From 03ecf5bc827c93dd1c2b215084bdc27ea2a4a4a1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 16 Sep 2024 14:30:25 +0200 Subject: [PATCH 01/52] chore(ci): update layer ARN on documentation (#3074) Co-authored-by: aws-powertools-bot <151832416+aws-powertools-bot@users.noreply.github.com> --- docs/index.md | 76 +++++++++++++++++++++++++-------------------------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/docs/index.md b/docs/index.md index da1e73eaa3..53f1914bde 100644 --- a/docs/index.md +++ b/docs/index.md @@ -69,7 +69,7 @@ You can use Powertools for AWS Lambda (TypeScript) by installing it with your fa For the latter, make sure to replace `{region}` with your AWS region, e.g., `eu-west-1`. - __arn:aws:lambda:{region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:12__{: .copyMe}:clipboard: + __arn:aws:lambda:{region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:13__{: .copyMe}:clipboard: ???+ note "Code snippets for popular infrastructure as code frameworks" @@ -89,7 +89,7 @@ You can use Powertools for AWS Lambda (TypeScript) by installing it with your fa const powertoolsLayer = LayerVersion.fromLayerVersionArn( this, 'PowertoolsLayer', - `arn:aws:lambda:${Stack.of(this).region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:12` + `arn:aws:lambda:${Stack.of(this).region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:13` ); new Function(this, 'Function', { @@ -126,7 +126,7 @@ You can use Powertools for AWS Lambda (TypeScript) by installing it with your fa Type: AWS::Serverless::Function Properties: Layers: - - !Sub arn:aws:lambda:${AWS::Region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:12 + - !Sub arn:aws:lambda:${AWS::Region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:13 ``` If you use `esbuild` to bundle your code, make sure to exclude `@aws-lambda-powertools/*` and `@aws-sdk/*` from being bundled since the packages are already present the layer: @@ -155,7 +155,7 @@ You can use Powertools for AWS Lambda (TypeScript) by installing it with your fa hello: handler: lambda_function.lambda_handler layers: - - arn:aws:lambda:${aws:region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:12 + - arn:aws:lambda:${aws:region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:13 ``` If you use `esbuild` to bundle your code, make sure to exclude `@aws-lambda-powertools/*` and `@aws-sdk/*` from being bundled since the packages are already present the layer: @@ -190,7 +190,7 @@ You can use Powertools for AWS Lambda (TypeScript) by installing it with your fa role = ... handler = "index.handler" runtime = "nodejs20.x" - layers = ["arn:aws:lambda:{aws::region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:12"] + layers = ["arn:aws:lambda:{aws::region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:13"] source_code_hash = filebase64sha256("lambda_function_payload.zip") } ``` @@ -208,7 +208,7 @@ You can use Powertools for AWS Lambda (TypeScript) by installing it with your fa const lambdaFunction = new aws.lambda.Function('function', { layers: [ - pulumi.interpolate`arn:aws:lambda:${aws.getRegionOutput().name}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:12` + pulumi.interpolate`arn:aws:lambda:${aws.getRegionOutput().name}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:13` ], code: new pulumi.asset.FileArchive('lambda_function_payload.zip'), tracingConfig: { @@ -232,7 +232,7 @@ You can use Powertools for AWS Lambda (TypeScript) by installing it with your fa ? Do you want to configure advanced settings? Yes ... ? Do you want to enable Lambda layers for this function? Yes - ? Enter up to 5 existing Lambda layer ARNs (comma-separated): arn:aws:lambda:{aws::region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:12 + ? Enter up to 5 existing Lambda layer ARNs (comma-separated): arn:aws:lambda:{aws::region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:13 ❯ amplify push -y # Updating an existing function and add the layer @@ -242,7 +242,7 @@ You can use Powertools for AWS Lambda (TypeScript) by installing it with your fa - Name: ? Which setting do you want to update? Lambda layers configuration ? Do you want to enable Lambda layers for this function? Yes - ? Enter up to 5 existing Lambda layer ARNs (comma-separated): arn:aws:lambda:{aws::region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:12 + ? Enter up to 5 existing Lambda layer ARNs (comma-separated): arn:aws:lambda:{aws::region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:13 ? Do you want to edit the local lambda function now? No ``` @@ -255,35 +255,35 @@ You can use the Lambda Layer both with CommonJS and ESM (ECMAScript modules) for ??? note "Click to expand and copy any regional Lambda Layer ARN" | Region | Layer ARN | | ---------------- | ------------------------------------------------------------------------------------------------------------- | - | `us-east-1` | [arn:aws:lambda:us-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:12](#){: .copyMe}:clipboard: | - | `us-east-2` | [arn:aws:lambda:us-east-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:12](#){: .copyMe}:clipboard: | - | `us-west-1` | [arn:aws:lambda:us-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:12](#){: .copyMe}:clipboard: | - | `us-west-2` | [arn:aws:lambda:us-west-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:12](#){: .copyMe}:clipboard: | - | `ap-south-1` | [arn:aws:lambda:ap-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:12](#){: .copyMe}:clipboard: | - | `ap-south-2` | [arn:aws:lambda:ap-south-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:12](#){: .copyMe}:clipboard: | - | `ap-east-1` | [arn:aws:lambda:ap-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:12](#){: .copyMe}:clipboard: | - | `ap-northeast-1` | [arn:aws:lambda:ap-northeast-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:12](#){: .copyMe}:clipboard: | - | `ap-northeast-2` | [arn:aws:lambda:ap-northeast-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:12](#){: .copyMe}:clipboard: | - | `ap-northeast-3` | [arn:aws:lambda:ap-northeast-3:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:12](#){: .copyMe}:clipboard: | - | `ap-southeast-1` | [arn:aws:lambda:ap-southeast-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:12](#){: .copyMe}:clipboard: | - | `ap-southeast-2` | [arn:aws:lambda:ap-southeast-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:12](#){: .copyMe}:clipboard: | - | `ap-southeast-3` | [arn:aws:lambda:ap-southeast-3:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:12](#){: .copyMe}:clipboard: | - | `ap-southeast-4` | [arn:aws:lambda:ap-southeast-4:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:12](#){: .copyMe}:clipboard: | - | `eu-central-1` | [arn:aws:lambda:eu-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:12](#){: .copyMe}:clipboard: | - | `eu-central-2` | [arn:aws:lambda:eu-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:12](#){: .copyMe}:clipboard: | - | `eu-west-1` | [arn:aws:lambda:eu-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:12](#){: .copyMe}:clipboard: | - | `eu-west-2` | [arn:aws:lambda:eu-west-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:12](#){: .copyMe}:clipboard: | - | `eu-west-3` | [arn:aws:lambda:eu-west-3:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:12](#){: .copyMe}:clipboard: | - | `eu-north-1` | [arn:aws:lambda:eu-north-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:12](#){: .copyMe}:clipboard: | - | `eu-south-1` | [arn:aws:lambda:eu-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:12](#){: .copyMe}:clipboard: | - | `eu-south-2` | [arn:aws:lambda:eu-south-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:12](#){: .copyMe}:clipboard: | - | `ca-central-1` | [arn:aws:lambda:ca-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:12](#){: .copyMe}:clipboard: | - | `ca-west-1` | [arn:aws:lambda:ca-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:12](#){: .copyMe}:clipboard: | - | `sa-east-1` | [arn:aws:lambda:sa-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:12](#){: .copyMe}:clipboard: | - | `af-south-1` | [arn:aws:lambda:af-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:12](#){: .copyMe}:clipboard: | - | `me-south-1` | [arn:aws:lambda:me-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:12](#){: .copyMe}:clipboard: | - | `me-central-1` | [arn:aws:lambda:me-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:12](#){: .copyMe}:clipboard: | - | `il-central-1` | [arn:aws:lambda:il-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:12](#){: .copyMe}:clipboard: | + | `us-east-1` | [arn:aws:lambda:us-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:13](#){: .copyMe}:clipboard: | + | `us-east-2` | [arn:aws:lambda:us-east-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:13](#){: .copyMe}:clipboard: | + | `us-west-1` | [arn:aws:lambda:us-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:13](#){: .copyMe}:clipboard: | + | `us-west-2` | [arn:aws:lambda:us-west-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:13](#){: .copyMe}:clipboard: | + | `ap-south-1` | [arn:aws:lambda:ap-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:13](#){: .copyMe}:clipboard: | + | `ap-south-2` | [arn:aws:lambda:ap-south-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:13](#){: .copyMe}:clipboard: | + | `ap-east-1` | [arn:aws:lambda:ap-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:13](#){: .copyMe}:clipboard: | + | `ap-northeast-1` | [arn:aws:lambda:ap-northeast-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:13](#){: .copyMe}:clipboard: | + | `ap-northeast-2` | [arn:aws:lambda:ap-northeast-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:13](#){: .copyMe}:clipboard: | + | `ap-northeast-3` | [arn:aws:lambda:ap-northeast-3:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:13](#){: .copyMe}:clipboard: | + | `ap-southeast-1` | [arn:aws:lambda:ap-southeast-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:13](#){: .copyMe}:clipboard: | + | `ap-southeast-2` | [arn:aws:lambda:ap-southeast-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:13](#){: .copyMe}:clipboard: | + | `ap-southeast-3` | [arn:aws:lambda:ap-southeast-3:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:13](#){: .copyMe}:clipboard: | + | `ap-southeast-4` | [arn:aws:lambda:ap-southeast-4:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:13](#){: .copyMe}:clipboard: | + | `eu-central-1` | [arn:aws:lambda:eu-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:13](#){: .copyMe}:clipboard: | + | `eu-central-2` | [arn:aws:lambda:eu-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:13](#){: .copyMe}:clipboard: | + | `eu-west-1` | [arn:aws:lambda:eu-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:13](#){: .copyMe}:clipboard: | + | `eu-west-2` | [arn:aws:lambda:eu-west-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:13](#){: .copyMe}:clipboard: | + | `eu-west-3` | [arn:aws:lambda:eu-west-3:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:13](#){: .copyMe}:clipboard: | + | `eu-north-1` | [arn:aws:lambda:eu-north-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:13](#){: .copyMe}:clipboard: | + | `eu-south-1` | [arn:aws:lambda:eu-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:13](#){: .copyMe}:clipboard: | + | `eu-south-2` | [arn:aws:lambda:eu-south-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:13](#){: .copyMe}:clipboard: | + | `ca-central-1` | [arn:aws:lambda:ca-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:13](#){: .copyMe}:clipboard: | + | `ca-west-1` | [arn:aws:lambda:ca-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:13](#){: .copyMe}:clipboard: | + | `sa-east-1` | [arn:aws:lambda:sa-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:13](#){: .copyMe}:clipboard: | + | `af-south-1` | [arn:aws:lambda:af-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:13](#){: .copyMe}:clipboard: | + | `me-south-1` | [arn:aws:lambda:me-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:13](#){: .copyMe}:clipboard: | + | `me-central-1` | [arn:aws:lambda:me-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:13](#){: .copyMe}:clipboard: | + | `il-central-1` | [arn:aws:lambda:il-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:13](#){: .copyMe}:clipboard: | **Want to inspect the contents of the Layer?** @@ -292,7 +292,7 @@ The pre-signed URL to download this Lambda Layer will be within `Location` key i Change `{aws::region}` to your AWS region, e.g. `eu-west-1`, and run the following command: ```bash title="AWS CLI command to download Lambda Layer content" -aws lambda get-layer-version-by-arn --arn arn:aws:lambda:{aws::region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:12 --region {aws::region} +aws lambda get-layer-version-by-arn --arn arn:aws:lambda:{aws::region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:13 --region {aws::region} ``` ## Instrumentation From ce2f2bd4606437e79b4f83a4448565eddfbc15ea Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Sep 2024 14:56:37 +0200 Subject: [PATCH 02/52] chore(deps): bump @types/node from 22.5.4 to 22.5.5 (#3067) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Andrea Amorosi --- examples/app/package.json | 4 ++-- package-lock.json | 12 ++++++------ package.json | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/examples/app/package.json b/examples/app/package.json index aa1cf4e8f3..5031fd4ab1 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -29,7 +29,7 @@ }, "devDependencies": { "@types/aws-lambda": "^8.10.145", - "@types/node": "22.5.4", + "@types/node": "22.5.5", "aws-cdk": "^2.158.0", "aws-cdk-lib": "^2.158.0", "constructs": "^10.3.0", @@ -49,7 +49,7 @@ "@aws-sdk/lib-dynamodb": "^3.651.1", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.145", - "@types/node": "22.5.4", + "@types/node": "22.5.5", "constructs": "^10.3.0", "esbuild": "^0.23.1", "typescript": "^5.6.2" diff --git a/package-lock.json b/package-lock.json index faa297762b..82ccb01c76 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,7 +28,7 @@ "@biomejs/biome": "^1.9.0", "@types/aws-lambda": "^8.10.145", "@types/jest": "^29.5.13", - "@types/node": "^22.5.4", + "@types/node": "^22.5.5", "@vitest/coverage-v8": "^2.1.0", "husky": "^9.1.6", "jest": "^29.7.0", @@ -65,14 +65,14 @@ "@aws-sdk/lib-dynamodb": "^3.651.1", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.145", - "@types/node": "22.5.4", + "@types/node": "22.5.5", "constructs": "^10.3.0", "esbuild": "^0.23.1", "typescript": "^5.6.2" }, "devDependencies": { "@types/aws-lambda": "^8.10.145", - "@types/node": "22.5.4", + "@types/node": "22.5.5", "aws-cdk": "^2.158.0", "aws-cdk-lib": "^2.158.0", "constructs": "^10.3.0", @@ -5316,9 +5316,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "22.5.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.4.tgz", - "integrity": "sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==", + "version": "22.5.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.5.tgz", + "integrity": "sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==", "dependencies": { "undici-types": "~6.19.2" } diff --git a/package.json b/package.json index 6392e89585..b798be4020 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,7 @@ "@biomejs/biome": "^1.9.0", "@types/aws-lambda": "^8.10.145", "@types/jest": "^29.5.13", - "@types/node": "^22.5.4", + "@types/node": "^22.5.5", "@vitest/coverage-v8": "^2.1.0", "husky": "^9.1.6", "jest": "^29.7.0", From 5db27bd7ffbf230d93c893bf7caaec09c17dc7f9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Sep 2024 15:01:16 +0200 Subject: [PATCH 03/52] chore(deps-dev): bump @vitest/coverage-v8 from 2.1.0 to 2.1.1 (#3068) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 126 +++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 64 insertions(+), 64 deletions(-) diff --git a/package-lock.json b/package-lock.json index 82ccb01c76..1af6b3d50b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,7 +29,7 @@ "@types/aws-lambda": "^8.10.145", "@types/jest": "^29.5.13", "@types/node": "^22.5.5", - "@vitest/coverage-v8": "^2.1.0", + "@vitest/coverage-v8": "^2.1.1", "husky": "^9.1.6", "jest": "^29.7.0", "jest-runner-groups": "^2.2.0", @@ -5387,9 +5387,9 @@ "dev": true }, "node_modules/@vitest/coverage-v8": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-2.1.0.tgz", - "integrity": "sha512-yqCkr2nrV4o58VcVMxTVkS6Ggxzy7pmSD8JbTbhbH5PsQfUIES1QT716VUzo33wf2lX9EcWYdT3Vl2MMmjR59g==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-2.1.1.tgz", + "integrity": "sha512-md/A7A3c42oTT8JUHSqjP5uKTWJejzUW4jalpvs+rZ27gsURsMU8DEb+8Jf8C6Kj2gwfSHJqobDNBuoqlm0cFw==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.3.0", @@ -5409,8 +5409,8 @@ "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "@vitest/browser": "2.1.0", - "vitest": "2.1.0" + "@vitest/browser": "2.1.1", + "vitest": "2.1.1" }, "peerDependenciesMeta": { "@vitest/browser": { @@ -5482,13 +5482,13 @@ } }, "node_modules/@vitest/expect": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.0.tgz", - "integrity": "sha512-N3/xR4fSu0+6sVZETEtPT1orUs2+Y477JOXTcU3xKuu3uBlsgbD7/7Mz2LZ1Jr1XjwilEWlrIgSCj4N1+5ZmsQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.1.tgz", + "integrity": "sha512-YeueunS0HiHiQxk+KEOnq/QMzlUuOzbU1Go+PgAsHvvv3tUkJPm9xWt+6ITNTlzsMXUjmgm5T+U7KBPK2qQV6w==", "dev": true, "dependencies": { - "@vitest/spy": "2.1.0", - "@vitest/utils": "2.1.0", + "@vitest/spy": "2.1.1", + "@vitest/utils": "2.1.1", "chai": "^5.1.1", "tinyrainbow": "^1.2.0" }, @@ -5497,9 +5497,9 @@ } }, "node_modules/@vitest/mocker": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.0.tgz", - "integrity": "sha512-ZxENovUqhzl+QiOFpagiHUNUuZ1qPd5yYTCYHomGIZOFArzn4mgX2oxZmiAItJWAaXHG6bbpb/DpSPhlk5DgtA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.1.tgz", + "integrity": "sha512-LNN5VwOEdJqCmJ/2XJBywB11DLlkbY0ooDJW3uRX5cZyYCrc4PI/ePX0iQhE3BiEGiQmK4GE7Q/PqCkkaiPnrA==", "dev": true, "dependencies": { "@vitest/spy": "^2.1.0-beta.1", @@ -5510,7 +5510,7 @@ "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "@vitest/spy": "2.1.0", + "@vitest/spy": "2.1.1", "msw": "^2.3.5", "vite": "^5.0.0" }, @@ -5524,9 +5524,9 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.0.tgz", - "integrity": "sha512-7sxf2F3DNYatgmzXXcTh6cq+/fxwB47RIQqZJFoSH883wnVAoccSRT6g+dTKemUBo8Q5N4OYYj1EBXLuRKvp3Q==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.1.tgz", + "integrity": "sha512-SjxPFOtuINDUW8/UkElJYQSFtnWX7tMksSGW0vfjxMneFqxVr8YJ979QpMbDW7g+BIiq88RAGDjf7en6rvLPPQ==", "dev": true, "dependencies": { "tinyrainbow": "^1.2.0" @@ -5536,12 +5536,12 @@ } }, "node_modules/@vitest/runner": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.0.tgz", - "integrity": "sha512-D9+ZiB8MbMt7qWDRJc4CRNNUlne/8E1X7dcKhZVAbcOKG58MGGYVDqAq19xlhNfMFZsW0bpVKgztBwks38Ko0w==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.1.tgz", + "integrity": "sha512-uTPuY6PWOYitIkLPidaY5L3t0JJITdGTSwBtwMjKzo5O6RCOEncz9PUN+0pDidX8kTHYjO0EwUIvhlGpnGpxmA==", "dev": true, "dependencies": { - "@vitest/utils": "2.1.0", + "@vitest/utils": "2.1.1", "pathe": "^1.1.2" }, "funding": { @@ -5549,12 +5549,12 @@ } }, "node_modules/@vitest/snapshot": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.0.tgz", - "integrity": "sha512-x69CygGMzt9VCO283K2/FYQ+nBrOj66OTKpsPykjCR4Ac3lLV+m85hj9reaIGmjBSsKzVvbxWmjWE3kF5ha3uQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.1.tgz", + "integrity": "sha512-BnSku1WFy7r4mm96ha2FzN99AZJgpZOWrAhtQfoxjUU5YMRpq1zmHRq7a5K9/NjqonebO7iVDla+VvZS8BOWMw==", "dev": true, "dependencies": { - "@vitest/pretty-format": "2.1.0", + "@vitest/pretty-format": "2.1.1", "magic-string": "^0.30.11", "pathe": "^1.1.2" }, @@ -5563,9 +5563,9 @@ } }, "node_modules/@vitest/spy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.0.tgz", - "integrity": "sha512-IXX5NkbdgTYTog3F14i2LgnBc+20YmkXMx0IWai84mcxySUDRgm0ihbOfR4L0EVRBDFG85GjmQQEZNNKVVpkZw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.1.tgz", + "integrity": "sha512-ZM39BnZ9t/xZ/nF4UwRH5il0Sw93QnZXd9NAZGRpIgj0yvVwPpLd702s/Cx955rGaMlyBQkZJ2Ir7qyY48VZ+g==", "dev": true, "dependencies": { "tinyspy": "^3.0.0" @@ -5575,12 +5575,12 @@ } }, "node_modules/@vitest/utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.0.tgz", - "integrity": "sha512-rreyfVe0PuNqJfKYUwfPDfi6rrp0VSu0Wgvp5WBqJonP+4NvXHk48X6oBam1Lj47Hy6jbJtnMj3OcRdrkTP0tA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.1.tgz", + "integrity": "sha512-Y6Q9TsI+qJ2CC0ZKj6VBb+T8UPz593N113nnUykqwANqhgf3QkZeHFlusgKLTqrnVHbj/XDKZcDHol+dxVT+rQ==", "dev": true, "dependencies": { - "@vitest/pretty-format": "2.1.0", + "@vitest/pretty-format": "2.1.1", "loupe": "^3.1.1", "tinyrainbow": "^1.2.0" }, @@ -13723,9 +13723,9 @@ } }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", "dev": true }, "node_modules/picomatch": { @@ -13847,9 +13847,9 @@ } }, "node_modules/postcss": { - "version": "8.4.45", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.45.tgz", - "integrity": "sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==", + "version": "8.4.47", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", + "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", "dev": true, "funding": [ { @@ -13867,8 +13867,8 @@ ], "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -15138,9 +15138,9 @@ } }, "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -16366,9 +16366,9 @@ } }, "node_modules/vite": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.4.tgz", - "integrity": "sha512-RHFCkULitycHVTtelJ6jQLd+KSAAzOgEYorV32R2q++M6COBjKJR6BxqClwp5sf0XaBDjVMuJ9wnNfyAJwjMkA==", + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.5.tgz", + "integrity": "sha512-pXqR0qtb2bTwLkev4SE3r4abCNioP3GkjvIDLlzziPpXtHgiJIjuKl+1GN6ESOT3wMjG3JTeARopj2SwYaHTOA==", "dev": true, "dependencies": { "esbuild": "^0.21.3", @@ -16425,9 +16425,9 @@ } }, "node_modules/vite-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.0.tgz", - "integrity": "sha512-+ybYqBVUjYyIscoLzMWodus2enQDZOpGhcU6HdOVD6n8WZdk12w1GFL3mbnxLs7hPtRtqs1Wo5YF6/Tsr6fmhg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.1.tgz", + "integrity": "sha512-N/mGckI1suG/5wQI35XeR9rsMsPqKXzq1CdUndzVstBj/HvyxxGctwnK6WX43NGt5L3Z5tcRf83g4TITKJhPrA==", "dev": true, "dependencies": { "cac": "^6.7.14", @@ -16866,18 +16866,18 @@ } }, "node_modules/vitest": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.0.tgz", - "integrity": "sha512-XuuEeyNkqbfr0FtAvd9vFbInSSNY1ykCQTYQ0sj9wPy4hx+1gR7gqVNdW0AX2wrrM1wWlN5fnJDjF9xG6mYRSQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.1.tgz", + "integrity": "sha512-97We7/VC0e9X5zBVkvt7SGQMGrRtn3KtySFQG5fpaMlS+l62eeXRQO633AYhSTC3z7IMebnPPNjGXVGNRFlxBA==", "dev": true, "dependencies": { - "@vitest/expect": "2.1.0", - "@vitest/mocker": "2.1.0", - "@vitest/pretty-format": "^2.1.0", - "@vitest/runner": "2.1.0", - "@vitest/snapshot": "2.1.0", - "@vitest/spy": "2.1.0", - "@vitest/utils": "2.1.0", + "@vitest/expect": "2.1.1", + "@vitest/mocker": "2.1.1", + "@vitest/pretty-format": "^2.1.1", + "@vitest/runner": "2.1.1", + "@vitest/snapshot": "2.1.1", + "@vitest/spy": "2.1.1", + "@vitest/utils": "2.1.1", "chai": "^5.1.1", "debug": "^4.3.6", "magic-string": "^0.30.11", @@ -16888,7 +16888,7 @@ "tinypool": "^1.0.0", "tinyrainbow": "^1.2.0", "vite": "^5.0.0", - "vite-node": "2.1.0", + "vite-node": "2.1.1", "why-is-node-running": "^2.3.0" }, "bin": { @@ -16903,8 +16903,8 @@ "peerDependencies": { "@edge-runtime/vm": "*", "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "2.1.0", - "@vitest/ui": "2.1.0", + "@vitest/browser": "2.1.1", + "@vitest/ui": "2.1.1", "happy-dom": "*", "jsdom": "*" }, diff --git a/package.json b/package.json index b798be4020..8526e48e38 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "@types/aws-lambda": "^8.10.145", "@types/jest": "^29.5.13", "@types/node": "^22.5.5", - "@vitest/coverage-v8": "^2.1.0", + "@vitest/coverage-v8": "^2.1.1", "husky": "^9.1.6", "jest": "^29.7.0", "jest-runner-groups": "^2.2.0", From e7a8c8ccf4366868e2ff809d026f601b58231ccc Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Mon, 16 Sep 2024 23:39:47 +0200 Subject: [PATCH 04/52] test(commons): migrate to vitest (#3060) --- ...sable-run-linting-check-and-unit-tests.yml | 9 +- .husky/pre-push | 1 - packages/batch/package.json | 4 +- packages/commons/jest.config.cjs | 29 ---- packages/commons/package.json | 8 +- .../tests/types/LambdaInterface.test.ts | 41 +++++ .../unit/EnvironmentVariablesService.test.ts | 38 ++--- packages/commons/tests/unit/LRUCache.test.ts | 28 ++-- .../tests/unit/LambdaInterface.test.ts | 155 ------------------ packages/commons/tests/unit/Utility.test.ts | 36 ++-- .../commons/tests/unit/awsSdkUtils.test.ts | 24 ++- .../tests/unit/cleanupMiddlewares.test.ts | 14 +- .../commons/tests/unit/fromBase64.test.ts | 10 +- packages/commons/tests/unit/typeUtils.test.ts | 10 +- packages/commons/vitest.config.ts | 7 + vitest.config.ts | 2 +- 16 files changed, 126 insertions(+), 290 deletions(-) delete mode 100644 packages/commons/jest.config.cjs create mode 100644 packages/commons/tests/types/LambdaInterface.test.ts delete mode 100644 packages/commons/tests/unit/LambdaInterface.test.ts create mode 100644 packages/commons/vitest.config.ts diff --git a/.github/workflows/reusable-run-linting-check-and-unit-tests.yml b/.github/workflows/reusable-run-linting-check-and-unit-tests.yml index 0dba209acf..93d0f5ddd4 100644 --- a/.github/workflows/reusable-run-linting-check-and-unit-tests.yml +++ b/.github/workflows/reusable-run-linting-check-and-unit-tests.yml @@ -40,7 +40,7 @@ jobs: strategy: matrix: version: [18, 20] - workspace: ["packages/batch"] + workspace: ["packages/batch", "packages/commons"] fail-fast: false steps: - name: Checkout code @@ -57,7 +57,9 @@ jobs: - name: Linting run: npm run lint -w ${{ matrix.workspace }} - name: Unit tests - run: npm run test:unit:coverage -w ${{ matrix.workspace }} + run: | + npm run test:unit:coverage -w ${{ matrix.workspace }} + npm run test:unit:types -w ${{ matrix.workspace }} run-linting-check-and-unit-tests-on-utilities: runs-on: ubuntu-latest env: @@ -92,8 +94,7 @@ jobs: -w packages/event-handler - name: Run unit tests run: | - npm t -w packages/commons \ - -w packages/logger \ + npm t -w packages/logger \ -w packages/tracer \ -w packages/metrics \ -w packages/parameters \ diff --git a/.husky/pre-push b/.husky/pre-push index 745483f08e..a011532b30 100755 --- a/.husky/pre-push +++ b/.husky/pre-push @@ -1,5 +1,4 @@ npm t \ - -w packages/commons \ -w packages/jmespath \ -w packages/logger \ -w packages/metrics \ diff --git a/packages/batch/package.json b/packages/batch/package.json index 655f18c0c2..d99b7c91b2 100644 --- a/packages/batch/package.json +++ b/packages/batch/package.json @@ -12,11 +12,11 @@ "scripts": { "test": "vitest --run", "test:unit": "vitest --run", - "test:unit:coverage": "vitest --run --coverage.enabled --coverage.thresholds.100 --coverage.include='src/**'", + "test:unit:coverage": "vitest --run tests/unit --coverage.enabled --coverage.thresholds.100 --coverage.include='src/**'", + "test:unit:types": "echo 'Not Implemented'", "test:e2e:nodejs18x": "echo 'Not Implemented'", "test:e2e:nodejs20x": "echo 'Not Implemented'", "test:e2e": "echo 'Not Implemented'", - "watch": "jest --watch", "build:cjs": "tsc --build tsconfig.json && echo '{ \"type\": \"commonjs\" }' > lib/cjs/package.json", "build:esm": "tsc --build tsconfig.esm.json && echo '{ \"type\": \"module\" }' > lib/esm/package.json", "build": "npm run build:esm & npm run build:cjs", diff --git a/packages/commons/jest.config.cjs b/packages/commons/jest.config.cjs deleted file mode 100644 index 957bbe96d7..0000000000 --- a/packages/commons/jest.config.cjs +++ /dev/null @@ -1,29 +0,0 @@ -module.exports = { - displayName: { - name: 'Powertools for AWS Lambda (TypeScript) utility: COMMONS', - color: 'red', - }, - preset: 'ts-jest', - moduleNameMapper: { - '^(\\.{1,2}/.*)\\.js$': '$1', - }, - transform: { - '^.+\\.ts?$': 'ts-jest', - }, - moduleFileExtensions: ['js', 'ts'], - collectCoverageFrom: ['**/src/**/*.ts', '!**/node_modules/**'], - testMatch: ['**/?(*.)+(spec|test).ts'], - roots: ['/src', '/tests'], - testPathIgnorePatterns: ['/node_modules/'], - testEnvironment: 'node', - coveragePathIgnorePatterns: ['/node_modules/', 'src/types/index.ts'], - coverageThreshold: { - global: { - statements: 100, - branches: 100, - functions: 100, - lines: 100, - }, - }, - coverageReporters: ['json-summary', 'text', 'lcov'], -}; diff --git a/packages/commons/package.json b/packages/commons/package.json index 1be24df095..cbe6cf6b8e 100644 --- a/packages/commons/package.json +++ b/packages/commons/package.json @@ -10,11 +10,11 @@ "access": "public" }, "scripts": { - "test": "npm run test:unit", - "test:unit": "jest --group=unit --detectOpenHandles --coverage --verbose", - "jest": "jest --detectOpenHandles --verbose", + "test": "vitest --run", + "test:unit": "vitest --run", + "test:unit:coverage": "vitest --run tests/unit --coverage.enabled --coverage.thresholds.100 --coverage.include='src/**'", + "test:unit:types": "vitest --run tests/types --typecheck", "test:e2e": "echo 'Not Applicable'", - "watch": "jest --watch", "generateVersionFile": "echo \"// this file is auto generated, do not modify\nexport const PT_VERSION = '$(jq -r '.version' package.json)';\" > src/version.ts", "build:cjs": "tsc --build tsconfig.json && echo '{ \"type\": \"commonjs\" }' > lib/cjs/package.json", "build:esm": "tsc --build tsconfig.esm.json && echo '{ \"type\": \"module\" }' > lib/esm/package.json", diff --git a/packages/commons/tests/types/LambdaInterface.test.ts b/packages/commons/tests/types/LambdaInterface.test.ts new file mode 100644 index 0000000000..5b50d083fe --- /dev/null +++ b/packages/commons/tests/types/LambdaInterface.test.ts @@ -0,0 +1,41 @@ +import type { Callback, Context } from 'aws-lambda'; +import { describe, expectTypeOf, it } from 'vitest'; +import type { LambdaInterface } from '../../src/types/index.js'; + +describe('Type: LambdaInterface', () => { + it('works with a sync handler', () => { + // Prepare + class Lambda implements LambdaInterface { + public handler(_event: unknown, context: Context, _callback: Callback) { + context.getRemainingTimeInMillis(); + _callback(null, 'Hello World'); + } + } + + // Act + const lambda = new Lambda(); + + // Assess + expectTypeOf(lambda).toBeObject(); + expectTypeOf(lambda).toHaveProperty('handler'); + expectTypeOf(lambda.handler).toBeFunction(); + }); + + it('works with an async handler', async () => { + // Prepare + class Lambda implements LambdaInterface { + public async handler(_event: unknown, context: Context) { + context.getRemainingTimeInMillis(); + return 'Hello World'; + } + } + + // Act + const lambda = new Lambda(); + + // Assess + expectTypeOf(lambda).toBeObject(); + expectTypeOf(lambda).toHaveProperty('handler'); + expectTypeOf(lambda.handler).toBeFunction(); + }); +}); diff --git a/packages/commons/tests/unit/EnvironmentVariablesService.test.ts b/packages/commons/tests/unit/EnvironmentVariablesService.test.ts index 2c7b7266f3..f941dbf6cb 100644 --- a/packages/commons/tests/unit/EnvironmentVariablesService.test.ts +++ b/packages/commons/tests/unit/EnvironmentVariablesService.test.ts @@ -1,15 +1,11 @@ -/** - * Test EnvironmentVariablesService class - * - * @group unit/commons/environmentService - */ +import { afterAll, beforeEach, describe, expect, it, vi } from 'vitest'; import { EnvironmentVariablesService } from '../../src/index.js'; describe('Class: EnvironmentVariablesService', () => { const ENVIRONMENT_VARIABLES = process.env; beforeEach(() => { - jest.resetModules(); + vi.resetModules(); process.env = { ...ENVIRONMENT_VARIABLES }; }); @@ -18,7 +14,7 @@ describe('Class: EnvironmentVariablesService', () => { }); describe('Method: get', () => { - test('When the variable IS present, it returns the value of a runtime variable', () => { + it('returns the value of a runtime variable', () => { // Prepare process.env.CUSTOM_VARIABLE = 'my custom value'; const service = new EnvironmentVariablesService(); @@ -30,7 +26,7 @@ describe('Class: EnvironmentVariablesService', () => { expect(value).toEqual('my custom value'); }); - test('When the variable IS NOT present, it returns an empty string', () => { + it('returns an empty string when the env variable is not present', () => { // Prepare process.env.CUSTOM_VARIABLE = undefined; const service = new EnvironmentVariablesService(); @@ -44,7 +40,7 @@ describe('Class: EnvironmentVariablesService', () => { }); describe('Method: getServiceName', () => { - test('It returns the value of the environment variable POWERTOOLS_SERVICE_NAME', () => { + it('returns the value of the environment variable POWERTOOLS_SERVICE_NAME', () => { // Prepare process.env.POWERTOOLS_SERVICE_NAME = 'shopping-cart-api'; const service = new EnvironmentVariablesService(); @@ -58,7 +54,7 @@ describe('Class: EnvironmentVariablesService', () => { }); describe('Method: getXrayTraceId', () => { - test('It returns the value of the environment variable _X_AMZN_TRACE_ID', () => { + it('returns the value of the environment variable _X_AMZN_TRACE_ID', () => { // Prepare process.env._X_AMZN_TRACE_ID = 'abcd123456789'; const service = new EnvironmentVariablesService(); @@ -69,7 +65,7 @@ describe('Class: EnvironmentVariablesService', () => { // Assess expect(value).toEqual('abcd123456789'); }); - test('It returns the value of the Root X-Ray segment ID properly formatted', () => { + it('returns the value of the Root X-Ray segment ID properly formatted', () => { // Prepare process.env._X_AMZN_TRACE_ID = 'Root=1-5759e988-bd862e3fe1be46a994272793;Parent=557abcec3ee5a047;Sampled=1'; @@ -82,7 +78,7 @@ describe('Class: EnvironmentVariablesService', () => { expect(value).toEqual('1-5759e988-bd862e3fe1be46a994272793'); }); - test('It returns the value of the Root X-Ray segment ID properly formatted', () => { + it('returns the value of the Root X-Ray segment ID properly formatted', () => { // Prepare process.env._X_AMZN_TRACE_ID = undefined; const service = new EnvironmentVariablesService(); @@ -96,7 +92,7 @@ describe('Class: EnvironmentVariablesService', () => { }); describe('Method: getXrayTraceSampled', () => { - test('It returns true if the Sampled flag is set in the _X_AMZN_TRACE_ID environment variable', () => { + it('returns true if the Sampled flag is set in the _X_AMZN_TRACE_ID environment variable', () => { // Prepare process.env._X_AMZN_TRACE_ID = 'Root=1-5759e988-bd862e3fe1be46a994272793;Parent=557abcec3ee5a047;Sampled=1'; @@ -109,7 +105,7 @@ describe('Class: EnvironmentVariablesService', () => { expect(value).toEqual(true); }); - test('It returns false if the Sampled flag is not set in the _X_AMZN_TRACE_ID environment variable', () => { + it('returns false if the Sampled flag is not set in the _X_AMZN_TRACE_ID environment variable', () => { // Prepare process.env._X_AMZN_TRACE_ID = 'Root=1-5759e988-bd862e3fe1be46a994272793;Parent=557abcec3ee5a047'; @@ -122,7 +118,7 @@ describe('Class: EnvironmentVariablesService', () => { expect(value).toEqual(false); }); - it('It returns false when no _X_AMZN_TRACE_ID environment variable is present', () => { + it('returns false when no _X_AMZN_TRACE_ID environment variable is present', () => { // Prepare process.env._X_AMZN_TRACE_ID = undefined; const service = new EnvironmentVariablesService(); @@ -150,8 +146,8 @@ describe('Class: EnvironmentVariablesService', () => { ['0', false], ]; - test.each(valuesToTest)( - 'it takes string "%s" and returns %s', + it.each(valuesToTest)( + 'takes string "%s" and returns %s', (input, output) => { // Prepare const service = new EnvironmentVariablesService(); @@ -164,7 +160,7 @@ describe('Class: EnvironmentVariablesService', () => { }); describe('Method: isDevMode', () => { - test('it returns true if the environment variable POWERTOOLS_DEV is "true"', () => { + it('returns true if the environment variable POWERTOOLS_DEV is "true"', () => { // Prepare process.env.POWERTOOLS_DEV = 'true'; const service = new EnvironmentVariablesService(); @@ -176,7 +172,7 @@ describe('Class: EnvironmentVariablesService', () => { expect(value).toEqual(true); }); - test('it returns false if the environment variable POWERTOOLS_DEV is "false"', () => { + it('returns false if the environment variable POWERTOOLS_DEV is "false"', () => { // Prepare process.env.POWERTOOLS_DEV = 'false'; const service = new EnvironmentVariablesService(); @@ -188,7 +184,7 @@ describe('Class: EnvironmentVariablesService', () => { expect(value).toEqual(false); }); - test('it returns false if the environment variable POWERTOOLS_DEV is NOT set', () => { + it('returns false if the environment variable POWERTOOLS_DEV is NOT set', () => { // Prepare process.env.POWERTOOLS_DEV = 'somethingsilly'; const service = new EnvironmentVariablesService(); @@ -200,7 +196,7 @@ describe('Class: EnvironmentVariablesService', () => { expect(value).toEqual(false); }); - test('it returns false if the environment variable POWERTOOLS_DEV is "somethingsilly"', () => { + it('returns false if the environment variable POWERTOOLS_DEV is "somethingsilly"', () => { // Prepare process.env.POWERTOOLS_DEV = 'somethingsilly'; const service = new EnvironmentVariablesService(); diff --git a/packages/commons/tests/unit/LRUCache.test.ts b/packages/commons/tests/unit/LRUCache.test.ts index cec778ac4c..089f38c218 100644 --- a/packages/commons/tests/unit/LRUCache.test.ts +++ b/packages/commons/tests/unit/LRUCache.test.ts @@ -1,13 +1,9 @@ -/** - * Test LRUCache class - * - * @group unit/commons/lru-cache - */ +import { describe, expect, it } from 'vitest'; import { LRUCache } from '../../src/LRUCache.js'; describe('Class: LRUMap', () => { describe('Method: add', () => { - test('when called it adds items to the cache', () => { + it('adds items to the cache', () => { // Prepare const cache = new LRUCache(); @@ -21,7 +17,7 @@ describe('Class: LRUMap', () => { expect(cache.get('b')).toBe(2); }); - test('when called it updates the value of an existing key', () => { + it('updates the value of an existing key', () => { // Prepare const cache = new LRUCache(); cache.add('a', 1); @@ -34,7 +30,7 @@ describe('Class: LRUMap', () => { expect(cache.get('a')).toBe(2); }); - test('when called it removes the oldest item when the cache is full', () => { + it('removes the oldest item when the cache is full', () => { // Prepare const cache = new LRUCache({ maxSize: 2 }); cache.add('a', 1); @@ -50,7 +46,7 @@ describe('Class: LRUMap', () => { expect(cache.get('c')).toBe(3); }); - test('when called and maxSize is 0, it skips cache', () => { + it('it skips the cache when max size is zero', () => { // Prepare const cache = new LRUCache({ maxSize: 0 }); @@ -63,7 +59,7 @@ describe('Class: LRUMap', () => { }); describe('Method: get', () => { - test('when called it returns the value of an existing key', () => { + it('returns the value of an existing key', () => { // Prepare const cache = new LRUCache(); cache.add('a', 1); @@ -75,7 +71,7 @@ describe('Class: LRUMap', () => { expect(value).toBe(1); }); - test('when called it returns undefined for a non-existing key', () => { + it('returns undefined for a non-existing key', () => { // Prepare const cache = new LRUCache(); @@ -86,7 +82,7 @@ describe('Class: LRUMap', () => { expect(value).toBeUndefined(); }); - test('when called it marks the item as the most recently used', () => { + it('marks the item as the most recently used', () => { // Prepare const cache = new LRUCache(); cache.add('a', 1); @@ -104,7 +100,7 @@ describe('Class: LRUMap', () => { }); describe('Method: has', () => { - test('when called it returns true for an existing key', () => { + it('returns true for an existing key', () => { // Prepare const cache = new LRUCache(); cache.add('a', 1); @@ -116,7 +112,7 @@ describe('Class: LRUMap', () => { expect(hasKey).toBe(true); }); - test('when called it returns false for a non-existing key', () => { + it('returns false for a non-existing key', () => { // Prepare const cache = new LRUCache(); @@ -129,7 +125,7 @@ describe('Class: LRUMap', () => { }); describe('Method: remove', () => { - test('when called it removes the item from the cache', () => { + it('removes the item from the cache', () => { // Prepare const cache = new LRUCache(); cache.add('a', 1); @@ -146,7 +142,7 @@ describe('Class: LRUMap', () => { expect(cache.get('a')).toBeUndefined(); }); - test('when called on an empty cache it does nothing', () => { + it('it does nothing when called on a non-existing key', () => { // Prepare const cache = new LRUCache(); cache.add('a', 1); diff --git a/packages/commons/tests/unit/LambdaInterface.test.ts b/packages/commons/tests/unit/LambdaInterface.test.ts deleted file mode 100644 index 4afc6e40f9..0000000000 --- a/packages/commons/tests/unit/LambdaInterface.test.ts +++ /dev/null @@ -1,155 +0,0 @@ -/** - * Test LambdaInterface interface - * - * @group unit/commons/lambdaInterface - */ -import context from '@aws-lambda-powertools/testing-utils/context'; -import type { Callback, Context, Handler } from 'aws-lambda'; -import type { - AsyncHandler, - LambdaInterface, - SyncHandler, -} from '../../src/types/index.js'; - -describe('LambdaInterface with arrow function', () => { - jest.spyOn(console, 'log').mockImplementation(); - test('it compiles when given a callback', async () => { - class LambdaFunction implements LambdaInterface { - public handler: SyncHandler = async ( - _event: unknown, - context: Context, - _callback: Callback - ) => { - context.done(); - context.fail(new Error('test Error')); - context.succeed('test succeed'); - context.getRemainingTimeInMillis(); - _callback(null, 'Hello World'); - }; - } - - new LambdaFunction().handler({}, context, () => - console.log('Lambda invoked!') - ); - }); - - test('it compiles when not given a callback', async () => { - class LambdaFunction implements LambdaInterface { - public handler: AsyncHandler = async ( - _event: unknown, - context: Context - ) => { - context.getRemainingTimeInMillis(); - }; - } - - await new LambdaFunction().handler({}, context); - }); -}); - -describe('LambdaInterface with standard function', () => { - test('it compiles when given a callback', async () => { - class LambdaFunction implements LambdaInterface { - public handler( - _event: unknown, - context: Context, - _callback: Callback - ): void { - context.getRemainingTimeInMillis(); - _callback(null, 'Hello World'); - } - } - - new LambdaFunction().handler({}, context, () => - console.log('Lambda invoked!') - ); - }); - - test('it compiles when not given a callback', async () => { - class LambdaFunction implements LambdaInterface { - public async handler(_event: unknown, context: Context): Promise { - context.getRemainingTimeInMillis(); - - return new Promise((resolve) => { - resolve('test promise'); - }); - } - } - - await new LambdaFunction().handler({}, context); - }); -}); - -describe('LambdaInterface with decorator', () => { - type HandlerMethodDecorator = ( - target: LambdaInterface, - propertyKey: string | symbol, - descriptor: - | TypedPropertyDescriptor> - | TypedPropertyDescriptor> - ) => void; - - class DummyModule { - public dummyDecorator(): HandlerMethodDecorator { - return (target, _propertyKey, descriptor) => { - const originalMethod = descriptor.value; - - descriptor.value = async (event, context, callback) => { - let result: unknown; - try { - console.log(`Invoking ${String(_propertyKey)}`); - result = await originalMethod?.apply(this, [ - event, - context, - callback, - ]); - console.log(`Invoked ${String(_propertyKey)}`); - } finally { - console.log('Finally from decorator'); - } - - return result; - }; - - return descriptor; - }; - } - } - - const dummyModule = new DummyModule(); - - test('decorator without callback compile', async () => { - // WHEN - class LambdaFunction implements LambdaInterface { - @dummyModule.dummyDecorator() - public async handler( - _event: unknown, - context: Context - ): Promise { - context.getRemainingTimeInMillis(); - - return 'test'; - } - } - - await new LambdaFunction().handler({}, context); - }); - - test('decorator with callback compile', async () => { - // WHEN - class LambdaFunction implements LambdaInterface { - @dummyModule.dummyDecorator() - public handler( - _event: unknown, - context: Context, - _callback: Callback - ): void { - context.getRemainingTimeInMillis(); - } - } - - new LambdaFunction().handler({}, context, () => - console.log('Lambda invoked!') - ); - }); -}); diff --git a/packages/commons/tests/unit/Utility.test.ts b/packages/commons/tests/unit/Utility.test.ts index f60e7edeea..e655273fc6 100644 --- a/packages/commons/tests/unit/Utility.test.ts +++ b/packages/commons/tests/unit/Utility.test.ts @@ -1,18 +1,14 @@ -/** - * Test Utility class - * - * @group unit/commons/utility - */ +import { beforeEach, describe, expect, it, vi } from 'vitest'; import { Utility } from '../../src/index.js'; describe('Class: Utility', () => { beforeEach(() => { - jest.clearAllMocks(); - jest.resetModules(); + vi.clearAllMocks(); + vi.resetModules(); }); describe('Method: getDefaultServiceName', () => { - test('it should return the default service name', () => { + it('returns the default service name', () => { class PowerTool extends Utility { public dummyMethod(): string { return this.getDefaultServiceName(); @@ -26,10 +22,10 @@ describe('Class: Utility', () => { }); describe('Method: getColdStart', () => { - test('when called multiple times on the parent class, it returns true the first time, then false afterwards', () => { + it('it returns true the first time, then false afterwards, when called multiple times', () => { // Prepare const utility = new Utility(); - const getColdStartSpy = jest.spyOn(utility, 'getColdStart'); + const getColdStartSpy = vi.spyOn(utility, 'getColdStart'); // Act utility.getColdStart(); @@ -49,7 +45,7 @@ describe('Class: Utility', () => { ]); }); - test('when called multiple times on a child class, it returns true the first time, then false afterwards', () => { + it('returns the correct values when subclassed', () => { // Prepare class PowerTool extends Utility { public dummyMethod(): boolean { @@ -57,8 +53,8 @@ describe('Class: Utility', () => { } } const powertool = new PowerTool(); - const dummyMethodSpy = jest.spyOn(powertool, 'dummyMethod'); - const getColdStartSpy = jest.spyOn(powertool, 'getColdStart'); + const dummyMethodSpy = vi.spyOn(powertool, 'dummyMethod'); + const getColdStartSpy = vi.spyOn(powertool, 'getColdStart'); // Act powertool.dummyMethod(); @@ -81,10 +77,10 @@ describe('Class: Utility', () => { }); describe('Method: isColdStart', () => { - test('when called multiple times on the parent class, it returns true the first time, then false afterwards', () => { + it('returns true the first time, then false afterwards when called multiple times', () => { // Prepare const utility = new Utility(); - const isColdStartSpy = jest.spyOn(utility, 'isColdStart'); + const isColdStartSpy = vi.spyOn(utility, 'isColdStart'); // Act utility.isColdStart(); @@ -104,7 +100,7 @@ describe('Class: Utility', () => { ]); }); - test('when called multiple times on a child class, it returns true the first time, then false afterwards', () => { + it('returns the correct values when subclassed', () => { // Prepare class PowerTool extends Utility { public dummyMethod(): boolean { @@ -112,8 +108,8 @@ describe('Class: Utility', () => { } } const powertool = new PowerTool(); - const dummyMethodSpy = jest.spyOn(powertool, 'dummyMethod'); - const isColdStartSpy = jest.spyOn(powertool, 'isColdStart'); + const dummyMethodSpy = vi.spyOn(powertool, 'dummyMethod'); + const isColdStartSpy = vi.spyOn(powertool, 'isColdStart'); // Act powertool.dummyMethod(); @@ -141,7 +137,7 @@ describe('Class: Utility', () => { return this.isValidServiceName(name); } } - test('it should allow valid strings', () => { + it('allows valid strings', () => { const powertool = new PowerTool(); const goodName = 'serverlessAirline'; @@ -150,7 +146,7 @@ describe('Class: Utility', () => { expect(result).toBe(true); }); - test('it should not allow empty strings', () => { + it("doesn't allow empty strings", () => { const tooShort = ''; const powertool = new PowerTool(); const result = powertool.dummyMethod(tooShort); diff --git a/packages/commons/tests/unit/awsSdkUtils.test.ts b/packages/commons/tests/unit/awsSdkUtils.test.ts index da06ea7729..907409b25d 100644 --- a/packages/commons/tests/unit/awsSdkUtils.test.ts +++ b/packages/commons/tests/unit/awsSdkUtils.test.ts @@ -1,8 +1,4 @@ -/** - * Test AWS SDK utilities - * - * @group unit/commons/awsSdkUtils - */ +import { beforeAll, describe, expect, it, vi } from 'vitest'; import { customUserAgentMiddleware } from '../../src/awsSdkUtils.js'; import { addUserAgentMiddleware, @@ -13,7 +9,7 @@ import { describe('Helpers: awsSdk', () => { describe('Function: userAgentMiddleware', () => { beforeAll(() => { - jest.spyOn(console, 'warn').mockImplementation(() => ({})); + vi.spyOn(console, 'warn').mockImplementation(() => ({})); }); it('handles gracefully failures in adding a middleware and only log a warning', () => { @@ -25,7 +21,7 @@ describe('Helpers: awsSdk', () => { }, }, }; - const warningSpy = jest + const warningSpy = vi .spyOn(console, 'warn') .mockImplementation(() => ({})); @@ -41,9 +37,9 @@ describe('Helpers: awsSdk', () => { identify: () => [ 'addPowertoolsToUserAgent: after getUserAgentMiddleware', ], - addRelativeTo: jest.fn(), + addRelativeTo: vi.fn(), }, - send: jest.fn(), + send: vi.fn(), config: { defaultSigningName: 'bar', }, @@ -62,9 +58,9 @@ describe('Helpers: awsSdk', () => { const client = { middlewareStack: { identify: () => '', - addRelativeTo: jest.fn(), + addRelativeTo: vi.fn(), }, - send: jest.fn(), + send: vi.fn(), config: { defaultSigningName: 'bar', }, @@ -104,7 +100,7 @@ describe('Helpers: awsSdk', () => { // Prepare const feature = 'my-feature'; const middleware = customUserAgentMiddleware(feature); - const next = jest.fn(); + const next = vi.fn(); const args = { request: { headers: { @@ -127,13 +123,13 @@ describe('Helpers: awsSdk', () => { it('returns true if the client is a valid AWS SDK v3 client', () => { // Prepare const client = { - send: jest.fn(), + send: vi.fn(), config: { defaultSigningName: 'bar', }, middlewareStack: { identify: () => '', - addRelativeTo: jest.fn(), + addRelativeTo: vi.fn(), }, }; diff --git a/packages/commons/tests/unit/cleanupMiddlewares.test.ts b/packages/commons/tests/unit/cleanupMiddlewares.test.ts index 8b178f2e9f..2046455de4 100644 --- a/packages/commons/tests/unit/cleanupMiddlewares.test.ts +++ b/packages/commons/tests/unit/cleanupMiddlewares.test.ts @@ -1,9 +1,5 @@ -/** - * Test Middy cleanupMiddlewares function - * - * @group unit/commons/cleanupMiddlewares - */ import context from '@aws-lambda-powertools/testing-utils/context'; +import { describe, expect, it, vi } from 'vitest'; import { IDEMPOTENCY_KEY, LOGGER_KEY, @@ -15,10 +11,10 @@ import { describe('Function: cleanupMiddlewares', () => { it('calls the cleanup function that are present', async () => { // Prepare - const mockCleanupFunction1 = jest.fn(); - const mockCleanupFunction2 = jest.fn(); - const mockCleanupFunction3 = jest.fn(); - const mockCleanupFunction4 = jest.fn(); + const mockCleanupFunction1 = vi.fn(); + const mockCleanupFunction2 = vi.fn(); + const mockCleanupFunction3 = vi.fn(); + const mockCleanupFunction4 = vi.fn(); const mockRequest = { event: {}, context: context, diff --git a/packages/commons/tests/unit/fromBase64.test.ts b/packages/commons/tests/unit/fromBase64.test.ts index 6d2a2a965b..8edc84a77b 100644 --- a/packages/commons/tests/unit/fromBase64.test.ts +++ b/packages/commons/tests/unit/fromBase64.test.ts @@ -1,14 +1,10 @@ -/** - * Test fromBase64 function - * - * @group unit/commons/fromBase64 - */ +import { beforeEach, describe, expect, it, vi } from 'vitest'; import { fromBase64 } from '../../src/fromBase64.js'; describe('Function: fromBase64', () => { beforeEach(() => { - jest.clearAllMocks(); - jest.resetModules(); + vi.clearAllMocks(); + vi.resetModules(); }); it('returns the Uint8Array from a base64 string', () => { diff --git a/packages/commons/tests/unit/typeUtils.test.ts b/packages/commons/tests/unit/typeUtils.test.ts index 6b96d61882..c2ccbcb61a 100644 --- a/packages/commons/tests/unit/typeUtils.test.ts +++ b/packages/commons/tests/unit/typeUtils.test.ts @@ -1,8 +1,4 @@ -/** - * Test type utils functions - * - * @group unit/commons/typeUtils - */ +import { beforeEach, describe, expect, it, vi } from 'vitest'; import { getType, isIntegerNumber, @@ -17,8 +13,8 @@ import { describe('Functions: typeUtils', () => { beforeEach(() => { - jest.clearAllMocks(); - jest.resetModules(); + vi.clearAllMocks(); + vi.resetModules(); }); describe('Function: isRecord', () => { diff --git a/packages/commons/vitest.config.ts b/packages/commons/vitest.config.ts new file mode 100644 index 0000000000..d5aa737c68 --- /dev/null +++ b/packages/commons/vitest.config.ts @@ -0,0 +1,7 @@ +import { defineProject } from 'vitest/config'; + +export default defineProject({ + test: { + environment: 'node', + }, +}); diff --git a/vitest.config.ts b/vitest.config.ts index eca83dc65c..241b69b7be 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -13,8 +13,8 @@ export default defineConfig({ include: ['packages/*/src/**'], exclude: [ ...coverageConfigDefaults.exclude, - 'packages/commons/**', 'packages/batch/src/types.ts', + 'packages/commons/src/types/**', 'packages/event-handler/**', 'packages/idempotency/**', 'packages/jmespath/**', From 455d7b9b13db891d8a058e37ff28a6c23ea5f66e Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Tue, 17 Sep 2024 11:02:50 +0200 Subject: [PATCH 05/52] test(jmespath): switch tests to vitest (#3079) --- ...sable-run-linting-check-and-unit-tests.yml | 13 ++++--- .husky/pre-push | 1 - packages/jmespath/jest.config.cjs | 34 ------------------- packages/jmespath/package.json | 8 ++--- .../helpers/populateEnvironmentVariables.ts | 1 - .../tests/unit/compliance/base.test.ts | 6 +--- .../tests/unit/compliance/boolean.test.ts | 6 +--- .../tests/unit/compliance/current.test.ts | 6 +--- .../tests/unit/compliance/escape.test.ts | 6 +--- .../tests/unit/compliance/filters.test.ts | 6 +--- .../tests/unit/compliance/functions.test.ts | 6 +--- .../tests/unit/compliance/identifiers.test.ts | 6 +--- .../tests/unit/compliance/indices.test.ts | 6 +--- .../tests/unit/compliance/literal.test.ts | 6 +--- .../tests/unit/compliance/multiselect.test.ts | 6 +--- .../tests/unit/compliance/pipe.test.ts | 6 +--- .../tests/unit/compliance/slice.test.ts | 6 +--- .../tests/unit/compliance/syntax.test.ts | 6 +--- .../tests/unit/compliance/unicode.test.ts | 6 +--- .../tests/unit/compliance/wildcard.test.ts | 6 +--- packages/jmespath/tests/unit/index.test.ts | 6 +--- packages/jmespath/vitest.config.ts | 7 ++++ vitest.config.ts | 2 +- 23 files changed, 34 insertions(+), 128 deletions(-) delete mode 100644 packages/jmespath/jest.config.cjs delete mode 100644 packages/jmespath/tests/helpers/populateEnvironmentVariables.ts create mode 100644 packages/jmespath/vitest.config.ts diff --git a/.github/workflows/reusable-run-linting-check-and-unit-tests.yml b/.github/workflows/reusable-run-linting-check-and-unit-tests.yml index 93d0f5ddd4..795a31644d 100644 --- a/.github/workflows/reusable-run-linting-check-and-unit-tests.yml +++ b/.github/workflows/reusable-run-linting-check-and-unit-tests.yml @@ -40,7 +40,11 @@ jobs: strategy: matrix: version: [18, 20] - workspace: ["packages/batch", "packages/commons"] + workspace: [ + "packages/batch", + "packages/commons", + "packages/jmespath" + ] fail-fast: false steps: - name: Checkout code @@ -82,14 +86,11 @@ jobs: nodeVersion: ${{ matrix.version }} - name: Run linting run: | - npm run lint -w packages/commons \ - -w packages/logger \ + npm run lint -w packages/logger \ -w packages/tracer \ -w packages/metrics \ -w packages/parameters \ -w packages/idempotency \ - -w packages/batch \ - -w packages/jmespath \ -w packages/parser \ -w packages/event-handler - name: Run unit tests @@ -99,8 +100,6 @@ jobs: -w packages/metrics \ -w packages/parameters \ -w packages/idempotency \ - -w packages/batch \ - -w packages/jmespath \ -w packages/parser \ -w packages/event-handler check-examples: diff --git a/.husky/pre-push b/.husky/pre-push index a011532b30..936e9022be 100755 --- a/.husky/pre-push +++ b/.husky/pre-push @@ -1,5 +1,4 @@ npm t \ - -w packages/jmespath \ -w packages/logger \ -w packages/metrics \ -w packages/tracer \ diff --git a/packages/jmespath/jest.config.cjs b/packages/jmespath/jest.config.cjs deleted file mode 100644 index 9b345debe4..0000000000 --- a/packages/jmespath/jest.config.cjs +++ /dev/null @@ -1,34 +0,0 @@ -module.exports = { - displayName: { - name: 'Powertools for AWS Lambda (TypeScript) utility: JMESPATH', - color: 'purple', - }, - runner: 'groups', - moduleNameMapper: { - '^(\\.{1,2}/.*)\\.js$': '$1', - }, - transform: { - '^.+\\.ts?$': 'ts-jest', - }, - moduleFileExtensions: ['js', 'ts'], - collectCoverageFrom: ['**/src/**/*.ts', '!**/node_modules/**'], - testMatch: ['**/?(*.)+(spec|test).ts'], - roots: ['/src', '/tests'], - testPathIgnorePatterns: ['/node_modules/'], - testEnvironment: 'node', - coveragePathIgnorePatterns: [ - '/node_modules/', - 'src/index.ts', - 'src/types/index.ts', - ], - coverageThreshold: { - global: { - statements: 100, - branches: 100, - functions: 100, - lines: 100, - }, - }, - coverageReporters: ['json-summary', 'text', 'lcov'], - setupFiles: ['/tests/helpers/populateEnvironmentVariables.ts'], -}; diff --git a/packages/jmespath/package.json b/packages/jmespath/package.json index 3e7b349458..209c7f363c 100644 --- a/packages/jmespath/package.json +++ b/packages/jmespath/package.json @@ -10,11 +10,11 @@ "access": "public" }, "scripts": { - "test": "npm run test:unit", - "test:unit": "jest --group=unit --detectOpenHandles --coverage", - "jest": "jest --detectOpenHandles --verbose", + "test": "vitest --run", + "test:unit": "vitest --run", + "test:unit:coverage": "vitest --run tests/unit --coverage.enabled --coverage.thresholds.100 --coverage.include='src/**'", + "test:unit:types": "echo 'Not applicable for this package'", "test:e2e": "echo 'Not applicable for this package'", - "watch": "jest --watch --group=unit", "build:cjs": "tsc --build tsconfig.json && echo '{ \"type\": \"commonjs\" }' > lib/cjs/package.json", "build:esm": "tsc --build tsconfig.esm.json && echo '{ \"type\": \"module\" }' > lib/esm/package.json", "build": "npm run build:esm & npm run build:cjs", diff --git a/packages/jmespath/tests/helpers/populateEnvironmentVariables.ts b/packages/jmespath/tests/helpers/populateEnvironmentVariables.ts deleted file mode 100644 index a6715813ef..0000000000 --- a/packages/jmespath/tests/helpers/populateEnvironmentVariables.ts +++ /dev/null @@ -1 +0,0 @@ -// Powertools for AWS Lambda (TypeScript) variables diff --git a/packages/jmespath/tests/unit/compliance/base.test.ts b/packages/jmespath/tests/unit/compliance/base.test.ts index 9626938593..0c75f6dbd1 100644 --- a/packages/jmespath/tests/unit/compliance/base.test.ts +++ b/packages/jmespath/tests/unit/compliance/base.test.ts @@ -1,8 +1,4 @@ -/** - * Test Compliance with the JMESPath specification - * - * @group unit/jmespath/compliance/base - */ +import { describe, expect, it } from 'vitest'; import { search } from '../../../src/index.js'; describe('Base tests', () => { diff --git a/packages/jmespath/tests/unit/compliance/boolean.test.ts b/packages/jmespath/tests/unit/compliance/boolean.test.ts index 0cc90f80a7..bf39dd6803 100644 --- a/packages/jmespath/tests/unit/compliance/boolean.test.ts +++ b/packages/jmespath/tests/unit/compliance/boolean.test.ts @@ -1,8 +1,4 @@ -/** - * Test Compliance with the JMESPath specification - * - * @group unit/jmespath/compliance/boolean - */ +import { describe, expect, it } from 'vitest'; import { search } from '../../../src/index.js'; describe('Boolean tests', () => { diff --git a/packages/jmespath/tests/unit/compliance/current.test.ts b/packages/jmespath/tests/unit/compliance/current.test.ts index 58bf29bec3..3eeb565111 100644 --- a/packages/jmespath/tests/unit/compliance/current.test.ts +++ b/packages/jmespath/tests/unit/compliance/current.test.ts @@ -1,8 +1,4 @@ -/** - * Test Compliance with the JMESPath specification - * - * @group unit/jmespath/compliance/current - */ +import { describe, expect, it } from 'vitest'; import { search } from '../../../src/index.js'; describe('Current operator tests', () => { diff --git a/packages/jmespath/tests/unit/compliance/escape.test.ts b/packages/jmespath/tests/unit/compliance/escape.test.ts index 0bfa2345fd..8e1ed35ccb 100644 --- a/packages/jmespath/tests/unit/compliance/escape.test.ts +++ b/packages/jmespath/tests/unit/compliance/escape.test.ts @@ -1,8 +1,4 @@ -/** - * Test Compliance with the JMESPath specification - * - * @group unit/jmespath/compliance/escape - */ +import { describe, expect, it } from 'vitest'; import { search } from '../../../src/index.js'; describe('Escape characters tests', () => { diff --git a/packages/jmespath/tests/unit/compliance/filters.test.ts b/packages/jmespath/tests/unit/compliance/filters.test.ts index 3f337208de..8e2d7154d1 100644 --- a/packages/jmespath/tests/unit/compliance/filters.test.ts +++ b/packages/jmespath/tests/unit/compliance/filters.test.ts @@ -1,8 +1,4 @@ -/** - * Test Compliance with the JMESPath specification - * - * @group unit/jmespath/compliance/filters - */ +import { describe, expect, it } from 'vitest'; import { search } from '../../../src/index.js'; describe('Filer operator tests', () => { diff --git a/packages/jmespath/tests/unit/compliance/functions.test.ts b/packages/jmespath/tests/unit/compliance/functions.test.ts index b892fcd225..33244946c4 100644 --- a/packages/jmespath/tests/unit/compliance/functions.test.ts +++ b/packages/jmespath/tests/unit/compliance/functions.test.ts @@ -1,8 +1,4 @@ -/** - * Test Compliance with the JMESPath specification - * - * @group unit/jmespath/compliance/functions - */ +import { describe, expect, it } from 'vitest'; import { search } from '../../../src/index.js'; describe('Functions tests', () => { diff --git a/packages/jmespath/tests/unit/compliance/identifiers.test.ts b/packages/jmespath/tests/unit/compliance/identifiers.test.ts index bd3eed3c1d..852e310ed7 100644 --- a/packages/jmespath/tests/unit/compliance/identifiers.test.ts +++ b/packages/jmespath/tests/unit/compliance/identifiers.test.ts @@ -1,8 +1,4 @@ -/** - * Test Compliance with the JMESPath specification - * - * @group unit/jmespath/compliance/identifiers - */ +import { describe, expect, it } from 'vitest'; import { search } from '../../../src/index.js'; describe('Identifiers tests', () => { diff --git a/packages/jmespath/tests/unit/compliance/indices.test.ts b/packages/jmespath/tests/unit/compliance/indices.test.ts index 44d4874a9a..74f9927128 100644 --- a/packages/jmespath/tests/unit/compliance/indices.test.ts +++ b/packages/jmespath/tests/unit/compliance/indices.test.ts @@ -1,8 +1,4 @@ -/** - * Test Compliance with the JMESPath specification - * - * @group unit/jmespath/compliance/indices - */ +import { describe, expect, it } from 'vitest'; import { search } from '../../../src/index.js'; describe('Indices tests', () => { diff --git a/packages/jmespath/tests/unit/compliance/literal.test.ts b/packages/jmespath/tests/unit/compliance/literal.test.ts index d2d95495f7..b94716c3d3 100644 --- a/packages/jmespath/tests/unit/compliance/literal.test.ts +++ b/packages/jmespath/tests/unit/compliance/literal.test.ts @@ -1,8 +1,4 @@ -/** - * Test Compliance with the JMESPath specification - * - * @group unit/jmespath/compliance/literal - */ +import { describe, expect, it } from 'vitest'; import { search } from '../../../src/index.js'; describe('Literal expressions tests', () => { diff --git a/packages/jmespath/tests/unit/compliance/multiselect.test.ts b/packages/jmespath/tests/unit/compliance/multiselect.test.ts index 52e81964d8..0c72cd7275 100644 --- a/packages/jmespath/tests/unit/compliance/multiselect.test.ts +++ b/packages/jmespath/tests/unit/compliance/multiselect.test.ts @@ -1,8 +1,4 @@ -/** - * Test Compliance with the JMESPath specification - * - * @group unit/jmespath/compliance/multiselect - */ +import { describe, expect, it } from 'vitest'; import { search } from '../../../src/index.js'; describe('Multiselect expressions tests', () => { diff --git a/packages/jmespath/tests/unit/compliance/pipe.test.ts b/packages/jmespath/tests/unit/compliance/pipe.test.ts index e1ad54dfe6..963bbc9264 100644 --- a/packages/jmespath/tests/unit/compliance/pipe.test.ts +++ b/packages/jmespath/tests/unit/compliance/pipe.test.ts @@ -1,8 +1,4 @@ -/** - * Test Compliance with the JMESPath specification - * - * @group unit/jmespath/compliance/pipe - */ +import { describe, expect, it } from 'vitest'; import { search } from '../../../src/index.js'; describe('Pipe expressions tests', () => { diff --git a/packages/jmespath/tests/unit/compliance/slice.test.ts b/packages/jmespath/tests/unit/compliance/slice.test.ts index 5221effdaa..9807fcb004 100644 --- a/packages/jmespath/tests/unit/compliance/slice.test.ts +++ b/packages/jmespath/tests/unit/compliance/slice.test.ts @@ -1,8 +1,4 @@ -/** - * Test Compliance with the JMESPath specification - * - * @group unit/jmespath/compliance/slice - */ +import { describe, expect, it } from 'vitest'; import { search } from '../../../src/index.js'; describe('Slices tests', () => { diff --git a/packages/jmespath/tests/unit/compliance/syntax.test.ts b/packages/jmespath/tests/unit/compliance/syntax.test.ts index bd7834b63f..b606b5f100 100644 --- a/packages/jmespath/tests/unit/compliance/syntax.test.ts +++ b/packages/jmespath/tests/unit/compliance/syntax.test.ts @@ -1,8 +1,4 @@ -/** - * Test Compliance with the JMESPath specification - * - * @group unit/jmespath/compliance/syntax - */ +import { describe, expect, it } from 'vitest'; import { search } from '../../../src/index.js'; describe('Syntax tests', () => { diff --git a/packages/jmespath/tests/unit/compliance/unicode.test.ts b/packages/jmespath/tests/unit/compliance/unicode.test.ts index 29e0521349..ae64493eeb 100644 --- a/packages/jmespath/tests/unit/compliance/unicode.test.ts +++ b/packages/jmespath/tests/unit/compliance/unicode.test.ts @@ -1,8 +1,4 @@ -/** - * Test Compliance with the JMESPath specification - * - * @group unit/jmespath/compliance/unicode - */ +import { describe, expect, it } from 'vitest'; import { search } from '../../../src/index.js'; describe('Unicode tests', () => { diff --git a/packages/jmespath/tests/unit/compliance/wildcard.test.ts b/packages/jmespath/tests/unit/compliance/wildcard.test.ts index c472591008..6cd31c9e84 100644 --- a/packages/jmespath/tests/unit/compliance/wildcard.test.ts +++ b/packages/jmespath/tests/unit/compliance/wildcard.test.ts @@ -1,8 +1,4 @@ -/** - * Test Compliance with the JMESPath specification - * - * @group unit/jmespath/compliance/wildcard - */ +import { describe, expect, it } from 'vitest'; import { search } from '../../../src/index.js'; describe('Wildcard tests', () => { diff --git a/packages/jmespath/tests/unit/index.test.ts b/packages/jmespath/tests/unit/index.test.ts index 9522e526c9..7b25c566e1 100644 --- a/packages/jmespath/tests/unit/index.test.ts +++ b/packages/jmespath/tests/unit/index.test.ts @@ -1,10 +1,6 @@ -/** - * Test Compliance with the JMESPath specification - * - * @group unit/jmespath/coverage - */ import { brotliDecompressSync } from 'node:zlib'; import { fromBase64 } from '@aws-lambda-powertools/commons/utils/base64'; +import { describe, expect, it } from 'vitest'; import { Functions } from '../../src/Functions.js'; import { Parser } from '../../src/Parser.js'; import { PowertoolsFunctions } from '../../src/PowertoolsFunctions.js'; diff --git a/packages/jmespath/vitest.config.ts b/packages/jmespath/vitest.config.ts new file mode 100644 index 0000000000..d5aa737c68 --- /dev/null +++ b/packages/jmespath/vitest.config.ts @@ -0,0 +1,7 @@ +import { defineProject } from 'vitest/config'; + +export default defineProject({ + test: { + environment: 'node', + }, +}); diff --git a/vitest.config.ts b/vitest.config.ts index 241b69b7be..54cf34dc82 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -17,7 +17,7 @@ export default defineConfig({ 'packages/commons/src/types/**', 'packages/event-handler/**', 'packages/idempotency/**', - 'packages/jmespath/**', + 'packages/jmespath/src/types.ts', 'packages/logger/**', 'packages/metrics/**', 'packages/parameters/**', From 321b4f8aba51606c7f670dbbf5a25300d7ea5732 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 17 Sep 2024 15:57:32 +0200 Subject: [PATCH 06/52] chore(deps): bump vscode/devcontainers/javascript-node from `f1e8fdc` to `b303046` in /.devcontainer (#3080) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .devcontainer/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index a64529d442..b202a53f80 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,5 +1,5 @@ # See here for image contents: https://github.com/microsoft/vscode-dev-containers/blob/v0.212.0/containers/javascript-node/.devcontainer/base.Dockerfile -FROM mcr.microsoft.com/vscode/devcontainers/javascript-node@sha256:f1e8fdca29c437891d8d793bf59d368e4c1850884c22161f7401086da63332d4 +FROM mcr.microsoft.com/vscode/devcontainers/javascript-node@sha256:b3030464fe18c02840992f9b0b46422e0ea3589a424c9617efda22b71308f023 # Install fnm to manage Node.js versions RUN curl -fsSL https://fnm.vercel.app/install -o /tmp/install \ From 59a464f783ea66cb2a1de974536cb7cd6bf232c0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Sep 2024 09:31:11 +0200 Subject: [PATCH 07/52] chore(deps): bump vite from 5.4.5 to 5.4.6 (#3081) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1af6b3d50b..9e936b9c31 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16366,9 +16366,9 @@ } }, "node_modules/vite": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.5.tgz", - "integrity": "sha512-pXqR0qtb2bTwLkev4SE3r4abCNioP3GkjvIDLlzziPpXtHgiJIjuKl+1GN6ESOT3wMjG3JTeARopj2SwYaHTOA==", + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.6.tgz", + "integrity": "sha512-IeL5f8OO5nylsgzd9tq4qD2QqI0k2CQLGrWD0rCN0EQJZpBK5vJAx0I+GDkMOXxQX/OfFHMuLIx6ddAxGX/k+Q==", "dev": true, "dependencies": { "esbuild": "^0.21.3", From f5cb6aca1c7e16386010d22d6187c656a1ac6ad8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Sep 2024 09:45:20 +0200 Subject: [PATCH 08/52] chore(deps-dev): bump @faker-js/faker from 9.0.0 to 9.0.1 (#3075) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- packages/parser/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9e936b9c31..f5ef636d03 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2430,9 +2430,9 @@ } }, "node_modules/@faker-js/faker": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-9.0.0.tgz", - "integrity": "sha512-dTDHJSmz6c1OJ6HO7jiUiIb4sB20Dlkb3pxYsKm0qTXm2Bmj97rlXIhlvaFsW2rvCi+OLlwKLVSS6ZxFUVZvjQ==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-9.0.1.tgz", + "integrity": "sha512-4mDeYIgM3By7X6t5E6eYwLAa+2h4DeZDF7thhzIg6XB76jeEvMwadYAMCFJL/R4AnEBcAUO9+gL0vhy3s+qvZA==", "dev": true, "funding": [ { @@ -17436,7 +17436,7 @@ "license": "MIT-0", "devDependencies": { "@anatine/zod-mock": "^3.13.3", - "@faker-js/faker": "^9.0.0" + "@faker-js/faker": "^9.0.1" }, "peerDependencies": { "@middy/core": "4.x || 5.x", diff --git a/packages/parser/package.json b/packages/parser/package.json index aee47afb8f..45cb85fa2a 100644 --- a/packages/parser/package.json +++ b/packages/parser/package.json @@ -362,6 +362,6 @@ }, "devDependencies": { "@anatine/zod-mock": "^3.13.3", - "@faker-js/faker": "^9.0.0" + "@faker-js/faker": "^9.0.1" } } From bd30f065fb02e56ddc7ee594d97297a377ca4dae Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 19 Sep 2024 09:22:45 +0200 Subject: [PATCH 09/52] chore(deps): bump mkdocs-material from 9.5.34 to 9.5.35 in /docs (#3084) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/requirements.in | 2 +- docs/requirements.txt | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/requirements.in b/docs/requirements.in index 0469039b8e..3cbc4afbd6 100644 --- a/docs/requirements.in +++ b/docs/requirements.in @@ -1,4 +1,4 @@ mike==1.1.2 -mkdocs-material==9.5.34 +mkdocs-material==9.5.35 mkdocs-git-revision-date-plugin==0.3.2 mkdocs-exclude==1.0.2 \ No newline at end of file diff --git a/docs/requirements.txt b/docs/requirements.txt index 4ab3170c59..04767dfa2f 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -235,9 +235,9 @@ mkdocs-get-deps==0.2.0 \ mkdocs-git-revision-date-plugin==0.3.2 \ --hash=sha256:2e67956cb01823dd2418e2833f3623dee8604cdf223bddd005fe36226a56f6ef # via -r requirements.in -mkdocs-material==9.5.34 \ - --hash=sha256:1e60ddf716cfb5679dfd65900b8a25d277064ed82d9a53cd5190e3f894df7840 \ - --hash=sha256:54caa8be708de2b75167fd4d3b9f3d949579294f49cb242515d4653dbee9227e +mkdocs-material==9.5.35 \ + --hash=sha256:0d233d7db067ac896bf22ee7950eebf2b1eaf26c155bb27382bf4174021cc117 \ + --hash=sha256:44e069d87732d29f4a2533ae0748fa0e67e270043270c71f04d0fba11a357b24 # via -r requirements.in mkdocs-material-extensions==1.3.1 \ --hash=sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443 \ From 1a65746cf75772f6d41088e5edc420ad3dc9aeb3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 19 Sep 2024 09:32:48 +0200 Subject: [PATCH 10/52] chore(deps): bump squidfunk/mkdocs-material from `a2e3a31` to `2a70399` in /docs (#3082) --- docs/Dockerfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/Dockerfile b/docs/Dockerfile index af74ee7509..c8066d6c1b 100644 --- a/docs/Dockerfile +++ b/docs/Dockerfile @@ -1,5 +1,5 @@ -# version 9.5.2 -FROM squidfunk/mkdocs-material@sha256:a2e3a31c00cfe1dd2dae83ba21dbfa2c04aee2fa2414275c230c27b91a4eda09 +# version 9.5.35 +FROM squidfunk/mkdocs-material@sha256:2a703999163cdb8257a85849fb2d39914a82587769f95c297bb3f01acf72a609 COPY requirements.txt /tmp/ -RUN pip install --require-hashes -r /tmp/requirements.txt \ No newline at end of file +RUN pip install --require-hashes -r /tmp/requirements.txt From f7c176901a36698f591d897c2abde54cf30c9ea9 Mon Sep 17 00:00:00 2001 From: Asifur Rahman Arnab Date: Thu, 19 Sep 2024 23:33:32 +0600 Subject: [PATCH 11/52] feat(idempotency): manipulate idempotent response via response hook (#3071) Co-authored-by: Alexander Schueren Co-authored-by: Andrea Amorosi --- docs/utilities/idempotency.md | 71 +++++++++++++++ ...ingWithResponseHookIdempotentResponse.json | 8 ++ .../workingWithResponseHookSampleEvent.json | 4 + .../idempotency/workingWithResponseHook.ts | 58 ++++++++++++ packages/idempotency/src/IdempotencyConfig.ts | 10 ++- .../idempotency/src/IdempotencyHandler.ts | 17 ++-- .../src/types/IdempotencyOptions.ts | 14 +++ packages/idempotency/src/types/index.ts | 1 + .../tests/unit/IdempotencyHandler.test.ts | 90 ++++++++++++++++++- 9 files changed, 263 insertions(+), 10 deletions(-) create mode 100644 examples/snippets/idempotency/samples/workingWithResponseHookIdempotentResponse.json create mode 100644 examples/snippets/idempotency/samples/workingWithResponseHookSampleEvent.json create mode 100644 examples/snippets/idempotency/workingWithResponseHook.ts diff --git a/docs/utilities/idempotency.md b/docs/utilities/idempotency.md index 1c6395db29..e14fe864fb 100644 --- a/docs/utilities/idempotency.md +++ b/docs/utilities/idempotency.md @@ -373,6 +373,40 @@ sequenceDiagram Idempotent successful request cached +#### Successful request with responseHook configured + +
+```mermaid +sequenceDiagram + participant Client + participant Lambda + participant Response hook + participant Persistence Layer + alt initial request + Client->>Lambda: Invoke (event) + Lambda->>Persistence Layer: Get or set idempotency_key=hash(payload) + activate Persistence Layer + Note over Lambda,Persistence Layer: Set record status to INPROGRESS.
Prevents concurrent invocations
with the same payload + Lambda-->>Lambda: Call your function + Lambda->>Persistence Layer: Update record with result + deactivate Persistence Layer + Persistence Layer-->>Persistence Layer: Update record + Note over Lambda,Persistence Layer: Set record status to COMPLETE.
New invocations with the same payload
now return the same result + Lambda-->>Client: Response sent to client + else retried request + Client->>Lambda: Invoke (event) + Lambda->>Persistence Layer: Get or set idempotency_key=hash(payload) + activate Persistence Layer + Persistence Layer-->>Response hook: Already exists in persistence layer. + deactivate Persistence Layer + Note over Response hook,Persistence Layer: Record status is COMPLETE and not expired + Response hook->>Lambda: Response hook invoked + Lambda-->>Client: Manipulated idempotent response sent to client + end +``` +Successful idempotent request with a response hook +
+ #### Expired idempotency records
@@ -544,6 +578,7 @@ Idempotent decorator can be further configured with **`IdempotencyConfig`** as s | **useLocalCache** | `false` | Whether to locally cache idempotency results | | **localCacheMaxItems** | 256 | Max number of items to store in local cache | | **hashFunction** | `md5` | Function to use for calculating hashes, as provided by the [crypto](https://nodejs.org/api/crypto.html#cryptocreatehashalgorithm-options){target="_blank"} module in the standard library. | +| **responseHook** | `undefined` | Function to use for processing the stored Idempotent response. This function hook is called when an existing idempotent response is found. See [Manipulating The Idempotent Response](idempotency.md#manipulating-the-idempotent-response) | ### Handling concurrent executions with the same payload @@ -744,6 +779,42 @@ Below an example implementation of a custom persistence layer backed by a generi For example, the `_putRecord()` method needs to throw an error if a non-expired record already exists in the data store with a matching key. +### Manipulating the Idempotent Response + +You can set up a `responseHook` in the `IdempotentConfig` class to manipulate the returned data when an operation is idempotent. The hook function will be called with the current deserialized response object and the Idempotency record. + +=== "Using an Idempotent Response Hook" + + ```typescript hl_lines="16 19 27 56" + --8<-- "examples/snippets/idempotency/workingWithResponseHook.ts" + ``` + +=== "Sample event" + + ```json + --8<-- "examples/snippets/idempotency/samples/workingWithResponseHookSampleEvent.json" + ``` + +=== "Sample Idempotent response" + + ```json hl_lines="6" + --8<-- "examples/snippets/idempotency/samples/workingWithResponseHookIdempotentResponse.json" + ``` + +???+ info "Info: Using custom de-serialization?" + + The responseHook is called after the custom de-serialization so the payload you process will be the de-serialized version. + +#### Being a good citizen + +When using response hooks to manipulate returned data from idempotent operations, it's important to follow best practices to avoid introducing complexity or issues. Keep these guidelines in mind: + +1. **Response hook works exclusively when operations are idempotent.** The hook will not be called when an operation is not idempotent, or when the idempotent logic fails. + +2. **Catch and Handle Exceptions.** Your response hook code should catch and handle any exceptions that may arise from your logic. Unhandled exceptions will cause the Lambda function to fail unexpectedly. + +3. **Keep Hook Logic Simple** Response hooks should consist of minimal and straightforward logic for manipulating response data. Avoid complex conditional branching and aim for hooks that are easy to reason about. + ## Testing your code The idempotency utility provides several routes to test your code. diff --git a/examples/snippets/idempotency/samples/workingWithResponseHookIdempotentResponse.json b/examples/snippets/idempotency/samples/workingWithResponseHookIdempotentResponse.json new file mode 100644 index 0000000000..0c7e1abdae --- /dev/null +++ b/examples/snippets/idempotency/samples/workingWithResponseHookIdempotentResponse.json @@ -0,0 +1,8 @@ +{ + "message": "success", + "paymentId": "31a964eb-7477-4fe1-99fe-7f8a6a351a7e", + "statusCode": 200, + "headers": { + "x-idempotency-key": "function-name#mHfGv2vJ8h+ZvLIr/qGBbQ==" + } + } \ No newline at end of file diff --git a/examples/snippets/idempotency/samples/workingWithResponseHookSampleEvent.json b/examples/snippets/idempotency/samples/workingWithResponseHookSampleEvent.json new file mode 100644 index 0000000000..40a46dcbf4 --- /dev/null +++ b/examples/snippets/idempotency/samples/workingWithResponseHookSampleEvent.json @@ -0,0 +1,4 @@ +{ + "user": "John Doe", + "productId": "123456" +} \ No newline at end of file diff --git a/examples/snippets/idempotency/workingWithResponseHook.ts b/examples/snippets/idempotency/workingWithResponseHook.ts new file mode 100644 index 0000000000..e24509ba06 --- /dev/null +++ b/examples/snippets/idempotency/workingWithResponseHook.ts @@ -0,0 +1,58 @@ +import { randomUUID } from 'node:crypto'; +import type { JSONValue } from '@aws-lambda-powertools/commons/types'; +import { + IdempotencyConfig, + makeIdempotent, +} from '@aws-lambda-powertools/idempotency'; +import { DynamoDBPersistenceLayer } from '@aws-lambda-powertools/idempotency/dynamodb'; +import type { IdempotencyRecord } from '@aws-lambda-powertools/idempotency/persistence'; +import type { Context } from 'aws-lambda'; +import type { Request, Response, SubscriptionResult } from './types.js'; + +const persistenceStore = new DynamoDBPersistenceLayer({ + tableName: 'idempotencyTableName', +}); + +const responseHook = (response: JSONValue, record: IdempotencyRecord) => { + // Return inserted Header data into the Idempotent Response + (response as Response).headers = { + 'x-idempotency-key': record.idempotencyKey, + }; + + // Must return the response here + return response as JSONValue; +}; + +const config = new IdempotencyConfig({ + responseHook, +}); + +const createSubscriptionPayment = async ( + event: Request +): Promise => { + // ... create payment + return { + id: randomUUID(), + productId: event.productId, + }; +}; + +export const handler = makeIdempotent( + async (event: Request, _context: Context): Promise => { + try { + const payment = await createSubscriptionPayment(event); + + return { + paymentId: payment.id, + message: 'success', + statusCode: 200, + }; + } catch (error) { + throw new Error('Error creating payment'); + } + }, + { + persistenceStore, + config, + } +); diff --git a/packages/idempotency/src/IdempotencyConfig.ts b/packages/idempotency/src/IdempotencyConfig.ts index 043fa828f8..84e943d8ce 100644 --- a/packages/idempotency/src/IdempotencyConfig.ts +++ b/packages/idempotency/src/IdempotencyConfig.ts @@ -2,7 +2,10 @@ import { PowertoolsFunctions } from '@aws-lambda-powertools/jmespath/functions'; import type { JMESPathParsingOptions } from '@aws-lambda-powertools/jmespath/types'; import type { Context } from 'aws-lambda'; import { EnvironmentVariablesService } from './config/EnvironmentVariablesService.js'; -import type { IdempotencyConfigOptions } from './types/IdempotencyOptions.js'; +import type { + IdempotencyConfigOptions, + ResponseHook, +} from './types/IdempotencyOptions.js'; /** * Configuration for the idempotency feature. @@ -52,6 +55,10 @@ class IdempotencyConfig { * @default false */ public throwOnNoIdempotencyKey: boolean; + /** + * A hook that runs when an idempotent request is made. + */ + public responseHook?: ResponseHook; /** * Use the local cache to store idempotency keys. @@ -70,6 +77,7 @@ class IdempotencyConfig { this.maxLocalCacheSize = config.maxLocalCacheSize ?? 1000; this.hashFunction = config.hashFunction ?? 'md5'; this.lambdaContext = config.lambdaContext; + this.responseHook = config.responseHook; this.#envVarsService = new EnvironmentVariablesService(); this.#enabled = this.#envVarsService.getIdempotencyEnabled(); } diff --git a/packages/idempotency/src/IdempotencyHandler.ts b/packages/idempotency/src/IdempotencyHandler.ts index 4dcfa03def..3c64a92a6b 100644 --- a/packages/idempotency/src/IdempotencyHandler.ts +++ b/packages/idempotency/src/IdempotencyHandler.ts @@ -87,12 +87,14 @@ export class IdempotencyHandler { /** * Takes an idempotency key and returns the idempotency record from the persistence layer. * + * If a response hook is provided in the idempotency configuration, it will be called before returning the response. + * * If the idempotency record is not COMPLETE, then it will throw an error based on the status of the record. * * @param idempotencyRecord The idempotency record stored in the persistence layer * @returns The result of the function if the idempotency record is in a terminal state */ - public static determineResultFromIdempotencyRecord( + public determineResultFromIdempotencyRecord( idempotencyRecord: IdempotencyRecord ): JSONValue { if (idempotencyRecord.getStatus() === IdempotencyRecordStatus.EXPIRED) { @@ -115,7 +117,14 @@ export class IdempotencyHandler { ); } - return idempotencyRecord.getResponse(); + const response = idempotencyRecord.getResponse(); + + // If a response hook is provided, call it to allow the user to modify the response + if (this.#idempotencyConfig.responseHook) { + return this.#idempotencyConfig.responseHook(response, idempotencyRecord); + } + + return response; } /** @@ -381,9 +390,7 @@ export class IdempotencyHandler { returnValue.isIdempotent = true; returnValue.result = - IdempotencyHandler.determineResultFromIdempotencyRecord( - idempotencyRecord - ); + this.determineResultFromIdempotencyRecord(idempotencyRecord); return returnValue; } diff --git a/packages/idempotency/src/types/IdempotencyOptions.ts b/packages/idempotency/src/types/IdempotencyOptions.ts index 99736c6e22..b9ca069fc9 100644 --- a/packages/idempotency/src/types/IdempotencyOptions.ts +++ b/packages/idempotency/src/types/IdempotencyOptions.ts @@ -2,6 +2,7 @@ import type { JSONValue } from '@aws-lambda-powertools/commons/types'; import type { Context, Handler } from 'aws-lambda'; import type { IdempotencyConfig } from '../IdempotencyConfig.js'; import type { BasePersistenceLayer } from '../persistence/BasePersistenceLayer.js'; +import type { IdempotencyRecord } from '../persistence/IdempotencyRecord.js'; /** * Configuration options for the idempotency utility. @@ -147,6 +148,14 @@ type IdempotencyHandlerOptions = { thisArg?: Handler; }; +/** + * A hook that runs when an idempotent request is made. + */ +type ResponseHook = ( + response: JSONValue, + record: IdempotencyRecord +) => JSONValue; + /** * Idempotency configuration options */ @@ -183,6 +192,10 @@ type IdempotencyConfigOptions = { * AWS Lambda Context object containing information about the current invocation, function, and execution environment */ lambdaContext?: Context; + /** + * A hook that runs when an idempotent request is made + */ + responseHook?: ResponseHook; }; export type { @@ -191,4 +204,5 @@ export type { ItempotentFunctionOptions, IdempotencyLambdaHandlerOptions, IdempotencyHandlerOptions, + ResponseHook, }; diff --git a/packages/idempotency/src/types/index.ts b/packages/idempotency/src/types/index.ts index c390a7d185..0158d7855b 100644 --- a/packages/idempotency/src/types/index.ts +++ b/packages/idempotency/src/types/index.ts @@ -12,6 +12,7 @@ export type { IdempotencyHandlerOptions, ItempotentFunctionOptions, AnyFunction, + ResponseHook, } from './IdempotencyOptions.js'; export type { DynamoDBPersistenceOptions, diff --git a/packages/idempotency/tests/unit/IdempotencyHandler.test.ts b/packages/idempotency/tests/unit/IdempotencyHandler.test.ts index 89e0f91d10..7c5f218a1a 100644 --- a/packages/idempotency/tests/unit/IdempotencyHandler.test.ts +++ b/packages/idempotency/tests/unit/IdempotencyHandler.test.ts @@ -1,3 +1,4 @@ +import type { JSONValue } from '@aws-lambda-powertools/commons/types'; import { IdempotencyHandler } from '../../src/IdempotencyHandler.js'; import { IdempotencyRecordStatus, MAX_RETRIES } from '../../src/constants.js'; import { @@ -16,12 +17,17 @@ import { IdempotencyRecord } from '../../src/persistence/index.js'; import { PersistenceLayerTestClass } from '../helpers/idempotencyUtils.js'; const mockFunctionToMakeIdempotent = jest.fn(); +const mockResponseHook = jest + .fn() + .mockImplementation((response, record) => response); const mockFunctionPayloadToBeHashed = {}; const persistenceStore = new PersistenceLayerTestClass(); const mockIdempotencyOptions = { persistenceStore, dataKeywordArgument: 'testKeywordArgument', - config: new IdempotencyConfig({}), + config: new IdempotencyConfig({ + responseHook: mockResponseHook, + }), }; const idempotentHandler = new IdempotencyHandler({ @@ -64,8 +70,9 @@ describe('Class IdempotencyHandler', () => { expect(stubRecord.isExpired()).toBe(false); expect(stubRecord.getStatus()).toBe(IdempotencyRecordStatus.INPROGRESS); expect(() => - IdempotencyHandler.determineResultFromIdempotencyRecord(stubRecord) + idempotentHandler.determineResultFromIdempotencyRecord(stubRecord) ).toThrow(IdempotencyAlreadyInProgressError); + expect(mockResponseHook).not.toHaveBeenCalled(); }); test('when record is in progress and outside expiry window, it rejects with IdempotencyInconsistentStateError', async () => { @@ -83,8 +90,9 @@ describe('Class IdempotencyHandler', () => { expect(stubRecord.isExpired()).toBe(false); expect(stubRecord.getStatus()).toBe(IdempotencyRecordStatus.INPROGRESS); expect(() => - IdempotencyHandler.determineResultFromIdempotencyRecord(stubRecord) + idempotentHandler.determineResultFromIdempotencyRecord(stubRecord) ).toThrow(IdempotencyInconsistentStateError); + expect(mockResponseHook).not.toHaveBeenCalled(); }); test('when record is expired, it rejects with IdempotencyInconsistentStateError', async () => { @@ -102,8 +110,82 @@ describe('Class IdempotencyHandler', () => { expect(stubRecord.isExpired()).toBe(true); expect(stubRecord.getStatus()).toBe(IdempotencyRecordStatus.EXPIRED); expect(() => - IdempotencyHandler.determineResultFromIdempotencyRecord(stubRecord) + idempotentHandler.determineResultFromIdempotencyRecord(stubRecord) ).toThrow(IdempotencyInconsistentStateError); + expect(mockResponseHook).not.toHaveBeenCalled(); + }); + + test('when response hook is provided, it should should call responseHook during an idempotent request', () => { + // Prepare + const stubRecord = new IdempotencyRecord({ + idempotencyKey: 'idempotencyKey', + responseData: { responseData: 'responseData' }, + payloadHash: 'payloadHash', + status: IdempotencyRecordStatus.COMPLETED, + }); + + // Act + idempotentHandler.determineResultFromIdempotencyRecord(stubRecord); + + // Assess + expect(mockResponseHook).toHaveBeenCalled(); + }); + + test('when response hook is provided, it can manipulate response during an idempotent request', () => { + // Prepare + interface HandlerResponse { + message: string; + statusCode: number; + headers?: Record; + } + + const responseHook = jest + .fn() + .mockImplementation( + (response: JSONValue, record: IdempotencyRecord) => { + const handlerResponse = response as unknown as HandlerResponse; + handlerResponse.headers = { + 'x-idempotency-key': record.idempotencyKey, + }; + return handlerResponse as unknown as JSONValue; + } + ); + + const idempotentHandler = new IdempotencyHandler({ + functionToMakeIdempotent: mockFunctionToMakeIdempotent, + functionPayloadToBeHashed: mockFunctionPayloadToBeHashed, + persistenceStore: mockIdempotencyOptions.persistenceStore, + functionArguments: [], + idempotencyConfig: new IdempotencyConfig({ + responseHook, + }), + }); + + const responseData = { + message: 'Original message', + statusCode: 200, + }; + + const stubRecord = new IdempotencyRecord({ + idempotencyKey: 'test-key', + responseData, + payloadHash: 'payloadHash', + status: IdempotencyRecordStatus.COMPLETED, + }); + + // Act + const result = + idempotentHandler.determineResultFromIdempotencyRecord(stubRecord); + + // Assess + expect(responseHook).toHaveBeenCalledWith(responseData, stubRecord); + expect(result).toEqual({ + message: 'Original message', + statusCode: 200, + headers: { + 'x-idempotency-key': 'test-key', + }, + }); }); }); From 07e836f3cf9cf00371df22a4d204e4ab2dfbb139 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 20 Sep 2024 10:18:52 +0200 Subject: [PATCH 12/52] chore(deps): bump github/codeql-action from 3.26.7 to 3.26.8 (#3087) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Andrea Amorosi --- .github/workflows/ossf_scorecard.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ossf_scorecard.yml b/.github/workflows/ossf_scorecard.yml index ec9dddde80..5817e187bb 100644 --- a/.github/workflows/ossf_scorecard.yml +++ b/.github/workflows/ossf_scorecard.yml @@ -43,6 +43,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@8214744c546c1e5c8f03dde8fab3a7353211988d # v3.26.7 + uses: github/codeql-action/upload-sarif@294a9d92911152fe08befb9ec03e240add280cb3 # v3.26.8 with: sarif_file: results.sarif From 49654d2915975723b0881aedf4090a49df156393 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 20 Sep 2024 11:59:52 +0200 Subject: [PATCH 13/52] chore(deps): bump the aws-sdk-v3 group across 1 directory with 9 updates (#3090) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Andrea Amorosi --- examples/app/package.json | 4 +- examples/snippets/package.json | 10 +- package-lock.json | 1538 ++++++++++++++--------------- packages/idempotency/package.json | 4 +- packages/metrics/package.json | 2 +- packages/parameters/package.json | 10 +- packages/testing/package.json | 2 +- packages/tracer/package.json | 4 +- 8 files changed, 787 insertions(+), 787 deletions(-) diff --git a/examples/app/package.json b/examples/app/package.json index 5031fd4ab1..ec952c4ed7 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -45,8 +45,8 @@ "@aws-lambda-powertools/metrics": "^2.8.0", "@aws-lambda-powertools/parameters": "^2.8.0", "@aws-lambda-powertools/tracer": "^2.8.0", - "@aws-sdk/client-ssm": "^3.651.1", - "@aws-sdk/lib-dynamodb": "^3.651.1", + "@aws-sdk/client-ssm": "^3.654.0", + "@aws-sdk/lib-dynamodb": "^3.654.0", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.145", "@types/node": "22.5.5", diff --git a/examples/snippets/package.json b/examples/snippets/package.json index f13d605be0..61a505df33 100644 --- a/examples/snippets/package.json +++ b/examples/snippets/package.json @@ -32,11 +32,11 @@ "@aws-lambda-powertools/parameters": "^2.8.0", "@aws-lambda-powertools/parser": "^2.8.0", "@aws-lambda-powertools/tracer": "^2.8.0", - "@aws-sdk/client-appconfigdata": "^3.651.1", - "@aws-sdk/client-dynamodb": "^3.651.1", - "@aws-sdk/client-secrets-manager": "^3.651.1", - "@aws-sdk/client-ssm": "^3.651.1", - "@aws-sdk/util-dynamodb": "^3.651.1", + "@aws-sdk/client-appconfigdata": "^3.654.0", + "@aws-sdk/client-dynamodb": "^3.654.0", + "@aws-sdk/client-secrets-manager": "^3.654.0", + "@aws-sdk/client-ssm": "^3.654.0", + "@aws-sdk/util-dynamodb": "^3.654.0", "@middy/core": "^4.7.0", "aws-sdk": "^2.1691.0", "aws-sdk-client-mock": "^4.0.1", diff --git a/package-lock.json b/package-lock.json index f5ef636d03..9b5c1f1bc9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -61,8 +61,8 @@ "@aws-lambda-powertools/metrics": "^2.8.0", "@aws-lambda-powertools/parameters": "^2.8.0", "@aws-lambda-powertools/tracer": "^2.8.0", - "@aws-sdk/client-ssm": "^3.651.1", - "@aws-sdk/lib-dynamodb": "^3.651.1", + "@aws-sdk/client-ssm": "^3.654.0", + "@aws-sdk/lib-dynamodb": "^3.654.0", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.145", "@types/node": "22.5.5", @@ -110,11 +110,11 @@ "@aws-lambda-powertools/parameters": "^2.8.0", "@aws-lambda-powertools/parser": "^2.8.0", "@aws-lambda-powertools/tracer": "^2.8.0", - "@aws-sdk/client-appconfigdata": "^3.651.1", - "@aws-sdk/client-dynamodb": "^3.651.1", - "@aws-sdk/client-secrets-manager": "^3.651.1", - "@aws-sdk/client-ssm": "^3.651.1", - "@aws-sdk/util-dynamodb": "^3.651.1", + "@aws-sdk/client-appconfigdata": "^3.654.0", + "@aws-sdk/client-dynamodb": "^3.654.0", + "@aws-sdk/client-secrets-manager": "^3.654.0", + "@aws-sdk/client-ssm": "^3.654.0", + "@aws-sdk/util-dynamodb": "^3.654.0", "@middy/core": "^4.7.0", "aws-sdk": "^2.1691.0", "aws-sdk-client-mock": "^4.0.1", @@ -410,51 +410,51 @@ "link": true }, "node_modules/@aws-sdk/client-appconfigdata": { - "version": "3.651.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-appconfigdata/-/client-appconfigdata-3.651.1.tgz", - "integrity": "sha512-QLT9INGvJn94BmN4GvRIr84DYKoAErqPsmVnHM+6IVeNv4QKe2zpeUHUdIDCartiobpF/hp22PfcxyX03O9KSw==", + "version": "3.654.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-appconfigdata/-/client-appconfigdata-3.654.0.tgz", + "integrity": "sha512-g3Vg07qrx+0un8aCQW+pz0woTxJEFoWuqsWMIO9TMmnyzFiLvWvY1hL+Cmg3PmtsOy3ZgY7ZVqkEvbcijUq14g==", "dev": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.651.1", - "@aws-sdk/client-sts": "3.651.1", - "@aws-sdk/core": "3.651.1", - "@aws-sdk/credential-provider-node": "3.651.1", - "@aws-sdk/middleware-host-header": "3.649.0", - "@aws-sdk/middleware-logger": "3.649.0", - "@aws-sdk/middleware-recursion-detection": "3.649.0", - "@aws-sdk/middleware-user-agent": "3.649.0", - "@aws-sdk/region-config-resolver": "3.649.0", - "@aws-sdk/types": "3.649.0", - "@aws-sdk/util-endpoints": "3.649.0", - "@aws-sdk/util-user-agent-browser": "3.649.0", - "@aws-sdk/util-user-agent-node": "3.649.0", - "@smithy/config-resolver": "^3.0.6", - "@smithy/core": "^2.4.1", - "@smithy/fetch-http-handler": "^3.2.5", - "@smithy/hash-node": "^3.0.4", - "@smithy/invalid-dependency": "^3.0.4", - "@smithy/middleware-content-length": "^3.0.6", - "@smithy/middleware-endpoint": "^3.1.1", - "@smithy/middleware-retry": "^3.0.16", - "@smithy/middleware-serde": "^3.0.4", - "@smithy/middleware-stack": "^3.0.4", - "@smithy/node-config-provider": "^3.1.5", - "@smithy/node-http-handler": "^3.2.0", - "@smithy/protocol-http": "^4.1.1", - "@smithy/smithy-client": "^3.3.0", - "@smithy/types": "^3.4.0", - "@smithy/url-parser": "^3.0.4", + "@aws-sdk/client-sso-oidc": "3.654.0", + "@aws-sdk/client-sts": "3.654.0", + "@aws-sdk/core": "3.654.0", + "@aws-sdk/credential-provider-node": "3.654.0", + "@aws-sdk/middleware-host-header": "3.654.0", + "@aws-sdk/middleware-logger": "3.654.0", + "@aws-sdk/middleware-recursion-detection": "3.654.0", + "@aws-sdk/middleware-user-agent": "3.654.0", + "@aws-sdk/region-config-resolver": "3.654.0", + "@aws-sdk/types": "3.654.0", + "@aws-sdk/util-endpoints": "3.654.0", + "@aws-sdk/util-user-agent-browser": "3.654.0", + "@aws-sdk/util-user-agent-node": "3.654.0", + "@smithy/config-resolver": "^3.0.8", + "@smithy/core": "^2.4.3", + "@smithy/fetch-http-handler": "^3.2.7", + "@smithy/hash-node": "^3.0.6", + "@smithy/invalid-dependency": "^3.0.6", + "@smithy/middleware-content-length": "^3.0.8", + "@smithy/middleware-endpoint": "^3.1.3", + "@smithy/middleware-retry": "^3.0.18", + "@smithy/middleware-serde": "^3.0.6", + "@smithy/middleware-stack": "^3.0.6", + "@smithy/node-config-provider": "^3.1.7", + "@smithy/node-http-handler": "^3.2.2", + "@smithy/protocol-http": "^4.1.3", + "@smithy/smithy-client": "^3.3.2", + "@smithy/types": "^3.4.2", + "@smithy/url-parser": "^3.0.6", "@smithy/util-base64": "^3.0.0", "@smithy/util-body-length-browser": "^3.0.0", "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.16", - "@smithy/util-defaults-mode-node": "^3.0.16", - "@smithy/util-endpoints": "^2.1.0", - "@smithy/util-middleware": "^3.0.4", - "@smithy/util-retry": "^3.0.4", - "@smithy/util-stream": "^3.1.4", + "@smithy/util-defaults-mode-browser": "^3.0.18", + "@smithy/util-defaults-mode-node": "^3.0.18", + "@smithy/util-endpoints": "^2.1.2", + "@smithy/util-middleware": "^3.0.6", + "@smithy/util-retry": "^3.0.6", + "@smithy/util-stream": "^3.1.6", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, @@ -463,53 +463,53 @@ } }, "node_modules/@aws-sdk/client-cloudwatch": { - "version": "3.651.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch/-/client-cloudwatch-3.651.1.tgz", - "integrity": "sha512-vrWHQNGIR+jhgE5DKcvqCTZNJBu6ihJarK/dw/tB77eamyyqHW4aH6XqgIP6G59oSVyIe/TJ1Gqa2a4ag1DVIw==", + "version": "3.654.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch/-/client-cloudwatch-3.654.0.tgz", + "integrity": "sha512-2S3D8yF1ldpAoJjZlWXYYBhLnvUM2Vvt0ktKpe2J9y5cBqbs9AsrvdCHEf4eWM+vmfEbOLDOtUblrHpGfPSJkw==", "dev": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.651.1", - "@aws-sdk/client-sts": "3.651.1", - "@aws-sdk/core": "3.651.1", - "@aws-sdk/credential-provider-node": "3.651.1", - "@aws-sdk/middleware-host-header": "3.649.0", - "@aws-sdk/middleware-logger": "3.649.0", - "@aws-sdk/middleware-recursion-detection": "3.649.0", - "@aws-sdk/middleware-user-agent": "3.649.0", - "@aws-sdk/region-config-resolver": "3.649.0", - "@aws-sdk/types": "3.649.0", - "@aws-sdk/util-endpoints": "3.649.0", - "@aws-sdk/util-user-agent-browser": "3.649.0", - "@aws-sdk/util-user-agent-node": "3.649.0", - "@smithy/config-resolver": "^3.0.6", - "@smithy/core": "^2.4.1", - "@smithy/fetch-http-handler": "^3.2.5", - "@smithy/hash-node": "^3.0.4", - "@smithy/invalid-dependency": "^3.0.4", - "@smithy/middleware-compression": "^3.0.8", - "@smithy/middleware-content-length": "^3.0.6", - "@smithy/middleware-endpoint": "^3.1.1", - "@smithy/middleware-retry": "^3.0.16", - "@smithy/middleware-serde": "^3.0.4", - "@smithy/middleware-stack": "^3.0.4", - "@smithy/node-config-provider": "^3.1.5", - "@smithy/node-http-handler": "^3.2.0", - "@smithy/protocol-http": "^4.1.1", - "@smithy/smithy-client": "^3.3.0", - "@smithy/types": "^3.4.0", - "@smithy/url-parser": "^3.0.4", + "@aws-sdk/client-sso-oidc": "3.654.0", + "@aws-sdk/client-sts": "3.654.0", + "@aws-sdk/core": "3.654.0", + "@aws-sdk/credential-provider-node": "3.654.0", + "@aws-sdk/middleware-host-header": "3.654.0", + "@aws-sdk/middleware-logger": "3.654.0", + "@aws-sdk/middleware-recursion-detection": "3.654.0", + "@aws-sdk/middleware-user-agent": "3.654.0", + "@aws-sdk/region-config-resolver": "3.654.0", + "@aws-sdk/types": "3.654.0", + "@aws-sdk/util-endpoints": "3.654.0", + "@aws-sdk/util-user-agent-browser": "3.654.0", + "@aws-sdk/util-user-agent-node": "3.654.0", + "@smithy/config-resolver": "^3.0.8", + "@smithy/core": "^2.4.3", + "@smithy/fetch-http-handler": "^3.2.7", + "@smithy/hash-node": "^3.0.6", + "@smithy/invalid-dependency": "^3.0.6", + "@smithy/middleware-compression": "^3.0.10", + "@smithy/middleware-content-length": "^3.0.8", + "@smithy/middleware-endpoint": "^3.1.3", + "@smithy/middleware-retry": "^3.0.18", + "@smithy/middleware-serde": "^3.0.6", + "@smithy/middleware-stack": "^3.0.6", + "@smithy/node-config-provider": "^3.1.7", + "@smithy/node-http-handler": "^3.2.2", + "@smithy/protocol-http": "^4.1.3", + "@smithy/smithy-client": "^3.3.2", + "@smithy/types": "^3.4.2", + "@smithy/url-parser": "^3.0.6", "@smithy/util-base64": "^3.0.0", "@smithy/util-body-length-browser": "^3.0.0", "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.16", - "@smithy/util-defaults-mode-node": "^3.0.16", - "@smithy/util-endpoints": "^2.1.0", - "@smithy/util-middleware": "^3.0.4", - "@smithy/util-retry": "^3.0.4", + "@smithy/util-defaults-mode-browser": "^3.0.18", + "@smithy/util-defaults-mode-node": "^3.0.18", + "@smithy/util-endpoints": "^2.1.2", + "@smithy/util-middleware": "^3.0.6", + "@smithy/util-retry": "^3.0.6", "@smithy/util-utf8": "^3.0.0", - "@smithy/util-waiter": "^3.1.3", + "@smithy/util-waiter": "^3.1.5", "tslib": "^2.6.2" }, "engines": { @@ -517,52 +517,52 @@ } }, "node_modules/@aws-sdk/client-dynamodb": { - "version": "3.651.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.651.1.tgz", - "integrity": "sha512-HrZ01VVoJeL1Ye94xVA/LIL1aY+sSmoCshcYnY9Wl2Xgs/QDCA8y+Q+Yvcyoua949X32wXPAhmXRjeuIfY7MNg==", + "version": "3.654.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.654.0.tgz", + "integrity": "sha512-QG7n2WJ4ZycoYnq04K7bYgai11in93XJgGJXeQM2jAszbMxrlFfczwhWDciHDz7hXWMhNvpKWuhvrXyxj9Irlg==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.651.1", - "@aws-sdk/client-sts": "3.651.1", - "@aws-sdk/core": "3.651.1", - "@aws-sdk/credential-provider-node": "3.651.1", - "@aws-sdk/middleware-endpoint-discovery": "3.649.0", - "@aws-sdk/middleware-host-header": "3.649.0", - "@aws-sdk/middleware-logger": "3.649.0", - "@aws-sdk/middleware-recursion-detection": "3.649.0", - "@aws-sdk/middleware-user-agent": "3.649.0", - "@aws-sdk/region-config-resolver": "3.649.0", - "@aws-sdk/types": "3.649.0", - "@aws-sdk/util-endpoints": "3.649.0", - "@aws-sdk/util-user-agent-browser": "3.649.0", - "@aws-sdk/util-user-agent-node": "3.649.0", - "@smithy/config-resolver": "^3.0.6", - "@smithy/core": "^2.4.1", - "@smithy/fetch-http-handler": "^3.2.5", - "@smithy/hash-node": "^3.0.4", - "@smithy/invalid-dependency": "^3.0.4", - "@smithy/middleware-content-length": "^3.0.6", - "@smithy/middleware-endpoint": "^3.1.1", - "@smithy/middleware-retry": "^3.0.16", - "@smithy/middleware-serde": "^3.0.4", - "@smithy/middleware-stack": "^3.0.4", - "@smithy/node-config-provider": "^3.1.5", - "@smithy/node-http-handler": "^3.2.0", - "@smithy/protocol-http": "^4.1.1", - "@smithy/smithy-client": "^3.3.0", - "@smithy/types": "^3.4.0", - "@smithy/url-parser": "^3.0.4", + "@aws-sdk/client-sso-oidc": "3.654.0", + "@aws-sdk/client-sts": "3.654.0", + "@aws-sdk/core": "3.654.0", + "@aws-sdk/credential-provider-node": "3.654.0", + "@aws-sdk/middleware-endpoint-discovery": "3.654.0", + "@aws-sdk/middleware-host-header": "3.654.0", + "@aws-sdk/middleware-logger": "3.654.0", + "@aws-sdk/middleware-recursion-detection": "3.654.0", + "@aws-sdk/middleware-user-agent": "3.654.0", + "@aws-sdk/region-config-resolver": "3.654.0", + "@aws-sdk/types": "3.654.0", + "@aws-sdk/util-endpoints": "3.654.0", + "@aws-sdk/util-user-agent-browser": "3.654.0", + "@aws-sdk/util-user-agent-node": "3.654.0", + "@smithy/config-resolver": "^3.0.8", + "@smithy/core": "^2.4.3", + "@smithy/fetch-http-handler": "^3.2.7", + "@smithy/hash-node": "^3.0.6", + "@smithy/invalid-dependency": "^3.0.6", + "@smithy/middleware-content-length": "^3.0.8", + "@smithy/middleware-endpoint": "^3.1.3", + "@smithy/middleware-retry": "^3.0.18", + "@smithy/middleware-serde": "^3.0.6", + "@smithy/middleware-stack": "^3.0.6", + "@smithy/node-config-provider": "^3.1.7", + "@smithy/node-http-handler": "^3.2.2", + "@smithy/protocol-http": "^4.1.3", + "@smithy/smithy-client": "^3.3.2", + "@smithy/types": "^3.4.2", + "@smithy/url-parser": "^3.0.6", "@smithy/util-base64": "^3.0.0", "@smithy/util-body-length-browser": "^3.0.0", "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.16", - "@smithy/util-defaults-mode-node": "^3.0.16", - "@smithy/util-endpoints": "^2.1.0", - "@smithy/util-middleware": "^3.0.4", - "@smithy/util-retry": "^3.0.4", + "@smithy/util-defaults-mode-browser": "^3.0.18", + "@smithy/util-defaults-mode-node": "^3.0.18", + "@smithy/util-endpoints": "^2.1.2", + "@smithy/util-middleware": "^3.0.6", + "@smithy/util-retry": "^3.0.6", "@smithy/util-utf8": "^3.0.0", - "@smithy/util-waiter": "^3.1.3", + "@smithy/util-waiter": "^3.1.5", "tslib": "^2.6.2", "uuid": "^9.0.1" }, @@ -571,55 +571,55 @@ } }, "node_modules/@aws-sdk/client-lambda": { - "version": "3.651.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.651.1.tgz", - "integrity": "sha512-/8+j1m5+hJ1fUZLWr+bC/R1/ScGIasR1Kj0jCwJUXZL+ZjKaggiy7sVmVC7DZdaD/hKCdts8SpUeXZejPjSiFg==", + "version": "3.654.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.654.0.tgz", + "integrity": "sha512-/ITRFpQeutTNsyZ5AjLCnNKM08rPq5WSEtNoJ2zLOAinOUnPpLFZ3p6w+5AVc2FYTeFY5gxby84Ejs4gzS8/Mg==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.651.1", - "@aws-sdk/client-sts": "3.651.1", - "@aws-sdk/core": "3.651.1", - "@aws-sdk/credential-provider-node": "3.651.1", - "@aws-sdk/middleware-host-header": "3.649.0", - "@aws-sdk/middleware-logger": "3.649.0", - "@aws-sdk/middleware-recursion-detection": "3.649.0", - "@aws-sdk/middleware-user-agent": "3.649.0", - "@aws-sdk/region-config-resolver": "3.649.0", - "@aws-sdk/types": "3.649.0", - "@aws-sdk/util-endpoints": "3.649.0", - "@aws-sdk/util-user-agent-browser": "3.649.0", - "@aws-sdk/util-user-agent-node": "3.649.0", - "@smithy/config-resolver": "^3.0.6", - "@smithy/core": "^2.4.1", - "@smithy/eventstream-serde-browser": "^3.0.7", - "@smithy/eventstream-serde-config-resolver": "^3.0.4", - "@smithy/eventstream-serde-node": "^3.0.6", - "@smithy/fetch-http-handler": "^3.2.5", - "@smithy/hash-node": "^3.0.4", - "@smithy/invalid-dependency": "^3.0.4", - "@smithy/middleware-content-length": "^3.0.6", - "@smithy/middleware-endpoint": "^3.1.1", - "@smithy/middleware-retry": "^3.0.16", - "@smithy/middleware-serde": "^3.0.4", - "@smithy/middleware-stack": "^3.0.4", - "@smithy/node-config-provider": "^3.1.5", - "@smithy/node-http-handler": "^3.2.0", - "@smithy/protocol-http": "^4.1.1", - "@smithy/smithy-client": "^3.3.0", - "@smithy/types": "^3.4.0", - "@smithy/url-parser": "^3.0.4", + "@aws-sdk/client-sso-oidc": "3.654.0", + "@aws-sdk/client-sts": "3.654.0", + "@aws-sdk/core": "3.654.0", + "@aws-sdk/credential-provider-node": "3.654.0", + "@aws-sdk/middleware-host-header": "3.654.0", + "@aws-sdk/middleware-logger": "3.654.0", + "@aws-sdk/middleware-recursion-detection": "3.654.0", + "@aws-sdk/middleware-user-agent": "3.654.0", + "@aws-sdk/region-config-resolver": "3.654.0", + "@aws-sdk/types": "3.654.0", + "@aws-sdk/util-endpoints": "3.654.0", + "@aws-sdk/util-user-agent-browser": "3.654.0", + "@aws-sdk/util-user-agent-node": "3.654.0", + "@smithy/config-resolver": "^3.0.8", + "@smithy/core": "^2.4.3", + "@smithy/eventstream-serde-browser": "^3.0.9", + "@smithy/eventstream-serde-config-resolver": "^3.0.6", + "@smithy/eventstream-serde-node": "^3.0.8", + "@smithy/fetch-http-handler": "^3.2.7", + "@smithy/hash-node": "^3.0.6", + "@smithy/invalid-dependency": "^3.0.6", + "@smithy/middleware-content-length": "^3.0.8", + "@smithy/middleware-endpoint": "^3.1.3", + "@smithy/middleware-retry": "^3.0.18", + "@smithy/middleware-serde": "^3.0.6", + "@smithy/middleware-stack": "^3.0.6", + "@smithy/node-config-provider": "^3.1.7", + "@smithy/node-http-handler": "^3.2.2", + "@smithy/protocol-http": "^4.1.3", + "@smithy/smithy-client": "^3.3.2", + "@smithy/types": "^3.4.2", + "@smithy/url-parser": "^3.0.6", "@smithy/util-base64": "^3.0.0", "@smithy/util-body-length-browser": "^3.0.0", "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.16", - "@smithy/util-defaults-mode-node": "^3.0.16", - "@smithy/util-endpoints": "^2.1.0", - "@smithy/util-middleware": "^3.0.4", - "@smithy/util-retry": "^3.0.4", - "@smithy/util-stream": "^3.1.4", + "@smithy/util-defaults-mode-browser": "^3.0.18", + "@smithy/util-defaults-mode-node": "^3.0.18", + "@smithy/util-endpoints": "^2.1.2", + "@smithy/util-middleware": "^3.0.6", + "@smithy/util-retry": "^3.0.6", + "@smithy/util-stream": "^3.1.6", "@smithy/util-utf8": "^3.0.0", - "@smithy/util-waiter": "^3.1.3", + "@smithy/util-waiter": "^3.1.5", "tslib": "^2.6.2" }, "engines": { @@ -627,50 +627,50 @@ } }, "node_modules/@aws-sdk/client-secrets-manager": { - "version": "3.651.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.651.1.tgz", - "integrity": "sha512-PPX2RqdMgUb2BWwzugQu3xVxPcNphaKPR1zpZU52DLiZpoxOSDQ3d2NLr4osUV+6h+6z9K8Ub2gjp8qwwy9zPg==", + "version": "3.654.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.654.0.tgz", + "integrity": "sha512-Fua3kW8XCU2+gWcv8vHpsaR5g4ABuE4/tqv2B7vbMThLZ2Aam6Rw9b5dIMhpbje+edhAUBS0x6UyE88zQeHWZQ==", "dev": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.651.1", - "@aws-sdk/client-sts": "3.651.1", - "@aws-sdk/core": "3.651.1", - "@aws-sdk/credential-provider-node": "3.651.1", - "@aws-sdk/middleware-host-header": "3.649.0", - "@aws-sdk/middleware-logger": "3.649.0", - "@aws-sdk/middleware-recursion-detection": "3.649.0", - "@aws-sdk/middleware-user-agent": "3.649.0", - "@aws-sdk/region-config-resolver": "3.649.0", - "@aws-sdk/types": "3.649.0", - "@aws-sdk/util-endpoints": "3.649.0", - "@aws-sdk/util-user-agent-browser": "3.649.0", - "@aws-sdk/util-user-agent-node": "3.649.0", - "@smithy/config-resolver": "^3.0.6", - "@smithy/core": "^2.4.1", - "@smithy/fetch-http-handler": "^3.2.5", - "@smithy/hash-node": "^3.0.4", - "@smithy/invalid-dependency": "^3.0.4", - "@smithy/middleware-content-length": "^3.0.6", - "@smithy/middleware-endpoint": "^3.1.1", - "@smithy/middleware-retry": "^3.0.16", - "@smithy/middleware-serde": "^3.0.4", - "@smithy/middleware-stack": "^3.0.4", - "@smithy/node-config-provider": "^3.1.5", - "@smithy/node-http-handler": "^3.2.0", - "@smithy/protocol-http": "^4.1.1", - "@smithy/smithy-client": "^3.3.0", - "@smithy/types": "^3.4.0", - "@smithy/url-parser": "^3.0.4", + "@aws-sdk/client-sso-oidc": "3.654.0", + "@aws-sdk/client-sts": "3.654.0", + "@aws-sdk/core": "3.654.0", + "@aws-sdk/credential-provider-node": "3.654.0", + "@aws-sdk/middleware-host-header": "3.654.0", + "@aws-sdk/middleware-logger": "3.654.0", + "@aws-sdk/middleware-recursion-detection": "3.654.0", + "@aws-sdk/middleware-user-agent": "3.654.0", + "@aws-sdk/region-config-resolver": "3.654.0", + "@aws-sdk/types": "3.654.0", + "@aws-sdk/util-endpoints": "3.654.0", + "@aws-sdk/util-user-agent-browser": "3.654.0", + "@aws-sdk/util-user-agent-node": "3.654.0", + "@smithy/config-resolver": "^3.0.8", + "@smithy/core": "^2.4.3", + "@smithy/fetch-http-handler": "^3.2.7", + "@smithy/hash-node": "^3.0.6", + "@smithy/invalid-dependency": "^3.0.6", + "@smithy/middleware-content-length": "^3.0.8", + "@smithy/middleware-endpoint": "^3.1.3", + "@smithy/middleware-retry": "^3.0.18", + "@smithy/middleware-serde": "^3.0.6", + "@smithy/middleware-stack": "^3.0.6", + "@smithy/node-config-provider": "^3.1.7", + "@smithy/node-http-handler": "^3.2.2", + "@smithy/protocol-http": "^4.1.3", + "@smithy/smithy-client": "^3.3.2", + "@smithy/types": "^3.4.2", + "@smithy/url-parser": "^3.0.6", "@smithy/util-base64": "^3.0.0", "@smithy/util-body-length-browser": "^3.0.0", "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.16", - "@smithy/util-defaults-mode-node": "^3.0.16", - "@smithy/util-endpoints": "^2.1.0", - "@smithy/util-middleware": "^3.0.4", - "@smithy/util-retry": "^3.0.4", + "@smithy/util-defaults-mode-browser": "^3.0.18", + "@smithy/util-defaults-mode-node": "^3.0.18", + "@smithy/util-endpoints": "^2.1.2", + "@smithy/util-middleware": "^3.0.6", + "@smithy/util-retry": "^3.0.6", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2", "uuid": "^9.0.1" @@ -680,51 +680,51 @@ } }, "node_modules/@aws-sdk/client-ssm": { - "version": "3.651.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-ssm/-/client-ssm-3.651.1.tgz", - "integrity": "sha512-f3RganJCh/N9E28kw3VlAYdPIXUd52i8XFXWkws5Ltdoqu9accYvZxTi4d8Gy/0PAzFQyUciS7xpHIjbX8mvgg==", + "version": "3.654.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ssm/-/client-ssm-3.654.0.tgz", + "integrity": "sha512-Lg+BvIcD+fol1Jke8GcPLofwJAs6gzLeXvHijI9lEIeTvtIJYG8QANG435StEEGHMsAeSVrmoVT9UHOwLnM/KA==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.651.1", - "@aws-sdk/client-sts": "3.651.1", - "@aws-sdk/core": "3.651.1", - "@aws-sdk/credential-provider-node": "3.651.1", - "@aws-sdk/middleware-host-header": "3.649.0", - "@aws-sdk/middleware-logger": "3.649.0", - "@aws-sdk/middleware-recursion-detection": "3.649.0", - "@aws-sdk/middleware-user-agent": "3.649.0", - "@aws-sdk/region-config-resolver": "3.649.0", - "@aws-sdk/types": "3.649.0", - "@aws-sdk/util-endpoints": "3.649.0", - "@aws-sdk/util-user-agent-browser": "3.649.0", - "@aws-sdk/util-user-agent-node": "3.649.0", - "@smithy/config-resolver": "^3.0.6", - "@smithy/core": "^2.4.1", - "@smithy/fetch-http-handler": "^3.2.5", - "@smithy/hash-node": "^3.0.4", - "@smithy/invalid-dependency": "^3.0.4", - "@smithy/middleware-content-length": "^3.0.6", - "@smithy/middleware-endpoint": "^3.1.1", - "@smithy/middleware-retry": "^3.0.16", - "@smithy/middleware-serde": "^3.0.4", - "@smithy/middleware-stack": "^3.0.4", - "@smithy/node-config-provider": "^3.1.5", - "@smithy/node-http-handler": "^3.2.0", - "@smithy/protocol-http": "^4.1.1", - "@smithy/smithy-client": "^3.3.0", - "@smithy/types": "^3.4.0", - "@smithy/url-parser": "^3.0.4", + "@aws-sdk/client-sso-oidc": "3.654.0", + "@aws-sdk/client-sts": "3.654.0", + "@aws-sdk/core": "3.654.0", + "@aws-sdk/credential-provider-node": "3.654.0", + "@aws-sdk/middleware-host-header": "3.654.0", + "@aws-sdk/middleware-logger": "3.654.0", + "@aws-sdk/middleware-recursion-detection": "3.654.0", + "@aws-sdk/middleware-user-agent": "3.654.0", + "@aws-sdk/region-config-resolver": "3.654.0", + "@aws-sdk/types": "3.654.0", + "@aws-sdk/util-endpoints": "3.654.0", + "@aws-sdk/util-user-agent-browser": "3.654.0", + "@aws-sdk/util-user-agent-node": "3.654.0", + "@smithy/config-resolver": "^3.0.8", + "@smithy/core": "^2.4.3", + "@smithy/fetch-http-handler": "^3.2.7", + "@smithy/hash-node": "^3.0.6", + "@smithy/invalid-dependency": "^3.0.6", + "@smithy/middleware-content-length": "^3.0.8", + "@smithy/middleware-endpoint": "^3.1.3", + "@smithy/middleware-retry": "^3.0.18", + "@smithy/middleware-serde": "^3.0.6", + "@smithy/middleware-stack": "^3.0.6", + "@smithy/node-config-provider": "^3.1.7", + "@smithy/node-http-handler": "^3.2.2", + "@smithy/protocol-http": "^4.1.3", + "@smithy/smithy-client": "^3.3.2", + "@smithy/types": "^3.4.2", + "@smithy/url-parser": "^3.0.6", "@smithy/util-base64": "^3.0.0", "@smithy/util-body-length-browser": "^3.0.0", "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.16", - "@smithy/util-defaults-mode-node": "^3.0.16", - "@smithy/util-endpoints": "^2.1.0", - "@smithy/util-middleware": "^3.0.4", - "@smithy/util-retry": "^3.0.4", + "@smithy/util-defaults-mode-browser": "^3.0.18", + "@smithy/util-defaults-mode-node": "^3.0.18", + "@smithy/util-endpoints": "^2.1.2", + "@smithy/util-middleware": "^3.0.6", + "@smithy/util-retry": "^3.0.6", "@smithy/util-utf8": "^3.0.0", - "@smithy/util-waiter": "^3.1.3", + "@smithy/util-waiter": "^3.1.5", "tslib": "^2.6.2", "uuid": "^9.0.1" }, @@ -733,46 +733,46 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.651.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.651.1.tgz", - "integrity": "sha512-Fm8PoMgiBKmmKrY6QQUGj/WW6eIiQqC1I0AiVXfO+Sqkmxcg3qex+CZBAYrTuIDnvnc/89f9N4mdL8V9DRn03Q==", + "version": "3.654.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.654.0.tgz", + "integrity": "sha512-4kBxs2IzCDtj6a6lRXa/lXK5wWpMGzwKtb+HMXf/rJYVM6x7wYRzc1hYrOd3DYkFQ/sR3dUFj+0mTP0os3aAbA==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.651.1", - "@aws-sdk/middleware-host-header": "3.649.0", - "@aws-sdk/middleware-logger": "3.649.0", - "@aws-sdk/middleware-recursion-detection": "3.649.0", - "@aws-sdk/middleware-user-agent": "3.649.0", - "@aws-sdk/region-config-resolver": "3.649.0", - "@aws-sdk/types": "3.649.0", - "@aws-sdk/util-endpoints": "3.649.0", - "@aws-sdk/util-user-agent-browser": "3.649.0", - "@aws-sdk/util-user-agent-node": "3.649.0", - "@smithy/config-resolver": "^3.0.6", - "@smithy/core": "^2.4.1", - "@smithy/fetch-http-handler": "^3.2.5", - "@smithy/hash-node": "^3.0.4", - "@smithy/invalid-dependency": "^3.0.4", - "@smithy/middleware-content-length": "^3.0.6", - "@smithy/middleware-endpoint": "^3.1.1", - "@smithy/middleware-retry": "^3.0.16", - "@smithy/middleware-serde": "^3.0.4", - "@smithy/middleware-stack": "^3.0.4", - "@smithy/node-config-provider": "^3.1.5", - "@smithy/node-http-handler": "^3.2.0", - "@smithy/protocol-http": "^4.1.1", - "@smithy/smithy-client": "^3.3.0", - "@smithy/types": "^3.4.0", - "@smithy/url-parser": "^3.0.4", + "@aws-sdk/core": "3.654.0", + "@aws-sdk/middleware-host-header": "3.654.0", + "@aws-sdk/middleware-logger": "3.654.0", + "@aws-sdk/middleware-recursion-detection": "3.654.0", + "@aws-sdk/middleware-user-agent": "3.654.0", + "@aws-sdk/region-config-resolver": "3.654.0", + "@aws-sdk/types": "3.654.0", + "@aws-sdk/util-endpoints": "3.654.0", + "@aws-sdk/util-user-agent-browser": "3.654.0", + "@aws-sdk/util-user-agent-node": "3.654.0", + "@smithy/config-resolver": "^3.0.8", + "@smithy/core": "^2.4.3", + "@smithy/fetch-http-handler": "^3.2.7", + "@smithy/hash-node": "^3.0.6", + "@smithy/invalid-dependency": "^3.0.6", + "@smithy/middleware-content-length": "^3.0.8", + "@smithy/middleware-endpoint": "^3.1.3", + "@smithy/middleware-retry": "^3.0.18", + "@smithy/middleware-serde": "^3.0.6", + "@smithy/middleware-stack": "^3.0.6", + "@smithy/node-config-provider": "^3.1.7", + "@smithy/node-http-handler": "^3.2.2", + "@smithy/protocol-http": "^4.1.3", + "@smithy/smithy-client": "^3.3.2", + "@smithy/types": "^3.4.2", + "@smithy/url-parser": "^3.0.6", "@smithy/util-base64": "^3.0.0", "@smithy/util-body-length-browser": "^3.0.0", "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.16", - "@smithy/util-defaults-mode-node": "^3.0.16", - "@smithy/util-endpoints": "^2.1.0", - "@smithy/util-middleware": "^3.0.4", - "@smithy/util-retry": "^3.0.4", + "@smithy/util-defaults-mode-browser": "^3.0.18", + "@smithy/util-defaults-mode-node": "^3.0.18", + "@smithy/util-endpoints": "^2.1.2", + "@smithy/util-middleware": "^3.0.6", + "@smithy/util-retry": "^3.0.6", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, @@ -781,47 +781,47 @@ } }, "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.651.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.651.1.tgz", - "integrity": "sha512-PKwAyTJW8pgaPIXm708haIZWBAwNycs25yNcD7OQ3NLcmgGxvrx6bSlhPEGcvwdTYwQMJsdx8ls+khlYbLqTvQ==", + "version": "3.654.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.654.0.tgz", + "integrity": "sha512-gbHrKsEnaAtmkNCVQzLyiqMzpDaThV/bWl/ODEklI+t6stW3Pe3oDMstEHLfJ6JU5g8sYnx4VLuxlnJMtUkvPw==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.651.1", - "@aws-sdk/credential-provider-node": "3.651.1", - "@aws-sdk/middleware-host-header": "3.649.0", - "@aws-sdk/middleware-logger": "3.649.0", - "@aws-sdk/middleware-recursion-detection": "3.649.0", - "@aws-sdk/middleware-user-agent": "3.649.0", - "@aws-sdk/region-config-resolver": "3.649.0", - "@aws-sdk/types": "3.649.0", - "@aws-sdk/util-endpoints": "3.649.0", - "@aws-sdk/util-user-agent-browser": "3.649.0", - "@aws-sdk/util-user-agent-node": "3.649.0", - "@smithy/config-resolver": "^3.0.6", - "@smithy/core": "^2.4.1", - "@smithy/fetch-http-handler": "^3.2.5", - "@smithy/hash-node": "^3.0.4", - "@smithy/invalid-dependency": "^3.0.4", - "@smithy/middleware-content-length": "^3.0.6", - "@smithy/middleware-endpoint": "^3.1.1", - "@smithy/middleware-retry": "^3.0.16", - "@smithy/middleware-serde": "^3.0.4", - "@smithy/middleware-stack": "^3.0.4", - "@smithy/node-config-provider": "^3.1.5", - "@smithy/node-http-handler": "^3.2.0", - "@smithy/protocol-http": "^4.1.1", - "@smithy/smithy-client": "^3.3.0", - "@smithy/types": "^3.4.0", - "@smithy/url-parser": "^3.0.4", + "@aws-sdk/core": "3.654.0", + "@aws-sdk/credential-provider-node": "3.654.0", + "@aws-sdk/middleware-host-header": "3.654.0", + "@aws-sdk/middleware-logger": "3.654.0", + "@aws-sdk/middleware-recursion-detection": "3.654.0", + "@aws-sdk/middleware-user-agent": "3.654.0", + "@aws-sdk/region-config-resolver": "3.654.0", + "@aws-sdk/types": "3.654.0", + "@aws-sdk/util-endpoints": "3.654.0", + "@aws-sdk/util-user-agent-browser": "3.654.0", + "@aws-sdk/util-user-agent-node": "3.654.0", + "@smithy/config-resolver": "^3.0.8", + "@smithy/core": "^2.4.3", + "@smithy/fetch-http-handler": "^3.2.7", + "@smithy/hash-node": "^3.0.6", + "@smithy/invalid-dependency": "^3.0.6", + "@smithy/middleware-content-length": "^3.0.8", + "@smithy/middleware-endpoint": "^3.1.3", + "@smithy/middleware-retry": "^3.0.18", + "@smithy/middleware-serde": "^3.0.6", + "@smithy/middleware-stack": "^3.0.6", + "@smithy/node-config-provider": "^3.1.7", + "@smithy/node-http-handler": "^3.2.2", + "@smithy/protocol-http": "^4.1.3", + "@smithy/smithy-client": "^3.3.2", + "@smithy/types": "^3.4.2", + "@smithy/url-parser": "^3.0.6", "@smithy/util-base64": "^3.0.0", "@smithy/util-body-length-browser": "^3.0.0", "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.16", - "@smithy/util-defaults-mode-node": "^3.0.16", - "@smithy/util-endpoints": "^2.1.0", - "@smithy/util-middleware": "^3.0.4", - "@smithy/util-retry": "^3.0.4", + "@smithy/util-defaults-mode-browser": "^3.0.18", + "@smithy/util-defaults-mode-node": "^3.0.18", + "@smithy/util-endpoints": "^2.1.2", + "@smithy/util-middleware": "^3.0.6", + "@smithy/util-retry": "^3.0.6", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, @@ -829,52 +829,52 @@ "node": ">=16.0.0" }, "peerDependencies": { - "@aws-sdk/client-sts": "^3.651.1" + "@aws-sdk/client-sts": "^3.654.0" } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.651.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.651.1.tgz", - "integrity": "sha512-4X2RqLqeDuVLk+Omt4X+h+Fa978Wn+zek/AM4HSPi4C5XzRBEFLRRtOQUvkETvIjbEwTYQhm0LdgzcBH4bUqIg==", + "version": "3.654.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.654.0.tgz", + "integrity": "sha512-tyHa8jsBy+/NQZFHm6Q2Q09Vi9p3EH4yPy6PU8yPewpi2klreObtrUd0anJa6nzjS9SSuqnlZWsRic3cQ4QwCg==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.651.1", - "@aws-sdk/core": "3.651.1", - "@aws-sdk/credential-provider-node": "3.651.1", - "@aws-sdk/middleware-host-header": "3.649.0", - "@aws-sdk/middleware-logger": "3.649.0", - "@aws-sdk/middleware-recursion-detection": "3.649.0", - "@aws-sdk/middleware-user-agent": "3.649.0", - "@aws-sdk/region-config-resolver": "3.649.0", - "@aws-sdk/types": "3.649.0", - "@aws-sdk/util-endpoints": "3.649.0", - "@aws-sdk/util-user-agent-browser": "3.649.0", - "@aws-sdk/util-user-agent-node": "3.649.0", - "@smithy/config-resolver": "^3.0.6", - "@smithy/core": "^2.4.1", - "@smithy/fetch-http-handler": "^3.2.5", - "@smithy/hash-node": "^3.0.4", - "@smithy/invalid-dependency": "^3.0.4", - "@smithy/middleware-content-length": "^3.0.6", - "@smithy/middleware-endpoint": "^3.1.1", - "@smithy/middleware-retry": "^3.0.16", - "@smithy/middleware-serde": "^3.0.4", - "@smithy/middleware-stack": "^3.0.4", - "@smithy/node-config-provider": "^3.1.5", - "@smithy/node-http-handler": "^3.2.0", - "@smithy/protocol-http": "^4.1.1", - "@smithy/smithy-client": "^3.3.0", - "@smithy/types": "^3.4.0", - "@smithy/url-parser": "^3.0.4", + "@aws-sdk/client-sso-oidc": "3.654.0", + "@aws-sdk/core": "3.654.0", + "@aws-sdk/credential-provider-node": "3.654.0", + "@aws-sdk/middleware-host-header": "3.654.0", + "@aws-sdk/middleware-logger": "3.654.0", + "@aws-sdk/middleware-recursion-detection": "3.654.0", + "@aws-sdk/middleware-user-agent": "3.654.0", + "@aws-sdk/region-config-resolver": "3.654.0", + "@aws-sdk/types": "3.654.0", + "@aws-sdk/util-endpoints": "3.654.0", + "@aws-sdk/util-user-agent-browser": "3.654.0", + "@aws-sdk/util-user-agent-node": "3.654.0", + "@smithy/config-resolver": "^3.0.8", + "@smithy/core": "^2.4.3", + "@smithy/fetch-http-handler": "^3.2.7", + "@smithy/hash-node": "^3.0.6", + "@smithy/invalid-dependency": "^3.0.6", + "@smithy/middleware-content-length": "^3.0.8", + "@smithy/middleware-endpoint": "^3.1.3", + "@smithy/middleware-retry": "^3.0.18", + "@smithy/middleware-serde": "^3.0.6", + "@smithy/middleware-stack": "^3.0.6", + "@smithy/node-config-provider": "^3.1.7", + "@smithy/node-http-handler": "^3.2.2", + "@smithy/protocol-http": "^4.1.3", + "@smithy/smithy-client": "^3.3.2", + "@smithy/types": "^3.4.2", + "@smithy/url-parser": "^3.0.6", "@smithy/util-base64": "^3.0.0", "@smithy/util-body-length-browser": "^3.0.0", "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.16", - "@smithy/util-defaults-mode-node": "^3.0.16", - "@smithy/util-endpoints": "^2.1.0", - "@smithy/util-middleware": "^3.0.4", - "@smithy/util-retry": "^3.0.4", + "@smithy/util-defaults-mode-browser": "^3.0.18", + "@smithy/util-defaults-mode-node": "^3.0.18", + "@smithy/util-endpoints": "^2.1.2", + "@smithy/util-middleware": "^3.0.6", + "@smithy/util-retry": "^3.0.6", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, @@ -883,50 +883,50 @@ } }, "node_modules/@aws-sdk/client-xray": { - "version": "3.651.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-xray/-/client-xray-3.651.1.tgz", - "integrity": "sha512-1H76QE94ofJI3qBLyeUhRDpNp7G3RfbSWMAyh2X+e8hfBPi/cpDcYabDRtRsKLhMDDxbOPqgIl+ewVwaZhE6ww==", + "version": "3.654.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-xray/-/client-xray-3.654.0.tgz", + "integrity": "sha512-B2LkjoLQWiwCgVL0iFTtCmirn7ZiZxa+6YtBhf4o9gMY9yBztV3PP/zHYCqCFWgZdG2DXRWDg7UDGkgf/bV8iA==", "dev": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.651.1", - "@aws-sdk/client-sts": "3.651.1", - "@aws-sdk/core": "3.651.1", - "@aws-sdk/credential-provider-node": "3.651.1", - "@aws-sdk/middleware-host-header": "3.649.0", - "@aws-sdk/middleware-logger": "3.649.0", - "@aws-sdk/middleware-recursion-detection": "3.649.0", - "@aws-sdk/middleware-user-agent": "3.649.0", - "@aws-sdk/region-config-resolver": "3.649.0", - "@aws-sdk/types": "3.649.0", - "@aws-sdk/util-endpoints": "3.649.0", - "@aws-sdk/util-user-agent-browser": "3.649.0", - "@aws-sdk/util-user-agent-node": "3.649.0", - "@smithy/config-resolver": "^3.0.6", - "@smithy/core": "^2.4.1", - "@smithy/fetch-http-handler": "^3.2.5", - "@smithy/hash-node": "^3.0.4", - "@smithy/invalid-dependency": "^3.0.4", - "@smithy/middleware-content-length": "^3.0.6", - "@smithy/middleware-endpoint": "^3.1.1", - "@smithy/middleware-retry": "^3.0.16", - "@smithy/middleware-serde": "^3.0.4", - "@smithy/middleware-stack": "^3.0.4", - "@smithy/node-config-provider": "^3.1.5", - "@smithy/node-http-handler": "^3.2.0", - "@smithy/protocol-http": "^4.1.1", - "@smithy/smithy-client": "^3.3.0", - "@smithy/types": "^3.4.0", - "@smithy/url-parser": "^3.0.4", + "@aws-sdk/client-sso-oidc": "3.654.0", + "@aws-sdk/client-sts": "3.654.0", + "@aws-sdk/core": "3.654.0", + "@aws-sdk/credential-provider-node": "3.654.0", + "@aws-sdk/middleware-host-header": "3.654.0", + "@aws-sdk/middleware-logger": "3.654.0", + "@aws-sdk/middleware-recursion-detection": "3.654.0", + "@aws-sdk/middleware-user-agent": "3.654.0", + "@aws-sdk/region-config-resolver": "3.654.0", + "@aws-sdk/types": "3.654.0", + "@aws-sdk/util-endpoints": "3.654.0", + "@aws-sdk/util-user-agent-browser": "3.654.0", + "@aws-sdk/util-user-agent-node": "3.654.0", + "@smithy/config-resolver": "^3.0.8", + "@smithy/core": "^2.4.3", + "@smithy/fetch-http-handler": "^3.2.7", + "@smithy/hash-node": "^3.0.6", + "@smithy/invalid-dependency": "^3.0.6", + "@smithy/middleware-content-length": "^3.0.8", + "@smithy/middleware-endpoint": "^3.1.3", + "@smithy/middleware-retry": "^3.0.18", + "@smithy/middleware-serde": "^3.0.6", + "@smithy/middleware-stack": "^3.0.6", + "@smithy/node-config-provider": "^3.1.7", + "@smithy/node-http-handler": "^3.2.2", + "@smithy/protocol-http": "^4.1.3", + "@smithy/smithy-client": "^3.3.2", + "@smithy/types": "^3.4.2", + "@smithy/url-parser": "^3.0.6", "@smithy/util-base64": "^3.0.0", "@smithy/util-body-length-browser": "^3.0.0", "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.16", - "@smithy/util-defaults-mode-node": "^3.0.16", - "@smithy/util-endpoints": "^2.1.0", - "@smithy/util-middleware": "^3.0.4", - "@smithy/util-retry": "^3.0.4", + "@smithy/util-defaults-mode-browser": "^3.0.18", + "@smithy/util-defaults-mode-node": "^3.0.18", + "@smithy/util-endpoints": "^2.1.2", + "@smithy/util-middleware": "^3.0.6", + "@smithy/util-retry": "^3.0.6", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, @@ -935,18 +935,18 @@ } }, "node_modules/@aws-sdk/core": { - "version": "3.651.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.651.1.tgz", - "integrity": "sha512-eqOq3W39K+5QTP5GAXtmP2s9B7hhM2pVz8OPe5tqob8o1xQgkwdgHerf3FoshO9bs0LDxassU/fUSz1wlwqfqg==", - "dependencies": { - "@smithy/core": "^2.4.1", - "@smithy/node-config-provider": "^3.1.5", - "@smithy/property-provider": "^3.1.4", - "@smithy/protocol-http": "^4.1.1", - "@smithy/signature-v4": "^4.1.1", - "@smithy/smithy-client": "^3.3.0", - "@smithy/types": "^3.4.0", - "@smithy/util-middleware": "^3.0.4", + "version": "3.654.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.654.0.tgz", + "integrity": "sha512-4Rwx7BVaNaFqmXBDmnOkMbyuIFFbpZ+ru4lr660p45zY1QoNNSalechfoRffcokLFOZO+VWEJkdcorPUUU993w==", + "dependencies": { + "@smithy/core": "^2.4.3", + "@smithy/node-config-provider": "^3.1.7", + "@smithy/property-provider": "^3.1.6", + "@smithy/protocol-http": "^4.1.3", + "@smithy/signature-v4": "^4.1.3", + "@smithy/smithy-client": "^3.3.2", + "@smithy/types": "^3.4.2", + "@smithy/util-middleware": "^3.0.6", "fast-xml-parser": "4.4.1", "tslib": "^2.6.2" }, @@ -955,13 +955,13 @@ } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.649.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.649.0.tgz", - "integrity": "sha512-tViwzM1dauksA3fdRjsg0T8mcHklDa8EfveyiQKK6pUJopkqV6FQx+X5QNda0t/LrdEVlFZvwHNdXqOEfc83TA==", + "version": "3.654.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.654.0.tgz", + "integrity": "sha512-kogsx3Ql81JouHS7DkheCDU9MYAvK0AokxjcshDveGmf7BbgbWCA8Fnb9wjQyNDaOXNvkZu8Z8rgkX91z324/w==", "dependencies": { - "@aws-sdk/types": "3.649.0", - "@smithy/property-provider": "^3.1.4", - "@smithy/types": "^3.4.0", + "@aws-sdk/types": "3.654.0", + "@smithy/property-provider": "^3.1.6", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "engines": { @@ -969,18 +969,18 @@ } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.649.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.649.0.tgz", - "integrity": "sha512-ODAJ+AJJq6ozbns6ejGbicpsQ0dyMOpnGlg0J9J0jITQ05DKQZ581hdB8APDOZ9N8FstShP6dLZflSj8jb5fNA==", - "dependencies": { - "@aws-sdk/types": "3.649.0", - "@smithy/fetch-http-handler": "^3.2.5", - "@smithy/node-http-handler": "^3.2.0", - "@smithy/property-provider": "^3.1.4", - "@smithy/protocol-http": "^4.1.1", - "@smithy/smithy-client": "^3.3.0", - "@smithy/types": "^3.4.0", - "@smithy/util-stream": "^3.1.4", + "version": "3.654.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.654.0.tgz", + "integrity": "sha512-tgmAH4MBi/aDR882lfw48+tDV95ZH3GWc1Eoe6DpNLiM3GN2VfU/cZwuHmi6aq+vAbdIlswBHJ/+va0fOvlyjw==", + "dependencies": { + "@aws-sdk/types": "3.654.0", + "@smithy/fetch-http-handler": "^3.2.7", + "@smithy/node-http-handler": "^3.2.2", + "@smithy/property-provider": "^3.1.6", + "@smithy/protocol-http": "^4.1.3", + "@smithy/smithy-client": "^3.3.2", + "@smithy/types": "^3.4.2", + "@smithy/util-stream": "^3.1.6", "tslib": "^2.6.2" }, "engines": { @@ -988,45 +988,45 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.651.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.651.1.tgz", - "integrity": "sha512-yOzPC3GbwLZ8IYzke4fy70ievmunnBUni/MOXFE8c9kAIV+/RMC7IWx14nAAZm0gAcY+UtCXvBVZprFqmctfzA==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.649.0", - "@aws-sdk/credential-provider-http": "3.649.0", - "@aws-sdk/credential-provider-process": "3.649.0", - "@aws-sdk/credential-provider-sso": "3.651.1", - "@aws-sdk/credential-provider-web-identity": "3.649.0", - "@aws-sdk/types": "3.649.0", - "@smithy/credential-provider-imds": "^3.2.1", - "@smithy/property-provider": "^3.1.4", - "@smithy/shared-ini-file-loader": "^3.1.5", - "@smithy/types": "^3.4.0", + "version": "3.654.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.654.0.tgz", + "integrity": "sha512-DKSdaNu2hwdmuvnm9KnA0NLqMWxxmxSOLWjSUSoFIm++wGXUjPrRMFYKvMktaXnPuyf5my8gF/yGbwzPZ8wlTg==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.654.0", + "@aws-sdk/credential-provider-http": "3.654.0", + "@aws-sdk/credential-provider-process": "3.654.0", + "@aws-sdk/credential-provider-sso": "3.654.0", + "@aws-sdk/credential-provider-web-identity": "3.654.0", + "@aws-sdk/types": "3.654.0", + "@smithy/credential-provider-imds": "^3.2.3", + "@smithy/property-provider": "^3.1.6", + "@smithy/shared-ini-file-loader": "^3.1.7", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" }, "peerDependencies": { - "@aws-sdk/client-sts": "^3.651.1" + "@aws-sdk/client-sts": "^3.654.0" } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.651.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.651.1.tgz", - "integrity": "sha512-QKA74Qs83FTUz3jS39kBuNbLAnm6cgDqomm7XS/BkYgtUq+1lI9WL97astNIuoYvumGIS58kuIa+I3ycOA4wgw==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.649.0", - "@aws-sdk/credential-provider-http": "3.649.0", - "@aws-sdk/credential-provider-ini": "3.651.1", - "@aws-sdk/credential-provider-process": "3.649.0", - "@aws-sdk/credential-provider-sso": "3.651.1", - "@aws-sdk/credential-provider-web-identity": "3.649.0", - "@aws-sdk/types": "3.649.0", - "@smithy/credential-provider-imds": "^3.2.1", - "@smithy/property-provider": "^3.1.4", - "@smithy/shared-ini-file-loader": "^3.1.5", - "@smithy/types": "^3.4.0", + "version": "3.654.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.654.0.tgz", + "integrity": "sha512-wPV7CNYaXDEc+SS+3R0v8SZwkHRUE1z2k2j1d49tH5QBDT4tb/k2V/biXWkwSk3hbR+IMWXmuhJDv/5lybhIvg==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.654.0", + "@aws-sdk/credential-provider-http": "3.654.0", + "@aws-sdk/credential-provider-ini": "3.654.0", + "@aws-sdk/credential-provider-process": "3.654.0", + "@aws-sdk/credential-provider-sso": "3.654.0", + "@aws-sdk/credential-provider-web-identity": "3.654.0", + "@aws-sdk/types": "3.654.0", + "@smithy/credential-provider-imds": "^3.2.3", + "@smithy/property-provider": "^3.1.6", + "@smithy/shared-ini-file-loader": "^3.1.7", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "engines": { @@ -1034,14 +1034,14 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.649.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.649.0.tgz", - "integrity": "sha512-6VYPQpEVpU+6DDS/gLoI40ppuNM5RPIEprK30qZZxnhTr5wyrGOeJ7J7wbbwPOZ5dKwta290BiJDU2ipV8Y9BQ==", - "dependencies": { - "@aws-sdk/types": "3.649.0", - "@smithy/property-provider": "^3.1.4", - "@smithy/shared-ini-file-loader": "^3.1.5", - "@smithy/types": "^3.4.0", + "version": "3.654.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.654.0.tgz", + "integrity": "sha512-PmQoo8sZ9Q2Ow8OMzK++Z9lI7MsRUG7sNq3E72DVA215dhtTICTDQwGlXH2AAmIp7n+G9LLRds+4wo2ehG4mkg==", + "dependencies": { + "@aws-sdk/types": "3.654.0", + "@smithy/property-provider": "^3.1.6", + "@smithy/shared-ini-file-loader": "^3.1.7", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "engines": { @@ -1049,16 +1049,16 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.651.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.651.1.tgz", - "integrity": "sha512-7jeU+Jbn65aDaNjkjWDQcXwjNTzpYNKovkSSRmfVpP5WYiKerVS5mrfg3RiBeiArou5igCUtYcOKlRJiGRO47g==", - "dependencies": { - "@aws-sdk/client-sso": "3.651.1", - "@aws-sdk/token-providers": "3.649.0", - "@aws-sdk/types": "3.649.0", - "@smithy/property-provider": "^3.1.4", - "@smithy/shared-ini-file-loader": "^3.1.5", - "@smithy/types": "^3.4.0", + "version": "3.654.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.654.0.tgz", + "integrity": "sha512-7GFme6fWEdA/XYKzZPOAdj/jS6fMBy1NdSIZsDXikS0v9jU+ZzHrAaWt13YLzHyjgxB9Sg9id9ncdY1IiubQXQ==", + "dependencies": { + "@aws-sdk/client-sso": "3.654.0", + "@aws-sdk/token-providers": "3.654.0", + "@aws-sdk/types": "3.654.0", + "@smithy/property-provider": "^3.1.6", + "@smithy/shared-ini-file-loader": "^3.1.7", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "engines": { @@ -1066,20 +1066,20 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.649.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.649.0.tgz", - "integrity": "sha512-XVk3WsDa0g3kQFPmnCH/LaCtGY/0R2NDv7gscYZSXiBZcG/fixasglTprgWSp8zcA0t7tEIGu9suyjz8ZwhymQ==", + "version": "3.654.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.654.0.tgz", + "integrity": "sha512-6a2g9gMtZToqSu+CusjNK5zvbLJahQ9di7buO3iXgbizXpLXU1rnawCpWxwslMpT5fLgMSKDnKDrr6wdEk7jSw==", "dependencies": { - "@aws-sdk/types": "3.649.0", - "@smithy/property-provider": "^3.1.4", - "@smithy/types": "^3.4.0", + "@aws-sdk/types": "3.654.0", + "@smithy/property-provider": "^3.1.6", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" }, "peerDependencies": { - "@aws-sdk/client-sts": "^3.649.0" + "@aws-sdk/client-sts": "^3.654.0" } }, "node_modules/@aws-sdk/endpoint-cache": { @@ -1095,33 +1095,33 @@ } }, "node_modules/@aws-sdk/lib-dynamodb": { - "version": "3.651.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.651.1.tgz", - "integrity": "sha512-b5FYNUaogL+hiIG1F+L9CW6S+XXWaoPtYajIVTi6AbOVjiTxUqyeSdUK+oqnEKuCZ6CkY4kfedRwVchBprEmiw==", - "dependencies": { - "@aws-sdk/util-dynamodb": "3.651.1", - "@smithy/core": "^2.4.1", - "@smithy/smithy-client": "^3.3.0", - "@smithy/types": "^3.4.0", + "version": "3.654.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.654.0.tgz", + "integrity": "sha512-/mi11SFhw3LQN+MUOtn3Dsu3gUd3oX1viSx37E/yU9oh6debP+zQSBC2RX4crDuJ5dNpdsvmTSMbbvkbZQ88hA==", + "dependencies": { + "@aws-sdk/util-dynamodb": "3.654.0", + "@smithy/core": "^2.4.3", + "@smithy/smithy-client": "^3.3.2", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" }, "peerDependencies": { - "@aws-sdk/client-dynamodb": "^3.651.1" + "@aws-sdk/client-dynamodb": "^3.654.0" } }, "node_modules/@aws-sdk/middleware-endpoint-discovery": { - "version": "3.649.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.649.0.tgz", - "integrity": "sha512-deyv8Vx2a7+63NVrOURfUlyfxPbpbtJSPHLbQikHthuEs3dYol/5LXr1VonFe9dlzHRa1ZPMnA2ibOBmUCwz5g==", + "version": "3.654.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.654.0.tgz", + "integrity": "sha512-oHmSZYWsoGSYTjrohu/EFbtthGZOr9qIU8ewDzzhI2ceCEvCy6w7Vd/Ov1pG6C3faNEGAGNZynOmYJBeF2XIOA==", "dependencies": { "@aws-sdk/endpoint-cache": "3.572.0", - "@aws-sdk/types": "3.649.0", - "@smithy/node-config-provider": "^3.1.5", - "@smithy/protocol-http": "^4.1.1", - "@smithy/types": "^3.4.0", + "@aws-sdk/types": "3.654.0", + "@smithy/node-config-provider": "^3.1.7", + "@smithy/protocol-http": "^4.1.3", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "engines": { @@ -1129,13 +1129,13 @@ } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.649.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.649.0.tgz", - "integrity": "sha512-PjAe2FocbicHVgNNwdSZ05upxIO7AgTPFtQLpnIAmoyzMcgv/zNB5fBn3uAnQSAeEPPCD+4SYVEUD1hw1ZBvEg==", + "version": "3.654.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.654.0.tgz", + "integrity": "sha512-rxGgVHWKp8U2ubMv+t+vlIk7QYUaRCHaVpmUlJv0Wv6Q0KeO9a42T9FxHphjOTlCGQOLcjCreL9CF8Qhtb4mdQ==", "dependencies": { - "@aws-sdk/types": "3.649.0", - "@smithy/protocol-http": "^4.1.1", - "@smithy/types": "^3.4.0", + "@aws-sdk/types": "3.654.0", + "@smithy/protocol-http": "^4.1.3", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "engines": { @@ -1143,12 +1143,12 @@ } }, "node_modules/@aws-sdk/middleware-logger": { - "version": "3.649.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.649.0.tgz", - "integrity": "sha512-qdqRx6q7lYC6KL/NT9x3ShTL0TBuxdkCczGzHzY3AnOoYUjnCDH7Vlq867O6MAvb4EnGNECFzIgtkZkQ4FhY5w==", + "version": "3.654.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.654.0.tgz", + "integrity": "sha512-OQYb+nWlmASyXfRb989pwkJ9EVUMP1CrKn2eyTk3usl20JZmKo2Vjis6I0tLUkMSxMhnBJJlQKyWkRpD/u1FVg==", "dependencies": { - "@aws-sdk/types": "3.649.0", - "@smithy/types": "^3.4.0", + "@aws-sdk/types": "3.654.0", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "engines": { @@ -1156,13 +1156,13 @@ } }, "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.649.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.649.0.tgz", - "integrity": "sha512-IPnO4wlmaLRf6IYmJW2i8gJ2+UPXX0hDRv1it7Qf8DpBW+lGyF2rnoN7NrFX0WIxdGOlJF1RcOr/HjXb2QeXfQ==", + "version": "3.654.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.654.0.tgz", + "integrity": "sha512-gKSomgltKVmsT8sC6W7CrADZ4GHwX9epk3GcH6QhebVO3LA9LRbkL3TwOPUXakxxOLLUTYdOZLIOtFf7iH00lg==", "dependencies": { - "@aws-sdk/types": "3.649.0", - "@smithy/protocol-http": "^4.1.1", - "@smithy/types": "^3.4.0", + "@aws-sdk/types": "3.654.0", + "@smithy/protocol-http": "^4.1.3", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "engines": { @@ -1170,14 +1170,14 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.649.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.649.0.tgz", - "integrity": "sha512-q6sO10dnCXoxe9thobMJxekhJumzd1j6dxcE1+qJdYKHJr6yYgWbogJqrLCpWd30w0lEvnuAHK8lN2kWLdJxJw==", - "dependencies": { - "@aws-sdk/types": "3.649.0", - "@aws-sdk/util-endpoints": "3.649.0", - "@smithy/protocol-http": "^4.1.1", - "@smithy/types": "^3.4.0", + "version": "3.654.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.654.0.tgz", + "integrity": "sha512-liCcqPAyRsr53cy2tYu4qeH4MMN0eh9g6k56XzI5xd4SghXH5YWh4qOYAlQ8T66ZV4nPMtD8GLtLXGzsH8moFg==", + "dependencies": { + "@aws-sdk/types": "3.654.0", + "@aws-sdk/util-endpoints": "3.654.0", + "@smithy/protocol-http": "^4.1.3", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "engines": { @@ -1185,15 +1185,15 @@ } }, "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.649.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.649.0.tgz", - "integrity": "sha512-xURBvdQXvRvca5Du8IlC5FyCj3pkw8Z75+373J3Wb+vyg8GjD14HfKk1Je1HCCQDyIE9VB/scYDcm9ri0ppePw==", + "version": "3.654.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.654.0.tgz", + "integrity": "sha512-ydGOrXJxj3x0sJhsXyTmvJVLAE0xxuTWFJihTl67RtaO7VRNtd82I3P3bwoMMaDn5WpmV5mPo8fEUDRlBm3fPg==", "dependencies": { - "@aws-sdk/types": "3.649.0", - "@smithy/node-config-provider": "^3.1.5", - "@smithy/types": "^3.4.0", + "@aws-sdk/types": "3.654.0", + "@smithy/node-config-provider": "^3.1.7", + "@smithy/types": "^3.4.2", "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.4", + "@smithy/util-middleware": "^3.0.6", "tslib": "^2.6.2" }, "engines": { @@ -1201,29 +1201,29 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.649.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.649.0.tgz", - "integrity": "sha512-ZBqr+JuXI9RiN+4DSZykMx5gxpL8Dr3exIfFhxMiwAP3DQojwl0ub8ONjMuAjq9OvmX6n+jHZL6fBnNgnNFC8w==", - "dependencies": { - "@aws-sdk/types": "3.649.0", - "@smithy/property-provider": "^3.1.4", - "@smithy/shared-ini-file-loader": "^3.1.5", - "@smithy/types": "^3.4.0", + "version": "3.654.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.654.0.tgz", + "integrity": "sha512-D8GeJYmvbfWkQDtTB4owmIobSMexZel0fOoetwvgCQ/7L8VPph3Q2bn1TRRIXvH7wdt6DcDxA3tKMHPBkT3GlA==", + "dependencies": { + "@aws-sdk/types": "3.654.0", + "@smithy/property-provider": "^3.1.6", + "@smithy/shared-ini-file-loader": "^3.1.7", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" }, "peerDependencies": { - "@aws-sdk/client-sso-oidc": "^3.649.0" + "@aws-sdk/client-sso-oidc": "^3.654.0" } }, "node_modules/@aws-sdk/types": { - "version": "3.649.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.649.0.tgz", - "integrity": "sha512-PuPw8RysbhJNlaD2d/PzOTf8sbf4Dsn2b7hwyGh7YVG3S75yTpxSAZxrnhKsz9fStgqFmnw/jUfV/G+uQAeTVw==", + "version": "3.654.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.654.0.tgz", + "integrity": "sha512-VWvbED3SV+10QJIcmU/PKjsKilsTV16d1I7/on4bvD/jo1qGeMXqLDBSen3ks/tuvXZF/mFc7ZW/W2DiLVtO7A==", "dependencies": { - "@smithy/types": "^3.4.0", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "engines": { @@ -1231,9 +1231,9 @@ } }, "node_modules/@aws-sdk/util-dynamodb": { - "version": "3.651.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.651.1.tgz", - "integrity": "sha512-/06/Ao3AnvTlHu5jFqpGwK9eqbjwHRTWmyFPo65gwuR1QQwxQbGw0QSnk2OMMUm1CeGmqARj93TYZif/71UheA==", + "version": "3.654.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.654.0.tgz", + "integrity": "sha512-Jzl/1TR41VwtlBOBv3xfMHUErK6oLxkhTPmlUpwK0uY5XhKi17mr/JimYMjhOce3z3KNlkEpFLDmxUElw04p+w==", "dependencies": { "tslib": "^2.6.2" }, @@ -1241,17 +1241,17 @@ "node": ">=16.0.0" }, "peerDependencies": { - "@aws-sdk/client-dynamodb": "^3.651.1" + "@aws-sdk/client-dynamodb": "^3.654.0" } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.649.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.649.0.tgz", - "integrity": "sha512-bZI1Wc3R/KibdDVWFxX/N4AoJFG4VJ92Dp4WYmOrVD6VPkb8jPz7ZeiYc7YwPl8NoDjYyPneBV0lEoK/V8OKAA==", + "version": "3.654.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.654.0.tgz", + "integrity": "sha512-i902fcBknHs0Irgdpi62+QMvzxE+bczvILXigYrlHL4+PiEnlMVpni5L5W1qCkNZXf8AaMrSBuR1NZAGp6UOUw==", "dependencies": { - "@aws-sdk/types": "3.649.0", - "@smithy/types": "^3.4.0", - "@smithy/util-endpoints": "^2.1.0", + "@aws-sdk/types": "3.654.0", + "@smithy/types": "^3.4.2", + "@smithy/util-endpoints": "^2.1.2", "tslib": "^2.6.2" }, "engines": { @@ -1270,24 +1270,24 @@ } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.649.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.649.0.tgz", - "integrity": "sha512-IY43r256LhKAvdEVQO/FPdUyVpcZS5EVxh/WHVdNzuN1bNLoUK2rIzuZqVA0EGguvCxoXVmQv9m50GvG7cGktg==", + "version": "3.654.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.654.0.tgz", + "integrity": "sha512-ykYAJqvnxLt7wfrqya28wuH3/7NdrwzfiFd7NqEVQf7dXVxL5RPEpD7DxjcyQo3DsHvvdUvGZVaQhozycn1pzA==", "dependencies": { - "@aws-sdk/types": "3.649.0", - "@smithy/types": "^3.4.0", + "@aws-sdk/types": "3.654.0", + "@smithy/types": "^3.4.2", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.649.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.649.0.tgz", - "integrity": "sha512-x5DiLpZDG/AJmCIBnE3Xhpwy35QIo3WqNiOpw6ExVs1NydbM/e90zFPSfhME0FM66D/WorigvluBxxwjxDm/GA==", + "version": "3.654.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.654.0.tgz", + "integrity": "sha512-a0ojjdBN6pqv6gB4H/QPPSfhs7mFtlVwnmKCM/QrTaFzN0U810PJ1BST3lBx5sa23I5jWHGaoFY+5q65C3clLQ==", "dependencies": { - "@aws-sdk/types": "3.649.0", - "@smithy/node-config-provider": "^3.1.5", - "@smithy/types": "^3.4.0", + "@aws-sdk/types": "3.654.0", + "@smithy/node-config-provider": "^3.1.7", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "engines": { @@ -4512,11 +4512,11 @@ "dev": true }, "node_modules/@smithy/abort-controller": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.2.tgz", - "integrity": "sha512-b5g+PNujlfqIib9BjkNB108NyO5aZM/RXjfOCXRCqXQ1oPnIkfvdORrztbGgCZdPe/BN/MKDlrGA7PafKPM2jw==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.4.tgz", + "integrity": "sha512-VupaALAQlXViW3/enTf/f5l5JZYSAxoJL7f0nanhNNKnww6DGCg1oYIuNP78KDugnkwthBO6iEcym16HhWV8RQ==", "dependencies": { - "@smithy/types": "^3.4.0", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "engines": { @@ -4524,14 +4524,14 @@ } }, "node_modules/@smithy/config-resolver": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.6.tgz", - "integrity": "sha512-j7HuVNoRd8EhcFp0MzcUb4fG40C7BcyshH+fAd3Jhd8bINNFvEQYBrZoS/SK6Pun9WPlfoI8uuU2SMz8DsEGlA==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.8.tgz", + "integrity": "sha512-Tv1obAC18XOd2OnDAjSWmmthzx6Pdeh63FbLin8MlPiuJ2ATpKkq0NcNOJFr0dO+JmZXnwu8FQxKJ3TKJ3Hulw==", "dependencies": { - "@smithy/node-config-provider": "^3.1.5", - "@smithy/types": "^3.4.0", + "@smithy/node-config-provider": "^3.1.7", + "@smithy/types": "^3.4.2", "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.4", + "@smithy/util-middleware": "^3.0.6", "tslib": "^2.6.2" }, "engines": { @@ -4539,18 +4539,18 @@ } }, "node_modules/@smithy/core": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.4.1.tgz", - "integrity": "sha512-7cts7/Oni7aCHebHGiBeWoz5z+vmH+Vx2Z/UW3XtXMslcxI3PEwBZxNinepwZjixS3n12fPc247PHWmjU7ndsQ==", - "dependencies": { - "@smithy/middleware-endpoint": "^3.1.1", - "@smithy/middleware-retry": "^3.0.16", - "@smithy/middleware-serde": "^3.0.4", - "@smithy/protocol-http": "^4.1.1", - "@smithy/smithy-client": "^3.3.0", - "@smithy/types": "^3.4.0", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.4.3.tgz", + "integrity": "sha512-4LTusLqFMRVQUfC3RNuTg6IzYTeJNpydRdTKq7J5wdEyIRQSu3rGIa3s80mgG2hhe6WOZl9IqTSo1pgbn6EHhA==", + "dependencies": { + "@smithy/middleware-endpoint": "^3.1.3", + "@smithy/middleware-retry": "^3.0.18", + "@smithy/middleware-serde": "^3.0.6", + "@smithy/protocol-http": "^4.1.3", + "@smithy/smithy-client": "^3.3.2", + "@smithy/types": "^3.4.2", "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-middleware": "^3.0.4", + "@smithy/util-middleware": "^3.0.6", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, @@ -4559,14 +4559,14 @@ } }, "node_modules/@smithy/credential-provider-imds": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.1.tgz", - "integrity": "sha512-4z/oTWpRF2TqQI3aCM89/PWu3kim58XU4kOCTtuTJnoaS4KT95cPWMxbQfTN2vzcOe96SOKO8QouQW/+ESB1fQ==", - "dependencies": { - "@smithy/node-config-provider": "^3.1.5", - "@smithy/property-provider": "^3.1.4", - "@smithy/types": "^3.4.0", - "@smithy/url-parser": "^3.0.4", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.3.tgz", + "integrity": "sha512-VoxMzSzdvkkjMJNE38yQgx4CfnmT+Z+5EUXkg4x7yag93eQkVQgZvN3XBSHC/ylfBbLbAtdu7flTCChX9I+mVg==", + "dependencies": { + "@smithy/node-config-provider": "^3.1.7", + "@smithy/property-provider": "^3.1.6", + "@smithy/types": "^3.4.2", + "@smithy/url-parser": "^3.0.6", "tslib": "^2.6.2" }, "engines": { @@ -4574,23 +4574,23 @@ } }, "node_modules/@smithy/eventstream-codec": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-3.1.3.tgz", - "integrity": "sha512-mKBrmhg6Zd3j07G9dkKTGmrU7pdJGTNz8LbZtIOR3QoodS5yDNqEqoXU4Eg38snZcnCAh7NPBsw5ndxtJPLiCg==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-3.1.5.tgz", + "integrity": "sha512-6pu+PT2r+5ZnWEV3vLV1DzyrpJ0TmehQlniIDCSpZg6+Ji2SfOI38EqUyQ+O8lotVElCrfVc9chKtSMe9cmCZQ==", "dependencies": { "@aws-crypto/crc32": "5.2.0", - "@smithy/types": "^3.4.0", + "@smithy/types": "^3.4.2", "@smithy/util-hex-encoding": "^3.0.0", "tslib": "^2.6.2" } }, "node_modules/@smithy/eventstream-serde-browser": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-3.0.7.tgz", - "integrity": "sha512-UC4RQqyM8B0g5cX/xmWtsNgSBmZ13HrzCqoe5Ulcz6R462/egbIdfTXnayik7jkjvwOrCPL1N11Q9S+n68jPLA==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-3.0.9.tgz", + "integrity": "sha512-PiQLo6OQmZAotJweIcObL1H44gkvuJACKMNqpBBe5Rf2Ax1DOcGi/28+feZI7yTe1ERHlQQaGnm8sSkyDUgsMg==", "dependencies": { - "@smithy/eventstream-serde-universal": "^3.0.6", - "@smithy/types": "^3.4.0", + "@smithy/eventstream-serde-universal": "^3.0.8", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "engines": { @@ -4598,11 +4598,11 @@ } }, "node_modules/@smithy/eventstream-serde-config-resolver": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.0.4.tgz", - "integrity": "sha512-saIs5rtAMpifqL7u7nc5YeE/6gkenzXpSz5NwEyhIesRWtHK+zEuYn9KY8SArZEbPSHyGxvvgKk1z86VzfUGHw==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.0.6.tgz", + "integrity": "sha512-iew15It+c7WfnVowWkt2a7cdPp533LFJnpjDQgfZQcxv2QiOcyEcea31mnrk5PVbgo0nNH3VbYGq7myw2q/F6A==", "dependencies": { - "@smithy/types": "^3.4.0", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "engines": { @@ -4610,12 +4610,12 @@ } }, "node_modules/@smithy/eventstream-serde-node": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-3.0.6.tgz", - "integrity": "sha512-gRKGBdZah3EjZZgWcsTpShq4cZ4Q4JTTe1OPob+jrftmbYj6CvpeydZbH0roO5SvBG8SI3aBZIet9TGN3zUxUw==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-3.0.8.tgz", + "integrity": "sha512-6m+wI+fT0na+6oao6UqALVA38fsScCpoG5UO/A8ZSyGLnPM2i4MS1cFUhpuALgvLMxfYoTCh7qSeJa0aG4IWpQ==", "dependencies": { - "@smithy/eventstream-serde-universal": "^3.0.6", - "@smithy/types": "^3.4.0", + "@smithy/eventstream-serde-universal": "^3.0.8", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "engines": { @@ -4623,12 +4623,12 @@ } }, "node_modules/@smithy/eventstream-serde-universal": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-3.0.6.tgz", - "integrity": "sha512-1jvXd4sFG+zKaL6WqrJXpL6E+oAMafuM5GPd4qF0+ccenZTX3DZugoCCjlooQyTh+TZho2FpdVYUf5J/bB/j6Q==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-3.0.8.tgz", + "integrity": "sha512-09tqzIQ6e+7jLqGvRji1yJoDbL/zob0OFhq75edgStWErGLf16+yI5hRc/o9/YAybOhUZs/swpW2SPn892G5Gg==", "dependencies": { - "@smithy/eventstream-codec": "^3.1.3", - "@smithy/types": "^3.4.0", + "@smithy/eventstream-codec": "^3.1.5", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "engines": { @@ -4636,23 +4636,23 @@ } }, "node_modules/@smithy/fetch-http-handler": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.5.tgz", - "integrity": "sha512-DjRtGmK8pKQMIo9+JlAKUt14Z448bg8nAN04yKIvlrrpmpRSG57s5d2Y83npks1r4gPtTRNbAFdQCoj9l3P2KQ==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.7.tgz", + "integrity": "sha512-Ra6IPI1spYLO+t62/3jQbodjOwAbto9wlpJdHZwkycm0Kit+GVpzHW/NMmSgY4rK1bjJ4qLAmCnaBzePO5Nkkg==", "dependencies": { - "@smithy/protocol-http": "^4.1.1", - "@smithy/querystring-builder": "^3.0.4", - "@smithy/types": "^3.4.0", + "@smithy/protocol-http": "^4.1.3", + "@smithy/querystring-builder": "^3.0.6", + "@smithy/types": "^3.4.2", "@smithy/util-base64": "^3.0.0", "tslib": "^2.6.2" } }, "node_modules/@smithy/hash-node": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.4.tgz", - "integrity": "sha512-6FgTVqEfCr9z/7+Em8BwSkJKA2y3krf1em134x3yr2NHWVCo2KYI8tcA53cjeO47y41jwF84ntsEE0Pe6pNKlg==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.6.tgz", + "integrity": "sha512-c/FHEdKK/7DU2z6ZE91L36ahyXWayR3B+FzELjnYq7wH5YqIseM24V+pWCS9kFn1Ln8OFGTf+pyYPiHZuX0s/Q==", "dependencies": { - "@smithy/types": "^3.4.0", + "@smithy/types": "^3.4.2", "@smithy/util-buffer-from": "^3.0.0", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" @@ -4662,11 +4662,11 @@ } }, "node_modules/@smithy/invalid-dependency": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.4.tgz", - "integrity": "sha512-MJBUrojC4SEXi9aJcnNOE3oNAuYNphgCGFXscaCj2TA/59BTcXhzHACP8jnnEU3n4yir/NSLKzxqez0T4x4tjA==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.6.tgz", + "integrity": "sha512-czM7Ioq3s8pIXht7oD+vmgy4Wfb4XavU/k/irO8NdXFFOx7YAlsCCcKOh/lJD1mJSYQqiR7NmpZ9JviryD/7AQ==", "dependencies": { - "@smithy/types": "^3.4.0", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" } }, @@ -4682,17 +4682,17 @@ } }, "node_modules/@smithy/middleware-compression": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-compression/-/middleware-compression-3.0.8.tgz", - "integrity": "sha512-qY3ALlU0YT+ewBniwjQHwYApIK3fQWiNrLtcnw5Wk4spYZJQlDl0Z9SOvL+GKX4mKOlbR/pWG/gKfpGqwHW65Q==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@smithy/middleware-compression/-/middleware-compression-3.0.10.tgz", + "integrity": "sha512-0dzc3D4GqbuHFYN0bDti+suxAT18s2RFL1EYIvZSTOLz0Vt7E/xqgNLgQ+SDCg/B8kvR0JeClkCqYPcWEqtnQQ==", "dev": true, "dependencies": { "@smithy/is-array-buffer": "^3.0.0", - "@smithy/node-config-provider": "^3.1.5", - "@smithy/protocol-http": "^4.1.1", - "@smithy/types": "^3.4.0", + "@smithy/node-config-provider": "^3.1.7", + "@smithy/protocol-http": "^4.1.3", + "@smithy/types": "^3.4.2", "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.4", + "@smithy/util-middleware": "^3.0.6", "@smithy/util-utf8": "^3.0.0", "fflate": "0.8.1", "tslib": "^2.6.2" @@ -4702,12 +4702,12 @@ } }, "node_modules/@smithy/middleware-content-length": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.6.tgz", - "integrity": "sha512-AFyHCfe8rumkJkz+hCOVJmBagNBj05KypyDwDElA4TgMSA4eYDZRjVePFZuyABrJZFDc7uVj3dpFIDCEhf59SA==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.8.tgz", + "integrity": "sha512-VuyszlSO49WKh3H9/kIO2kf07VUwGV80QRiaDxUfP8P8UKlokz381ETJvwLhwuypBYhLymCYyNhB3fLAGBX2og==", "dependencies": { - "@smithy/protocol-http": "^4.1.1", - "@smithy/types": "^3.4.0", + "@smithy/protocol-http": "^4.1.3", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "engines": { @@ -4715,16 +4715,16 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.1.1.tgz", - "integrity": "sha512-Irv+soW8NKluAtFSEsF8O3iGyLxa5oOevJb/e1yNacV9H7JP/yHyJuKST5YY2ORS1+W34VR8EuUrOF+K29Pl4g==", - "dependencies": { - "@smithy/middleware-serde": "^3.0.4", - "@smithy/node-config-provider": "^3.1.5", - "@smithy/shared-ini-file-loader": "^3.1.5", - "@smithy/types": "^3.4.0", - "@smithy/url-parser": "^3.0.4", - "@smithy/util-middleware": "^3.0.4", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.1.3.tgz", + "integrity": "sha512-KeM/OrK8MVFUsoJsmCN0MZMVPjKKLudn13xpgwIMpGTYpA8QZB2Xq5tJ+RE6iu3A6NhOI4VajDTwBsm8pwwrhg==", + "dependencies": { + "@smithy/middleware-serde": "^3.0.6", + "@smithy/node-config-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.7", + "@smithy/types": "^3.4.2", + "@smithy/url-parser": "^3.0.6", + "@smithy/util-middleware": "^3.0.6", "tslib": "^2.6.2" }, "engines": { @@ -4732,17 +4732,17 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.16.tgz", - "integrity": "sha512-08kI36p1yB4CWO3Qi+UQxjzobt8iQJpnruF0K5BkbZmA/N/sJ51A1JJGJ36GgcbFyPfWw2FU48S5ZoqXt0h0jw==", - "dependencies": { - "@smithy/node-config-provider": "^3.1.5", - "@smithy/protocol-http": "^4.1.1", - "@smithy/service-error-classification": "^3.0.4", - "@smithy/smithy-client": "^3.3.0", - "@smithy/types": "^3.4.0", - "@smithy/util-middleware": "^3.0.4", - "@smithy/util-retry": "^3.0.4", + "version": "3.0.18", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.18.tgz", + "integrity": "sha512-YU1o/vYob6vlqZdd97MN8cSXRToknLXhFBL3r+c9CZcnxkO/rgNZ++CfgX2vsmnEKvlqdi26+SRtSzlVp5z6Mg==", + "dependencies": { + "@smithy/node-config-provider": "^3.1.7", + "@smithy/protocol-http": "^4.1.3", + "@smithy/service-error-classification": "^3.0.6", + "@smithy/smithy-client": "^3.3.2", + "@smithy/types": "^3.4.2", + "@smithy/util-middleware": "^3.0.6", + "@smithy/util-retry": "^3.0.6", "tslib": "^2.6.2", "uuid": "^9.0.1" }, @@ -4751,11 +4751,11 @@ } }, "node_modules/@smithy/middleware-serde": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.4.tgz", - "integrity": "sha512-1lPDB2O6IJ50Ucxgn7XrvZXbbuI48HmPCcMTuSoXT1lDzuTUfIuBjgAjpD8YLVMfnrjdepi/q45556LA51Pubw==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.6.tgz", + "integrity": "sha512-KKTUSl1MzOM0MAjGbudeaVNtIDo+PpekTBkCNwvfZlKndodrnvRo+00USatiyLOc0ujjO9UydMRu3O9dYML7ag==", "dependencies": { - "@smithy/types": "^3.4.0", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "engines": { @@ -4763,11 +4763,11 @@ } }, "node_modules/@smithy/middleware-stack": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.4.tgz", - "integrity": "sha512-sLMRjtMCqtVcrOqaOZ10SUnlFE25BSlmLsi4bRSGFD7dgR54eqBjfqkVkPBQyrKBortfGM0+2DJoUPcGECR+nQ==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.6.tgz", + "integrity": "sha512-2c0eSYhTQ8xQqHMcRxLMpadFbTXg6Zla5l0mwNftFCZMQmuhI7EbAJMx6R5eqfuV3YbJ3QGyS3d5uSmrHV8Khg==", "dependencies": { - "@smithy/types": "^3.4.0", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "engines": { @@ -4775,13 +4775,13 @@ } }, "node_modules/@smithy/node-config-provider": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.5.tgz", - "integrity": "sha512-dq/oR3/LxgCgizVk7in7FGTm0w9a3qM4mg3IIXLTCHeW3fV+ipssSvBZ2bvEx1+asfQJTyCnVLeYf7JKfd9v3Q==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.7.tgz", + "integrity": "sha512-g3mfnC3Oo8pOI0dYuPXLtdW1WGVb3bR2tkV21GNkm0ZvQjLTtamXAwCWt/FCb0HGvKt3gHHmF1XerG0ICfalOg==", "dependencies": { - "@smithy/property-provider": "^3.1.4", - "@smithy/shared-ini-file-loader": "^3.1.5", - "@smithy/types": "^3.4.0", + "@smithy/property-provider": "^3.1.6", + "@smithy/shared-ini-file-loader": "^3.1.7", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "engines": { @@ -4789,14 +4789,14 @@ } }, "node_modules/@smithy/node-http-handler": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.2.0.tgz", - "integrity": "sha512-5TFqaABbiY7uJMKbqR4OARjwI/l4TRoysDJ75pLpVQyO3EcmeloKYwDGyCtgB9WJniFx3BMkmGCB9+j+QiB+Ww==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.2.2.tgz", + "integrity": "sha512-42Cy4/oT2O+00aiG1iQ7Kd7rE6q8j7vI0gFfnMlUiATvyo8vefJkhb7O10qZY0jAqo5WZdUzfl9IV6wQ3iMBCg==", "dependencies": { - "@smithy/abort-controller": "^3.1.2", - "@smithy/protocol-http": "^4.1.1", - "@smithy/querystring-builder": "^3.0.4", - "@smithy/types": "^3.4.0", + "@smithy/abort-controller": "^3.1.4", + "@smithy/protocol-http": "^4.1.3", + "@smithy/querystring-builder": "^3.0.6", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "engines": { @@ -4804,11 +4804,11 @@ } }, "node_modules/@smithy/property-provider": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.4.tgz", - "integrity": "sha512-BmhefQbfkSl9DeU0/e6k9N4sT5bya5etv2epvqLUz3eGyfRBhtQq60nDkc1WPp4c+KWrzK721cUc/3y0f2psPQ==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.6.tgz", + "integrity": "sha512-NK3y/T7Q/Bw+Z8vsVs9MYIQ5v7gOX7clyrXcwhhIBQhbPgRl6JDrZbusO9qWDhcEus75Tg+VCxtIRfo3H76fpw==", "dependencies": { - "@smithy/types": "^3.4.0", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "engines": { @@ -4816,11 +4816,11 @@ } }, "node_modules/@smithy/protocol-http": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.1.tgz", - "integrity": "sha512-Fm5+8LkeIus83Y8jTL1XHsBGP8sPvE1rEVyKf/87kbOPTbzEDMcgOlzcmYXat2h+nC3wwPtRy8hFqtJS71+Wow==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.3.tgz", + "integrity": "sha512-GcbMmOYpH9iRqtC05RbRnc/0FssxSTHlmaNhYBTgSgNCYpdR3Kt88u5GAZTBmouzv+Zlj/VRv92J9ruuDeJuEw==", "dependencies": { - "@smithy/types": "^3.4.0", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "engines": { @@ -4828,11 +4828,11 @@ } }, "node_modules/@smithy/querystring-builder": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.4.tgz", - "integrity": "sha512-NEoPAsZPdpfVbF98qm8i5k1XMaRKeEnO47CaL5ja6Y1Z2DgJdwIJuJkTJypKm/IKfp8gc0uimIFLwhml8+/pAw==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.6.tgz", + "integrity": "sha512-sQe08RunoObe+Usujn9+R2zrLuQERi3CWvRO3BvnoWSYUaIrLKuAIeY7cMeDax6xGyfIP3x/yFWbEKSXvOnvVg==", "dependencies": { - "@smithy/types": "^3.4.0", + "@smithy/types": "^3.4.2", "@smithy/util-uri-escape": "^3.0.0", "tslib": "^2.6.2" }, @@ -4841,11 +4841,11 @@ } }, "node_modules/@smithy/querystring-parser": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.4.tgz", - "integrity": "sha512-7CHPXffFcakFzhO0OZs/rn6fXlTHrSDdLhIT6/JIk1u2bvwguTL3fMCc1+CfcbXA7TOhjWXu3TcB1EGMqJQwHg==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.6.tgz", + "integrity": "sha512-UJKw4LlEkytzz2Wq+uIdHf6qOtFfee/o7ruH0jF5I6UAuU+19r9QV7nU3P/uI0l6+oElRHmG/5cBBcGJrD7Ozg==", "dependencies": { - "@smithy/types": "^3.4.0", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "engines": { @@ -4853,22 +4853,22 @@ } }, "node_modules/@smithy/service-error-classification": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.4.tgz", - "integrity": "sha512-KciDHHKFVTb9A1KlJHBt2F26PBaDtoE23uTZy5qRvPzHPqrooXFi6fmx98lJb3Jl38PuUTqIuCUmmY3pacuMBQ==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.6.tgz", + "integrity": "sha512-53SpchU3+DUZrN7J6sBx9tBiCVGzsib2e4sc512Q7K9fpC5zkJKs6Z9s+qbMxSYrkEkle6hnMtrts7XNkMJJMg==", "dependencies": { - "@smithy/types": "^3.4.0" + "@smithy/types": "^3.4.2" }, "engines": { "node": ">=16.0.0" } }, "node_modules/@smithy/shared-ini-file-loader": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.5.tgz", - "integrity": "sha512-6jxsJ4NOmY5Du4FD0enYegNJl4zTSuKLiChIMqIkh+LapxiP7lmz5lYUNLE9/4cvA65mbBmtdzZ8yxmcqM5igg==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.7.tgz", + "integrity": "sha512-IA4K2qTJYXkF5OfVN4vsY1hfnUZjaslEE8Fsr/gGFza4TAC2A9NfnZuSY2srQIbt9bwtjHiAayrRVgKse4Q7fA==", "dependencies": { - "@smithy/types": "^3.4.0", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "engines": { @@ -4876,15 +4876,15 @@ } }, "node_modules/@smithy/signature-v4": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.1.1.tgz", - "integrity": "sha512-SH9J9be81TMBNGCmjhrgMWu4YSpQ3uP1L06u/K9SDrE2YibUix1qxedPCxEQu02At0P0SrYDjvz+y91vLG0KRQ==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.1.3.tgz", + "integrity": "sha512-YD2KYSCEEeFHcWZ1E3mLdAaHl8T/TANh6XwmocQ6nPcTdBfh4N5fusgnblnWDlnlU1/cUqEq3PiGi22GmT2Lkg==", "dependencies": { "@smithy/is-array-buffer": "^3.0.0", - "@smithy/protocol-http": "^4.1.1", - "@smithy/types": "^3.4.0", + "@smithy/protocol-http": "^4.1.3", + "@smithy/types": "^3.4.2", "@smithy/util-hex-encoding": "^3.0.0", - "@smithy/util-middleware": "^3.0.4", + "@smithy/util-middleware": "^3.0.6", "@smithy/util-uri-escape": "^3.0.0", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" @@ -4894,15 +4894,15 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.3.0.tgz", - "integrity": "sha512-H32nVo8tIX82kB0xI2LBrIcj8jx/3/ITotNLbeG1UL0b3b440YPR/hUvqjFJiaB24pQrMjRbU8CugqH5sV0hkw==", - "dependencies": { - "@smithy/middleware-endpoint": "^3.1.1", - "@smithy/middleware-stack": "^3.0.4", - "@smithy/protocol-http": "^4.1.1", - "@smithy/types": "^3.4.0", - "@smithy/util-stream": "^3.1.4", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.3.2.tgz", + "integrity": "sha512-RKDfhF2MTwXl7jan5d7QfS9eCC6XJbO3H+EZAvLQN8A5in4ib2Ml4zoeLo57w9QrqFekBPcsoC2hW3Ekw4vQ9Q==", + "dependencies": { + "@smithy/middleware-endpoint": "^3.1.3", + "@smithy/middleware-stack": "^3.0.6", + "@smithy/protocol-http": "^4.1.3", + "@smithy/types": "^3.4.2", + "@smithy/util-stream": "^3.1.6", "tslib": "^2.6.2" }, "engines": { @@ -4910,9 +4910,9 @@ } }, "node_modules/@smithy/types": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.0.tgz", - "integrity": "sha512-0shOWSg/pnFXPcsSU8ZbaJ4JBHZJPPzLCJxafJvbMVFo9l1w81CqpgUqjlKGNHVrVB7fhIs+WS82JDTyzaLyLA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", + "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", "dependencies": { "tslib": "^2.6.2" }, @@ -4921,12 +4921,12 @@ } }, "node_modules/@smithy/url-parser": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.4.tgz", - "integrity": "sha512-XdXfObA8WrloavJYtDuzoDhJAYc5rOt+FirFmKBRKaihu7QtU/METAxJgSo7uMK6hUkx0vFnqxV75urtRaLkLg==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.6.tgz", + "integrity": "sha512-47Op/NU8Opt49KyGpHtVdnmmJMsp2hEwBdyjuFB9M2V5QVOwA7pBhhxKN5z6ztKGrMw76gd8MlbPuzzvaAncuQ==", "dependencies": { - "@smithy/querystring-parser": "^3.0.4", - "@smithy/types": "^3.4.0", + "@smithy/querystring-parser": "^3.0.6", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" } }, @@ -4986,13 +4986,13 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.16.tgz", - "integrity": "sha512-Os8ddfNBe7hmc5UMWZxygIHCyAqY0aWR8Wnp/aKbti3f8Df/r0J9ttMZIxeMjsFgtVjEryB0q7SGcwBsHk8WEw==", + "version": "3.0.18", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.18.tgz", + "integrity": "sha512-/eveCzU6Z6Yw8dlYQLA4rcK30XY0E4L3lD3QFHm59mzDaWYelrXE1rlynuT3J6qxv+5yNy3a1JuzhG5hk5hcmw==", "dependencies": { - "@smithy/property-provider": "^3.1.4", - "@smithy/smithy-client": "^3.3.0", - "@smithy/types": "^3.4.0", + "@smithy/property-provider": "^3.1.6", + "@smithy/smithy-client": "^3.3.2", + "@smithy/types": "^3.4.2", "bowser": "^2.11.0", "tslib": "^2.6.2" }, @@ -5001,16 +5001,16 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.16.tgz", - "integrity": "sha512-rNhFIYRtrOrrhRlj6RL8jWA6/dcwrbGYAmy8+OAHjjzQ6zdzUBB1P+3IuJAgwWN6Y5GxI+mVXlM/pOjaoIgHow==", - "dependencies": { - "@smithy/config-resolver": "^3.0.6", - "@smithy/credential-provider-imds": "^3.2.1", - "@smithy/node-config-provider": "^3.1.5", - "@smithy/property-provider": "^3.1.4", - "@smithy/smithy-client": "^3.3.0", - "@smithy/types": "^3.4.0", + "version": "3.0.18", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.18.tgz", + "integrity": "sha512-9cfzRjArtOFPlTYRREJk00suUxVXTgbrzVncOyMRTUeMKnecG/YentLF3cORa+R6mUOMSrMSnT18jos1PKqK6Q==", + "dependencies": { + "@smithy/config-resolver": "^3.0.8", + "@smithy/credential-provider-imds": "^3.2.3", + "@smithy/node-config-provider": "^3.1.7", + "@smithy/property-provider": "^3.1.6", + "@smithy/smithy-client": "^3.3.2", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "engines": { @@ -5018,12 +5018,12 @@ } }, "node_modules/@smithy/util-endpoints": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.1.0.tgz", - "integrity": "sha512-ilS7/0jcbS2ELdg0fM/4GVvOiuk8/U3bIFXUW25xE1Vh1Ol4DP6vVHQKqM40rCMizCLmJ9UxK+NeJrKlhI3HVA==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.1.2.tgz", + "integrity": "sha512-FEISzffb4H8DLzGq1g4MuDpcv6CIG15fXoQzDH9SjpRJv6h7J++1STFWWinilG0tQh9H1v2UKWG19Jjr2B16zQ==", "dependencies": { - "@smithy/node-config-provider": "^3.1.5", - "@smithy/types": "^3.4.0", + "@smithy/node-config-provider": "^3.1.7", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "engines": { @@ -5042,11 +5042,11 @@ } }, "node_modules/@smithy/util-middleware": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.4.tgz", - "integrity": "sha512-uSXHTBhstb1c4nHdmQEdkNMv9LiRNaJ/lWV2U/GO+5F236YFpdPw+hyWI9Zc0Rp9XKzwD9kVZvhZmEgp0UCVnA==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.6.tgz", + "integrity": "sha512-BxbX4aBhI1O9p87/xM+zWy0GzT3CEVcXFPBRDoHAM+pV0eSW156pR+PSYEz0DQHDMYDsYAflC2bQNz2uaDBUZQ==", "dependencies": { - "@smithy/types": "^3.4.0", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "engines": { @@ -5054,12 +5054,12 @@ } }, "node_modules/@smithy/util-retry": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.4.tgz", - "integrity": "sha512-JJr6g0tO1qO2tCQyK+n3J18r34ZpvatlFN5ULcLranFIBZPxqoivb77EPyNTVwTGMEvvq2qMnyjm4jMIxjdLFg==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.6.tgz", + "integrity": "sha512-BRZiuF7IwDntAbevqMco67an0Sr9oLQJqqRCsSPZZHYRnehS0LHDAkJk/pSmI7Z8c/1Vet294H7fY2fWUgB+Rg==", "dependencies": { - "@smithy/service-error-classification": "^3.0.4", - "@smithy/types": "^3.4.0", + "@smithy/service-error-classification": "^3.0.6", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "engines": { @@ -5067,13 +5067,13 @@ } }, "node_modules/@smithy/util-stream": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.1.4.tgz", - "integrity": "sha512-txU3EIDLhrBZdGfon6E9V6sZz/irYnKFMblz4TLVjyq8hObNHNS2n9a2t7GIrl7d85zgEPhwLE0gANpZsvpsKg==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.1.6.tgz", + "integrity": "sha512-lQEUfTx1ht5CRdvIjdAN/gUL6vQt2wSARGGLaBHNe+iJSkRHlWzY+DOn0mFTmTgyU3jcI5n9DkT5gTzYuSOo6A==", "dependencies": { - "@smithy/fetch-http-handler": "^3.2.5", - "@smithy/node-http-handler": "^3.2.0", - "@smithy/types": "^3.4.0", + "@smithy/fetch-http-handler": "^3.2.7", + "@smithy/node-http-handler": "^3.2.2", + "@smithy/types": "^3.4.2", "@smithy/util-base64": "^3.0.0", "@smithy/util-buffer-from": "^3.0.0", "@smithy/util-hex-encoding": "^3.0.0", @@ -5108,12 +5108,12 @@ } }, "node_modules/@smithy/util-waiter": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-3.1.3.tgz", - "integrity": "sha512-OU0YllH51/CxD8iyr3UHSMwYqTGTyuxFdCMH/0F978t+iDmJseC/ttrWPb22zmYkhkrjqtipzC1xaMuax5QKIA==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-3.1.5.tgz", + "integrity": "sha512-jYOSvM3H6sZe3CHjzD2VQNCjWBJs+4DbtwBMvUp9y5EnnwNa7NQxTeYeQw0CKCAdGGZ3QvVkyJmvbvs5M/B10A==", "dependencies": { - "@smithy/abort-controller": "^3.1.2", - "@smithy/types": "^3.4.0", + "@smithy/abort-controller": "^3.1.4", + "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, "engines": { @@ -17310,8 +17310,8 @@ }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.651.1", - "@aws-sdk/lib-dynamodb": "^3.651.1", + "@aws-sdk/client-dynamodb": "^3.654.0", + "@aws-sdk/lib-dynamodb": "^3.654.0", "aws-sdk-client-mock": "^4.0.1", "aws-sdk-client-mock-jest": "^4.0.1" }, @@ -17370,7 +17370,7 @@ }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-cloudwatch": "^3.651.1", + "@aws-sdk/client-cloudwatch": "^3.654.0", "@types/promise-retry": "^1.1.3", "promise-retry": "^2.0.1" }, @@ -17392,11 +17392,11 @@ }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-appconfigdata": "^3.651.1", - "@aws-sdk/client-dynamodb": "^3.651.1", - "@aws-sdk/client-secrets-manager": "^3.651.1", - "@aws-sdk/client-ssm": "^3.651.1", - "@aws-sdk/util-dynamodb": "^3.651.1", + "@aws-sdk/client-appconfigdata": "^3.654.0", + "@aws-sdk/client-dynamodb": "^3.654.0", + "@aws-sdk/client-secrets-manager": "^3.654.0", + "@aws-sdk/client-ssm": "^3.654.0", + "@aws-sdk/util-dynamodb": "^3.654.0", "@smithy/util-base64": "^3.0.0", "aws-sdk-client-mock": "^4.0.1", "aws-sdk-client-mock-jest": "^4.0.1" @@ -17457,7 +17457,7 @@ "license": "MIT-0", "dependencies": { "@aws-cdk/cli-lib-alpha": "^2.155.0-alpha.0", - "@aws-sdk/client-lambda": "^3.651.1", + "@aws-sdk/client-lambda": "^3.654.0", "@smithy/util-utf8": "^3.0.0", "aws-cdk-lib": "^2.158.0", "esbuild": "^0.23.1", @@ -17477,8 +17477,8 @@ }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.651.1", - "@aws-sdk/client-xray": "^3.651.1" + "@aws-sdk/client-dynamodb": "^3.654.0", + "@aws-sdk/client-xray": "^3.654.0" }, "peerDependencies": { "@middy/core": "4.x || 5.x" diff --git a/packages/idempotency/package.json b/packages/idempotency/package.json index 45f37bad5d..598adf5e3c 100644 --- a/packages/idempotency/package.json +++ b/packages/idempotency/package.json @@ -125,8 +125,8 @@ ], "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.651.1", - "@aws-sdk/lib-dynamodb": "^3.651.1", + "@aws-sdk/client-dynamodb": "^3.654.0", + "@aws-sdk/lib-dynamodb": "^3.654.0", "aws-sdk-client-mock": "^4.0.1", "aws-sdk-client-mock-jest": "^4.0.1" } diff --git a/packages/metrics/package.json b/packages/metrics/package.json index d11f2da862..e64fa8e50c 100644 --- a/packages/metrics/package.json +++ b/packages/metrics/package.json @@ -62,7 +62,7 @@ "main": "./lib/cjs/index.js", "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-cloudwatch": "^3.651.1", + "@aws-sdk/client-cloudwatch": "^3.654.0", "@types/promise-retry": "^1.1.3", "promise-retry": "^2.0.1" }, diff --git a/packages/parameters/package.json b/packages/parameters/package.json index 1f47cee497..8776a06de1 100644 --- a/packages/parameters/package.json +++ b/packages/parameters/package.json @@ -154,11 +154,11 @@ ], "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-appconfigdata": "^3.651.1", - "@aws-sdk/client-dynamodb": "^3.651.1", - "@aws-sdk/client-secrets-manager": "^3.651.1", - "@aws-sdk/client-ssm": "^3.651.1", - "@aws-sdk/util-dynamodb": "^3.651.1", + "@aws-sdk/client-appconfigdata": "^3.654.0", + "@aws-sdk/client-dynamodb": "^3.654.0", + "@aws-sdk/client-secrets-manager": "^3.654.0", + "@aws-sdk/client-ssm": "^3.654.0", + "@aws-sdk/util-dynamodb": "^3.654.0", "@smithy/util-base64": "^3.0.0", "aws-sdk-client-mock": "^4.0.1", "aws-sdk-client-mock-jest": "^4.0.1" diff --git a/packages/testing/package.json b/packages/testing/package.json index 674b37265a..d4462c97e1 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -99,7 +99,7 @@ "homepage": "https://github.com/aws-powertools/powertools-lambda-typescript/tree/main/packages/testing#readme", "dependencies": { "@aws-cdk/cli-lib-alpha": "^2.155.0-alpha.0", - "@aws-sdk/client-lambda": "^3.651.1", + "@aws-sdk/client-lambda": "^3.654.0", "@smithy/util-utf8": "^3.0.0", "aws-cdk-lib": "^2.158.0", "esbuild": "^0.23.1", diff --git a/packages/tracer/package.json b/packages/tracer/package.json index 1c1a402fca..613742c448 100644 --- a/packages/tracer/package.json +++ b/packages/tracer/package.json @@ -28,8 +28,8 @@ "license": "MIT-0", "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.651.1", - "@aws-sdk/client-xray": "^3.651.1" + "@aws-sdk/client-dynamodb": "^3.654.0", + "@aws-sdk/client-xray": "^3.654.0" }, "peerDependencies": { "@middy/core": "4.x || 5.x" From 381c9c91b9a96bb1b3554d04ad7bfc3baeaf422b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 20 Sep 2024 15:47:19 +0200 Subject: [PATCH 14/52] chore(deps): bump the aws-cdk group across 1 directory with 2 updates (#3088) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Andrea Amorosi --- examples/app/package.json | 4 ++-- layers/package.json | 4 ++-- package-lock.json | 16 ++++++++-------- packages/testing/package.json | 2 +- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/examples/app/package.json b/examples/app/package.json index ec952c4ed7..bb1054fbae 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -30,8 +30,8 @@ "devDependencies": { "@types/aws-lambda": "^8.10.145", "@types/node": "22.5.5", - "aws-cdk": "^2.158.0", - "aws-cdk-lib": "^2.158.0", + "aws-cdk": "^2.159.0", + "aws-cdk-lib": "^2.159.0", "constructs": "^10.3.0", "source-map-support": "^0.5.21", "tsx": "^4.19.1", diff --git a/layers/package.json b/layers/package.json index da0b3879db..ecdd5e4c0f 100644 --- a/layers/package.json +++ b/layers/package.json @@ -36,8 +36,8 @@ "source-map-support": "^0.5.21" }, "dependencies": { - "aws-cdk": "^2.158.0", - "aws-cdk-lib": "^2.158.0", + "aws-cdk": "^2.159.0", + "aws-cdk-lib": "^2.159.0", "esbuild": "^0.23.1" } } diff --git a/package-lock.json b/package-lock.json index 9b5c1f1bc9..2060577333 100644 --- a/package-lock.json +++ b/package-lock.json @@ -73,8 +73,8 @@ "devDependencies": { "@types/aws-lambda": "^8.10.145", "@types/node": "22.5.5", - "aws-cdk": "^2.158.0", - "aws-cdk-lib": "^2.158.0", + "aws-cdk": "^2.159.0", + "aws-cdk-lib": "^2.159.0", "constructs": "^10.3.0", "source-map-support": "^0.5.21", "tsx": "^4.19.1", @@ -127,8 +127,8 @@ "version": "2.8.0", "license": "MIT-0", "dependencies": { - "aws-cdk": "^2.158.0", - "aws-cdk-lib": "^2.158.0", + "aws-cdk": "^2.159.0", + "aws-cdk-lib": "^2.159.0", "esbuild": "^0.23.1" }, "bin": { @@ -5923,9 +5923,9 @@ } }, "node_modules/aws-cdk-lib": { - "version": "2.158.0", - "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.158.0.tgz", - "integrity": "sha512-Pl9CCLM+XRTy6nyyRJM1INEMtwIlZOib0FWyq9i9E388vurw7sNVJ6tAsfLpGIOLHsFQCbF4f6OZ0KSVxmMaiA==", + "version": "2.159.0", + "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.159.0.tgz", + "integrity": "sha512-OzcOuwK11i4xfrcAdDfnALOEBk4tyL257xU9AYTywG7nxQBO7QdawgODcDQV2bXTtNZGZGTH6wwcESNvKk4n8g==", "bundleDependencies": [ "@balena/dockerignore", "case", @@ -17459,7 +17459,7 @@ "@aws-cdk/cli-lib-alpha": "^2.155.0-alpha.0", "@aws-sdk/client-lambda": "^3.654.0", "@smithy/util-utf8": "^3.0.0", - "aws-cdk-lib": "^2.158.0", + "aws-cdk-lib": "^2.159.0", "esbuild": "^0.23.1", "promise-retry": "^2.0.1" }, diff --git a/packages/testing/package.json b/packages/testing/package.json index d4462c97e1..fbafa3f07f 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -101,7 +101,7 @@ "@aws-cdk/cli-lib-alpha": "^2.155.0-alpha.0", "@aws-sdk/client-lambda": "^3.654.0", "@smithy/util-utf8": "^3.0.0", - "aws-cdk-lib": "^2.158.0", + "aws-cdk-lib": "^2.159.0", "esbuild": "^0.23.1", "promise-retry": "^2.0.1" }, From 53a7e54f541ca40906cd9a1dda034353550e72a1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 Sep 2024 14:59:31 +0200 Subject: [PATCH 15/52] chore(deps): bump rollup from 4.21.3 to 4.22.4 (#3106) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 134 +++++++++++++++++++++++----------------------- 1 file changed, 67 insertions(+), 67 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2060577333..2b8c70d319 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3933,9 +3933,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.3.tgz", - "integrity": "sha512-MmKSfaB9GX+zXl6E8z4koOr/xU63AMVleLEa64v7R0QF/ZloMs5vcD1sHgM64GXXS1csaJutG+ddtzcueI/BLg==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz", + "integrity": "sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==", "cpu": [ "arm" ], @@ -3946,9 +3946,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.3.tgz", - "integrity": "sha512-zrt8ecH07PE3sB4jPOggweBjJMzI1JG5xI2DIsUbkA+7K+Gkjys6eV7i9pOenNSDJH3eOr/jLb/PzqtmdwDq5g==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz", + "integrity": "sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==", "cpu": [ "arm64" ], @@ -3959,9 +3959,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.3.tgz", - "integrity": "sha512-P0UxIOrKNBFTQaXTxOH4RxuEBVCgEA5UTNV6Yz7z9QHnUJ7eLX9reOd/NYMO3+XZO2cco19mXTxDMXxit4R/eQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz", + "integrity": "sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==", "cpu": [ "arm64" ], @@ -3972,9 +3972,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.3.tgz", - "integrity": "sha512-L1M0vKGO5ASKntqtsFEjTq/fD91vAqnzeaF6sfNAy55aD+Hi2pBI5DKwCO+UNDQHWsDViJLqshxOahXyLSh3EA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz", + "integrity": "sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==", "cpu": [ "x64" ], @@ -3985,9 +3985,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.3.tgz", - "integrity": "sha512-btVgIsCjuYFKUjopPoWiDqmoUXQDiW2A4C3Mtmp5vACm7/GnyuprqIDPNczeyR5W8rTXEbkmrJux7cJmD99D2g==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz", + "integrity": "sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==", "cpu": [ "arm" ], @@ -3998,9 +3998,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.3.tgz", - "integrity": "sha512-zmjbSphplZlau6ZTkxd3+NMtE4UKVy7U4aVFMmHcgO5CUbw17ZP6QCgyxhzGaU/wFFdTfiojjbLG3/0p9HhAqA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz", + "integrity": "sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==", "cpu": [ "arm" ], @@ -4011,9 +4011,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.3.tgz", - "integrity": "sha512-nSZfcZtAnQPRZmUkUQwZq2OjQciR6tEoJaZVFvLHsj0MF6QhNMg0fQ6mUOsiCUpTqxTx0/O6gX0V/nYc7LrgPw==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz", + "integrity": "sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==", "cpu": [ "arm64" ], @@ -4024,9 +4024,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.3.tgz", - "integrity": "sha512-MnvSPGO8KJXIMGlQDYfvYS3IosFN2rKsvxRpPO2l2cum+Z3exiExLwVU+GExL96pn8IP+GdH8Tz70EpBhO0sIQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz", + "integrity": "sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==", "cpu": [ "arm64" ], @@ -4037,9 +4037,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.3.tgz", - "integrity": "sha512-+W+p/9QNDr2vE2AXU0qIy0qQE75E8RTwTwgqS2G5CRQ11vzq0tbnfBd6brWhS9bCRjAjepJe2fvvkvS3dno+iw==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz", + "integrity": "sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==", "cpu": [ "ppc64" ], @@ -4050,9 +4050,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.3.tgz", - "integrity": "sha512-yXH6K6KfqGXaxHrtr+Uoy+JpNlUlI46BKVyonGiaD74ravdnF9BUNC+vV+SIuB96hUMGShhKV693rF9QDfO6nQ==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz", + "integrity": "sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==", "cpu": [ "riscv64" ], @@ -4063,9 +4063,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.3.tgz", - "integrity": "sha512-R8cwY9wcnApN/KDYWTH4gV/ypvy9yZUHlbJvfaiXSB48JO3KpwSpjOGqO4jnGkLDSk1hgjYkTbTt6Q7uvPf8eg==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz", + "integrity": "sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==", "cpu": [ "s390x" ], @@ -4076,9 +4076,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.3.tgz", - "integrity": "sha512-kZPbX/NOPh0vhS5sI+dR8L1bU2cSO9FgxwM8r7wHzGydzfSjLRCFAT87GR5U9scj2rhzN3JPYVC7NoBbl4FZ0g==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz", + "integrity": "sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==", "cpu": [ "x64" ], @@ -4089,9 +4089,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.3.tgz", - "integrity": "sha512-S0Yq+xA1VEH66uiMNhijsWAafffydd2X5b77eLHfRmfLsRSpbiAWiRHV6DEpz6aOToPsgid7TI9rGd6zB1rhbg==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz", + "integrity": "sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==", "cpu": [ "x64" ], @@ -4102,9 +4102,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.3.tgz", - "integrity": "sha512-9isNzeL34yquCPyerog+IMCNxKR8XYmGd0tHSV+OVx0TmE0aJOo9uw4fZfUuk2qxobP5sug6vNdZR6u7Mw7Q+Q==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz", + "integrity": "sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==", "cpu": [ "arm64" ], @@ -4115,9 +4115,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.3.tgz", - "integrity": "sha512-nMIdKnfZfzn1Vsk+RuOvl43ONTZXoAPUUxgcU0tXooqg4YrAqzfKzVenqqk2g5efWh46/D28cKFrOzDSW28gTA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz", + "integrity": "sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==", "cpu": [ "ia32" ], @@ -4128,9 +4128,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.3.tgz", - "integrity": "sha512-fOvu7PCQjAj4eWDEuD8Xz5gpzFqXzGlxHZozHP4b9Jxv9APtdxL6STqztDzMLuRXEc4UpXGGhx029Xgm91QBeA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz", + "integrity": "sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==", "cpu": [ "x64" ], @@ -14588,9 +14588,9 @@ "dev": true }, "node_modules/rollup": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.3.tgz", - "integrity": "sha512-7sqRtBNnEbcBtMeRVc6VRsJMmpI+JU1z9VTvW8D4gXIYQFz0aLcsE6rRkyghZkLfEgUZgVvOG7A5CVz/VW5GIA==", + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.4.tgz", + "integrity": "sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==", "dev": true, "dependencies": { "@types/estree": "1.0.5" @@ -14603,22 +14603,22 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.21.3", - "@rollup/rollup-android-arm64": "4.21.3", - "@rollup/rollup-darwin-arm64": "4.21.3", - "@rollup/rollup-darwin-x64": "4.21.3", - "@rollup/rollup-linux-arm-gnueabihf": "4.21.3", - "@rollup/rollup-linux-arm-musleabihf": "4.21.3", - "@rollup/rollup-linux-arm64-gnu": "4.21.3", - "@rollup/rollup-linux-arm64-musl": "4.21.3", - "@rollup/rollup-linux-powerpc64le-gnu": "4.21.3", - "@rollup/rollup-linux-riscv64-gnu": "4.21.3", - "@rollup/rollup-linux-s390x-gnu": "4.21.3", - "@rollup/rollup-linux-x64-gnu": "4.21.3", - "@rollup/rollup-linux-x64-musl": "4.21.3", - "@rollup/rollup-win32-arm64-msvc": "4.21.3", - "@rollup/rollup-win32-ia32-msvc": "4.21.3", - "@rollup/rollup-win32-x64-msvc": "4.21.3", + "@rollup/rollup-android-arm-eabi": "4.22.4", + "@rollup/rollup-android-arm64": "4.22.4", + "@rollup/rollup-darwin-arm64": "4.22.4", + "@rollup/rollup-darwin-x64": "4.22.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.22.4", + "@rollup/rollup-linux-arm-musleabihf": "4.22.4", + "@rollup/rollup-linux-arm64-gnu": "4.22.4", + "@rollup/rollup-linux-arm64-musl": "4.22.4", + "@rollup/rollup-linux-powerpc64le-gnu": "4.22.4", + "@rollup/rollup-linux-riscv64-gnu": "4.22.4", + "@rollup/rollup-linux-s390x-gnu": "4.22.4", + "@rollup/rollup-linux-x64-gnu": "4.22.4", + "@rollup/rollup-linux-x64-musl": "4.22.4", + "@rollup/rollup-win32-arm64-msvc": "4.22.4", + "@rollup/rollup-win32-ia32-msvc": "4.22.4", + "@rollup/rollup-win32-x64-msvc": "4.22.4", "fsevents": "~2.3.2" } }, From b124ada6ecb303288fb5aef574f532cb0b0a5d85 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 Sep 2024 16:39:24 +0200 Subject: [PATCH 16/52] chore(deps): bump the aws-sdk-v3 group across 1 directory with 6 updates (#3107) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- examples/app/package.json | 2 +- examples/snippets/package.json | 8 +- package-lock.json | 170 ++++++++++++++++-------------- packages/idempotency/package.json | 8 +- packages/parameters/package.json | 8 +- packages/testing/package.json | 2 +- packages/tracer/package.json | 2 +- 7 files changed, 106 insertions(+), 94 deletions(-) diff --git a/examples/app/package.json b/examples/app/package.json index bb1054fbae..9b5f927d0c 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -46,7 +46,7 @@ "@aws-lambda-powertools/parameters": "^2.8.0", "@aws-lambda-powertools/tracer": "^2.8.0", "@aws-sdk/client-ssm": "^3.654.0", - "@aws-sdk/lib-dynamodb": "^3.654.0", + "@aws-sdk/lib-dynamodb": "^3.656.0", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.145", "@types/node": "22.5.5", diff --git a/examples/snippets/package.json b/examples/snippets/package.json index 61a505df33..4c84562e6a 100644 --- a/examples/snippets/package.json +++ b/examples/snippets/package.json @@ -33,14 +33,14 @@ "@aws-lambda-powertools/parser": "^2.8.0", "@aws-lambda-powertools/tracer": "^2.8.0", "@aws-sdk/client-appconfigdata": "^3.654.0", - "@aws-sdk/client-dynamodb": "^3.654.0", + "@aws-sdk/client-dynamodb": "^3.656.0", "@aws-sdk/client-secrets-manager": "^3.654.0", "@aws-sdk/client-ssm": "^3.654.0", - "@aws-sdk/util-dynamodb": "^3.654.0", + "@aws-sdk/util-dynamodb": "^3.656.0", "@middy/core": "^4.7.0", "aws-sdk": "^2.1691.0", - "aws-sdk-client-mock": "^4.0.1", - "aws-sdk-client-mock-jest": "^4.0.1", + "aws-sdk-client-mock": "^4.0.2", + "aws-sdk-client-mock-jest": "^4.0.2", "hashi-vault-js": "^0.4.16", "zod": "^3.23.8" } diff --git a/package-lock.json b/package-lock.json index 2b8c70d319..efe0c4b343 100644 --- a/package-lock.json +++ b/package-lock.json @@ -62,7 +62,7 @@ "@aws-lambda-powertools/parameters": "^2.8.0", "@aws-lambda-powertools/tracer": "^2.8.0", "@aws-sdk/client-ssm": "^3.654.0", - "@aws-sdk/lib-dynamodb": "^3.654.0", + "@aws-sdk/lib-dynamodb": "^3.656.0", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.145", "@types/node": "22.5.5", @@ -111,14 +111,14 @@ "@aws-lambda-powertools/parser": "^2.8.0", "@aws-lambda-powertools/tracer": "^2.8.0", "@aws-sdk/client-appconfigdata": "^3.654.0", - "@aws-sdk/client-dynamodb": "^3.654.0", + "@aws-sdk/client-dynamodb": "^3.656.0", "@aws-sdk/client-secrets-manager": "^3.654.0", "@aws-sdk/client-ssm": "^3.654.0", - "@aws-sdk/util-dynamodb": "^3.654.0", + "@aws-sdk/util-dynamodb": "^3.656.0", "@middy/core": "^4.7.0", "aws-sdk": "^2.1691.0", - "aws-sdk-client-mock": "^4.0.1", - "aws-sdk-client-mock-jest": "^4.0.1", + "aws-sdk-client-mock": "^4.0.2", + "aws-sdk-client-mock-jest": "^4.0.2", "hashi-vault-js": "^0.4.16", "zod": "^3.23.8" } @@ -517,9 +517,9 @@ } }, "node_modules/@aws-sdk/client-dynamodb": { - "version": "3.654.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.654.0.tgz", - "integrity": "sha512-QG7n2WJ4ZycoYnq04K7bYgai11in93XJgGJXeQM2jAszbMxrlFfczwhWDciHDz7hXWMhNvpKWuhvrXyxj9Irlg==", + "version": "3.656.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.656.0.tgz", + "integrity": "sha512-a7nzK4tGZHlg1IY63aGmdSlVLYpdYFwjIDFx3vQwNAzStwh8pbb7Fv8jLFTAi33ZNHM7H4mASwvgFbu8ZfbMVA==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", @@ -571,9 +571,9 @@ } }, "node_modules/@aws-sdk/client-lambda": { - "version": "3.654.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.654.0.tgz", - "integrity": "sha512-/ITRFpQeutTNsyZ5AjLCnNKM08rPq5WSEtNoJ2zLOAinOUnPpLFZ3p6w+5AVc2FYTeFY5gxby84Ejs4gzS8/Mg==", + "version": "3.656.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.656.0.tgz", + "integrity": "sha512-tpJDNpMa4G3TTjBEimBkczM/obxWwrYo88BD5/iwmxQ9LUpBLrGfbH3e1YU5vxhEvGWzNUvP7IGbIif7EvaqpQ==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", @@ -1095,11 +1095,11 @@ } }, "node_modules/@aws-sdk/lib-dynamodb": { - "version": "3.654.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.654.0.tgz", - "integrity": "sha512-/mi11SFhw3LQN+MUOtn3Dsu3gUd3oX1viSx37E/yU9oh6debP+zQSBC2RX4crDuJ5dNpdsvmTSMbbvkbZQ88hA==", + "version": "3.656.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.656.0.tgz", + "integrity": "sha512-UgT+jSMZGckYuXXGpj+agCv0N8zuK/jCgw7nTQH9g02ZQHTI7dedHUnsgfBN5Jts7fm21Mxkwnd5Mj8xK5DeOQ==", "dependencies": { - "@aws-sdk/util-dynamodb": "3.654.0", + "@aws-sdk/util-dynamodb": "3.656.0", "@smithy/core": "^2.4.3", "@smithy/smithy-client": "^3.3.2", "@smithy/types": "^3.4.2", @@ -1109,7 +1109,7 @@ "node": ">=16.0.0" }, "peerDependencies": { - "@aws-sdk/client-dynamodb": "^3.654.0" + "@aws-sdk/client-dynamodb": "^3.656.0" } }, "node_modules/@aws-sdk/middleware-endpoint-discovery": { @@ -1231,9 +1231,9 @@ } }, "node_modules/@aws-sdk/util-dynamodb": { - "version": "3.654.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.654.0.tgz", - "integrity": "sha512-Jzl/1TR41VwtlBOBv3xfMHUErK6oLxkhTPmlUpwK0uY5XhKi17mr/JimYMjhOce3z3KNlkEpFLDmxUElw04p+w==", + "version": "3.656.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.656.0.tgz", + "integrity": "sha512-vavQ0AZ4t7US3zWCv8mSS9wH6O2nB2lW4yFMO5pkd1Y8YFE3DDFSbzl0zI2A2YSrU1n4fqFbCfXhQhK6sRYoNA==", "dependencies": { "tslib": "^2.6.2" }, @@ -1241,7 +1241,7 @@ "node": ">=16.0.0" }, "peerDependencies": { - "@aws-sdk/client-dynamodb": "^3.654.0" + "@aws-sdk/client-dynamodb": "^3.656.0" } }, "node_modules/@aws-sdk/util-endpoints": { @@ -4486,29 +4486,29 @@ } }, "node_modules/@sinonjs/samsam": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.0.tgz", - "integrity": "sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.2.tgz", + "integrity": "sha512-v46t/fwnhejRSFTGqbpn9u+LQ9xJDse10gNnPgAcxgdoCDMXj/G2asWAC/8Qs+BAZDicX+MNZouXT1A7c83kVw==", "dev": true, "dependencies": { - "@sinonjs/commons": "^2.0.0", + "@sinonjs/commons": "^3.0.1", "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" + "type-detect": "^4.1.0" } }, - "node_modules/@sinonjs/samsam/node_modules/@sinonjs/commons": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "node_modules/@sinonjs/samsam/node_modules/type-detect": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", + "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", "dev": true, - "dependencies": { - "type-detect": "4.0.8" + "engines": { + "node": ">=4" } }, "node_modules/@sinonjs/text-encoding": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", - "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz", + "integrity": "sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==", "dev": true }, "node_modules/@smithy/abort-controller": { @@ -5345,9 +5345,9 @@ "dev": true }, "node_modules/@types/sinon": { - "version": "10.0.20", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.20.tgz", - "integrity": "sha512-2APKKruFNCAZgx3daAyACGzWuJ028VVCUDk6o2rw/Z4PXT0ogwdV4KUegW0MwVs0Zu59auPXbbuBJHF12Sx1Eg==", + "version": "17.0.3", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-17.0.3.tgz", + "integrity": "sha512-j3uovdn8ewky9kRBG19bOwaZbexJu/XjtkHyjvUgt4xfPFz18dcORIMqnYh66Fx3Powhcr85NT5+er3+oViapw==", "dev": true, "dependencies": { "@types/sinonjs__fake-timers": "*" @@ -6285,27 +6285,27 @@ } }, "node_modules/aws-sdk-client-mock": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/aws-sdk-client-mock/-/aws-sdk-client-mock-4.0.1.tgz", - "integrity": "sha512-yD2mmgy73Xce097G5hIpr1k7j50qzvJ49/+6osGZiCyk4m6cwhb+2x7kKFY1gEMwTzaS8+m8fXv9SB29SkRYyQ==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/aws-sdk-client-mock/-/aws-sdk-client-mock-4.0.2.tgz", + "integrity": "sha512-saFLXQPqHuMH0A1peNIGoAFEq9B0bpS5y5qrr+Y5F86MasVkCctggHKhHPRVjGr852Nz7cLg/PBxKs6lQoK3mg==", "dev": true, "dependencies": { - "@types/sinon": "^10.0.10", - "sinon": "^16.1.3", + "@types/sinon": "^17.0.3", + "sinon": "^18.0.1", "tslib": "^2.1.0" } }, "node_modules/aws-sdk-client-mock-jest": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/aws-sdk-client-mock-jest/-/aws-sdk-client-mock-jest-4.0.1.tgz", - "integrity": "sha512-PilgESg/u2sJvHg0+4C8/ty7w2+/pMhBYpdfPlCysnsjNfFk6a7eW7fwfIWoL93BCvcEblPdLyVL/vYTRCNFYA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/aws-sdk-client-mock-jest/-/aws-sdk-client-mock-jest-4.0.2.tgz", + "integrity": "sha512-3GlApOCVg0ykbpf/t1AD6lTAeaL1Yu0MpTnpd8noCdI/mC8A9GvoSu60n8zgY3O+qaOE4DxHLdqWPMMM6iCQKg==", "dev": true, "dependencies": { "expect": ">28.1.3", "tslib": "^2.1.0" }, "peerDependencies": { - "aws-sdk-client-mock": "4.0.1" + "aws-sdk-client-mock": "4.0.2" } }, "node_modules/aws-sdk/node_modules/buffer": { @@ -12229,25 +12229,25 @@ "dev": true }, "node_modules/nise": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.9.tgz", - "integrity": "sha512-qOnoujW4SV6e40dYxJOb3uvuoPHtmLzIk4TFo+j0jPJoC+5Z9xja5qH5JZobEPsa8+YYphMrOSwnrshEhG2qww==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/nise/-/nise-6.1.1.tgz", + "integrity": "sha512-aMSAzLVY7LyeM60gvBS423nBmIPP+Wy7St7hsb+8/fc1HmeoHJfLO8CKse4u3BtOZvQLJghYPI2i/1WZrEj5/g==", "dev": true, "dependencies": { - "@sinonjs/commons": "^3.0.0", - "@sinonjs/fake-timers": "^11.2.2", - "@sinonjs/text-encoding": "^0.7.2", + "@sinonjs/commons": "^3.0.1", + "@sinonjs/fake-timers": "^13.0.1", + "@sinonjs/text-encoding": "^0.7.3", "just-extend": "^6.2.0", - "path-to-regexp": "^6.2.1" + "path-to-regexp": "^8.1.0" } }, "node_modules/nise/node_modules/@sinonjs/fake-timers": { - "version": "11.2.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz", - "integrity": "sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==", + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.2.tgz", + "integrity": "sha512-4Bb+oqXZTSTZ1q27Izly9lv8B9dlV61CROxPiVtywwzv5SnytJqhvYe6FclHYuXml4cd1VHPo1zd5PmTeJozvA==", "dev": true, "dependencies": { - "@sinonjs/commons": "^3.0.0" + "@sinonjs/commons": "^3.0.1" } }, "node_modules/node-fetch": { @@ -13693,10 +13693,13 @@ } }, "node_modules/path-to-regexp": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", - "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", - "dev": true + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.1.0.tgz", + "integrity": "sha512-Bqn3vc8CMHty6zuD+tG23s6v2kwxslHEhTj4eYaVKGIEB+YX/2wd0/rgXLFD9G9id9KCtbVy/3ZgmvZjpa0UdQ==", + "dev": true, + "engines": { + "node": ">=16" + } }, "node_modules/path-type": { "version": "4.0.0", @@ -15009,23 +15012,32 @@ "dev": true }, "node_modules/sinon": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-16.1.3.tgz", - "integrity": "sha512-mjnWWeyxcAf9nC0bXcPmiDut+oE8HYridTNzBbF98AYVLmWwGRp2ISEpyhYflG1ifILT+eNn3BmKUJPxjXUPlA==", + "version": "18.0.1", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-18.0.1.tgz", + "integrity": "sha512-a2N2TDY1uGviajJ6r4D1CyRAkzE9NNVlYOV1wX5xQDuAk0ONgzgRl0EjCQuRCPxOwp13ghsMwt9Gdldujs39qw==", "dev": true, "dependencies": { - "@sinonjs/commons": "^3.0.0", - "@sinonjs/fake-timers": "^10.3.0", + "@sinonjs/commons": "^3.0.1", + "@sinonjs/fake-timers": "11.2.2", "@sinonjs/samsam": "^8.0.0", - "diff": "^5.1.0", - "nise": "^5.1.4", - "supports-color": "^7.2.0" + "diff": "^5.2.0", + "nise": "^6.0.0", + "supports-color": "^7" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/sinon" } }, + "node_modules/sinon/node_modules/@sinonjs/fake-timers": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz", + "integrity": "sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, "node_modules/sinon/node_modules/diff": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", @@ -17310,10 +17322,10 @@ }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.654.0", - "@aws-sdk/lib-dynamodb": "^3.654.0", - "aws-sdk-client-mock": "^4.0.1", - "aws-sdk-client-mock-jest": "^4.0.1" + "@aws-sdk/client-dynamodb": "^3.656.0", + "@aws-sdk/lib-dynamodb": "^3.656.0", + "aws-sdk-client-mock": "^4.0.2", + "aws-sdk-client-mock-jest": "^4.0.2" }, "peerDependencies": { "@aws-sdk/client-dynamodb": ">=3.x", @@ -17393,13 +17405,13 @@ "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", "@aws-sdk/client-appconfigdata": "^3.654.0", - "@aws-sdk/client-dynamodb": "^3.654.0", + "@aws-sdk/client-dynamodb": "^3.656.0", "@aws-sdk/client-secrets-manager": "^3.654.0", "@aws-sdk/client-ssm": "^3.654.0", - "@aws-sdk/util-dynamodb": "^3.654.0", + "@aws-sdk/util-dynamodb": "^3.656.0", "@smithy/util-base64": "^3.0.0", - "aws-sdk-client-mock": "^4.0.1", - "aws-sdk-client-mock-jest": "^4.0.1" + "aws-sdk-client-mock": "^4.0.2", + "aws-sdk-client-mock-jest": "^4.0.2" }, "peerDependencies": { "@aws-sdk/client-appconfigdata": ">=3.x", @@ -17457,7 +17469,7 @@ "license": "MIT-0", "dependencies": { "@aws-cdk/cli-lib-alpha": "^2.155.0-alpha.0", - "@aws-sdk/client-lambda": "^3.654.0", + "@aws-sdk/client-lambda": "^3.656.0", "@smithy/util-utf8": "^3.0.0", "aws-cdk-lib": "^2.159.0", "esbuild": "^0.23.1", @@ -17477,7 +17489,7 @@ }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.654.0", + "@aws-sdk/client-dynamodb": "^3.656.0", "@aws-sdk/client-xray": "^3.654.0" }, "peerDependencies": { diff --git a/packages/idempotency/package.json b/packages/idempotency/package.json index 598adf5e3c..2092aa7ee5 100644 --- a/packages/idempotency/package.json +++ b/packages/idempotency/package.json @@ -125,9 +125,9 @@ ], "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.654.0", - "@aws-sdk/lib-dynamodb": "^3.654.0", - "aws-sdk-client-mock": "^4.0.1", - "aws-sdk-client-mock-jest": "^4.0.1" + "@aws-sdk/client-dynamodb": "^3.656.0", + "@aws-sdk/lib-dynamodb": "^3.656.0", + "aws-sdk-client-mock": "^4.0.2", + "aws-sdk-client-mock-jest": "^4.0.2" } } diff --git a/packages/parameters/package.json b/packages/parameters/package.json index 8776a06de1..841004c9f4 100644 --- a/packages/parameters/package.json +++ b/packages/parameters/package.json @@ -155,13 +155,13 @@ "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", "@aws-sdk/client-appconfigdata": "^3.654.0", - "@aws-sdk/client-dynamodb": "^3.654.0", + "@aws-sdk/client-dynamodb": "^3.656.0", "@aws-sdk/client-secrets-manager": "^3.654.0", "@aws-sdk/client-ssm": "^3.654.0", - "@aws-sdk/util-dynamodb": "^3.654.0", + "@aws-sdk/util-dynamodb": "^3.656.0", "@smithy/util-base64": "^3.0.0", - "aws-sdk-client-mock": "^4.0.1", - "aws-sdk-client-mock-jest": "^4.0.1" + "aws-sdk-client-mock": "^4.0.2", + "aws-sdk-client-mock-jest": "^4.0.2" }, "dependencies": { "@aws-lambda-powertools/commons": "^2.8.0" diff --git a/packages/testing/package.json b/packages/testing/package.json index fbafa3f07f..782cf3098a 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -99,7 +99,7 @@ "homepage": "https://github.com/aws-powertools/powertools-lambda-typescript/tree/main/packages/testing#readme", "dependencies": { "@aws-cdk/cli-lib-alpha": "^2.155.0-alpha.0", - "@aws-sdk/client-lambda": "^3.654.0", + "@aws-sdk/client-lambda": "^3.656.0", "@smithy/util-utf8": "^3.0.0", "aws-cdk-lib": "^2.159.0", "esbuild": "^0.23.1", diff --git a/packages/tracer/package.json b/packages/tracer/package.json index 613742c448..8f2ce6f02e 100644 --- a/packages/tracer/package.json +++ b/packages/tracer/package.json @@ -28,7 +28,7 @@ "license": "MIT-0", "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.654.0", + "@aws-sdk/client-dynamodb": "^3.656.0", "@aws-sdk/client-xray": "^3.654.0" }, "peerDependencies": { From cc3b4d318d11ada9312f0abcaa68eb917e0d53e6 Mon Sep 17 00:00:00 2001 From: James van de Ven Date: Wed, 25 Sep 2024 15:53:23 +0800 Subject: [PATCH 17/52] chore(layers): add Parser to layer (#3101) Co-authored-by: Alexander Schueren --- layers/src/canary-stack.ts | 1 + layers/src/layer-publisher-stack.ts | 2 ++ .../layerPublisher.class.test.functionCode.ts | 12 +++++++++++- layers/tests/e2e/layerPublisher.test.ts | 19 +++++++++++++++++++ 4 files changed, 33 insertions(+), 1 deletion(-) diff --git a/layers/src/canary-stack.ts b/layers/src/canary-stack.ts index 9ee3a4031b..75c4c852a3 100644 --- a/layers/src/canary-stack.ts +++ b/layers/src/canary-stack.ts @@ -54,6 +54,7 @@ export class CanaryStack extends Stack { '@aws-lambda-powertools/parameters', '@aws-lambda-powertools/idempotency', '@aws-lambda-powertools/batch', + '@aws-lambda-powertools/parser', ], }, environment: { diff --git a/layers/src/layer-publisher-stack.ts b/layers/src/layer-publisher-stack.ts index 74ea60cc67..b5652d6e59 100644 --- a/layers/src/layer-publisher-stack.ts +++ b/layers/src/layer-publisher-stack.ts @@ -65,6 +65,7 @@ export class LayerPublisherStack extends Stack { 'parameters', 'idempotency', 'batch', + 'parser', ]; // These files are relative to the tmp folder @@ -108,6 +109,7 @@ export class LayerPublisherStack extends Stack { '@aws-sdk/client-ssm', '@aws-sdk/client-secrets-manager', '@aws-sdk/client-appconfigdata', + 'zod', ]; if (buildFromLocal) { diff --git a/layers/tests/e2e/layerPublisher.class.test.functionCode.ts b/layers/tests/e2e/layerPublisher.class.test.functionCode.ts index a58bcbde9d..95f1a271b6 100644 --- a/layers/tests/e2e/layerPublisher.class.test.functionCode.ts +++ b/layers/tests/e2e/layerPublisher.class.test.functionCode.ts @@ -8,11 +8,13 @@ import { AppConfigProvider } from '@aws-lambda-powertools/parameters/appconfig'; import { DynamoDBProvider } from '@aws-lambda-powertools/parameters/dynamodb'; import { SecretsProvider } from '@aws-lambda-powertools/parameters/secrets'; import { SSMProvider } from '@aws-lambda-powertools/parameters/ssm'; +import { EventBridgeSchema } from '@aws-lambda-powertools/parser/schemas'; import { Tracer } from '@aws-lambda-powertools/tracer'; import { AppConfigDataClient } from '@aws-sdk/client-appconfigdata'; import { DynamoDBClient } from '@aws-sdk/client-dynamodb'; import { SecretsManagerClient } from '@aws-sdk/client-secrets-manager'; import { SSMClient } from '@aws-sdk/client-ssm'; +import { z } from 'zod'; const logger = new Logger({ logLevel: 'DEBUG', @@ -48,6 +50,10 @@ new DynamoDBProvider({ tableName: 'foo', awsSdkV3Client: ddbClient }); // Instantiating the BatchProcessor will confirm that the utility can be used new BatchProcessor(EventType.SQS); +const testSchema = z.object({ instance_id: z.string(), state: z.string() }); + +const testEventSchema = EventBridgeSchema.extend({ detail: testSchema }); + const layerPath = process.env.LAYERS_PATH || '/opt/nodejs/node_modules'; const expectedVersion = process.env.POWERTOOLS_PACKAGE_VERSION || '0.0.0'; @@ -79,7 +85,7 @@ const getVersionFromModule = async (moduleName: string): Promise => { return moduleVersion; }; -export const handler = async (): Promise => { +export const handler = async (event: unknown): Promise => { // Check that the packages version matches the expected one for (const moduleName of [ 'commons', @@ -89,6 +95,7 @@ export const handler = async (): Promise => { 'parameters', 'idempotency', 'batch', + 'parser', ]) { const moduleVersion = await getVersionFromModule(moduleName); if (moduleVersion !== expectedVersion) { @@ -115,4 +122,7 @@ export const handler = async (): Promise => { // the presence of a log will indicate that the logger is working // while the content of the log will indicate that the tracer is working logger.debug('subsegment', { subsegment: subsegment.format() }); + + // Check that the parser is working + testEventSchema.parse(event); }; diff --git a/layers/tests/e2e/layerPublisher.test.ts b/layers/tests/e2e/layerPublisher.test.ts index 87261d7c91..fd6fca0c58 100644 --- a/layers/tests/e2e/layerPublisher.test.ts +++ b/layers/tests/e2e/layerPublisher.test.ts @@ -13,6 +13,7 @@ import { import { TestNodejsFunction } from '@aws-lambda-powertools/testing-utils/resources/lambda'; import { App } from 'aws-cdk-lib'; import { LayerVersion } from 'aws-cdk-lib/aws-lambda'; +import type { EventBridgeEvent } from 'aws-lambda'; import packageJson from '../../package.json'; import { LayerPublisherStack } from '../../src/layer-publisher-stack'; import { @@ -132,6 +133,24 @@ describe('Layers E2E tests', () => { functionName: testStack.findAndGetStackOutputValue( `test${outputFormat}Fn` ), + // Uses an EventBridge event payload to test parser functionality + payload: { + version: '0', + id: '6a7e8feb-b491-4cf7-a9f1-bf3703467718', + 'detail-type': 'EC2 Instance State-change Notification', + source: 'aws.ec2', + account: '111122223333', + time: '2017-12-22T18:43:48Z', + region: 'us-west-1', + resources: [ + 'arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0', + ], + detail: { + instance_id: 'i-1234567890abcdef0', + state: 'terminated', + }, + 'replay-name': 'replay_archive', + } satisfies EventBridgeEvent, }) ); } From 05c16e5fa8bdb895504ed5669abbd886fec7709e Mon Sep 17 00:00:00 2001 From: Gary Sassano <10464497+garysassano@users.noreply.github.com> Date: Wed, 25 Sep 2024 09:57:19 +0200 Subject: [PATCH 18/52] docs(idempotency): fix descriptions in `Advanced` table (#3092) Co-authored-by: Andrea Amorosi --- docs/utilities/idempotency.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/utilities/idempotency.md b/docs/utilities/idempotency.md index e14fe864fb..75a9618f00 100644 --- a/docs/utilities/idempotency.md +++ b/docs/utilities/idempotency.md @@ -569,16 +569,16 @@ When using DynamoDB as a persistence layer, you can alter the attribute names by Idempotent decorator can be further configured with **`IdempotencyConfig`** as seen in the previous examples. These are the available options for further configuration -| Parameter | Default | Description | -| ----------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| **eventKeyJmespath** | `''` | JMESPath expression to extract the idempotency key from the event | -| **payloadValidationJmespath** | `''` | JMESPath expression to validate whether certain parameters have changed in the event while the event payload | -| **throwOnNoIdempotencyKey** | `false` | Throw an error if no idempotency key was found in the request | -| **expiresAfterSeconds** | 3600 | The number of seconds to wait before a record is expired | -| **useLocalCache** | `false` | Whether to locally cache idempotency results | -| **localCacheMaxItems** | 256 | Max number of items to store in local cache | -| **hashFunction** | `md5` | Function to use for calculating hashes, as provided by the [crypto](https://nodejs.org/api/crypto.html#cryptocreatehashalgorithm-options){target="_blank"} module in the standard library. | -| **responseHook** | `undefined` | Function to use for processing the stored Idempotent response. This function hook is called when an existing idempotent response is found. See [Manipulating The Idempotent Response](idempotency.md#manipulating-the-idempotent-response) | +| Parameter | Default | Description | +| ----------------------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| **eventKeyJmespath** | `''` | JMESPath expression to extract the idempotency key from the event record using [built-in functions](./jmespath.md#built-in-jmespath-functions){target="_blank"} | +| **payloadValidationJmespath** | `''` | JMESPath expression to validate that the specified fields haven't changed across requests for the same idempotency key _e.g., payload tampering._ | +| **throwOnNoIdempotencyKey** | `false` | Throw an error if no idempotency key was found in the request | +| **expiresAfterSeconds** | 3600 | The number of seconds to wait before a record is expired, allowing a new transaction with the same idempotency key | +| **useLocalCache** | `false` | Whether to cache idempotency results in-memory to save on persistence storage latency and costs | +| **localCacheMaxItems** | 256 | Max number of items to store in local cache | +| **hashFunction** | `md5` | Function to use for calculating hashes, as provided by the [crypto](https://nodejs.org/api/crypto.html#cryptocreatehashalgorithm-options){target="_blank"} module in the standard library. | +| **responseHook** | `undefined` | Function to use for processing the stored Idempotent response. This function hook is called when an existing idempotent response is found. See [Manipulating The Idempotent Response](idempotency.md#manipulating-the-idempotent-response) | ### Handling concurrent executions with the same payload From aa99bc7bdd2d10671c186f3b486cdc1548437f9b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 25 Sep 2024 10:14:00 +0200 Subject: [PATCH 19/52] chore(deps): bump actions/setup-node from 4.0.3 to 4.0.4 (#3097) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Andrea Amorosi --- .github/workflows/make-release.yml | 2 +- .github/workflows/make-version.yml | 2 +- .github/workflows/publish_layer.yml | 2 +- .../reusable-run-linting-check-and-unit-tests.yml | 12 ++++++------ .github/workflows/reusable_deploy_layer_stack.yml | 2 +- .github/workflows/reusable_publish_docs.yml | 2 +- .github/workflows/run-e2e-tests.yml | 2 +- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/make-release.yml b/.github/workflows/make-release.yml index 4fd8000298..8cf8193dcc 100644 --- a/.github/workflows/make-release.yml +++ b/.github/workflows/make-release.yml @@ -49,7 +49,7 @@ jobs: with: ref: ${{ github.sha }} - name: Setup NodeJS - uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 + uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 with: node-version: "20" cache: "npm" diff --git a/.github/workflows/make-version.yml b/.github/workflows/make-version.yml index b1297b465d..7b743d0c98 100644 --- a/.github/workflows/make-version.yml +++ b/.github/workflows/make-version.yml @@ -23,7 +23,7 @@ jobs: ref: ${{ github.ref }} fetch-depth: 0 # fetch all history, commits and tags, lerna scans it to the last tag and looks at commits, we need all of it to determine the next version - name: Setup NodeJS - uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 + uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 with: node-version: "20" cache: "npm" diff --git a/.github/workflows/publish_layer.yml b/.github/workflows/publish_layer.yml index a6190b71ac..1ceca64228 100644 --- a/.github/workflows/publish_layer.yml +++ b/.github/workflows/publish_layer.yml @@ -35,7 +35,7 @@ jobs: with: ref: ${{ github.sha }} - name: Setup Node.js - uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 + uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 with: node-version: "20" - name: Setup dependencies diff --git a/.github/workflows/reusable-run-linting-check-and-unit-tests.yml b/.github/workflows/reusable-run-linting-check-and-unit-tests.yml index 795a31644d..e59e01783b 100644 --- a/.github/workflows/reusable-run-linting-check-and-unit-tests.yml +++ b/.github/workflows/reusable-run-linting-check-and-unit-tests.yml @@ -50,7 +50,7 @@ jobs: - name: Checkout code uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Setup NodeJS - uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 + uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 with: node-version: ${{ matrix.version }} cache: "npm" @@ -76,7 +76,7 @@ jobs: - name: Checkout code uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Setup NodeJS - uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 + uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 with: node-version: ${{ matrix.version }} cache: "npm" @@ -117,7 +117,7 @@ jobs: - name: Checkout code uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Setup NodeJS - uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 + uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 with: node-version: 20 cache: "npm" @@ -135,7 +135,7 @@ jobs: - name: Checkout code uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Setup NodeJS - uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 + uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 with: node-version: 20 cache: "npm" @@ -153,7 +153,7 @@ jobs: - name: Checkout code uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Setup NodeJS - uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 + uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 with: node-version: 20 cache: "npm" @@ -169,7 +169,7 @@ jobs: - name: Checkout code uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Setup NodeJS - uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 + uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 with: node-version: 20 cache: "npm" diff --git a/.github/workflows/reusable_deploy_layer_stack.yml b/.github/workflows/reusable_deploy_layer_stack.yml index c48329a547..ef9abcb093 100644 --- a/.github/workflows/reusable_deploy_layer_stack.yml +++ b/.github/workflows/reusable_deploy_layer_stack.yml @@ -72,7 +72,7 @@ jobs: role-to-assume: ${{ secrets.target-account-role }} mask-aws-account-id: true - name: Setup Node.js - uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 + uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 with: node-version: "20" - name: Setup dependencies diff --git a/.github/workflows/reusable_publish_docs.yml b/.github/workflows/reusable_publish_docs.yml index c6babe6bcd..8d3e2868ac 100644 --- a/.github/workflows/reusable_publish_docs.yml +++ b/.github/workflows/reusable_publish_docs.yml @@ -52,7 +52,7 @@ jobs: - name: Checkout code uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Setup NodeJS - uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 + uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 with: node-version: "20" cache: "npm" diff --git a/.github/workflows/run-e2e-tests.yml b/.github/workflows/run-e2e-tests.yml index 6a626f975d..9b8a88f415 100644 --- a/.github/workflows/run-e2e-tests.yml +++ b/.github/workflows/run-e2e-tests.yml @@ -55,7 +55,7 @@ jobs: with: ref: ${{ steps.extract_PR_details.outputs.headSHA }} - name: Setup NodeJS - uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 + uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 with: node-version: '20' - name: Setup dependencies From 2ac181f6487258b5acf73d55de4bd8d92dcd1936 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 25 Sep 2024 10:22:46 +0200 Subject: [PATCH 20/52] chore(deps): bump vscode/devcontainers/javascript-node from `b303046` to `426f06d` in /.devcontainer (#3108) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Andrea Amorosi --- .devcontainer/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index b202a53f80..7c46fc0fa0 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,5 +1,5 @@ # See here for image contents: https://github.com/microsoft/vscode-dev-containers/blob/v0.212.0/containers/javascript-node/.devcontainer/base.Dockerfile -FROM mcr.microsoft.com/vscode/devcontainers/javascript-node@sha256:b3030464fe18c02840992f9b0b46422e0ea3589a424c9617efda22b71308f023 +FROM mcr.microsoft.com/vscode/devcontainers/javascript-node@sha256:426f06d22e8a81d047d7cae9c08509907d2663bc137ccc6ba597ddd8a6808aa1 # Install fnm to manage Node.js versions RUN curl -fsSL https://fnm.vercel.app/install -o /tmp/install \ From 06b6e0af729c1ea6ec70f1172e361b80152a8527 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 25 Sep 2024 12:02:21 +0200 Subject: [PATCH 21/52] chore(deps): bump esbuild from 0.23.1 to 0.24.0 (#3102) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Andrea Amorosi --- examples/app/package.json | 2 +- layers/package.json | 2 +- package-lock.json | 627 ++++++++++++++++++++++++++++------ packages/testing/package.json | 2 +- 4 files changed, 528 insertions(+), 105 deletions(-) diff --git a/examples/app/package.json b/examples/app/package.json index 9b5f927d0c..870bf4bc4f 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -51,7 +51,7 @@ "@types/aws-lambda": "^8.10.145", "@types/node": "22.5.5", "constructs": "^10.3.0", - "esbuild": "^0.23.1", + "esbuild": "^0.24.0", "typescript": "^5.6.2" } } diff --git a/layers/package.json b/layers/package.json index ecdd5e4c0f..a5db2b468c 100644 --- a/layers/package.json +++ b/layers/package.json @@ -38,6 +38,6 @@ "dependencies": { "aws-cdk": "^2.159.0", "aws-cdk-lib": "^2.159.0", - "esbuild": "^0.23.1" + "esbuild": "^0.24.0" } } diff --git a/package-lock.json b/package-lock.json index efe0c4b343..6b3fd9b46a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -67,7 +67,7 @@ "@types/aws-lambda": "^8.10.145", "@types/node": "22.5.5", "constructs": "^10.3.0", - "esbuild": "^0.23.1", + "esbuild": "^0.24.0", "typescript": "^5.6.2" }, "devDependencies": { @@ -129,7 +129,7 @@ "dependencies": { "aws-cdk": "^2.159.0", "aws-cdk-lib": "^2.159.0", - "esbuild": "^0.23.1" + "esbuild": "^0.24.0" }, "bin": { "layer": "bin/layers.js" @@ -2070,9 +2070,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", - "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", + "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", "cpu": [ "ppc64" ], @@ -2085,9 +2085,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", - "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", + "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", "cpu": [ "arm" ], @@ -2100,9 +2100,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", - "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", + "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", "cpu": [ "arm64" ], @@ -2115,9 +2115,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", - "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", + "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", "cpu": [ "x64" ], @@ -2130,9 +2130,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", - "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", + "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", "cpu": [ "arm64" ], @@ -2145,9 +2145,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", - "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", + "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", "cpu": [ "x64" ], @@ -2160,9 +2160,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", - "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", + "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", "cpu": [ "arm64" ], @@ -2175,9 +2175,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", - "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", + "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", "cpu": [ "x64" ], @@ -2190,9 +2190,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", - "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", + "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", "cpu": [ "arm" ], @@ -2205,9 +2205,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", - "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", + "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", "cpu": [ "arm64" ], @@ -2220,9 +2220,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", - "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", + "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", "cpu": [ "ia32" ], @@ -2235,9 +2235,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", - "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", + "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", "cpu": [ "loong64" ], @@ -2250,9 +2250,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", - "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", + "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", "cpu": [ "mips64el" ], @@ -2265,9 +2265,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", - "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", + "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", "cpu": [ "ppc64" ], @@ -2280,9 +2280,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", - "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", + "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", "cpu": [ "riscv64" ], @@ -2295,9 +2295,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", - "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", + "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", "cpu": [ "s390x" ], @@ -2310,9 +2310,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", - "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", + "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", "cpu": [ "x64" ], @@ -2325,9 +2325,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", - "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", + "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", "cpu": [ "x64" ], @@ -2340,9 +2340,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", - "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", + "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", "cpu": [ "arm64" ], @@ -2355,9 +2355,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", - "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", + "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", "cpu": [ "x64" ], @@ -2370,9 +2370,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", - "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", + "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", "cpu": [ "x64" ], @@ -2385,9 +2385,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", - "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", + "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", "cpu": [ "arm64" ], @@ -2400,9 +2400,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", - "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", + "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", "cpu": [ "ia32" ], @@ -2415,9 +2415,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", - "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", + "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", "cpu": [ "x64" ], @@ -7942,9 +7942,9 @@ } }, "node_modules/esbuild": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", - "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", + "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", "hasInstallScript": true, "bin": { "esbuild": "bin/esbuild" @@ -7953,30 +7953,30 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.23.1", - "@esbuild/android-arm": "0.23.1", - "@esbuild/android-arm64": "0.23.1", - "@esbuild/android-x64": "0.23.1", - "@esbuild/darwin-arm64": "0.23.1", - "@esbuild/darwin-x64": "0.23.1", - "@esbuild/freebsd-arm64": "0.23.1", - "@esbuild/freebsd-x64": "0.23.1", - "@esbuild/linux-arm": "0.23.1", - "@esbuild/linux-arm64": "0.23.1", - "@esbuild/linux-ia32": "0.23.1", - "@esbuild/linux-loong64": "0.23.1", - "@esbuild/linux-mips64el": "0.23.1", - "@esbuild/linux-ppc64": "0.23.1", - "@esbuild/linux-riscv64": "0.23.1", - "@esbuild/linux-s390x": "0.23.1", - "@esbuild/linux-x64": "0.23.1", - "@esbuild/netbsd-x64": "0.23.1", - "@esbuild/openbsd-arm64": "0.23.1", - "@esbuild/openbsd-x64": "0.23.1", - "@esbuild/sunos-x64": "0.23.1", - "@esbuild/win32-arm64": "0.23.1", - "@esbuild/win32-ia32": "0.23.1", - "@esbuild/win32-x64": "0.23.1" + "@esbuild/aix-ppc64": "0.24.0", + "@esbuild/android-arm": "0.24.0", + "@esbuild/android-arm64": "0.24.0", + "@esbuild/android-x64": "0.24.0", + "@esbuild/darwin-arm64": "0.24.0", + "@esbuild/darwin-x64": "0.24.0", + "@esbuild/freebsd-arm64": "0.24.0", + "@esbuild/freebsd-x64": "0.24.0", + "@esbuild/linux-arm": "0.24.0", + "@esbuild/linux-arm64": "0.24.0", + "@esbuild/linux-ia32": "0.24.0", + "@esbuild/linux-loong64": "0.24.0", + "@esbuild/linux-mips64el": "0.24.0", + "@esbuild/linux-ppc64": "0.24.0", + "@esbuild/linux-riscv64": "0.24.0", + "@esbuild/linux-s390x": "0.24.0", + "@esbuild/linux-x64": "0.24.0", + "@esbuild/netbsd-x64": "0.24.0", + "@esbuild/openbsd-arm64": "0.24.0", + "@esbuild/openbsd-x64": "0.24.0", + "@esbuild/sunos-x64": "0.24.0", + "@esbuild/win32-arm64": "0.24.0", + "@esbuild/win32-ia32": "0.24.0", + "@esbuild/win32-x64": "0.24.0" } }, "node_modules/escalade": { @@ -15863,6 +15863,429 @@ "fsevents": "~2.3.3" } }, + "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", + "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", + "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", + "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", + "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", + "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", + "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", + "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", + "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", + "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", + "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", + "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-loong64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", + "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", + "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", + "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", + "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-s390x": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", + "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", + "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", + "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openbsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", + "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", + "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/sunos-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", + "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", + "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", + "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", + "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/esbuild": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", + "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.23.1", + "@esbuild/android-arm": "0.23.1", + "@esbuild/android-arm64": "0.23.1", + "@esbuild/android-x64": "0.23.1", + "@esbuild/darwin-arm64": "0.23.1", + "@esbuild/darwin-x64": "0.23.1", + "@esbuild/freebsd-arm64": "0.23.1", + "@esbuild/freebsd-x64": "0.23.1", + "@esbuild/linux-arm": "0.23.1", + "@esbuild/linux-arm64": "0.23.1", + "@esbuild/linux-ia32": "0.23.1", + "@esbuild/linux-loong64": "0.23.1", + "@esbuild/linux-mips64el": "0.23.1", + "@esbuild/linux-ppc64": "0.23.1", + "@esbuild/linux-riscv64": "0.23.1", + "@esbuild/linux-s390x": "0.23.1", + "@esbuild/linux-x64": "0.23.1", + "@esbuild/netbsd-x64": "0.23.1", + "@esbuild/openbsd-arm64": "0.23.1", + "@esbuild/openbsd-x64": "0.23.1", + "@esbuild/sunos-x64": "0.23.1", + "@esbuild/win32-arm64": "0.23.1", + "@esbuild/win32-ia32": "0.23.1", + "@esbuild/win32-x64": "0.23.1" + } + }, "node_modules/tsx/node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -17472,7 +17895,7 @@ "@aws-sdk/client-lambda": "^3.656.0", "@smithy/util-utf8": "^3.0.0", "aws-cdk-lib": "^2.159.0", - "esbuild": "^0.23.1", + "esbuild": "^0.24.0", "promise-retry": "^2.0.1" }, "devDependencies": { diff --git a/packages/testing/package.json b/packages/testing/package.json index 782cf3098a..6f5f0a284f 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -102,7 +102,7 @@ "@aws-sdk/client-lambda": "^3.656.0", "@smithy/util-utf8": "^3.0.0", "aws-cdk-lib": "^2.159.0", - "esbuild": "^0.23.1", + "esbuild": "^0.24.0", "promise-retry": "^2.0.1" }, "devDependencies": { From 2b9534bbbe0a016daf99b357064cb1881aca0dc7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 25 Sep 2024 12:17:35 +0200 Subject: [PATCH 22/52] chore(deps): bump the aws-cdk group across 1 directory with 2 updates (#3110) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- examples/app/package.json | 4 ++-- layers/package.json | 4 ++-- package-lock.json | 27 ++++++++++++--------------- packages/testing/package.json | 2 +- 4 files changed, 17 insertions(+), 20 deletions(-) diff --git a/examples/app/package.json b/examples/app/package.json index 870bf4bc4f..b73072c7c1 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -30,8 +30,8 @@ "devDependencies": { "@types/aws-lambda": "^8.10.145", "@types/node": "22.5.5", - "aws-cdk": "^2.159.0", - "aws-cdk-lib": "^2.159.0", + "aws-cdk": "^2.160.0", + "aws-cdk-lib": "^2.160.0", "constructs": "^10.3.0", "source-map-support": "^0.5.21", "tsx": "^4.19.1", diff --git a/layers/package.json b/layers/package.json index a5db2b468c..6c03270ceb 100644 --- a/layers/package.json +++ b/layers/package.json @@ -36,8 +36,8 @@ "source-map-support": "^0.5.21" }, "dependencies": { - "aws-cdk": "^2.159.0", - "aws-cdk-lib": "^2.159.0", + "aws-cdk": "^2.160.0", + "aws-cdk-lib": "^2.160.0", "esbuild": "^0.24.0" } } diff --git a/package-lock.json b/package-lock.json index 6b3fd9b46a..309a4fbce1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -73,8 +73,8 @@ "devDependencies": { "@types/aws-lambda": "^8.10.145", "@types/node": "22.5.5", - "aws-cdk": "^2.159.0", - "aws-cdk-lib": "^2.159.0", + "aws-cdk": "^2.160.0", + "aws-cdk-lib": "^2.160.0", "constructs": "^10.3.0", "source-map-support": "^0.5.21", "tsx": "^4.19.1", @@ -127,8 +127,8 @@ "version": "2.8.0", "license": "MIT-0", "dependencies": { - "aws-cdk": "^2.159.0", - "aws-cdk-lib": "^2.159.0", + "aws-cdk": "^2.160.0", + "aws-cdk-lib": "^2.160.0", "esbuild": "^0.24.0" }, "bin": { @@ -203,9 +203,9 @@ } }, "node_modules/@aws-cdk/cloud-assembly-schema": { - "version": "36.0.25", - "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-36.0.25.tgz", - "integrity": "sha512-AK86v4IMV4zcWfp392e3wlaVJPT72/dk39Lo2SDDFxQR+sikMOyY2IGrULyhK1TwQmPiyxM7QB/0MkTbMDAPrw==", + "version": "38.0.1", + "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-38.0.1.tgz", + "integrity": "sha512-KvPe+NMWAulfNVwY7jenFhzhuLhLqJ/OPy5jx7wUstbjnYnjRVLpUHPU3yCjXFE0J8cuJVdx95BJ4rOs66Pi9w==", "bundleDependencies": [ "jsonschema", "semver" @@ -213,9 +213,6 @@ "dependencies": { "jsonschema": "^1.4.1", "semver": "^7.6.3" - }, - "engines": { - "node": ">= 18.18.0" } }, "node_modules/@aws-cdk/cloud-assembly-schema/node_modules/jsonschema": { @@ -5923,9 +5920,9 @@ } }, "node_modules/aws-cdk-lib": { - "version": "2.159.0", - "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.159.0.tgz", - "integrity": "sha512-OzcOuwK11i4xfrcAdDfnALOEBk4tyL257xU9AYTywG7nxQBO7QdawgODcDQV2bXTtNZGZGTH6wwcESNvKk4n8g==", + "version": "2.160.0", + "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.160.0.tgz", + "integrity": "sha512-HJvn1lKmyZk1i56j4sgOddRfoDto9L/INgXSWmLzDdnMdMQWRvB/dbPQPrF1voVN26UKmrNdH9Irr0soMD5B1A==", "bundleDependencies": [ "@balena/dockerignore", "case", @@ -5943,7 +5940,7 @@ "@aws-cdk/asset-awscli-v1": "^2.2.202", "@aws-cdk/asset-kubectl-v20": "^2.1.2", "@aws-cdk/asset-node-proxy-agent-v6": "^2.1.0", - "@aws-cdk/cloud-assembly-schema": "^36.0.24", + "@aws-cdk/cloud-assembly-schema": "^38.0.0", "@balena/dockerignore": "^1.0.2", "case": "1.6.3", "fs-extra": "^11.2.0", @@ -17894,7 +17891,7 @@ "@aws-cdk/cli-lib-alpha": "^2.155.0-alpha.0", "@aws-sdk/client-lambda": "^3.656.0", "@smithy/util-utf8": "^3.0.0", - "aws-cdk-lib": "^2.159.0", + "aws-cdk-lib": "^2.160.0", "esbuild": "^0.24.0", "promise-retry": "^2.0.1" }, diff --git a/packages/testing/package.json b/packages/testing/package.json index 6f5f0a284f..2c539b6c6f 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -101,7 +101,7 @@ "@aws-cdk/cli-lib-alpha": "^2.155.0-alpha.0", "@aws-sdk/client-lambda": "^3.656.0", "@smithy/util-utf8": "^3.0.0", - "aws-cdk-lib": "^2.159.0", + "aws-cdk-lib": "^2.160.0", "esbuild": "^0.24.0", "promise-retry": "^2.0.1" }, From 1406a354b5bc63fa611e396a82934bf694025392 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 25 Sep 2024 18:34:41 +0200 Subject: [PATCH 23/52] chore(deps): bump github/codeql-action from 3.26.8 to 3.26.9 (#3114) --- .github/workflows/ossf_scorecard.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ossf_scorecard.yml b/.github/workflows/ossf_scorecard.yml index 5817e187bb..ee80a1a095 100644 --- a/.github/workflows/ossf_scorecard.yml +++ b/.github/workflows/ossf_scorecard.yml @@ -43,6 +43,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@294a9d92911152fe08befb9ec03e240add280cb3 # v3.26.8 + uses: github/codeql-action/upload-sarif@461ef6c76dfe95d5c364de2f431ddbd31a417628 # v3.26.9 with: sarif_file: results.sarif From b3903a07bffd8caf0822447dcc8233b9df9af847 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 26 Sep 2024 00:16:17 +0200 Subject: [PATCH 24/52] chore(deps-dev): bump @faker-js/faker from 9.0.1 to 9.0.2 (#3113) --- package-lock.json | 8 ++++---- packages/parser/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 309a4fbce1..d2cb71d641 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2427,9 +2427,9 @@ } }, "node_modules/@faker-js/faker": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-9.0.1.tgz", - "integrity": "sha512-4mDeYIgM3By7X6t5E6eYwLAa+2h4DeZDF7thhzIg6XB76jeEvMwadYAMCFJL/R4AnEBcAUO9+gL0vhy3s+qvZA==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-9.0.2.tgz", + "integrity": "sha512-nI/FP30ZGXb+UaR7yXawVTH40NVKXPIx0tA3GKjkKLjorqBoMAeq4iSEacl8mJmpVhOCDa0vYHwYDmOOcFMrYw==", "dev": true, "funding": [ { @@ -17868,7 +17868,7 @@ "license": "MIT-0", "devDependencies": { "@anatine/zod-mock": "^3.13.3", - "@faker-js/faker": "^9.0.1" + "@faker-js/faker": "^9.0.2" }, "peerDependencies": { "@middy/core": "4.x || 5.x", diff --git a/packages/parser/package.json b/packages/parser/package.json index 45cb85fa2a..34f3817c77 100644 --- a/packages/parser/package.json +++ b/packages/parser/package.json @@ -362,6 +362,6 @@ }, "devDependencies": { "@anatine/zod-mock": "^3.13.3", - "@faker-js/faker": "^9.0.1" + "@faker-js/faker": "^9.0.2" } } From 71f1021d6f70feffd76b676c80590e5aced733a8 Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Thu, 26 Sep 2024 11:06:08 +0200 Subject: [PATCH 25/52] chore(deps): bump @aws-cdk/cli-lib-alpha to 2.160.0-alpha.0 (#3118) --- package-lock.json | 18 +++++++++--------- packages/testing/package.json | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index d2cb71d641..cbddab0724 100644 --- a/package-lock.json +++ b/package-lock.json @@ -194,14 +194,6 @@ "resolved": "https://registry.npmjs.org/@aws-cdk/asset-node-proxy-agent-v6/-/asset-node-proxy-agent-v6-2.1.0.tgz", "integrity": "sha512-7bY3J8GCVxLupn/kNmpPc5VJz8grx+4RKfnnJiO1LG+uxkZfANZG3RMHhE+qQxxwkyQ9/MfPtTpf748UhR425A==" }, - "node_modules/@aws-cdk/cli-lib-alpha": { - "version": "2.155.0-alpha.0", - "resolved": "https://registry.npmjs.org/@aws-cdk/cli-lib-alpha/-/cli-lib-alpha-2.155.0-alpha.0.tgz", - "integrity": "sha512-2hXV65AP3h21aelU//ygGdQi/33kjzD2hEe+Giv7ISuMFPk3zCIS7L+uClmtXISLGLyyCLY9xS/OmMzb3m6pxQ==", - "engines": { - "node": ">= 14.15.0" - } - }, "node_modules/@aws-cdk/cloud-assembly-schema": { "version": "38.0.1", "resolved": "https://registry.npmjs.org/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-38.0.1.tgz", @@ -17888,7 +17880,7 @@ "version": "2.8.0", "license": "MIT-0", "dependencies": { - "@aws-cdk/cli-lib-alpha": "^2.155.0-alpha.0", + "@aws-cdk/cli-lib-alpha": "^2.160.0-alpha.0", "@aws-sdk/client-lambda": "^3.656.0", "@smithy/util-utf8": "^3.0.0", "aws-cdk-lib": "^2.160.0", @@ -17899,6 +17891,14 @@ "@types/promise-retry": "^1.1.6" } }, + "packages/testing/node_modules/@aws-cdk/cli-lib-alpha": { + "version": "2.160.0-alpha.0", + "resolved": "https://registry.npmjs.org/@aws-cdk/cli-lib-alpha/-/cli-lib-alpha-2.160.0-alpha.0.tgz", + "integrity": "sha512-1SOl12B5/Kvi83T4he7Y9KVucc+VEGCXNs2qoBDOke/df3eLvZy6VqzztfUezNBvP0hkboUG7sMKRgYMdY/sEw==", + "engines": { + "node": ">= 14.15.0" + } + }, "packages/tracer": { "name": "@aws-lambda-powertools/tracer", "version": "2.8.0", diff --git a/packages/testing/package.json b/packages/testing/package.json index 2c539b6c6f..37f60477e6 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -98,7 +98,7 @@ }, "homepage": "https://github.com/aws-powertools/powertools-lambda-typescript/tree/main/packages/testing#readme", "dependencies": { - "@aws-cdk/cli-lib-alpha": "^2.155.0-alpha.0", + "@aws-cdk/cli-lib-alpha": "^2.160.0-alpha.0", "@aws-sdk/client-lambda": "^3.656.0", "@smithy/util-utf8": "^3.0.0", "aws-cdk-lib": "^2.160.0", From 934368180e65654bf32ea2fa9e0d4fc0646a0dae Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 26 Sep 2024 11:28:44 +0200 Subject: [PATCH 26/52] chore(deps): bump aws-xray-sdk-core from 3.10.0 to 3.10.1 (#3095) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- packages/tracer/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index cbddab0724..d0752f4a5d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6324,9 +6324,9 @@ } }, "node_modules/aws-xray-sdk-core": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/aws-xray-sdk-core/-/aws-xray-sdk-core-3.10.0.tgz", - "integrity": "sha512-D1Qk0CSu6ILu3dkDnoUimzUKLdUdngPggLXDJaOQlxr5TC+2/Yvvopf+GL43gXu7OFYEo0dciyGoSb3mAsuLAQ==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/aws-xray-sdk-core/-/aws-xray-sdk-core-3.10.1.tgz", + "integrity": "sha512-Eb1Iy5WEjRqRi8G+gi32QjR7t/9xTDore8EKasXsPMXCLMlYunslxJAvT2PDLXQ7ohEC/mKT9+7tUyUt6CGruw==", "dependencies": { "@aws-sdk/types": "^3.4.1", "@smithy/service-error-classification": "^2.0.4", @@ -17905,7 +17905,7 @@ "license": "MIT-0", "dependencies": { "@aws-lambda-powertools/commons": "^2.8.0", - "aws-xray-sdk-core": "^3.10.0" + "aws-xray-sdk-core": "^3.10.1" }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", diff --git a/packages/tracer/package.json b/packages/tracer/package.json index 8f2ce6f02e..8b1b30aaa1 100644 --- a/packages/tracer/package.json +++ b/packages/tracer/package.json @@ -86,7 +86,7 @@ }, "dependencies": { "@aws-lambda-powertools/commons": "^2.8.0", - "aws-xray-sdk-core": "^3.10.0" + "aws-xray-sdk-core": "^3.10.1" }, "keywords": [ "aws", From dc0cdd93c8e455379d340611e1bf72bb729603ea Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 26 Sep 2024 12:48:10 +0200 Subject: [PATCH 27/52] chore(deps): bump @types/node from 22.5.5 to 22.7.2 (#3115) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Andrea Amorosi --- examples/app/package.json | 4 ++-- package-lock.json | 12 ++++++------ package.json | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/examples/app/package.json b/examples/app/package.json index b73072c7c1..81ae78a9be 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -29,7 +29,7 @@ }, "devDependencies": { "@types/aws-lambda": "^8.10.145", - "@types/node": "22.5.5", + "@types/node": "22.7.2", "aws-cdk": "^2.160.0", "aws-cdk-lib": "^2.160.0", "constructs": "^10.3.0", @@ -49,7 +49,7 @@ "@aws-sdk/lib-dynamodb": "^3.656.0", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.145", - "@types/node": "22.5.5", + "@types/node": "22.7.2", "constructs": "^10.3.0", "esbuild": "^0.24.0", "typescript": "^5.6.2" diff --git a/package-lock.json b/package-lock.json index d0752f4a5d..d8f683be48 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,7 +28,7 @@ "@biomejs/biome": "^1.9.0", "@types/aws-lambda": "^8.10.145", "@types/jest": "^29.5.13", - "@types/node": "^22.5.5", + "@types/node": "^22.7.2", "@vitest/coverage-v8": "^2.1.1", "husky": "^9.1.6", "jest": "^29.7.0", @@ -65,14 +65,14 @@ "@aws-sdk/lib-dynamodb": "^3.656.0", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.145", - "@types/node": "22.5.5", + "@types/node": "22.7.2", "constructs": "^10.3.0", "esbuild": "^0.24.0", "typescript": "^5.6.2" }, "devDependencies": { "@types/aws-lambda": "^8.10.145", - "@types/node": "22.5.5", + "@types/node": "22.7.2", "aws-cdk": "^2.160.0", "aws-cdk-lib": "^2.160.0", "constructs": "^10.3.0", @@ -5305,9 +5305,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "22.5.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.5.tgz", - "integrity": "sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==", + "version": "22.7.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.2.tgz", + "integrity": "sha512-866lXSrpGpgyHBZUa2m9YNWqHDjjM0aBTJlNtYaGEw4rqY/dcD7deRVTbBBAJelfA7oaGDbNftXF/TL/A6RgoA==", "dependencies": { "undici-types": "~6.19.2" } diff --git a/package.json b/package.json index 8526e48e38..222166126d 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,7 @@ "@biomejs/biome": "^1.9.0", "@types/aws-lambda": "^8.10.145", "@types/jest": "^29.5.13", - "@types/node": "^22.5.5", + "@types/node": "^22.7.2", "@vitest/coverage-v8": "^2.1.1", "husky": "^9.1.6", "jest": "^29.7.0", From 7a71075b272849ca4bef2a250183ad66ccf5ab46 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 26 Sep 2024 12:51:19 +0200 Subject: [PATCH 28/52] chore(deps): bump mkdocs-material from 9.5.35 to 9.5.36 in /docs (#3105) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Alexander Schueren Co-authored-by: Andrea Amorosi --- docs/requirements.in | 2 +- docs/requirements.txt | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/requirements.in b/docs/requirements.in index 3cbc4afbd6..e3fe1cca91 100644 --- a/docs/requirements.in +++ b/docs/requirements.in @@ -1,4 +1,4 @@ mike==1.1.2 -mkdocs-material==9.5.35 +mkdocs-material==9.5.36 mkdocs-git-revision-date-plugin==0.3.2 mkdocs-exclude==1.0.2 \ No newline at end of file diff --git a/docs/requirements.txt b/docs/requirements.txt index 04767dfa2f..3cbb3a018e 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -235,9 +235,9 @@ mkdocs-get-deps==0.2.0 \ mkdocs-git-revision-date-plugin==0.3.2 \ --hash=sha256:2e67956cb01823dd2418e2833f3623dee8604cdf223bddd005fe36226a56f6ef # via -r requirements.in -mkdocs-material==9.5.35 \ - --hash=sha256:0d233d7db067ac896bf22ee7950eebf2b1eaf26c155bb27382bf4174021cc117 \ - --hash=sha256:44e069d87732d29f4a2533ae0748fa0e67e270043270c71f04d0fba11a357b24 +mkdocs-material==9.5.36 \ + --hash=sha256:140456f761320f72b399effc073fa3f8aac744c77b0970797c201cae2f6c967f \ + --hash=sha256:36734c1fd9404bea74236242ba3359b267fc930c7233b9fd086b0898825d0ac9 # via -r requirements.in mkdocs-material-extensions==1.3.1 \ --hash=sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443 \ From ce121baa566b4aa5cecd19c57c307e75c9fce6e3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 26 Sep 2024 12:57:18 +0200 Subject: [PATCH 29/52] chore(deps): bump squidfunk/mkdocs-material from `2a70399` to `22a429f` in /docs (#3104) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Alexander Schueren Co-authored-by: Andrea Amorosi --- docs/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Dockerfile b/docs/Dockerfile index c8066d6c1b..b125bf2d24 100644 --- a/docs/Dockerfile +++ b/docs/Dockerfile @@ -1,5 +1,5 @@ # version 9.5.35 -FROM squidfunk/mkdocs-material@sha256:2a703999163cdb8257a85849fb2d39914a82587769f95c297bb3f01acf72a609 +FROM squidfunk/mkdocs-material@sha256:22a429f602f2f616ff12ddc19bdcaae5f2096086a79c529fddd5472bdcb46165 COPY requirements.txt /tmp/ RUN pip install --require-hashes -r /tmp/requirements.txt From db17b52230a5a8d20bccf86fab622ccc9e580d88 Mon Sep 17 00:00:00 2001 From: Leandro Damascena Date: Thu, 26 Sep 2024 12:50:28 +0100 Subject: [PATCH 30/52] chore(docs): recreate requirements.txt file for mkdocs container (#3119) --- docs/requirements.txt | 555 +++++++++++++++++++++--------------------- 1 file changed, 284 insertions(+), 271 deletions(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index 3cbb3a018e..0cb25cb0aa 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,16 +1,16 @@ # -# This file is autogenerated by pip-compile with Python 3.11 +# This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # pip-compile --generate-hashes --output-file=requirements.txt requirements.in # -babel==2.14.0 \ - --hash=sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363 \ - --hash=sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287 +babel==2.16.0 \ + --hash=sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b \ + --hash=sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316 # via mkdocs-material -certifi==2024.7.4 \ - --hash=sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b \ - --hash=sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90 +certifi==2024.8.30 \ + --hash=sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8 \ + --hash=sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9 # via requests charset-normalizer==3.3.2 \ --hash=sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027 \ @@ -120,13 +120,13 @@ gitdb==4.0.11 \ --hash=sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4 \ --hash=sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b # via gitpython -gitpython==3.1.41 \ - --hash=sha256:c36b6634d069b3f719610175020a9aed919421c87552185b085e04fbbdb10b7c \ - --hash=sha256:ed66e624884f76df22c8e16066d567aaa5a37d5b5fa19db2c6df6f7156db9048 +gitpython==3.1.43 \ + --hash=sha256:35f314a9f878467f5453cc1fee295c3e18e52f1b99f10f6cf5b1682e968a9e7c \ + --hash=sha256:eec7ec56b92aad751f9912a73404bc02ba212a23adb2c7098ee668417051a1ff # via mkdocs-git-revision-date-plugin -idna==3.7 \ - --hash=sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc \ - --hash=sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0 +idna==3.10 \ + --hash=sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9 \ + --hash=sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3 # via requests jinja2==3.1.4 \ --hash=sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369 \ @@ -136,74 +136,74 @@ jinja2==3.1.4 \ # mkdocs # mkdocs-git-revision-date-plugin # mkdocs-material -markdown==3.5.1 \ - --hash=sha256:5874b47d4ee3f0b14d764324d2c94c03ea66bee56f2d929da9f2508d65e722dc \ - --hash=sha256:b65d7beb248dc22f2e8a31fb706d93798093c308dc1aba295aedeb9d41a813bd +markdown==3.7 \ + --hash=sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2 \ + --hash=sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803 # via # mkdocs # mkdocs-material # pymdown-extensions -markupsafe==2.1.3 \ - --hash=sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e \ - --hash=sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e \ - --hash=sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431 \ - --hash=sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686 \ - --hash=sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c \ - --hash=sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559 \ - --hash=sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc \ - --hash=sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb \ - --hash=sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939 \ - --hash=sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c \ - --hash=sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0 \ - --hash=sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4 \ - --hash=sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9 \ - --hash=sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575 \ - --hash=sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba \ - --hash=sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d \ - --hash=sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd \ - --hash=sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3 \ - --hash=sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00 \ - --hash=sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155 \ - --hash=sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac \ - --hash=sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52 \ - --hash=sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f \ - --hash=sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8 \ - --hash=sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b \ - --hash=sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007 \ - --hash=sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24 \ - --hash=sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea \ - --hash=sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198 \ - --hash=sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0 \ - --hash=sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee \ - --hash=sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be \ - --hash=sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2 \ - --hash=sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1 \ - --hash=sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707 \ - --hash=sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6 \ - --hash=sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c \ - --hash=sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58 \ - --hash=sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823 \ - --hash=sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779 \ - --hash=sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636 \ - --hash=sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c \ - --hash=sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad \ - --hash=sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee \ - --hash=sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc \ - --hash=sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2 \ - --hash=sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48 \ - --hash=sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7 \ - --hash=sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e \ - --hash=sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b \ - --hash=sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa \ - --hash=sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5 \ - --hash=sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e \ - --hash=sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb \ - --hash=sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9 \ - --hash=sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57 \ - --hash=sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc \ - --hash=sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc \ - --hash=sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2 \ - --hash=sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11 +markupsafe==2.1.5 \ + --hash=sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf \ + --hash=sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff \ + --hash=sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f \ + --hash=sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3 \ + --hash=sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532 \ + --hash=sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f \ + --hash=sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617 \ + --hash=sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df \ + --hash=sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4 \ + --hash=sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906 \ + --hash=sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f \ + --hash=sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4 \ + --hash=sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8 \ + --hash=sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371 \ + --hash=sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2 \ + --hash=sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465 \ + --hash=sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52 \ + --hash=sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6 \ + --hash=sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169 \ + --hash=sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad \ + --hash=sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2 \ + --hash=sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0 \ + --hash=sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029 \ + --hash=sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f \ + --hash=sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a \ + --hash=sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced \ + --hash=sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5 \ + --hash=sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c \ + --hash=sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf \ + --hash=sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9 \ + --hash=sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb \ + --hash=sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad \ + --hash=sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3 \ + --hash=sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1 \ + --hash=sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46 \ + --hash=sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc \ + --hash=sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a \ + --hash=sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee \ + --hash=sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900 \ + --hash=sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5 \ + --hash=sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea \ + --hash=sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f \ + --hash=sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5 \ + --hash=sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e \ + --hash=sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a \ + --hash=sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f \ + --hash=sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50 \ + --hash=sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a \ + --hash=sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b \ + --hash=sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4 \ + --hash=sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff \ + --hash=sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2 \ + --hash=sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46 \ + --hash=sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b \ + --hash=sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf \ + --hash=sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5 \ + --hash=sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5 \ + --hash=sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab \ + --hash=sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd \ + --hash=sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68 # via # jinja2 # mkdocs @@ -217,9 +217,9 @@ mike==1.1.2 \ --hash=sha256:4c307c28769834d78df10f834f57f810f04ca27d248f80a75f49c6fa2d1527ca \ --hash=sha256:56c3f1794c2d0b5fdccfa9b9487beb013ca813de2e3ad0744724e9d34d40b77b # via -r requirements.in -mkdocs==1.6.0 \ - --hash=sha256:1eb5cb7676b7d89323e62b56235010216319217d4af5ddc543a91beb8d125ea7 \ - --hash=sha256:a73f735824ef83a4f3bcb7a231dcab23f5a838f88b7efc54a0eef5fbdbc3c512 +mkdocs==1.6.1 \ + --hash=sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2 \ + --hash=sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e # via # mike # mkdocs-exclude @@ -243,84 +243,88 @@ mkdocs-material-extensions==1.3.1 \ --hash=sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443 \ --hash=sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31 # via mkdocs-material -packaging==23.2 \ - --hash=sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5 \ - --hash=sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7 +packaging==24.1 \ + --hash=sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002 \ + --hash=sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124 # via mkdocs -paginate==0.5.6 \ - --hash=sha256:5e6007b6a9398177a7e1648d04fdd9f8c9766a1a945bceac82f1929e8c78af2d +paginate==0.5.7 \ + --hash=sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945 \ + --hash=sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591 # via mkdocs-material pathspec==0.12.1 \ --hash=sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08 \ --hash=sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712 # via mkdocs -platformdirs==4.1.0 \ - --hash=sha256:11c8f37bcca40db96d8144522d925583bdb7a31f7b0e37e3ed4318400a8e2380 \ - --hash=sha256:906d548203468492d432bcb294d4bc2fff751bf84971fbb2c10918cc206ee420 +platformdirs==4.3.6 \ + --hash=sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907 \ + --hash=sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb # via mkdocs-get-deps -pygments==2.17.2 \ - --hash=sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c \ - --hash=sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367 +pygments==2.18.0 \ + --hash=sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199 \ + --hash=sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a # via mkdocs-material -pymdown-extensions==10.5 \ - --hash=sha256:1b60f1e462adbec5a1ed79dac91f666c9c0d241fa294de1989f29d20096cfd0b \ - --hash=sha256:1f0ca8bb5beff091315f793ee17683bc1390731f6ac4c5eb01e27464b80fe879 +pymdown-extensions==10.10.2 \ + --hash=sha256:513a9e9432b197cf0539356c8f1fc376e0d10b70ad150cadeb649a5628aacd45 \ + --hash=sha256:65d82324ef2497931bc858c8320540c6264ab0d9a292707edb61f4fe0cd56633 # via mkdocs-material -python-dateutil==2.8.2 \ - --hash=sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86 \ - --hash=sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9 +python-dateutil==2.9.0.post0 \ + --hash=sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3 \ + --hash=sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 # via ghp-import -pyyaml==6.0.1 \ - --hash=sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5 \ - --hash=sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc \ - --hash=sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df \ - --hash=sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741 \ - --hash=sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206 \ - --hash=sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27 \ - --hash=sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595 \ - --hash=sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62 \ - --hash=sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98 \ - --hash=sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696 \ - --hash=sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290 \ - --hash=sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9 \ - --hash=sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d \ - --hash=sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6 \ - --hash=sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867 \ - --hash=sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47 \ - --hash=sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486 \ - --hash=sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6 \ - --hash=sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3 \ - --hash=sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007 \ - --hash=sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938 \ - --hash=sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0 \ - --hash=sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c \ - --hash=sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735 \ - --hash=sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d \ - --hash=sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28 \ - --hash=sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4 \ - --hash=sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba \ - --hash=sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8 \ - --hash=sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5 \ - --hash=sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd \ - --hash=sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3 \ - --hash=sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0 \ - --hash=sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515 \ - --hash=sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c \ - --hash=sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c \ - --hash=sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924 \ - --hash=sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34 \ - --hash=sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43 \ - --hash=sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859 \ - --hash=sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673 \ - --hash=sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54 \ - --hash=sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a \ - --hash=sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b \ - --hash=sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab \ - --hash=sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa \ - --hash=sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c \ - --hash=sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585 \ - --hash=sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d \ - --hash=sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f +pyyaml==6.0.2 \ + --hash=sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff \ + --hash=sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48 \ + --hash=sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086 \ + --hash=sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e \ + --hash=sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133 \ + --hash=sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5 \ + --hash=sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484 \ + --hash=sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee \ + --hash=sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5 \ + --hash=sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68 \ + --hash=sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a \ + --hash=sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf \ + --hash=sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99 \ + --hash=sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8 \ + --hash=sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85 \ + --hash=sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19 \ + --hash=sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc \ + --hash=sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a \ + --hash=sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1 \ + --hash=sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317 \ + --hash=sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c \ + --hash=sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631 \ + --hash=sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d \ + --hash=sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652 \ + --hash=sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5 \ + --hash=sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e \ + --hash=sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b \ + --hash=sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8 \ + --hash=sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476 \ + --hash=sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706 \ + --hash=sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563 \ + --hash=sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237 \ + --hash=sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b \ + --hash=sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083 \ + --hash=sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180 \ + --hash=sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425 \ + --hash=sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e \ + --hash=sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f \ + --hash=sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725 \ + --hash=sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183 \ + --hash=sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab \ + --hash=sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774 \ + --hash=sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725 \ + --hash=sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e \ + --hash=sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5 \ + --hash=sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d \ + --hash=sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290 \ + --hash=sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44 \ + --hash=sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed \ + --hash=sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4 \ + --hash=sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba \ + --hash=sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12 \ + --hash=sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4 # via # mike # mkdocs @@ -331,99 +335,105 @@ pyyaml-env-tag==0.1 \ --hash=sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb \ --hash=sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069 # via mkdocs -regex==2023.10.3 \ - --hash=sha256:00ba3c9818e33f1fa974693fb55d24cdc8ebafcb2e4207680669d8f8d7cca79a \ - --hash=sha256:00e871d83a45eee2f8688d7e6849609c2ca2a04a6d48fba3dff4deef35d14f07 \ - --hash=sha256:06e9abc0e4c9ab4779c74ad99c3fc10d3967d03114449acc2c2762ad4472b8ca \ - --hash=sha256:0b9ac09853b2a3e0d0082104036579809679e7715671cfbf89d83c1cb2a30f58 \ - --hash=sha256:0d47840dc05e0ba04fe2e26f15126de7c755496d5a8aae4a08bda4dd8d646c54 \ - --hash=sha256:0f649fa32fe734c4abdfd4edbb8381c74abf5f34bc0b3271ce687b23729299ed \ - --hash=sha256:107ac60d1bfdc3edb53be75e2a52aff7481b92817cfdddd9b4519ccf0e54a6ff \ - --hash=sha256:11175910f62b2b8c055f2b089e0fedd694fe2be3941b3e2633653bc51064c528 \ - --hash=sha256:12bd4bc2c632742c7ce20db48e0d99afdc05e03f0b4c1af90542e05b809a03d9 \ - --hash=sha256:16f8740eb6dbacc7113e3097b0a36065a02e37b47c936b551805d40340fb9971 \ - --hash=sha256:1c0e8fae5b27caa34177bdfa5a960c46ff2f78ee2d45c6db15ae3f64ecadde14 \ - --hash=sha256:2c54e23836650bdf2c18222c87f6f840d4943944146ca479858404fedeb9f9af \ - --hash=sha256:3367007ad1951fde612bf65b0dffc8fd681a4ab98ac86957d16491400d661302 \ - --hash=sha256:36362386b813fa6c9146da6149a001b7bd063dabc4d49522a1f7aa65b725c7ec \ - --hash=sha256:39807cbcbe406efca2a233884e169d056c35aa7e9f343d4e78665246a332f597 \ - --hash=sha256:39cdf8d141d6d44e8d5a12a8569d5a227f645c87df4f92179bd06e2e2705e76b \ - --hash=sha256:3b2c3502603fab52d7619b882c25a6850b766ebd1b18de3df23b2f939360e1bd \ - --hash=sha256:3ccf2716add72f80714b9a63899b67fa711b654be3fcdd34fa391d2d274ce767 \ - --hash=sha256:3fef4f844d2290ee0ba57addcec17eec9e3df73f10a2748485dfd6a3a188cc0f \ - --hash=sha256:4023e2efc35a30e66e938de5aef42b520c20e7eda7bb5fb12c35e5d09a4c43f6 \ - --hash=sha256:4a3ee019a9befe84fa3e917a2dd378807e423d013377a884c1970a3c2792d293 \ - --hash=sha256:4a8bf76e3182797c6b1afa5b822d1d5802ff30284abe4599e1247be4fd6b03be \ - --hash=sha256:4a992f702c9be9c72fa46f01ca6e18d131906a7180950958f766c2aa294d4b41 \ - --hash=sha256:4c34d4f73ea738223a094d8e0ffd6d2c1a1b4c175da34d6b0de3d8d69bee6bcc \ - --hash=sha256:4cd1bccf99d3ef1ab6ba835308ad85be040e6a11b0977ef7ea8c8005f01a3c29 \ - --hash=sha256:4ef80829117a8061f974b2fda8ec799717242353bff55f8a29411794d635d964 \ - --hash=sha256:58837f9d221744d4c92d2cf7201c6acd19623b50c643b56992cbd2b745485d3d \ - --hash=sha256:5a8f91c64f390ecee09ff793319f30a0f32492e99f5dc1c72bc361f23ccd0a9a \ - --hash=sha256:5addc9d0209a9afca5fc070f93b726bf7003bd63a427f65ef797a931782e7edc \ - --hash=sha256:6239d4e2e0b52c8bd38c51b760cd870069f0bdf99700a62cd509d7a031749a55 \ - --hash=sha256:66e2fe786ef28da2b28e222c89502b2af984858091675044d93cb50e6f46d7af \ - --hash=sha256:69c0771ca5653c7d4b65203cbfc5e66db9375f1078689459fe196fe08b7b4930 \ - --hash=sha256:6ac965a998e1388e6ff2e9781f499ad1eaa41e962a40d11c7823c9952c77123e \ - --hash=sha256:6c56c3d47da04f921b73ff9415fbaa939f684d47293f071aa9cbb13c94afc17d \ - --hash=sha256:6f85739e80d13644b981a88f529d79c5bdf646b460ba190bffcaf6d57b2a9863 \ - --hash=sha256:706e7b739fdd17cb89e1fbf712d9dc21311fc2333f6d435eac2d4ee81985098c \ - --hash=sha256:741ba2f511cc9626b7561a440f87d658aabb3d6b744a86a3c025f866b4d19e7f \ - --hash=sha256:7434a61b158be563c1362d9071358f8ab91b8d928728cd2882af060481244c9e \ - --hash=sha256:76066d7ff61ba6bf3cb5efe2428fc82aac91802844c022d849a1f0f53820502d \ - --hash=sha256:7979b834ec7a33aafae34a90aad9f914c41fd6eaa8474e66953f3f6f7cbd4368 \ - --hash=sha256:7eece6fbd3eae4a92d7c748ae825cbc1ee41a89bb1c3db05b5578ed3cfcfd7cb \ - --hash=sha256:7ef1e014eed78ab650bef9a6a9cbe50b052c0aebe553fb2881e0453717573f52 \ - --hash=sha256:81dce2ddc9f6e8f543d94b05d56e70d03a0774d32f6cca53e978dc01e4fc75b8 \ - --hash=sha256:82fcc1f1cc3ff1ab8a57ba619b149b907072e750815c5ba63e7aa2e1163384a4 \ - --hash=sha256:8d1f21af4c1539051049796a0f50aa342f9a27cde57318f2fc41ed50b0dbc4ac \ - --hash=sha256:90a79bce019c442604662d17bf69df99090e24cdc6ad95b18b6725c2988a490e \ - --hash=sha256:9145f092b5d1977ec8c0ab46e7b3381b2fd069957b9862a43bd383e5c01d18c2 \ - --hash=sha256:91dc1d531f80c862441d7b66c4505cd6ea9d312f01fb2f4654f40c6fdf5cc37a \ - --hash=sha256:979c24cbefaf2420c4e377ecd1f165ea08cc3d1fbb44bdc51bccbbf7c66a2cb4 \ - --hash=sha256:994645a46c6a740ee8ce8df7911d4aee458d9b1bc5639bc968226763d07f00fa \ - --hash=sha256:9b98b7681a9437262947f41c7fac567c7e1f6eddd94b0483596d320092004533 \ - --hash=sha256:9c6b4d23c04831e3ab61717a707a5d763b300213db49ca680edf8bf13ab5d91b \ - --hash=sha256:9c6d0ced3c06d0f183b73d3c5920727268d2201aa0fe6d55c60d68c792ff3588 \ - --hash=sha256:9fd88f373cb71e6b59b7fa597e47e518282455c2734fd4306a05ca219a1991b0 \ - --hash=sha256:a8f4e49fc3ce020f65411432183e6775f24e02dff617281094ba6ab079ef0915 \ - --hash=sha256:a9e908ef5889cda4de038892b9accc36d33d72fb3e12c747e2799a0e806ec841 \ - --hash=sha256:ad08a69728ff3c79866d729b095872afe1e0557251da4abb2c5faff15a91d19a \ - --hash=sha256:adbccd17dcaff65704c856bd29951c58a1bd4b2b0f8ad6b826dbd543fe740988 \ - --hash=sha256:b0c7d2f698e83f15228ba41c135501cfe7d5740181d5903e250e47f617eb4292 \ - --hash=sha256:b3ab05a182c7937fb374f7e946f04fb23a0c0699c0450e9fb02ef567412d2fa3 \ - --hash=sha256:b6104f9a46bd8743e4f738afef69b153c4b8b592d35ae46db07fc28ae3d5fb7c \ - --hash=sha256:ba7cd6dc4d585ea544c1412019921570ebd8a597fabf475acc4528210d7c4a6f \ - --hash=sha256:bc72c231f5449d86d6c7d9cc7cd819b6eb30134bb770b8cfdc0765e48ef9c420 \ - --hash=sha256:bce8814b076f0ce5766dc87d5a056b0e9437b8e0cd351b9a6c4e1134a7dfbda9 \ - --hash=sha256:be5e22bbb67924dea15039c3282fa4cc6cdfbe0cbbd1c0515f9223186fc2ec5f \ - --hash=sha256:be6b7b8d42d3090b6c80793524fa66c57ad7ee3fe9722b258aec6d0672543fd0 \ - --hash=sha256:bfe50b61bab1b1ec260fa7cd91106fa9fece57e6beba05630afe27c71259c59b \ - --hash=sha256:bff507ae210371d4b1fe316d03433ac099f184d570a1a611e541923f78f05037 \ - --hash=sha256:c148bec483cc4b421562b4bcedb8e28a3b84fcc8f0aa4418e10898f3c2c0eb9b \ - --hash=sha256:c15ad0aee158a15e17e0495e1e18741573d04eb6da06d8b84af726cfc1ed02ee \ - --hash=sha256:c2169b2dcabf4e608416f7f9468737583ce5f0a6e8677c4efbf795ce81109d7c \ - --hash=sha256:c55853684fe08d4897c37dfc5faeff70607a5f1806c8be148f1695be4a63414b \ - --hash=sha256:c65a3b5330b54103e7d21cac3f6bf3900d46f6d50138d73343d9e5b2900b2353 \ - --hash=sha256:c7964c2183c3e6cce3f497e3a9f49d182e969f2dc3aeeadfa18945ff7bdd7051 \ - --hash=sha256:cc3f1c053b73f20c7ad88b0d1d23be7e7b3901229ce89f5000a8399746a6e039 \ - --hash=sha256:ce615c92d90df8373d9e13acddd154152645c0dc060871abf6bd43809673d20a \ - --hash=sha256:d29338556a59423d9ff7b6eb0cb89ead2b0875e08fe522f3e068b955c3e7b59b \ - --hash=sha256:d8a993c0a0ffd5f2d3bda23d0cd75e7086736f8f8268de8a82fbc4bd0ac6791e \ - --hash=sha256:d9c727bbcf0065cbb20f39d2b4f932f8fa1631c3e01fcedc979bd4f51fe051c5 \ - --hash=sha256:dac37cf08fcf2094159922edc7a2784cfcc5c70f8354469f79ed085f0328ebdf \ - --hash=sha256:dd829712de97753367153ed84f2de752b86cd1f7a88b55a3a775eb52eafe8a94 \ - --hash=sha256:e54ddd0bb8fb626aa1f9ba7b36629564544954fff9669b15da3610c22b9a0991 \ - --hash=sha256:e77c90ab5997e85901da85131fd36acd0ed2221368199b65f0d11bca44549711 \ - --hash=sha256:ebedc192abbc7fd13c5ee800e83a6df252bec691eb2c4bedc9f8b2e2903f5e2a \ - --hash=sha256:ef71561f82a89af6cfcbee47f0fabfdb6e63788a9258e913955d89fdd96902ab \ - --hash=sha256:f0a47efb1dbef13af9c9a54a94a0b814902e547b7f21acb29434504d18f36e3a \ - --hash=sha256:f4f2ca6df64cbdd27f27b34f35adb640b5d2d77264228554e68deda54456eb11 \ - --hash=sha256:fb02e4257376ae25c6dd95a5aec377f9b18c09be6ebdefa7ad209b9137b73d48 +regex==2024.9.11 \ + --hash=sha256:01c2acb51f8a7d6494c8c5eafe3d8e06d76563d8a8a4643b37e9b2dd8a2ff623 \ + --hash=sha256:02087ea0a03b4af1ed6ebab2c54d7118127fee8d71b26398e8e4b05b78963199 \ + --hash=sha256:040562757795eeea356394a7fb13076ad4f99d3c62ab0f8bdfb21f99a1f85664 \ + --hash=sha256:042c55879cfeb21a8adacc84ea347721d3d83a159da6acdf1116859e2427c43f \ + --hash=sha256:079400a8269544b955ffa9e31f186f01d96829110a3bf79dc338e9910f794fca \ + --hash=sha256:07f45f287469039ffc2c53caf6803cd506eb5f5f637f1d4acb37a738f71dd066 \ + --hash=sha256:09d77559e80dcc9d24570da3745ab859a9cf91953062e4ab126ba9d5993688ca \ + --hash=sha256:0cbff728659ce4bbf4c30b2a1be040faafaa9eca6ecde40aaff86f7889f4ab39 \ + --hash=sha256:0e12c481ad92d129c78f13a2a3662317e46ee7ef96c94fd332e1c29131875b7d \ + --hash=sha256:0ea51dcc0835eea2ea31d66456210a4e01a076d820e9039b04ae8d17ac11dee6 \ + --hash=sha256:0ffbcf9221e04502fc35e54d1ce9567541979c3fdfb93d2c554f0ca583a19b35 \ + --hash=sha256:1494fa8725c285a81d01dc8c06b55287a1ee5e0e382d8413adc0a9197aac6408 \ + --hash=sha256:16e13a7929791ac1216afde26f712802e3df7bf0360b32e4914dca3ab8baeea5 \ + --hash=sha256:18406efb2f5a0e57e3a5881cd9354c1512d3bb4f5c45d96d110a66114d84d23a \ + --hash=sha256:18e707ce6c92d7282dfce370cd205098384b8ee21544e7cb29b8aab955b66fa9 \ + --hash=sha256:220e92a30b426daf23bb67a7962900ed4613589bab80382be09b48896d211e92 \ + --hash=sha256:23b30c62d0f16827f2ae9f2bb87619bc4fba2044911e2e6c2eb1af0161cdb766 \ + --hash=sha256:23f9985c8784e544d53fc2930fc1ac1a7319f5d5332d228437acc9f418f2f168 \ + --hash=sha256:297f54910247508e6e5cae669f2bc308985c60540a4edd1c77203ef19bfa63ca \ + --hash=sha256:2b08fce89fbd45664d3df6ad93e554b6c16933ffa9d55cb7e01182baaf971508 \ + --hash=sha256:2cce2449e5927a0bf084d346da6cd5eb016b2beca10d0013ab50e3c226ffc0df \ + --hash=sha256:313ea15e5ff2a8cbbad96ccef6be638393041b0a7863183c2d31e0c6116688cf \ + --hash=sha256:323c1f04be6b2968944d730e5c2091c8c89767903ecaa135203eec4565ed2b2b \ + --hash=sha256:35f4a6f96aa6cb3f2f7247027b07b15a374f0d5b912c0001418d1d55024d5cb4 \ + --hash=sha256:3b37fa423beefa44919e009745ccbf353d8c981516e807995b2bd11c2c77d268 \ + --hash=sha256:3ce4f1185db3fbde8ed8aa223fc9620f276c58de8b0d4f8cc86fd1360829edb6 \ + --hash=sha256:46989629904bad940bbec2106528140a218b4a36bb3042d8406980be1941429c \ + --hash=sha256:4838e24ee015101d9f901988001038f7f0d90dc0c3b115541a1365fb439add62 \ + --hash=sha256:49b0e06786ea663f933f3710a51e9385ce0cba0ea56b67107fd841a55d56a231 \ + --hash=sha256:4db21ece84dfeefc5d8a3863f101995de646c6cb0536952c321a2650aa202c36 \ + --hash=sha256:54c4a097b8bc5bb0dfc83ae498061d53ad7b5762e00f4adaa23bee22b012e6ba \ + --hash=sha256:54d9ff35d4515debf14bc27f1e3b38bfc453eff3220f5bce159642fa762fe5d4 \ + --hash=sha256:55b96e7ce3a69a8449a66984c268062fbaa0d8ae437b285428e12797baefce7e \ + --hash=sha256:57fdd2e0b2694ce6fc2e5ccf189789c3e2962916fb38779d3e3521ff8fe7a822 \ + --hash=sha256:587d4af3979376652010e400accc30404e6c16b7df574048ab1f581af82065e4 \ + --hash=sha256:5b513b6997a0b2f10e4fd3a1313568e373926e8c252bd76c960f96fd039cd28d \ + --hash=sha256:5ddcd9a179c0a6fa8add279a4444015acddcd7f232a49071ae57fa6e278f1f71 \ + --hash=sha256:6113c008a7780792efc80f9dfe10ba0cd043cbf8dc9a76ef757850f51b4edc50 \ + --hash=sha256:635a1d96665f84b292e401c3d62775851aedc31d4f8784117b3c68c4fcd4118d \ + --hash=sha256:64ce2799bd75039b480cc0360907c4fb2f50022f030bf9e7a8705b636e408fad \ + --hash=sha256:69dee6a020693d12a3cf892aba4808fe168d2a4cef368eb9bf74f5398bfd4ee8 \ + --hash=sha256:6a2644a93da36c784e546de579ec1806bfd2763ef47babc1b03d765fe560c9f8 \ + --hash=sha256:6b41e1adc61fa347662b09398e31ad446afadff932a24807d3ceb955ed865cc8 \ + --hash=sha256:6c188c307e8433bcb63dc1915022deb553b4203a70722fc542c363bf120a01fd \ + --hash=sha256:6edd623bae6a737f10ce853ea076f56f507fd7726bee96a41ee3d68d347e4d16 \ + --hash=sha256:73d6d2f64f4d894c96626a75578b0bf7d9e56dcda8c3d037a2118fdfe9b1c664 \ + --hash=sha256:7a22ccefd4db3f12b526eccb129390942fe874a3a9fdbdd24cf55773a1faab1a \ + --hash=sha256:7fb89ee5d106e4a7a51bce305ac4efb981536301895f7bdcf93ec92ae0d91c7f \ + --hash=sha256:846bc79ee753acf93aef4184c040d709940c9d001029ceb7b7a52747b80ed2dd \ + --hash=sha256:85ab7824093d8f10d44330fe1e6493f756f252d145323dd17ab6b48733ff6c0a \ + --hash=sha256:8dee5b4810a89447151999428fe096977346cf2f29f4d5e29609d2e19e0199c9 \ + --hash=sha256:8e5fb5f77c8745a60105403a774fe2c1759b71d3e7b4ca237a5e67ad066c7199 \ + --hash=sha256:98eeee2f2e63edae2181c886d7911ce502e1292794f4c5ee71e60e23e8d26b5d \ + --hash=sha256:9d4a76b96f398697fe01117093613166e6aa8195d63f1b4ec3f21ab637632963 \ + --hash=sha256:9e8719792ca63c6b8340380352c24dcb8cd7ec49dae36e963742a275dfae6009 \ + --hash=sha256:a0b2b80321c2ed3fcf0385ec9e51a12253c50f146fddb2abbb10f033fe3d049a \ + --hash=sha256:a4cc92bb6db56ab0c1cbd17294e14f5e9224f0cc6521167ef388332604e92679 \ + --hash=sha256:a738b937d512b30bf75995c0159c0ddf9eec0775c9d72ac0202076c72f24aa96 \ + --hash=sha256:a8f877c89719d759e52783f7fe6e1c67121076b87b40542966c02de5503ace42 \ + --hash=sha256:a906ed5e47a0ce5f04b2c981af1c9acf9e8696066900bf03b9d7879a6f679fc8 \ + --hash=sha256:ae2941333154baff9838e88aa71c1d84f4438189ecc6021a12c7573728b5838e \ + --hash=sha256:b0d0a6c64fcc4ef9c69bd5b3b3626cc3776520a1637d8abaa62b9edc147a58f7 \ + --hash=sha256:b5b029322e6e7b94fff16cd120ab35a253236a5f99a79fb04fda7ae71ca20ae8 \ + --hash=sha256:b7aaa315101c6567a9a45d2839322c51c8d6e81f67683d529512f5bcfb99c802 \ + --hash=sha256:be1c8ed48c4c4065ecb19d882a0ce1afe0745dfad8ce48c49586b90a55f02366 \ + --hash=sha256:c0256beda696edcf7d97ef16b2a33a8e5a875affd6fa6567b54f7c577b30a137 \ + --hash=sha256:c157bb447303070f256e084668b702073db99bbb61d44f85d811025fcf38f784 \ + --hash=sha256:c57d08ad67aba97af57a7263c2d9006d5c404d721c5f7542f077f109ec2a4a29 \ + --hash=sha256:c69ada171c2d0e97a4b5aa78fbb835e0ffbb6b13fc5da968c09811346564f0d3 \ + --hash=sha256:c94bb0a9f1db10a1d16c00880bdebd5f9faf267273b8f5bd1878126e0fbde771 \ + --hash=sha256:cb130fccd1a37ed894824b8c046321540263013da72745d755f2d35114b81a60 \ + --hash=sha256:ced479f601cd2f8ca1fd7b23925a7e0ad512a56d6e9476f79b8f381d9d37090a \ + --hash=sha256:d05ac6fa06959c4172eccd99a222e1fbf17b5670c4d596cb1e5cde99600674c4 \ + --hash=sha256:d552c78411f60b1fdaafd117a1fca2f02e562e309223b9d44b7de8be451ec5e0 \ + --hash=sha256:dd4490a33eb909ef5078ab20f5f000087afa2a4daa27b4c072ccb3cb3050ad84 \ + --hash=sha256:df5cbb1fbc74a8305b6065d4ade43b993be03dbe0f8b30032cced0d7740994bd \ + --hash=sha256:e28f9faeb14b6f23ac55bfbbfd3643f5c7c18ede093977f1df249f73fd22c7b1 \ + --hash=sha256:e464b467f1588e2c42d26814231edecbcfe77f5ac414d92cbf4e7b55b2c2a776 \ + --hash=sha256:e4c22e1ac1f1ec1e09f72e6c44d8f2244173db7eb9629cc3a346a8d7ccc31142 \ + --hash=sha256:e53b5fbab5d675aec9f0c501274c467c0f9a5d23696cfc94247e1fb56501ed89 \ + --hash=sha256:e93f1c331ca8e86fe877a48ad64e77882c0c4da0097f2212873a69bbfea95d0c \ + --hash=sha256:e997fd30430c57138adc06bba4c7c2968fb13d101e57dd5bb9355bf8ce3fa7e8 \ + --hash=sha256:e9a091b0550b3b0207784a7d6d0f1a00d1d1c8a11699c1a4d93db3fbefc3ad35 \ + --hash=sha256:eab4bb380f15e189d1313195b062a6aa908f5bd687a0ceccd47c8211e9cf0d4a \ + --hash=sha256:eb1ae19e64c14c7ec1995f40bd932448713d3c73509e82d8cd7744dc00e29e86 \ + --hash=sha256:ecea58b43a67b1b79805f1a0255730edaf5191ecef84dbc4cc85eb30bc8b63b9 \ + --hash=sha256:ee439691d8c23e76f9802c42a95cfeebf9d47cf4ffd06f18489122dbb0a7ad64 \ + --hash=sha256:eee9130eaad130649fd73e5cd92f60e55708952260ede70da64de420cdcad554 \ + --hash=sha256:f47cd43a5bfa48f86925fe26fbdd0a488ff15b62468abb5d2a1e092a4fb10e85 \ + --hash=sha256:f6fff13ef6b5f29221d6904aa816c34701462956aa72a77f1f151a8ec4f56aeb \ + --hash=sha256:f745ec09bc1b0bd15cfc73df6fa4f726dcc26bb16c23a03f9e3367d357eeedd0 \ + --hash=sha256:f8404bf61298bb6f8224bb9176c1424548ee1181130818fcd2cbffddc768bed8 \ + --hash=sha256:f9268774428ec173654985ce55fc6caf4c6d11ade0f6f914d48ef4719eb05ebb \ + --hash=sha256:faa3c142464efec496967359ca99696c896c591c56c53506bac1ad465f66e919 # via mkdocs-material -requests==2.32.0 \ - --hash=sha256:f2c3881dddb70d056c5bd7600a4fae312b2a300e39be6a118d30b90bd27262b5 \ - --hash=sha256:fa5490319474c82ef1d2c9bc459d3652e3ae4ef4c4ebdd18a21145a47ca4b6b8 +requests==2.32.3 \ + --hash=sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760 \ + --hash=sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6 # via mkdocs-material six==1.16.0 \ --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ @@ -433,40 +443,43 @@ smmap==5.0.1 \ --hash=sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62 \ --hash=sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da # via gitdb -urllib3==2.2.2 \ - --hash=sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472 \ - --hash=sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168 +urllib3==2.2.3 \ + --hash=sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac \ + --hash=sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9 # via requests verspec==0.1.0 \ --hash=sha256:741877d5633cc9464c45a469ae2a31e801e6dbbaa85b9675d481cda100f11c31 \ --hash=sha256:c4504ca697b2056cdb4bfa7121461f5a0e81809255b41c03dda4ba823637c01e # via mike -watchdog==3.0.0 \ - --hash=sha256:0e06ab8858a76e1219e68c7573dfeba9dd1c0219476c5a44d5333b01d7e1743a \ - --hash=sha256:13bbbb462ee42ec3c5723e1205be8ced776f05b100e4737518c67c8325cf6100 \ - --hash=sha256:233b5817932685d39a7896b1090353fc8efc1ef99c9c054e46c8002561252fb8 \ - --hash=sha256:25f70b4aa53bd743729c7475d7ec41093a580528b100e9a8c5b5efe8899592fc \ - --hash=sha256:2b57a1e730af3156d13b7fdddfc23dea6487fceca29fc75c5a868beed29177ae \ - --hash=sha256:336adfc6f5cc4e037d52db31194f7581ff744b67382eb6021c868322e32eef41 \ - --hash=sha256:3aa7f6a12e831ddfe78cdd4f8996af9cf334fd6346531b16cec61c3b3c0d8da0 \ - --hash=sha256:3ed7c71a9dccfe838c2f0b6314ed0d9b22e77d268c67e015450a29036a81f60f \ - --hash=sha256:4c9956d27be0bb08fc5f30d9d0179a855436e655f046d288e2bcc11adfae893c \ - --hash=sha256:4d98a320595da7a7c5a18fc48cb633c2e73cda78f93cac2ef42d42bf609a33f9 \ - --hash=sha256:4f94069eb16657d2c6faada4624c39464f65c05606af50bb7902e036e3219be3 \ - --hash=sha256:5113334cf8cf0ac8cd45e1f8309a603291b614191c9add34d33075727a967709 \ - --hash=sha256:51f90f73b4697bac9c9a78394c3acbbd331ccd3655c11be1a15ae6fe289a8c83 \ - --hash=sha256:5d9f3a10e02d7371cd929b5d8f11e87d4bad890212ed3901f9b4d68767bee759 \ - --hash=sha256:7ade88d0d778b1b222adebcc0927428f883db07017618a5e684fd03b83342bd9 \ - --hash=sha256:7c5f84b5194c24dd573fa6472685b2a27cc5a17fe5f7b6fd40345378ca6812e3 \ - --hash=sha256:7e447d172af52ad204d19982739aa2346245cc5ba6f579d16dac4bfec226d2e7 \ - --hash=sha256:8ae9cda41fa114e28faf86cb137d751a17ffd0316d1c34ccf2235e8a84365c7f \ - --hash=sha256:8f3ceecd20d71067c7fd4c9e832d4e22584318983cabc013dbf3f70ea95de346 \ - --hash=sha256:9fac43a7466eb73e64a9940ac9ed6369baa39b3bf221ae23493a9ec4d0022674 \ - --hash=sha256:a70a8dcde91be523c35b2bf96196edc5730edb347e374c7de7cd20c43ed95397 \ - --hash=sha256:adfdeab2da79ea2f76f87eb42a3ab1966a5313e5a69a0213a3cc06ef692b0e96 \ - --hash=sha256:ba07e92756c97e3aca0912b5cbc4e5ad802f4557212788e72a72a47ff376950d \ - --hash=sha256:c07253088265c363d1ddf4b3cdb808d59a0468ecd017770ed716991620b8f77a \ - --hash=sha256:c9d8c8ec7efb887333cf71e328e39cffbf771d8f8f95d308ea4125bf5f90ba64 \ - --hash=sha256:d00e6be486affb5781468457b21a6cbe848c33ef43f9ea4a73b4882e5f188a44 \ - --hash=sha256:d429c2430c93b7903914e4db9a966c7f2b068dd2ebdd2fa9b9ce094c7d459f33 +watchdog==5.0.2 \ + --hash=sha256:14dd4ed023d79d1f670aa659f449bcd2733c33a35c8ffd88689d9d243885198b \ + --hash=sha256:29e4a2607bd407d9552c502d38b45a05ec26a8e40cc7e94db9bb48f861fa5abc \ + --hash=sha256:3960136b2b619510569b90f0cd96408591d6c251a75c97690f4553ca88889769 \ + --hash=sha256:3e8d5ff39f0a9968952cce548e8e08f849141a4fcc1290b1c17c032ba697b9d7 \ + --hash=sha256:53ed1bf71fcb8475dd0ef4912ab139c294c87b903724b6f4a8bd98e026862e6d \ + --hash=sha256:5597c051587f8757798216f2485e85eac583c3b343e9aa09127a3a6f82c65ee8 \ + --hash=sha256:638bcca3d5b1885c6ec47be67bf712b00a9ab3d4b22ec0881f4889ad870bc7e8 \ + --hash=sha256:6bec703ad90b35a848e05e1b40bf0050da7ca28ead7ac4be724ae5ac2653a1a0 \ + --hash=sha256:726eef8f8c634ac6584f86c9c53353a010d9f311f6c15a034f3800a7a891d941 \ + --hash=sha256:72990192cb63872c47d5e5fefe230a401b87fd59d257ee577d61c9e5564c62e5 \ + --hash=sha256:7d1aa7e4bb0f0c65a1a91ba37c10e19dabf7eaaa282c5787e51371f090748f4b \ + --hash=sha256:8c47150aa12f775e22efff1eee9f0f6beee542a7aa1a985c271b1997d340184f \ + --hash=sha256:901ee48c23f70193d1a7bc2d9ee297df66081dd5f46f0ca011be4f70dec80dab \ + --hash=sha256:963f7c4c91e3f51c998eeff1b3fb24a52a8a34da4f956e470f4b068bb47b78ee \ + --hash=sha256:9814adb768c23727a27792c77812cf4e2fd9853cd280eafa2bcfa62a99e8bd6e \ + --hash=sha256:aa9cd6e24126d4afb3752a3e70fce39f92d0e1a58a236ddf6ee823ff7dba28ee \ + --hash=sha256:b6dc8f1d770a8280997e4beae7b9a75a33b268c59e033e72c8a10990097e5fde \ + --hash=sha256:b84bff0391ad4abe25c2740c7aec0e3de316fdf7764007f41e248422a7760a7f \ + --hash=sha256:ba32efcccfe2c58f4d01115440d1672b4eb26cdd6fc5b5818f1fb41f7c3e1889 \ + --hash=sha256:bda40c57115684d0216556671875e008279dea2dc00fcd3dde126ac8e0d7a2fb \ + --hash=sha256:c4a440f725f3b99133de610bfec93d570b13826f89616377715b9cd60424db6e \ + --hash=sha256:d010be060c996db725fbce7e3ef14687cdcc76f4ca0e4339a68cc4532c382a73 \ + --hash=sha256:d2ab34adc9bf1489452965cdb16a924e97d4452fcf88a50b21859068b50b5c3b \ + --hash=sha256:d7594a6d32cda2b49df3fd9abf9b37c8d2f3eab5df45c24056b4a671ac661619 \ + --hash=sha256:d961f4123bb3c447d9fcdcb67e1530c366f10ab3a0c7d1c0c9943050936d4877 \ + --hash=sha256:dae7a1879918f6544201d33666909b040a46421054a50e0f773e0d870ed7438d \ + --hash=sha256:dcebf7e475001d2cdeb020be630dc5b687e9acdd60d16fea6bb4508e7b94cf76 \ + --hash=sha256:f627c5bf5759fdd90195b0c0431f99cff4867d212a67b384442c51136a098ed7 \ + --hash=sha256:f8b2918c19e0d48f5f20df458c84692e2a054f02d9df25e6c3c930063eca64c1 \ + --hash=sha256:fb223456db6e5f7bd9bbd5cd969f05aae82ae21acc00643b60d81c770abd402b # via mkdocs From 8d115101beffc02b17906427205c5f1e35c5eb80 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 26 Sep 2024 15:06:53 +0200 Subject: [PATCH 31/52] chore(deps): bump the aws-sdk-v3 group across 1 directory with 9 updates (#3116) --- examples/app/package.json | 4 +- examples/snippets/package.json | 10 +- package-lock.json | 460 +++++++++++++++--------------- packages/idempotency/package.json | 4 +- packages/metrics/package.json | 2 +- packages/parameters/package.json | 10 +- packages/testing/package.json | 2 +- packages/tracer/package.json | 4 +- 8 files changed, 248 insertions(+), 248 deletions(-) diff --git a/examples/app/package.json b/examples/app/package.json index 81ae78a9be..86a8640386 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -45,8 +45,8 @@ "@aws-lambda-powertools/metrics": "^2.8.0", "@aws-lambda-powertools/parameters": "^2.8.0", "@aws-lambda-powertools/tracer": "^2.8.0", - "@aws-sdk/client-ssm": "^3.654.0", - "@aws-sdk/lib-dynamodb": "^3.656.0", + "@aws-sdk/client-ssm": "^3.658.1", + "@aws-sdk/lib-dynamodb": "^3.658.1", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.145", "@types/node": "22.7.2", diff --git a/examples/snippets/package.json b/examples/snippets/package.json index 4c84562e6a..ebddada035 100644 --- a/examples/snippets/package.json +++ b/examples/snippets/package.json @@ -32,11 +32,11 @@ "@aws-lambda-powertools/parameters": "^2.8.0", "@aws-lambda-powertools/parser": "^2.8.0", "@aws-lambda-powertools/tracer": "^2.8.0", - "@aws-sdk/client-appconfigdata": "^3.654.0", - "@aws-sdk/client-dynamodb": "^3.656.0", - "@aws-sdk/client-secrets-manager": "^3.654.0", - "@aws-sdk/client-ssm": "^3.654.0", - "@aws-sdk/util-dynamodb": "^3.656.0", + "@aws-sdk/client-appconfigdata": "^3.658.1", + "@aws-sdk/client-dynamodb": "^3.658.1", + "@aws-sdk/client-secrets-manager": "^3.658.1", + "@aws-sdk/client-ssm": "^3.658.1", + "@aws-sdk/util-dynamodb": "^3.658.1", "@middy/core": "^4.7.0", "aws-sdk": "^2.1691.0", "aws-sdk-client-mock": "^4.0.2", diff --git a/package-lock.json b/package-lock.json index d8f683be48..3c1762845c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -61,8 +61,8 @@ "@aws-lambda-powertools/metrics": "^2.8.0", "@aws-lambda-powertools/parameters": "^2.8.0", "@aws-lambda-powertools/tracer": "^2.8.0", - "@aws-sdk/client-ssm": "^3.654.0", - "@aws-sdk/lib-dynamodb": "^3.656.0", + "@aws-sdk/client-ssm": "^3.658.1", + "@aws-sdk/lib-dynamodb": "^3.658.1", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.145", "@types/node": "22.7.2", @@ -110,11 +110,11 @@ "@aws-lambda-powertools/parameters": "^2.8.0", "@aws-lambda-powertools/parser": "^2.8.0", "@aws-lambda-powertools/tracer": "^2.8.0", - "@aws-sdk/client-appconfigdata": "^3.654.0", - "@aws-sdk/client-dynamodb": "^3.656.0", - "@aws-sdk/client-secrets-manager": "^3.654.0", - "@aws-sdk/client-ssm": "^3.654.0", - "@aws-sdk/util-dynamodb": "^3.656.0", + "@aws-sdk/client-appconfigdata": "^3.658.1", + "@aws-sdk/client-dynamodb": "^3.658.1", + "@aws-sdk/client-secrets-manager": "^3.658.1", + "@aws-sdk/client-ssm": "^3.658.1", + "@aws-sdk/util-dynamodb": "^3.658.1", "@middy/core": "^4.7.0", "aws-sdk": "^2.1691.0", "aws-sdk-client-mock": "^4.0.2", @@ -399,17 +399,17 @@ "link": true }, "node_modules/@aws-sdk/client-appconfigdata": { - "version": "3.654.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-appconfigdata/-/client-appconfigdata-3.654.0.tgz", - "integrity": "sha512-g3Vg07qrx+0un8aCQW+pz0woTxJEFoWuqsWMIO9TMmnyzFiLvWvY1hL+Cmg3PmtsOy3ZgY7ZVqkEvbcijUq14g==", + "version": "3.658.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-appconfigdata/-/client-appconfigdata-3.658.1.tgz", + "integrity": "sha512-FBlbbxCE4+QYY1XS8JWO9sO2UH4GAMlGMQ8MlQCyadQlgyzcUiCyrZfLQuQi8BP2AstkExJcAm3RHaiDituoSg==", "dev": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.654.0", - "@aws-sdk/client-sts": "3.654.0", - "@aws-sdk/core": "3.654.0", - "@aws-sdk/credential-provider-node": "3.654.0", + "@aws-sdk/client-sso-oidc": "3.658.1", + "@aws-sdk/client-sts": "3.658.1", + "@aws-sdk/core": "3.658.1", + "@aws-sdk/credential-provider-node": "3.658.1", "@aws-sdk/middleware-host-header": "3.654.0", "@aws-sdk/middleware-logger": "3.654.0", "@aws-sdk/middleware-recursion-detection": "3.654.0", @@ -420,30 +420,30 @@ "@aws-sdk/util-user-agent-browser": "3.654.0", "@aws-sdk/util-user-agent-node": "3.654.0", "@smithy/config-resolver": "^3.0.8", - "@smithy/core": "^2.4.3", - "@smithy/fetch-http-handler": "^3.2.7", + "@smithy/core": "^2.4.6", + "@smithy/fetch-http-handler": "^3.2.8", "@smithy/hash-node": "^3.0.6", "@smithy/invalid-dependency": "^3.0.6", "@smithy/middleware-content-length": "^3.0.8", "@smithy/middleware-endpoint": "^3.1.3", - "@smithy/middleware-retry": "^3.0.18", + "@smithy/middleware-retry": "^3.0.21", "@smithy/middleware-serde": "^3.0.6", "@smithy/middleware-stack": "^3.0.6", "@smithy/node-config-provider": "^3.1.7", - "@smithy/node-http-handler": "^3.2.2", + "@smithy/node-http-handler": "^3.2.3", "@smithy/protocol-http": "^4.1.3", - "@smithy/smithy-client": "^3.3.2", + "@smithy/smithy-client": "^3.3.5", "@smithy/types": "^3.4.2", "@smithy/url-parser": "^3.0.6", "@smithy/util-base64": "^3.0.0", "@smithy/util-body-length-browser": "^3.0.0", "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.18", - "@smithy/util-defaults-mode-node": "^3.0.18", + "@smithy/util-defaults-mode-browser": "^3.0.21", + "@smithy/util-defaults-mode-node": "^3.0.21", "@smithy/util-endpoints": "^2.1.2", "@smithy/util-middleware": "^3.0.6", "@smithy/util-retry": "^3.0.6", - "@smithy/util-stream": "^3.1.6", + "@smithy/util-stream": "^3.1.8", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, @@ -452,17 +452,17 @@ } }, "node_modules/@aws-sdk/client-cloudwatch": { - "version": "3.654.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch/-/client-cloudwatch-3.654.0.tgz", - "integrity": "sha512-2S3D8yF1ldpAoJjZlWXYYBhLnvUM2Vvt0ktKpe2J9y5cBqbs9AsrvdCHEf4eWM+vmfEbOLDOtUblrHpGfPSJkw==", + "version": "3.658.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch/-/client-cloudwatch-3.658.1.tgz", + "integrity": "sha512-qBCxDkiURRfBiFIeQB4HbYU/uQCN9fQi7GfE7lJufJQ18hM+QrBiegIbgUnR79R0UUQnMb5tKZpq6yqbahqUmg==", "dev": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.654.0", - "@aws-sdk/client-sts": "3.654.0", - "@aws-sdk/core": "3.654.0", - "@aws-sdk/credential-provider-node": "3.654.0", + "@aws-sdk/client-sso-oidc": "3.658.1", + "@aws-sdk/client-sts": "3.658.1", + "@aws-sdk/core": "3.658.1", + "@aws-sdk/credential-provider-node": "3.658.1", "@aws-sdk/middleware-host-header": "3.654.0", "@aws-sdk/middleware-logger": "3.654.0", "@aws-sdk/middleware-recursion-detection": "3.654.0", @@ -473,27 +473,27 @@ "@aws-sdk/util-user-agent-browser": "3.654.0", "@aws-sdk/util-user-agent-node": "3.654.0", "@smithy/config-resolver": "^3.0.8", - "@smithy/core": "^2.4.3", - "@smithy/fetch-http-handler": "^3.2.7", + "@smithy/core": "^2.4.6", + "@smithy/fetch-http-handler": "^3.2.8", "@smithy/hash-node": "^3.0.6", "@smithy/invalid-dependency": "^3.0.6", "@smithy/middleware-compression": "^3.0.10", "@smithy/middleware-content-length": "^3.0.8", "@smithy/middleware-endpoint": "^3.1.3", - "@smithy/middleware-retry": "^3.0.18", + "@smithy/middleware-retry": "^3.0.21", "@smithy/middleware-serde": "^3.0.6", "@smithy/middleware-stack": "^3.0.6", "@smithy/node-config-provider": "^3.1.7", - "@smithy/node-http-handler": "^3.2.2", + "@smithy/node-http-handler": "^3.2.3", "@smithy/protocol-http": "^4.1.3", - "@smithy/smithy-client": "^3.3.2", + "@smithy/smithy-client": "^3.3.5", "@smithy/types": "^3.4.2", "@smithy/url-parser": "^3.0.6", "@smithy/util-base64": "^3.0.0", "@smithy/util-body-length-browser": "^3.0.0", "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.18", - "@smithy/util-defaults-mode-node": "^3.0.18", + "@smithy/util-defaults-mode-browser": "^3.0.21", + "@smithy/util-defaults-mode-node": "^3.0.21", "@smithy/util-endpoints": "^2.1.2", "@smithy/util-middleware": "^3.0.6", "@smithy/util-retry": "^3.0.6", @@ -506,16 +506,16 @@ } }, "node_modules/@aws-sdk/client-dynamodb": { - "version": "3.656.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.656.0.tgz", - "integrity": "sha512-a7nzK4tGZHlg1IY63aGmdSlVLYpdYFwjIDFx3vQwNAzStwh8pbb7Fv8jLFTAi33ZNHM7H4mASwvgFbu8ZfbMVA==", + "version": "3.658.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.658.1.tgz", + "integrity": "sha512-RUMMadGecgIZ8J8IU1+SE5OC7MNyToq929hIqWNmlCwPdmveG4TsUmm+dJ2k+G7AwyzumB252Kkb8kdbLJ6H3g==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.654.0", - "@aws-sdk/client-sts": "3.654.0", - "@aws-sdk/core": "3.654.0", - "@aws-sdk/credential-provider-node": "3.654.0", + "@aws-sdk/client-sso-oidc": "3.658.1", + "@aws-sdk/client-sts": "3.658.1", + "@aws-sdk/core": "3.658.1", + "@aws-sdk/credential-provider-node": "3.658.1", "@aws-sdk/middleware-endpoint-discovery": "3.654.0", "@aws-sdk/middleware-host-header": "3.654.0", "@aws-sdk/middleware-logger": "3.654.0", @@ -527,26 +527,26 @@ "@aws-sdk/util-user-agent-browser": "3.654.0", "@aws-sdk/util-user-agent-node": "3.654.0", "@smithy/config-resolver": "^3.0.8", - "@smithy/core": "^2.4.3", - "@smithy/fetch-http-handler": "^3.2.7", + "@smithy/core": "^2.4.6", + "@smithy/fetch-http-handler": "^3.2.8", "@smithy/hash-node": "^3.0.6", "@smithy/invalid-dependency": "^3.0.6", "@smithy/middleware-content-length": "^3.0.8", "@smithy/middleware-endpoint": "^3.1.3", - "@smithy/middleware-retry": "^3.0.18", + "@smithy/middleware-retry": "^3.0.21", "@smithy/middleware-serde": "^3.0.6", "@smithy/middleware-stack": "^3.0.6", "@smithy/node-config-provider": "^3.1.7", - "@smithy/node-http-handler": "^3.2.2", + "@smithy/node-http-handler": "^3.2.3", "@smithy/protocol-http": "^4.1.3", - "@smithy/smithy-client": "^3.3.2", + "@smithy/smithy-client": "^3.3.5", "@smithy/types": "^3.4.2", "@smithy/url-parser": "^3.0.6", "@smithy/util-base64": "^3.0.0", "@smithy/util-body-length-browser": "^3.0.0", "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.18", - "@smithy/util-defaults-mode-node": "^3.0.18", + "@smithy/util-defaults-mode-browser": "^3.0.21", + "@smithy/util-defaults-mode-node": "^3.0.21", "@smithy/util-endpoints": "^2.1.2", "@smithy/util-middleware": "^3.0.6", "@smithy/util-retry": "^3.0.6", @@ -560,16 +560,16 @@ } }, "node_modules/@aws-sdk/client-lambda": { - "version": "3.656.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.656.0.tgz", - "integrity": "sha512-tpJDNpMa4G3TTjBEimBkczM/obxWwrYo88BD5/iwmxQ9LUpBLrGfbH3e1YU5vxhEvGWzNUvP7IGbIif7EvaqpQ==", + "version": "3.658.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.658.1.tgz", + "integrity": "sha512-KmsbyvUYhNYyZWdgWTmVfbe+0MLiUj0Ah+50kwTeh6lozwf39LfiZv+gXigbCGDUYaVQuOJXxFgSdqdFx0eKDA==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.654.0", - "@aws-sdk/client-sts": "3.654.0", - "@aws-sdk/core": "3.654.0", - "@aws-sdk/credential-provider-node": "3.654.0", + "@aws-sdk/client-sso-oidc": "3.658.1", + "@aws-sdk/client-sts": "3.658.1", + "@aws-sdk/core": "3.658.1", + "@aws-sdk/credential-provider-node": "3.658.1", "@aws-sdk/middleware-host-header": "3.654.0", "@aws-sdk/middleware-logger": "3.654.0", "@aws-sdk/middleware-recursion-detection": "3.654.0", @@ -580,33 +580,33 @@ "@aws-sdk/util-user-agent-browser": "3.654.0", "@aws-sdk/util-user-agent-node": "3.654.0", "@smithy/config-resolver": "^3.0.8", - "@smithy/core": "^2.4.3", + "@smithy/core": "^2.4.6", "@smithy/eventstream-serde-browser": "^3.0.9", "@smithy/eventstream-serde-config-resolver": "^3.0.6", "@smithy/eventstream-serde-node": "^3.0.8", - "@smithy/fetch-http-handler": "^3.2.7", + "@smithy/fetch-http-handler": "^3.2.8", "@smithy/hash-node": "^3.0.6", "@smithy/invalid-dependency": "^3.0.6", "@smithy/middleware-content-length": "^3.0.8", "@smithy/middleware-endpoint": "^3.1.3", - "@smithy/middleware-retry": "^3.0.18", + "@smithy/middleware-retry": "^3.0.21", "@smithy/middleware-serde": "^3.0.6", "@smithy/middleware-stack": "^3.0.6", "@smithy/node-config-provider": "^3.1.7", - "@smithy/node-http-handler": "^3.2.2", + "@smithy/node-http-handler": "^3.2.3", "@smithy/protocol-http": "^4.1.3", - "@smithy/smithy-client": "^3.3.2", + "@smithy/smithy-client": "^3.3.5", "@smithy/types": "^3.4.2", "@smithy/url-parser": "^3.0.6", "@smithy/util-base64": "^3.0.0", "@smithy/util-body-length-browser": "^3.0.0", "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.18", - "@smithy/util-defaults-mode-node": "^3.0.18", + "@smithy/util-defaults-mode-browser": "^3.0.21", + "@smithy/util-defaults-mode-node": "^3.0.21", "@smithy/util-endpoints": "^2.1.2", "@smithy/util-middleware": "^3.0.6", "@smithy/util-retry": "^3.0.6", - "@smithy/util-stream": "^3.1.6", + "@smithy/util-stream": "^3.1.8", "@smithy/util-utf8": "^3.0.0", "@smithy/util-waiter": "^3.1.5", "tslib": "^2.6.2" @@ -616,17 +616,17 @@ } }, "node_modules/@aws-sdk/client-secrets-manager": { - "version": "3.654.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.654.0.tgz", - "integrity": "sha512-Fua3kW8XCU2+gWcv8vHpsaR5g4ABuE4/tqv2B7vbMThLZ2Aam6Rw9b5dIMhpbje+edhAUBS0x6UyE88zQeHWZQ==", + "version": "3.658.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.658.1.tgz", + "integrity": "sha512-RpsY5KKIzBaJDKXtXTlFHiV+hOntZVTL94SsKhdcA9+FQvVPQh9Qrck1JPLxBAWHmcwhYD7svJnSoYLSkMgVgw==", "dev": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.654.0", - "@aws-sdk/client-sts": "3.654.0", - "@aws-sdk/core": "3.654.0", - "@aws-sdk/credential-provider-node": "3.654.0", + "@aws-sdk/client-sso-oidc": "3.658.1", + "@aws-sdk/client-sts": "3.658.1", + "@aws-sdk/core": "3.658.1", + "@aws-sdk/credential-provider-node": "3.658.1", "@aws-sdk/middleware-host-header": "3.654.0", "@aws-sdk/middleware-logger": "3.654.0", "@aws-sdk/middleware-recursion-detection": "3.654.0", @@ -637,26 +637,26 @@ "@aws-sdk/util-user-agent-browser": "3.654.0", "@aws-sdk/util-user-agent-node": "3.654.0", "@smithy/config-resolver": "^3.0.8", - "@smithy/core": "^2.4.3", - "@smithy/fetch-http-handler": "^3.2.7", + "@smithy/core": "^2.4.6", + "@smithy/fetch-http-handler": "^3.2.8", "@smithy/hash-node": "^3.0.6", "@smithy/invalid-dependency": "^3.0.6", "@smithy/middleware-content-length": "^3.0.8", "@smithy/middleware-endpoint": "^3.1.3", - "@smithy/middleware-retry": "^3.0.18", + "@smithy/middleware-retry": "^3.0.21", "@smithy/middleware-serde": "^3.0.6", "@smithy/middleware-stack": "^3.0.6", "@smithy/node-config-provider": "^3.1.7", - "@smithy/node-http-handler": "^3.2.2", + "@smithy/node-http-handler": "^3.2.3", "@smithy/protocol-http": "^4.1.3", - "@smithy/smithy-client": "^3.3.2", + "@smithy/smithy-client": "^3.3.5", "@smithy/types": "^3.4.2", "@smithy/url-parser": "^3.0.6", "@smithy/util-base64": "^3.0.0", "@smithy/util-body-length-browser": "^3.0.0", "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.18", - "@smithy/util-defaults-mode-node": "^3.0.18", + "@smithy/util-defaults-mode-browser": "^3.0.21", + "@smithy/util-defaults-mode-node": "^3.0.21", "@smithy/util-endpoints": "^2.1.2", "@smithy/util-middleware": "^3.0.6", "@smithy/util-retry": "^3.0.6", @@ -669,16 +669,16 @@ } }, "node_modules/@aws-sdk/client-ssm": { - "version": "3.654.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-ssm/-/client-ssm-3.654.0.tgz", - "integrity": "sha512-Lg+BvIcD+fol1Jke8GcPLofwJAs6gzLeXvHijI9lEIeTvtIJYG8QANG435StEEGHMsAeSVrmoVT9UHOwLnM/KA==", + "version": "3.658.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ssm/-/client-ssm-3.658.1.tgz", + "integrity": "sha512-L0fn/hDkkcDpSE5aLi+ntbbIE6rXc4NQRDtMyyWdTI9wVZvCQzvDRt4fQaVzknT26Z7QckoB952pIV0OCzpRgA==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.654.0", - "@aws-sdk/client-sts": "3.654.0", - "@aws-sdk/core": "3.654.0", - "@aws-sdk/credential-provider-node": "3.654.0", + "@aws-sdk/client-sso-oidc": "3.658.1", + "@aws-sdk/client-sts": "3.658.1", + "@aws-sdk/core": "3.658.1", + "@aws-sdk/credential-provider-node": "3.658.1", "@aws-sdk/middleware-host-header": "3.654.0", "@aws-sdk/middleware-logger": "3.654.0", "@aws-sdk/middleware-recursion-detection": "3.654.0", @@ -689,26 +689,26 @@ "@aws-sdk/util-user-agent-browser": "3.654.0", "@aws-sdk/util-user-agent-node": "3.654.0", "@smithy/config-resolver": "^3.0.8", - "@smithy/core": "^2.4.3", - "@smithy/fetch-http-handler": "^3.2.7", + "@smithy/core": "^2.4.6", + "@smithy/fetch-http-handler": "^3.2.8", "@smithy/hash-node": "^3.0.6", "@smithy/invalid-dependency": "^3.0.6", "@smithy/middleware-content-length": "^3.0.8", "@smithy/middleware-endpoint": "^3.1.3", - "@smithy/middleware-retry": "^3.0.18", + "@smithy/middleware-retry": "^3.0.21", "@smithy/middleware-serde": "^3.0.6", "@smithy/middleware-stack": "^3.0.6", "@smithy/node-config-provider": "^3.1.7", - "@smithy/node-http-handler": "^3.2.2", + "@smithy/node-http-handler": "^3.2.3", "@smithy/protocol-http": "^4.1.3", - "@smithy/smithy-client": "^3.3.2", + "@smithy/smithy-client": "^3.3.5", "@smithy/types": "^3.4.2", "@smithy/url-parser": "^3.0.6", "@smithy/util-base64": "^3.0.0", "@smithy/util-body-length-browser": "^3.0.0", "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.18", - "@smithy/util-defaults-mode-node": "^3.0.18", + "@smithy/util-defaults-mode-browser": "^3.0.21", + "@smithy/util-defaults-mode-node": "^3.0.21", "@smithy/util-endpoints": "^2.1.2", "@smithy/util-middleware": "^3.0.6", "@smithy/util-retry": "^3.0.6", @@ -722,13 +722,13 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.654.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.654.0.tgz", - "integrity": "sha512-4kBxs2IzCDtj6a6lRXa/lXK5wWpMGzwKtb+HMXf/rJYVM6x7wYRzc1hYrOd3DYkFQ/sR3dUFj+0mTP0os3aAbA==", + "version": "3.658.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.658.1.tgz", + "integrity": "sha512-lOuaBtqPTYGn6xpXlQF4LsNDsQ8Ij2kOdnk+i69Kp6yS76TYvtUuukyLL5kx8zE1c8WbYtxj9y8VNw9/6uKl7Q==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.654.0", + "@aws-sdk/core": "3.658.1", "@aws-sdk/middleware-host-header": "3.654.0", "@aws-sdk/middleware-logger": "3.654.0", "@aws-sdk/middleware-recursion-detection": "3.654.0", @@ -739,26 +739,26 @@ "@aws-sdk/util-user-agent-browser": "3.654.0", "@aws-sdk/util-user-agent-node": "3.654.0", "@smithy/config-resolver": "^3.0.8", - "@smithy/core": "^2.4.3", - "@smithy/fetch-http-handler": "^3.2.7", + "@smithy/core": "^2.4.6", + "@smithy/fetch-http-handler": "^3.2.8", "@smithy/hash-node": "^3.0.6", "@smithy/invalid-dependency": "^3.0.6", "@smithy/middleware-content-length": "^3.0.8", "@smithy/middleware-endpoint": "^3.1.3", - "@smithy/middleware-retry": "^3.0.18", + "@smithy/middleware-retry": "^3.0.21", "@smithy/middleware-serde": "^3.0.6", "@smithy/middleware-stack": "^3.0.6", "@smithy/node-config-provider": "^3.1.7", - "@smithy/node-http-handler": "^3.2.2", + "@smithy/node-http-handler": "^3.2.3", "@smithy/protocol-http": "^4.1.3", - "@smithy/smithy-client": "^3.3.2", + "@smithy/smithy-client": "^3.3.5", "@smithy/types": "^3.4.2", "@smithy/url-parser": "^3.0.6", "@smithy/util-base64": "^3.0.0", "@smithy/util-body-length-browser": "^3.0.0", "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.18", - "@smithy/util-defaults-mode-node": "^3.0.18", + "@smithy/util-defaults-mode-browser": "^3.0.21", + "@smithy/util-defaults-mode-node": "^3.0.21", "@smithy/util-endpoints": "^2.1.2", "@smithy/util-middleware": "^3.0.6", "@smithy/util-retry": "^3.0.6", @@ -770,14 +770,14 @@ } }, "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.654.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.654.0.tgz", - "integrity": "sha512-gbHrKsEnaAtmkNCVQzLyiqMzpDaThV/bWl/ODEklI+t6stW3Pe3oDMstEHLfJ6JU5g8sYnx4VLuxlnJMtUkvPw==", + "version": "3.658.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.658.1.tgz", + "integrity": "sha512-RGcZAI3qEA05JszPKwa0cAyp8rnS1nUvs0Sqw4hqLNQ1kD7b7V6CPjRXe7EFQqCOMvM4kGqx0+cEEVTOmBsFLw==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.654.0", - "@aws-sdk/credential-provider-node": "3.654.0", + "@aws-sdk/core": "3.658.1", + "@aws-sdk/credential-provider-node": "3.658.1", "@aws-sdk/middleware-host-header": "3.654.0", "@aws-sdk/middleware-logger": "3.654.0", "@aws-sdk/middleware-recursion-detection": "3.654.0", @@ -788,26 +788,26 @@ "@aws-sdk/util-user-agent-browser": "3.654.0", "@aws-sdk/util-user-agent-node": "3.654.0", "@smithy/config-resolver": "^3.0.8", - "@smithy/core": "^2.4.3", - "@smithy/fetch-http-handler": "^3.2.7", + "@smithy/core": "^2.4.6", + "@smithy/fetch-http-handler": "^3.2.8", "@smithy/hash-node": "^3.0.6", "@smithy/invalid-dependency": "^3.0.6", "@smithy/middleware-content-length": "^3.0.8", "@smithy/middleware-endpoint": "^3.1.3", - "@smithy/middleware-retry": "^3.0.18", + "@smithy/middleware-retry": "^3.0.21", "@smithy/middleware-serde": "^3.0.6", "@smithy/middleware-stack": "^3.0.6", "@smithy/node-config-provider": "^3.1.7", - "@smithy/node-http-handler": "^3.2.2", + "@smithy/node-http-handler": "^3.2.3", "@smithy/protocol-http": "^4.1.3", - "@smithy/smithy-client": "^3.3.2", + "@smithy/smithy-client": "^3.3.5", "@smithy/types": "^3.4.2", "@smithy/url-parser": "^3.0.6", "@smithy/util-base64": "^3.0.0", "@smithy/util-body-length-browser": "^3.0.0", "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.18", - "@smithy/util-defaults-mode-node": "^3.0.18", + "@smithy/util-defaults-mode-browser": "^3.0.21", + "@smithy/util-defaults-mode-node": "^3.0.21", "@smithy/util-endpoints": "^2.1.2", "@smithy/util-middleware": "^3.0.6", "@smithy/util-retry": "^3.0.6", @@ -818,19 +818,19 @@ "node": ">=16.0.0" }, "peerDependencies": { - "@aws-sdk/client-sts": "^3.654.0" + "@aws-sdk/client-sts": "^3.658.1" } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.654.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.654.0.tgz", - "integrity": "sha512-tyHa8jsBy+/NQZFHm6Q2Q09Vi9p3EH4yPy6PU8yPewpi2klreObtrUd0anJa6nzjS9SSuqnlZWsRic3cQ4QwCg==", + "version": "3.658.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.658.1.tgz", + "integrity": "sha512-yw9hc5blTnbT1V6mR7Cx9HGc9KQpcLQ1QXj8rntiJi6tIYu3aFNVEyy81JHL7NsuBSeQulJTvHO3y6r3O0sfRg==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.654.0", - "@aws-sdk/core": "3.654.0", - "@aws-sdk/credential-provider-node": "3.654.0", + "@aws-sdk/client-sso-oidc": "3.658.1", + "@aws-sdk/core": "3.658.1", + "@aws-sdk/credential-provider-node": "3.658.1", "@aws-sdk/middleware-host-header": "3.654.0", "@aws-sdk/middleware-logger": "3.654.0", "@aws-sdk/middleware-recursion-detection": "3.654.0", @@ -841,26 +841,26 @@ "@aws-sdk/util-user-agent-browser": "3.654.0", "@aws-sdk/util-user-agent-node": "3.654.0", "@smithy/config-resolver": "^3.0.8", - "@smithy/core": "^2.4.3", - "@smithy/fetch-http-handler": "^3.2.7", + "@smithy/core": "^2.4.6", + "@smithy/fetch-http-handler": "^3.2.8", "@smithy/hash-node": "^3.0.6", "@smithy/invalid-dependency": "^3.0.6", "@smithy/middleware-content-length": "^3.0.8", "@smithy/middleware-endpoint": "^3.1.3", - "@smithy/middleware-retry": "^3.0.18", + "@smithy/middleware-retry": "^3.0.21", "@smithy/middleware-serde": "^3.0.6", "@smithy/middleware-stack": "^3.0.6", "@smithy/node-config-provider": "^3.1.7", - "@smithy/node-http-handler": "^3.2.2", + "@smithy/node-http-handler": "^3.2.3", "@smithy/protocol-http": "^4.1.3", - "@smithy/smithy-client": "^3.3.2", + "@smithy/smithy-client": "^3.3.5", "@smithy/types": "^3.4.2", "@smithy/url-parser": "^3.0.6", "@smithy/util-base64": "^3.0.0", "@smithy/util-body-length-browser": "^3.0.0", "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.18", - "@smithy/util-defaults-mode-node": "^3.0.18", + "@smithy/util-defaults-mode-browser": "^3.0.21", + "@smithy/util-defaults-mode-node": "^3.0.21", "@smithy/util-endpoints": "^2.1.2", "@smithy/util-middleware": "^3.0.6", "@smithy/util-retry": "^3.0.6", @@ -872,17 +872,17 @@ } }, "node_modules/@aws-sdk/client-xray": { - "version": "3.654.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-xray/-/client-xray-3.654.0.tgz", - "integrity": "sha512-B2LkjoLQWiwCgVL0iFTtCmirn7ZiZxa+6YtBhf4o9gMY9yBztV3PP/zHYCqCFWgZdG2DXRWDg7UDGkgf/bV8iA==", + "version": "3.658.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-xray/-/client-xray-3.658.1.tgz", + "integrity": "sha512-FVm36F4iyrb91vx4nZHBmBGEf9868Zto8OFbtPw2LeolzxMFh33h6OOyHc6zkgKZfmUHlg8AZAlhVqV6bPXMWw==", "dev": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.654.0", - "@aws-sdk/client-sts": "3.654.0", - "@aws-sdk/core": "3.654.0", - "@aws-sdk/credential-provider-node": "3.654.0", + "@aws-sdk/client-sso-oidc": "3.658.1", + "@aws-sdk/client-sts": "3.658.1", + "@aws-sdk/core": "3.658.1", + "@aws-sdk/credential-provider-node": "3.658.1", "@aws-sdk/middleware-host-header": "3.654.0", "@aws-sdk/middleware-logger": "3.654.0", "@aws-sdk/middleware-recursion-detection": "3.654.0", @@ -893,26 +893,26 @@ "@aws-sdk/util-user-agent-browser": "3.654.0", "@aws-sdk/util-user-agent-node": "3.654.0", "@smithy/config-resolver": "^3.0.8", - "@smithy/core": "^2.4.3", - "@smithy/fetch-http-handler": "^3.2.7", + "@smithy/core": "^2.4.6", + "@smithy/fetch-http-handler": "^3.2.8", "@smithy/hash-node": "^3.0.6", "@smithy/invalid-dependency": "^3.0.6", "@smithy/middleware-content-length": "^3.0.8", "@smithy/middleware-endpoint": "^3.1.3", - "@smithy/middleware-retry": "^3.0.18", + "@smithy/middleware-retry": "^3.0.21", "@smithy/middleware-serde": "^3.0.6", "@smithy/middleware-stack": "^3.0.6", "@smithy/node-config-provider": "^3.1.7", - "@smithy/node-http-handler": "^3.2.2", + "@smithy/node-http-handler": "^3.2.3", "@smithy/protocol-http": "^4.1.3", - "@smithy/smithy-client": "^3.3.2", + "@smithy/smithy-client": "^3.3.5", "@smithy/types": "^3.4.2", "@smithy/url-parser": "^3.0.6", "@smithy/util-base64": "^3.0.0", "@smithy/util-body-length-browser": "^3.0.0", "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.18", - "@smithy/util-defaults-mode-node": "^3.0.18", + "@smithy/util-defaults-mode-browser": "^3.0.21", + "@smithy/util-defaults-mode-node": "^3.0.21", "@smithy/util-endpoints": "^2.1.2", "@smithy/util-middleware": "^3.0.6", "@smithy/util-retry": "^3.0.6", @@ -924,16 +924,16 @@ } }, "node_modules/@aws-sdk/core": { - "version": "3.654.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.654.0.tgz", - "integrity": "sha512-4Rwx7BVaNaFqmXBDmnOkMbyuIFFbpZ+ru4lr660p45zY1QoNNSalechfoRffcokLFOZO+VWEJkdcorPUUU993w==", + "version": "3.658.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.658.1.tgz", + "integrity": "sha512-vJVMoMcSKXK2gBRSu9Ywwv6wQ7tXH8VL1fqB1uVxgCqBZ3IHfqNn4zvpMPWrwgO2/3wv7XFyikGQ5ypPTCw4jA==", "dependencies": { - "@smithy/core": "^2.4.3", + "@smithy/core": "^2.4.6", "@smithy/node-config-provider": "^3.1.7", "@smithy/property-provider": "^3.1.6", "@smithy/protocol-http": "^4.1.3", - "@smithy/signature-v4": "^4.1.3", - "@smithy/smithy-client": "^3.3.2", + "@smithy/signature-v4": "^4.1.4", + "@smithy/smithy-client": "^3.3.5", "@smithy/types": "^3.4.2", "@smithy/util-middleware": "^3.0.6", "fast-xml-parser": "4.4.1", @@ -958,18 +958,18 @@ } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.654.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.654.0.tgz", - "integrity": "sha512-tgmAH4MBi/aDR882lfw48+tDV95ZH3GWc1Eoe6DpNLiM3GN2VfU/cZwuHmi6aq+vAbdIlswBHJ/+va0fOvlyjw==", + "version": "3.658.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.658.1.tgz", + "integrity": "sha512-4ubkJjEVCZflxkZnV1JDQv8P2pburxk1LrEp55telfJRzXrnowzBKwuV2ED0QMNC448g2B3VCaffS+Ct7c4IWQ==", "dependencies": { "@aws-sdk/types": "3.654.0", - "@smithy/fetch-http-handler": "^3.2.7", - "@smithy/node-http-handler": "^3.2.2", + "@smithy/fetch-http-handler": "^3.2.8", + "@smithy/node-http-handler": "^3.2.3", "@smithy/property-provider": "^3.1.6", "@smithy/protocol-http": "^4.1.3", - "@smithy/smithy-client": "^3.3.2", + "@smithy/smithy-client": "^3.3.5", "@smithy/types": "^3.4.2", - "@smithy/util-stream": "^3.1.6", + "@smithy/util-stream": "^3.1.8", "tslib": "^2.6.2" }, "engines": { @@ -977,14 +977,14 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.654.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.654.0.tgz", - "integrity": "sha512-DKSdaNu2hwdmuvnm9KnA0NLqMWxxmxSOLWjSUSoFIm++wGXUjPrRMFYKvMktaXnPuyf5my8gF/yGbwzPZ8wlTg==", + "version": "3.658.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.658.1.tgz", + "integrity": "sha512-2uwOamQg5ppwfegwen1ddPu5HM3/IBSnaGlaKLFhltkdtZ0jiqTZWUtX2V+4Q+buLnT0hQvLS/frQ+7QUam+0Q==", "dependencies": { "@aws-sdk/credential-provider-env": "3.654.0", - "@aws-sdk/credential-provider-http": "3.654.0", + "@aws-sdk/credential-provider-http": "3.658.1", "@aws-sdk/credential-provider-process": "3.654.0", - "@aws-sdk/credential-provider-sso": "3.654.0", + "@aws-sdk/credential-provider-sso": "3.658.1", "@aws-sdk/credential-provider-web-identity": "3.654.0", "@aws-sdk/types": "3.654.0", "@smithy/credential-provider-imds": "^3.2.3", @@ -997,19 +997,19 @@ "node": ">=16.0.0" }, "peerDependencies": { - "@aws-sdk/client-sts": "^3.654.0" + "@aws-sdk/client-sts": "^3.658.1" } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.654.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.654.0.tgz", - "integrity": "sha512-wPV7CNYaXDEc+SS+3R0v8SZwkHRUE1z2k2j1d49tH5QBDT4tb/k2V/biXWkwSk3hbR+IMWXmuhJDv/5lybhIvg==", + "version": "3.658.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.658.1.tgz", + "integrity": "sha512-XwxW6N+uPXPYAuyq+GfOEdfL/MZGAlCSfB5gEWtLBFmFbikhmEuqfWtI6CD60OwudCUOh6argd21BsJf8o1SJA==", "dependencies": { "@aws-sdk/credential-provider-env": "3.654.0", - "@aws-sdk/credential-provider-http": "3.654.0", - "@aws-sdk/credential-provider-ini": "3.654.0", + "@aws-sdk/credential-provider-http": "3.658.1", + "@aws-sdk/credential-provider-ini": "3.658.1", "@aws-sdk/credential-provider-process": "3.654.0", - "@aws-sdk/credential-provider-sso": "3.654.0", + "@aws-sdk/credential-provider-sso": "3.658.1", "@aws-sdk/credential-provider-web-identity": "3.654.0", "@aws-sdk/types": "3.654.0", "@smithy/credential-provider-imds": "^3.2.3", @@ -1038,11 +1038,11 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.654.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.654.0.tgz", - "integrity": "sha512-7GFme6fWEdA/XYKzZPOAdj/jS6fMBy1NdSIZsDXikS0v9jU+ZzHrAaWt13YLzHyjgxB9Sg9id9ncdY1IiubQXQ==", + "version": "3.658.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.658.1.tgz", + "integrity": "sha512-YOagVEsZEk9DmgJEBg+4MBXrPcw/tYas0VQ5OVBqC5XHNbi2OBGJqgmjVPesuu393E7W0VQxtJFDS00O1ewQgA==", "dependencies": { - "@aws-sdk/client-sso": "3.654.0", + "@aws-sdk/client-sso": "3.658.1", "@aws-sdk/token-providers": "3.654.0", "@aws-sdk/types": "3.654.0", "@smithy/property-provider": "^3.1.6", @@ -1084,13 +1084,13 @@ } }, "node_modules/@aws-sdk/lib-dynamodb": { - "version": "3.656.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.656.0.tgz", - "integrity": "sha512-UgT+jSMZGckYuXXGpj+agCv0N8zuK/jCgw7nTQH9g02ZQHTI7dedHUnsgfBN5Jts7fm21Mxkwnd5Mj8xK5DeOQ==", + "version": "3.658.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.658.1.tgz", + "integrity": "sha512-IU/PTANYfmTCt/gB5tM6XYvHXtBGTgNDW5kE5iNte5+VLN3OPXAzlg8Tk00b3sgERyOufiJ5nyerSCSsjyM5WQ==", "dependencies": { - "@aws-sdk/util-dynamodb": "3.656.0", - "@smithy/core": "^2.4.3", - "@smithy/smithy-client": "^3.3.2", + "@aws-sdk/util-dynamodb": "3.658.1", + "@smithy/core": "^2.4.6", + "@smithy/smithy-client": "^3.3.5", "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, @@ -1098,7 +1098,7 @@ "node": ">=16.0.0" }, "peerDependencies": { - "@aws-sdk/client-dynamodb": "^3.656.0" + "@aws-sdk/client-dynamodb": "^3.658.1" } }, "node_modules/@aws-sdk/middleware-endpoint-discovery": { @@ -1220,9 +1220,9 @@ } }, "node_modules/@aws-sdk/util-dynamodb": { - "version": "3.656.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.656.0.tgz", - "integrity": "sha512-vavQ0AZ4t7US3zWCv8mSS9wH6O2nB2lW4yFMO5pkd1Y8YFE3DDFSbzl0zI2A2YSrU1n4fqFbCfXhQhK6sRYoNA==", + "version": "3.658.1", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.658.1.tgz", + "integrity": "sha512-lzlnis+35a2OhGZlVJvM3/30iIVoP2cIv5Bkw1F2nkM6Pr+1NOd3XvYhCY1Ud5zWtV6HUSptzessvUPqJTMfjQ==", "dependencies": { "tslib": "^2.6.2" }, @@ -1230,7 +1230,7 @@ "node": ">=16.0.0" }, "peerDependencies": { - "@aws-sdk/client-dynamodb": "^3.656.0" + "@aws-sdk/client-dynamodb": "^3.658.1" } }, "node_modules/@aws-sdk/util-endpoints": { @@ -4528,15 +4528,15 @@ } }, "node_modules/@smithy/core": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.4.3.tgz", - "integrity": "sha512-4LTusLqFMRVQUfC3RNuTg6IzYTeJNpydRdTKq7J5wdEyIRQSu3rGIa3s80mgG2hhe6WOZl9IqTSo1pgbn6EHhA==", + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.4.6.tgz", + "integrity": "sha512-6lQQp99hnyuNNIzeTYSzCUXJHwvvFLY7hfdFGSJM95tjRDJGfzWYFRBXPaM9766LiiTsQ561KErtbufzUFSYUg==", "dependencies": { "@smithy/middleware-endpoint": "^3.1.3", - "@smithy/middleware-retry": "^3.0.18", + "@smithy/middleware-retry": "^3.0.21", "@smithy/middleware-serde": "^3.0.6", "@smithy/protocol-http": "^4.1.3", - "@smithy/smithy-client": "^3.3.2", + "@smithy/smithy-client": "^3.3.5", "@smithy/types": "^3.4.2", "@smithy/util-body-length-browser": "^3.0.0", "@smithy/util-middleware": "^3.0.6", @@ -4625,9 +4625,9 @@ } }, "node_modules/@smithy/fetch-http-handler": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.7.tgz", - "integrity": "sha512-Ra6IPI1spYLO+t62/3jQbodjOwAbto9wlpJdHZwkycm0Kit+GVpzHW/NMmSgY4rK1bjJ4qLAmCnaBzePO5Nkkg==", + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.8.tgz", + "integrity": "sha512-Lqe0B8F5RM7zkw//6avq1SJ8AfaRd3ubFUS1eVp5WszV7p6Ne5hQ4dSuMHDpNRPhgTvj4va9Kd/pcVigHEHRow==", "dependencies": { "@smithy/protocol-http": "^4.1.3", "@smithy/querystring-builder": "^3.0.6", @@ -4721,14 +4721,14 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "3.0.18", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.18.tgz", - "integrity": "sha512-YU1o/vYob6vlqZdd97MN8cSXRToknLXhFBL3r+c9CZcnxkO/rgNZ++CfgX2vsmnEKvlqdi26+SRtSzlVp5z6Mg==", + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.21.tgz", + "integrity": "sha512-/h0fElV95LekVVEJuSw+aI11S1Y3zIUwBc6h9ZbUv43Gl2weXsbQwjLoet6j/Qtb0phfrSxS6pNg6FqgJOWZkA==", "dependencies": { "@smithy/node-config-provider": "^3.1.7", "@smithy/protocol-http": "^4.1.3", "@smithy/service-error-classification": "^3.0.6", - "@smithy/smithy-client": "^3.3.2", + "@smithy/smithy-client": "^3.3.5", "@smithy/types": "^3.4.2", "@smithy/util-middleware": "^3.0.6", "@smithy/util-retry": "^3.0.6", @@ -4778,9 +4778,9 @@ } }, "node_modules/@smithy/node-http-handler": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.2.2.tgz", - "integrity": "sha512-42Cy4/oT2O+00aiG1iQ7Kd7rE6q8j7vI0gFfnMlUiATvyo8vefJkhb7O10qZY0jAqo5WZdUzfl9IV6wQ3iMBCg==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.2.3.tgz", + "integrity": "sha512-/gcm5DJ3k1b1zEInzBGAZC8ntJ+jwrz1NcSIu+9dSXd1FfG0G6QgkDI40tt8/WYUbHtLyo8fEqtm2v29koWo/w==", "dependencies": { "@smithy/abort-controller": "^3.1.4", "@smithy/protocol-http": "^4.1.3", @@ -4865,9 +4865,9 @@ } }, "node_modules/@smithy/signature-v4": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.1.3.tgz", - "integrity": "sha512-YD2KYSCEEeFHcWZ1E3mLdAaHl8T/TANh6XwmocQ6nPcTdBfh4N5fusgnblnWDlnlU1/cUqEq3PiGi22GmT2Lkg==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.1.4.tgz", + "integrity": "sha512-72MiK7xYukNsnLJI9NqvUHqTu0ziEsfMsYNlWpiJfuGQnCTFKpckThlEatirvcA/LmT1h7rRO+pJD06PYsPu9Q==", "dependencies": { "@smithy/is-array-buffer": "^3.0.0", "@smithy/protocol-http": "^4.1.3", @@ -4883,15 +4883,15 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.3.2.tgz", - "integrity": "sha512-RKDfhF2MTwXl7jan5d7QfS9eCC6XJbO3H+EZAvLQN8A5in4ib2Ml4zoeLo57w9QrqFekBPcsoC2hW3Ekw4vQ9Q==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.3.5.tgz", + "integrity": "sha512-7IZi8J3Dr9n3tX+lcpmJ/5tCYIqoXdblFBaPuv0SEKZFRpCxE+TqIWL6I3t7jLlk9TWu3JSvEZAhtjB9yvB+zA==", "dependencies": { "@smithy/middleware-endpoint": "^3.1.3", "@smithy/middleware-stack": "^3.0.6", "@smithy/protocol-http": "^4.1.3", "@smithy/types": "^3.4.2", - "@smithy/util-stream": "^3.1.6", + "@smithy/util-stream": "^3.1.8", "tslib": "^2.6.2" }, "engines": { @@ -4975,12 +4975,12 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "3.0.18", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.18.tgz", - "integrity": "sha512-/eveCzU6Z6Yw8dlYQLA4rcK30XY0E4L3lD3QFHm59mzDaWYelrXE1rlynuT3J6qxv+5yNy3a1JuzhG5hk5hcmw==", + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.21.tgz", + "integrity": "sha512-M/FhTBk4c/SsB91dD/M4gMGfJO7z/qJaM9+XQQIqBOf4qzZYMExnP7R4VdGwxxH8IKMGW+8F0I4rNtVRrcfPoA==", "dependencies": { "@smithy/property-provider": "^3.1.6", - "@smithy/smithy-client": "^3.3.2", + "@smithy/smithy-client": "^3.3.5", "@smithy/types": "^3.4.2", "bowser": "^2.11.0", "tslib": "^2.6.2" @@ -4990,15 +4990,15 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "3.0.18", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.18.tgz", - "integrity": "sha512-9cfzRjArtOFPlTYRREJk00suUxVXTgbrzVncOyMRTUeMKnecG/YentLF3cORa+R6mUOMSrMSnT18jos1PKqK6Q==", + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.21.tgz", + "integrity": "sha512-NiLinPvF86U3S2Pdx/ycqd4bnY5dmFSPNL5KYRwbNjqQFS09M5Wzqk8BNk61/47xCYz1X/6KeiSk9qgYPTtuDw==", "dependencies": { "@smithy/config-resolver": "^3.0.8", "@smithy/credential-provider-imds": "^3.2.3", "@smithy/node-config-provider": "^3.1.7", "@smithy/property-provider": "^3.1.6", - "@smithy/smithy-client": "^3.3.2", + "@smithy/smithy-client": "^3.3.5", "@smithy/types": "^3.4.2", "tslib": "^2.6.2" }, @@ -5056,12 +5056,12 @@ } }, "node_modules/@smithy/util-stream": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.1.6.tgz", - "integrity": "sha512-lQEUfTx1ht5CRdvIjdAN/gUL6vQt2wSARGGLaBHNe+iJSkRHlWzY+DOn0mFTmTgyU3jcI5n9DkT5gTzYuSOo6A==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.1.8.tgz", + "integrity": "sha512-hoKOqSmb8FD3WLObuB5hwbM7bNIWgcnvkThokTvVq7J5PKjlLUK5qQQcB9zWLHIoSaIlf3VIv2OxZY2wtQjcRQ==", "dependencies": { - "@smithy/fetch-http-handler": "^3.2.7", - "@smithy/node-http-handler": "^3.2.2", + "@smithy/fetch-http-handler": "^3.2.8", + "@smithy/node-http-handler": "^3.2.3", "@smithy/types": "^3.4.2", "@smithy/util-base64": "^3.0.0", "@smithy/util-buffer-from": "^3.0.0", @@ -17734,8 +17734,8 @@ }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.656.0", - "@aws-sdk/lib-dynamodb": "^3.656.0", + "@aws-sdk/client-dynamodb": "^3.658.1", + "@aws-sdk/lib-dynamodb": "^3.658.1", "aws-sdk-client-mock": "^4.0.2", "aws-sdk-client-mock-jest": "^4.0.2" }, @@ -17794,7 +17794,7 @@ }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-cloudwatch": "^3.654.0", + "@aws-sdk/client-cloudwatch": "^3.658.1", "@types/promise-retry": "^1.1.3", "promise-retry": "^2.0.1" }, @@ -17816,11 +17816,11 @@ }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-appconfigdata": "^3.654.0", - "@aws-sdk/client-dynamodb": "^3.656.0", - "@aws-sdk/client-secrets-manager": "^3.654.0", - "@aws-sdk/client-ssm": "^3.654.0", - "@aws-sdk/util-dynamodb": "^3.656.0", + "@aws-sdk/client-appconfigdata": "^3.658.1", + "@aws-sdk/client-dynamodb": "^3.658.1", + "@aws-sdk/client-secrets-manager": "^3.658.1", + "@aws-sdk/client-ssm": "^3.658.1", + "@aws-sdk/util-dynamodb": "^3.658.1", "@smithy/util-base64": "^3.0.0", "aws-sdk-client-mock": "^4.0.2", "aws-sdk-client-mock-jest": "^4.0.2" @@ -17881,7 +17881,7 @@ "license": "MIT-0", "dependencies": { "@aws-cdk/cli-lib-alpha": "^2.160.0-alpha.0", - "@aws-sdk/client-lambda": "^3.656.0", + "@aws-sdk/client-lambda": "^3.658.1", "@smithy/util-utf8": "^3.0.0", "aws-cdk-lib": "^2.160.0", "esbuild": "^0.24.0", @@ -17909,8 +17909,8 @@ }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.656.0", - "@aws-sdk/client-xray": "^3.654.0" + "@aws-sdk/client-dynamodb": "^3.658.1", + "@aws-sdk/client-xray": "^3.658.1" }, "peerDependencies": { "@middy/core": "4.x || 5.x" diff --git a/packages/idempotency/package.json b/packages/idempotency/package.json index 2092aa7ee5..3cb2e38ebb 100644 --- a/packages/idempotency/package.json +++ b/packages/idempotency/package.json @@ -125,8 +125,8 @@ ], "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.656.0", - "@aws-sdk/lib-dynamodb": "^3.656.0", + "@aws-sdk/client-dynamodb": "^3.658.1", + "@aws-sdk/lib-dynamodb": "^3.658.1", "aws-sdk-client-mock": "^4.0.2", "aws-sdk-client-mock-jest": "^4.0.2" } diff --git a/packages/metrics/package.json b/packages/metrics/package.json index e64fa8e50c..9a02c976af 100644 --- a/packages/metrics/package.json +++ b/packages/metrics/package.json @@ -62,7 +62,7 @@ "main": "./lib/cjs/index.js", "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-cloudwatch": "^3.654.0", + "@aws-sdk/client-cloudwatch": "^3.658.1", "@types/promise-retry": "^1.1.3", "promise-retry": "^2.0.1" }, diff --git a/packages/parameters/package.json b/packages/parameters/package.json index 841004c9f4..df80045f41 100644 --- a/packages/parameters/package.json +++ b/packages/parameters/package.json @@ -154,11 +154,11 @@ ], "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-appconfigdata": "^3.654.0", - "@aws-sdk/client-dynamodb": "^3.656.0", - "@aws-sdk/client-secrets-manager": "^3.654.0", - "@aws-sdk/client-ssm": "^3.654.0", - "@aws-sdk/util-dynamodb": "^3.656.0", + "@aws-sdk/client-appconfigdata": "^3.658.1", + "@aws-sdk/client-dynamodb": "^3.658.1", + "@aws-sdk/client-secrets-manager": "^3.658.1", + "@aws-sdk/client-ssm": "^3.658.1", + "@aws-sdk/util-dynamodb": "^3.658.1", "@smithy/util-base64": "^3.0.0", "aws-sdk-client-mock": "^4.0.2", "aws-sdk-client-mock-jest": "^4.0.2" diff --git a/packages/testing/package.json b/packages/testing/package.json index 37f60477e6..9044e97e80 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -99,7 +99,7 @@ "homepage": "https://github.com/aws-powertools/powertools-lambda-typescript/tree/main/packages/testing#readme", "dependencies": { "@aws-cdk/cli-lib-alpha": "^2.160.0-alpha.0", - "@aws-sdk/client-lambda": "^3.656.0", + "@aws-sdk/client-lambda": "^3.658.1", "@smithy/util-utf8": "^3.0.0", "aws-cdk-lib": "^2.160.0", "esbuild": "^0.24.0", diff --git a/packages/tracer/package.json b/packages/tracer/package.json index 8b1b30aaa1..20e276af56 100644 --- a/packages/tracer/package.json +++ b/packages/tracer/package.json @@ -28,8 +28,8 @@ "license": "MIT-0", "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.656.0", - "@aws-sdk/client-xray": "^3.654.0" + "@aws-sdk/client-dynamodb": "^3.658.1", + "@aws-sdk/client-xray": "^3.658.1" }, "peerDependencies": { "@middy/core": "4.x || 5.x" From 7dbaadcac3fac2b59ce88dca1252d2d5e6ae89b7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 26 Sep 2024 16:09:41 +0200 Subject: [PATCH 32/52] chore(deps): bump actions/checkout from 4.1.7 to 4.2.0 (#3122) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/dependency-review.yml | 2 +- .github/workflows/label_pr_on_title.yml | 2 +- .github/workflows/make-release.yml | 4 ++-- .github/workflows/make-version.yml | 2 +- .github/workflows/on_merged_pr.yml | 2 +- .github/workflows/on_opened_pr.yml | 4 ++-- .github/workflows/ossf_scorecard.yml | 2 +- .github/workflows/post-release.yml | 2 +- .github/workflows/publish_layer.yml | 4 ++-- .github/workflows/record_pr.yml | 2 +- .../reusable-run-linting-check-and-unit-tests.yml | 12 ++++++------ .github/workflows/reusable_deploy_layer_stack.yml | 2 +- .github/workflows/reusable_export_pr_details.yml | 2 +- .github/workflows/reusable_publish_docs.yml | 2 +- .github/workflows/run-e2e-tests.yml | 4 ++-- .github/workflows/secure-workflows.yml | 2 +- 16 files changed, 25 insertions(+), 25 deletions(-) diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml index 24a0dd11f5..fc92dbf5ed 100644 --- a/.github/workflows/dependency-review.yml +++ b/.github/workflows/dependency-review.yml @@ -17,6 +17,6 @@ jobs: runs-on: ubuntu-latest steps: - name: 'Checkout Repository' - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 - name: 'Dependency Review' uses: actions/dependency-review-action@5a2ce3f5b92ee19cbb1541a4984c76d921601d7c # v4.3.4 diff --git a/.github/workflows/label_pr_on_title.yml b/.github/workflows/label_pr_on_title.yml index 27ccdfe7be..d1786f6e1c 100644 --- a/.github/workflows/label_pr_on_title.yml +++ b/.github/workflows/label_pr_on_title.yml @@ -49,7 +49,7 @@ jobs: pull-requests: write # label respective PR steps: - name: Checkout repository - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 - name: "Label PR based on title" uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 env: diff --git a/.github/workflows/make-release.yml b/.github/workflows/make-release.yml index 8cf8193dcc..ef8ebd9550 100644 --- a/.github/workflows/make-release.yml +++ b/.github/workflows/make-release.yml @@ -45,7 +45,7 @@ jobs: RELEASE_VERSION: ${{ steps.set-release-version.outputs.RELEASE_VERSION }} steps: - name: Checkout code - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 with: ref: ${{ github.sha }} - name: Setup NodeJS @@ -75,7 +75,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout code - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 with: ref: ${{ github.sha }} - name: Git client setup diff --git a/.github/workflows/make-version.yml b/.github/workflows/make-version.yml index 7b743d0c98..3c013e8fc6 100644 --- a/.github/workflows/make-version.yml +++ b/.github/workflows/make-version.yml @@ -18,7 +18,7 @@ jobs: RELEASE_VERSION: ${{ steps.set-release-version.outputs.RELEASE_VERSION }} steps: - name: Checkout code - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 with: ref: ${{ github.ref }} fetch-depth: 0 # fetch all history, commits and tags, lerna scans it to the last tag and looks at commits, we need all of it to determine the next version diff --git a/.github/workflows/on_merged_pr.yml b/.github/workflows/on_merged_pr.yml index b93976ee7f..266d0a8c8b 100644 --- a/.github/workflows/on_merged_pr.yml +++ b/.github/workflows/on_merged_pr.yml @@ -49,7 +49,7 @@ jobs: issues: write # label issue with pending-release if: needs.get_pr_details.outputs.prIsMerged == 'true' steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 - name: "Label PR related issue for release" uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 env: diff --git a/.github/workflows/on_opened_pr.yml b/.github/workflows/on_opened_pr.yml index 42bb7e513f..ea808a1cfa 100644 --- a/.github/workflows/on_opened_pr.yml +++ b/.github/workflows/on_opened_pr.yml @@ -47,7 +47,7 @@ jobs: needs: get_pr_details runs-on: ubuntu-latest steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 - name: "Ensure related issue is present" uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 env: @@ -66,7 +66,7 @@ jobs: permissions: pull-requests: write # label and comment on PR if missing acknowledge section (requirement) steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 - name: "Ensure acknowledgement section is present" uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 env: diff --git a/.github/workflows/ossf_scorecard.yml b/.github/workflows/ossf_scorecard.yml index ee80a1a095..928a115d1e 100644 --- a/.github/workflows/ossf_scorecard.yml +++ b/.github/workflows/ossf_scorecard.yml @@ -22,7 +22,7 @@ jobs: steps: - name: "Checkout code" - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 with: persist-credentials: false diff --git a/.github/workflows/post-release.yml b/.github/workflows/post-release.yml index 8c63623845..e4f1ee5da8 100644 --- a/.github/workflows/post-release.yml +++ b/.github/workflows/post-release.yml @@ -26,7 +26,7 @@ jobs: env: RELEASE_VERSION: ${{ inputs.versionNumber }} steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 - name: Get release version run: | # The code below does the following: diff --git a/.github/workflows/publish_layer.yml b/.github/workflows/publish_layer.yml index 1ceca64228..bbcc0090ad 100644 --- a/.github/workflows/publish_layer.yml +++ b/.github/workflows/publish_layer.yml @@ -31,7 +31,7 @@ jobs: if: ${{ (github.event.workflow_run.conclusion == 'success') || (github.event_name == 'workflow_dispatch') }} steps: - name: checkout - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 with: ref: ${{ github.sha }} - name: Setup Node.js @@ -93,7 +93,7 @@ jobs: id-token: none steps: - name: Checkout repository # reusable workflows start clean, so we need to checkout again - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 with: ref: ${{ github.sha }} - name: Download CDK layer artifacts diff --git a/.github/workflows/record_pr.yml b/.github/workflows/record_pr.yml index 82d4956b45..bf9478fe64 100644 --- a/.github/workflows/record_pr.yml +++ b/.github/workflows/record_pr.yml @@ -46,7 +46,7 @@ jobs: permissions: contents: read # NOTE: treat as untrusted location steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 - name: "Extract PR details" uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 with: diff --git a/.github/workflows/reusable-run-linting-check-and-unit-tests.yml b/.github/workflows/reusable-run-linting-check-and-unit-tests.yml index e59e01783b..93802ebb73 100644 --- a/.github/workflows/reusable-run-linting-check-and-unit-tests.yml +++ b/.github/workflows/reusable-run-linting-check-and-unit-tests.yml @@ -48,7 +48,7 @@ jobs: fail-fast: false steps: - name: Checkout code - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 - name: Setup NodeJS uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 with: @@ -74,7 +74,7 @@ jobs: fail-fast: false steps: - name: Checkout code - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 - name: Setup NodeJS uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 with: @@ -115,7 +115,7 @@ jobs: working-directory: examples/${{ matrix.example }} steps: - name: Checkout code - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 - name: Setup NodeJS uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 with: @@ -133,7 +133,7 @@ jobs: NODE_ENV: dev steps: - name: Checkout code - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 - name: Setup NodeJS uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 with: @@ -151,7 +151,7 @@ jobs: NODE_ENV: dev steps: - name: Checkout code - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 - name: Setup NodeJS uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 with: @@ -167,7 +167,7 @@ jobs: NODE_ENV: dev steps: - name: Checkout code - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 - name: Setup NodeJS uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 with: diff --git a/.github/workflows/reusable_deploy_layer_stack.yml b/.github/workflows/reusable_deploy_layer_stack.yml index ef9abcb093..08491e693c 100644 --- a/.github/workflows/reusable_deploy_layer_stack.yml +++ b/.github/workflows/reusable_deploy_layer_stack.yml @@ -64,7 +64,7 @@ jobs: ] steps: - name: checkout - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 - name: aws credentials uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2 with: diff --git a/.github/workflows/reusable_export_pr_details.yml b/.github/workflows/reusable_export_pr_details.yml index 0f7b33e9c3..401cc025a8 100644 --- a/.github/workflows/reusable_export_pr_details.yml +++ b/.github/workflows/reusable_export_pr_details.yml @@ -75,7 +75,7 @@ jobs: prLabels: ${{ steps.prLabels.outputs.prLabels }} steps: - name: Checkout repository # in case caller workflow doesn't checkout thus failing with file not found - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 - name: "Download previously saved PR" uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 env: diff --git a/.github/workflows/reusable_publish_docs.yml b/.github/workflows/reusable_publish_docs.yml index 8d3e2868ac..8f9e67488e 100644 --- a/.github/workflows/reusable_publish_docs.yml +++ b/.github/workflows/reusable_publish_docs.yml @@ -50,7 +50,7 @@ jobs: id-token: write # trade JWT token for AWS credentials in AWS Docs account steps: - name: Checkout code - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 - name: Setup NodeJS uses: actions/setup-node@0a44ba7841725637a19e28fa30b79a866c81b0a6 # v4.0.4 with: diff --git a/.github/workflows/run-e2e-tests.yml b/.github/workflows/run-e2e-tests.yml index 9b8a88f415..02926eecbc 100644 --- a/.github/workflows/run-e2e-tests.yml +++ b/.github/workflows/run-e2e-tests.yml @@ -37,7 +37,7 @@ jobs: fail-fast: false steps: - name: Checkout Repo - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 # If we pass a PR Number when triggering the workflow we will retrieve the PR info and get its headSHA - name: Extract PR details id: extract_PR_details @@ -51,7 +51,7 @@ jobs: # we checkout the PR at that point in time - name: Checkout PR code if: ${{ inputs.prNumber != '' }} - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 with: ref: ${{ steps.extract_PR_details.outputs.headSHA }} - name: Setup NodeJS diff --git a/.github/workflows/secure-workflows.yml b/.github/workflows/secure-workflows.yml index a4d844598b..694cf8b1cb 100644 --- a/.github/workflows/secure-workflows.yml +++ b/.github/workflows/secure-workflows.yml @@ -30,7 +30,7 @@ jobs: contents: read # checkout code and subsequently GitHub action workflows steps: - name: Checkout code - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 - name: Ensure 3rd party workflows have SHA pinned uses: zgosalvez/github-actions-ensure-sha-pinned-actions@0901cf7b71c7ea6261ec69a3dc2bd3f9264f893e # v3.0.12 with: From 4318e532acdc6dcde295e31b07f1156706f7ccfb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 26 Sep 2024 17:56:36 +0200 Subject: [PATCH 33/52] chore(deps): bump squidfunk/mkdocs-material from `22a429f` to `7aea359` in /docs (#3120) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Andrea Amorosi --- docs/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Dockerfile b/docs/Dockerfile index b125bf2d24..dab288411d 100644 --- a/docs/Dockerfile +++ b/docs/Dockerfile @@ -1,5 +1,5 @@ # version 9.5.35 -FROM squidfunk/mkdocs-material@sha256:22a429f602f2f616ff12ddc19bdcaae5f2096086a79c529fddd5472bdcb46165 +FROM squidfunk/mkdocs-material@sha256:7aea3592488c021f1391fe2259ea20d6253d705a7acab17581c0a0104c7ce308 COPY requirements.txt /tmp/ RUN pip install --require-hashes -r /tmp/requirements.txt From 9548d77d5862dd19108d4c3aecdb5ffbb4bc3e18 Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Thu, 26 Sep 2024 21:22:45 +0200 Subject: [PATCH 34/52] test(idempotency): migrate to vitest (#3124) Co-authored-by: Alexander Schueren --- ...sable-run-linting-check-and-unit-tests.yml | 5 +- .husky/pre-push | 1 - package-lock.json | 22 +- packages/idempotency/package.json | 11 +- .../src/middleware/makeHandlerIdempotent.ts | 2 +- .../tests/helpers/idempotencyUtils.ts | 36 +- packages/idempotency/tests/tsconfig.json | 3 +- .../unit/EnvironmentVariableService.test.ts | 14 +- .../tests/unit/IdempotencyConfig.test.ts | 14 +- .../tests/unit/IdempotencyHandler.test.ts | 94 ++--- .../idempotency/tests/unit/deepSort.test.ts | 24 +- .../tests/unit/idempotencyDecorator.test.ts | 320 +---------------- .../tests/unit/makeIdempotent.test.ts | 108 +++--- .../persistence/BasePersistenceLayer.test.ts | 109 +++--- .../DynamoDbPersistenceLayer.test.ts | 324 ++++++------------ .../persistence/IdempotencyRecord.test.ts | 100 ++---- packages/idempotency/vitest.config.ts | 8 + packages/testing/package.json | 3 +- packages/testing/src/setupEnv.ts | 31 ++ vitest.config.ts | 3 +- 20 files changed, 402 insertions(+), 830 deletions(-) create mode 100644 packages/idempotency/vitest.config.ts create mode 100644 packages/testing/src/setupEnv.ts diff --git a/.github/workflows/reusable-run-linting-check-and-unit-tests.yml b/.github/workflows/reusable-run-linting-check-and-unit-tests.yml index 93802ebb73..f98a91353e 100644 --- a/.github/workflows/reusable-run-linting-check-and-unit-tests.yml +++ b/.github/workflows/reusable-run-linting-check-and-unit-tests.yml @@ -43,7 +43,8 @@ jobs: workspace: [ "packages/batch", "packages/commons", - "packages/jmespath" + "packages/jmespath", + "packages/idempotency" ] fail-fast: false steps: @@ -90,7 +91,6 @@ jobs: -w packages/tracer \ -w packages/metrics \ -w packages/parameters \ - -w packages/idempotency \ -w packages/parser \ -w packages/event-handler - name: Run unit tests @@ -99,7 +99,6 @@ jobs: -w packages/tracer \ -w packages/metrics \ -w packages/parameters \ - -w packages/idempotency \ -w packages/parser \ -w packages/event-handler check-examples: diff --git a/.husky/pre-push b/.husky/pre-push index 936e9022be..a6182662c5 100755 --- a/.husky/pre-push +++ b/.husky/pre-push @@ -2,7 +2,6 @@ npm t \ -w packages/logger \ -w packages/metrics \ -w packages/tracer \ - -w packages/idempotency \ -w packages/parameters \ -w packages/parser \ -w packages/event-handler diff --git a/package-lock.json b/package-lock.json index 3c1762845c..4238c2f73a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6297,6 +6297,16 @@ "aws-sdk-client-mock": "4.0.2" } }, + "node_modules/aws-sdk-client-mock-vitest": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/aws-sdk-client-mock-vitest/-/aws-sdk-client-mock-vitest-4.0.0.tgz", + "integrity": "sha512-AY4ZsTH+SJsEwnbu2bCPAb4ELO2XqKQBVeQwQnmxa6RVg89zX5W+mWs2qV5+evFOwDIBQensQeS/RsyEbHjvQw==", + "dev": true, + "dependencies": { + "@vitest/expect": "^2.0.1", + "tslib": "^2.6.3" + } + }, "node_modules/aws-sdk/node_modules/buffer": { "version": "4.9.2", "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", @@ -15829,9 +15839,9 @@ } }, "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" }, "node_modules/tsx": { "version": "4.19.1", @@ -17736,8 +17746,7 @@ "@aws-lambda-powertools/testing-utils": "file:../testing", "@aws-sdk/client-dynamodb": "^3.658.1", "@aws-sdk/lib-dynamodb": "^3.658.1", - "aws-sdk-client-mock": "^4.0.2", - "aws-sdk-client-mock-jest": "^4.0.2" + "aws-sdk-client-mock": "^4.0.2" }, "peerDependencies": { "@aws-sdk/client-dynamodb": ">=3.x", @@ -17888,7 +17897,8 @@ "promise-retry": "^2.0.1" }, "devDependencies": { - "@types/promise-retry": "^1.1.6" + "@types/promise-retry": "^1.1.6", + "aws-sdk-client-mock-vitest": "^4.0.0" } }, "packages/testing/node_modules/@aws-cdk/cli-lib-alpha": { diff --git a/packages/idempotency/package.json b/packages/idempotency/package.json index 3cb2e38ebb..d350f22cb6 100644 --- a/packages/idempotency/package.json +++ b/packages/idempotency/package.json @@ -10,13 +10,13 @@ "access": "public" }, "scripts": { - "test": "npm run test:unit", - "test:unit": "jest --group=unit --detectOpenHandles --coverage --verbose", - "jest": "jest --detectOpenHandles --verbose", + "test": "vitest --run", + "test:unit": "vitest --run", + "test:unit:coverage": "vitest --run tests/unit --coverage.enabled --coverage.thresholds.100 --coverage.include='src/**'", + "test:unit:types": "echo 'Not Implemented'", "test:e2e:nodejs18x": "RUNTIME=nodejs18x jest --group=e2e", "test:e2e:nodejs20x": "RUNTIME=nodejs20x jest --group=e2e", "test:e2e": "jest --group=e2e", - "watch": "jest --watch", "build:cjs": "tsc --build tsconfig.json && echo '{ \"type\": \"commonjs\" }' > lib/cjs/package.json", "build:esm": "tsc --build tsconfig.esm.json && echo '{ \"type\": \"module\" }' > lib/esm/package.json", "build": "npm run build:esm & npm run build:cjs", @@ -127,7 +127,6 @@ "@aws-lambda-powertools/testing-utils": "file:../testing", "@aws-sdk/client-dynamodb": "^3.658.1", "@aws-sdk/lib-dynamodb": "^3.658.1", - "aws-sdk-client-mock": "^4.0.2", - "aws-sdk-client-mock-jest": "^4.0.2" + "aws-sdk-client-mock": "^4.0.2" } } diff --git a/packages/idempotency/src/middleware/makeHandlerIdempotent.ts b/packages/idempotency/src/middleware/makeHandlerIdempotent.ts index 3e05ef7045..11958b3e3b 100644 --- a/packages/idempotency/src/middleware/makeHandlerIdempotent.ts +++ b/packages/idempotency/src/middleware/makeHandlerIdempotent.ts @@ -122,7 +122,7 @@ const makeHandlerIdempotent = ( }); const idempotencyHandler = new IdempotencyHandler({ - functionToMakeIdempotent: /* istanbul ignore next */ () => ({}), + functionToMakeIdempotent: /* v8 ignore next */ () => ({}), functionArguments: [], idempotencyConfig, persistenceStore, diff --git a/packages/idempotency/tests/helpers/idempotencyUtils.ts b/packages/idempotency/tests/helpers/idempotencyUtils.ts index 8b8eb04f09..3c57281814 100644 --- a/packages/idempotency/tests/helpers/idempotencyUtils.ts +++ b/packages/idempotency/tests/helpers/idempotencyUtils.ts @@ -1,4 +1,7 @@ +import { vi } from 'vitest'; import { BasePersistenceLayer } from '../../src/persistence/BasePersistenceLayer.js'; +import { DynamoDBPersistenceLayer } from '../../src/persistence/DynamoDBPersistenceLayer.js'; +import type { IdempotencyRecord } from '../../src/persistence/IdempotencyRecord.js'; /** * Dummy class to test the abstract class BasePersistenceLayer. @@ -6,10 +9,33 @@ import { BasePersistenceLayer } from '../../src/persistence/BasePersistenceLayer * This class is used in the unit tests. */ class PersistenceLayerTestClass extends BasePersistenceLayer { - protected _deleteRecord = jest.fn(); - protected _getRecord = jest.fn(); - protected _putRecord = jest.fn(); - protected _updateRecord = jest.fn(); + public _deleteRecord = vi.fn(); + public _getRecord = vi.fn(); + public _putRecord = vi.fn(); + public _updateRecord = vi.fn(); } -export { PersistenceLayerTestClass }; +/** + * Dummy class to test the abstract class DynamoDBPersistenceLayer. + * + * This class is used in the unit tests. + */ +class DynamoDBPersistenceLayerTestClass extends DynamoDBPersistenceLayer { + public _deleteRecord(record: IdempotencyRecord): Promise { + return super._deleteRecord(record); + } + + public _getRecord(idempotencyKey: string): Promise { + return super._getRecord(idempotencyKey); + } + + public _putRecord(_record: IdempotencyRecord): Promise { + return super._putRecord(_record); + } + + public _updateRecord(record: IdempotencyRecord): Promise { + return super._updateRecord(record); + } +} + +export { PersistenceLayerTestClass, DynamoDBPersistenceLayerTestClass }; diff --git a/packages/idempotency/tests/tsconfig.json b/packages/idempotency/tests/tsconfig.json index 5654b3e15f..dde99895c8 100644 --- a/packages/idempotency/tests/tsconfig.json +++ b/packages/idempotency/tests/tsconfig.json @@ -1,10 +1,11 @@ { "extends": "../tsconfig.json", "compilerOptions": { - "rootDir": "../", + "rootDir": "../../", "noEmit": true }, "include": [ + "../../testing/src/setupEnv.ts", "../src/**/*", "./**/*", ] diff --git a/packages/idempotency/tests/unit/EnvironmentVariableService.test.ts b/packages/idempotency/tests/unit/EnvironmentVariableService.test.ts index 6681ef672c..86ac2cc68a 100644 --- a/packages/idempotency/tests/unit/EnvironmentVariableService.test.ts +++ b/packages/idempotency/tests/unit/EnvironmentVariableService.test.ts @@ -1,15 +1,10 @@ -/** - * Test EnvironmentVariableService class - * - * @group unit/idempotency/environment-variables-service - */ +import { afterEach, beforeEach, describe, expect, it } from 'vitest'; import { EnvironmentVariablesService } from '../../src/config/EnvironmentVariablesService.js'; describe('Class: EnvironmentVariableService', () => { const ENVIRONMENT_VARIABLES = process.env; beforeEach(() => { - jest.resetModules(); process.env = { ...ENVIRONMENT_VARIABLES }; }); @@ -18,9 +13,10 @@ describe('Class: EnvironmentVariableService', () => { }); describe('Method: getFunctionName', () => { - test('When called, it gets the Lambda function name from the environment variable', () => { + it('gets the Lambda function name from the environment variable', () => { // Prepare - const expectedName = process.env.AWS_LAMBDA_FUNCTION_NAME; + const expectedName = 'test-function'; + process.env.AWS_LAMBDA_FUNCTION_NAME = expectedName; // Act const lambdaName = new EnvironmentVariablesService().getFunctionName(); @@ -29,7 +25,7 @@ describe('Class: EnvironmentVariableService', () => { expect(lambdaName).toEqual(expectedName); }); - test('When called without the environment variable set, it returns an empty string', () => { + it('it returns an empty string when the Lambda function name is not set', () => { // Prepare process.env.AWS_LAMBDA_FUNCTION_NAME = undefined; diff --git a/packages/idempotency/tests/unit/IdempotencyConfig.test.ts b/packages/idempotency/tests/unit/IdempotencyConfig.test.ts index 35551bc6d8..fef85a96d5 100644 --- a/packages/idempotency/tests/unit/IdempotencyConfig.test.ts +++ b/packages/idempotency/tests/unit/IdempotencyConfig.test.ts @@ -1,9 +1,5 @@ -/** - * Test IdempotencyConfig class - * - * @group unit/idempotency/config - */ import context from '@aws-lambda-powertools/testing-utils/context'; +import { afterAll, beforeEach, describe, expect, it } from 'vitest'; import { IdempotencyConfig } from '../../src/index.js'; import type { IdempotencyConfigOptions } from '../../src/types/index.js'; @@ -11,8 +7,6 @@ describe('Class: IdempotencyConfig', () => { const ENVIRONMENT_VARIABLES = process.env; beforeEach(() => { - jest.clearAllMocks(); - jest.resetModules(); process.env = { ...ENVIRONMENT_VARIABLES }; }); @@ -21,7 +15,7 @@ describe('Class: IdempotencyConfig', () => { }); describe('Method: configure', () => { - test('when configured with an empty config object, it initializes the config with default values', () => { + it('initializes the config with default values', () => { // Prepare const configOptions = {}; @@ -42,7 +36,7 @@ describe('Class: IdempotencyConfig', () => { ); }); - test('when configured with a config object, it initializes the config with the provided configs', () => { + it('initializes the config with the provided configs', () => { // Prepare const configOptions: IdempotencyConfigOptions = { eventKeyJmesPath: 'eventKeyJmesPath', @@ -73,7 +67,7 @@ describe('Class: IdempotencyConfig', () => { }); describe('Method: registerLambdaContext', () => { - test('when called, it stores the provided context', async () => { + it('stores the provided context', async () => { // Prepare const config = new IdempotencyConfig({}); diff --git a/packages/idempotency/tests/unit/IdempotencyHandler.test.ts b/packages/idempotency/tests/unit/IdempotencyHandler.test.ts index 7c5f218a1a..c64e3c10f7 100644 --- a/packages/idempotency/tests/unit/IdempotencyHandler.test.ts +++ b/packages/idempotency/tests/unit/IdempotencyHandler.test.ts @@ -1,4 +1,5 @@ import type { JSONValue } from '@aws-lambda-powertools/commons/types'; +import { afterAll, beforeEach, describe, expect, it, vi } from 'vitest'; import { IdempotencyHandler } from '../../src/IdempotencyHandler.js'; import { IdempotencyRecordStatus, MAX_RETRIES } from '../../src/constants.js'; import { @@ -8,16 +9,11 @@ import { IdempotencyItemAlreadyExistsError, IdempotencyPersistenceLayerError, } from '../../src/index.js'; -/** - * Test Idempotency Handler - * - * @group unit/idempotency/IdempotencyHandler - */ import { IdempotencyRecord } from '../../src/persistence/index.js'; import { PersistenceLayerTestClass } from '../helpers/idempotencyUtils.js'; -const mockFunctionToMakeIdempotent = jest.fn(); -const mockResponseHook = jest +const mockFunctionToMakeIdempotent = vi.fn(); +const mockResponseHook = vi .fn() .mockImplementation((response, record) => response); const mockFunctionPayloadToBeHashed = {}; @@ -25,9 +21,7 @@ const persistenceStore = new PersistenceLayerTestClass(); const mockIdempotencyOptions = { persistenceStore, dataKeywordArgument: 'testKeywordArgument', - config: new IdempotencyConfig({ - responseHook: mockResponseHook, - }), + config: new IdempotencyConfig({}), }; const idempotentHandler = new IdempotencyHandler({ @@ -42,12 +36,12 @@ describe('Class IdempotencyHandler', () => { const ENVIRONMENT_VARIABLES = process.env; beforeEach(() => { - jest.clearAllMocks(); - jest.restoreAllMocks(); + vi.clearAllMocks(); + vi.restoreAllMocks(); process.env = { ...ENVIRONMENT_VARIABLES }; - jest.spyOn(console, 'debug').mockImplementation(() => null); - jest.spyOn(console, 'warn').mockImplementation(() => null); - jest.spyOn(console, 'error').mockImplementation(() => null); + vi.spyOn(console, 'debug').mockImplementation(() => null); + vi.spyOn(console, 'warn').mockImplementation(() => null); + vi.spyOn(console, 'error').mockImplementation(() => null); }); afterAll(() => { @@ -55,7 +49,7 @@ describe('Class IdempotencyHandler', () => { }); describe('Method: determineResultFromIdempotencyRecord', () => { - test('when record is in progress and within expiry window, it rejects with IdempotencyAlreadyInProgressError', async () => { + it('throws when the record is in progress and within expiry window', async () => { // Prepare const stubRecord = new IdempotencyRecord({ idempotencyKey: 'idempotencyKey', @@ -75,7 +69,7 @@ describe('Class IdempotencyHandler', () => { expect(mockResponseHook).not.toHaveBeenCalled(); }); - test('when record is in progress and outside expiry window, it rejects with IdempotencyInconsistentStateError', async () => { + it('throws when the record is in progress and outside expiry window', async () => { // Prepare const stubRecord = new IdempotencyRecord({ idempotencyKey: 'idempotencyKey', @@ -95,7 +89,7 @@ describe('Class IdempotencyHandler', () => { expect(mockResponseHook).not.toHaveBeenCalled(); }); - test('when record is expired, it rejects with IdempotencyInconsistentStateError', async () => { + it('throws when the idempotency record is expired', async () => { // Prepare const stubRecord = new IdempotencyRecord({ idempotencyKey: 'idempotencyKey', @@ -115,23 +109,7 @@ describe('Class IdempotencyHandler', () => { expect(mockResponseHook).not.toHaveBeenCalled(); }); - test('when response hook is provided, it should should call responseHook during an idempotent request', () => { - // Prepare - const stubRecord = new IdempotencyRecord({ - idempotencyKey: 'idempotencyKey', - responseData: { responseData: 'responseData' }, - payloadHash: 'payloadHash', - status: IdempotencyRecordStatus.COMPLETED, - }); - - // Act - idempotentHandler.determineResultFromIdempotencyRecord(stubRecord); - - // Assess - expect(mockResponseHook).toHaveBeenCalled(); - }); - - test('when response hook is provided, it can manipulate response during an idempotent request', () => { + it('calls the provided response hook', () => { // Prepare interface HandlerResponse { message: string; @@ -139,7 +117,7 @@ describe('Class IdempotencyHandler', () => { headers?: Record; } - const responseHook = jest + const responseHook = vi .fn() .mockImplementation( (response: JSONValue, record: IdempotencyRecord) => { @@ -190,9 +168,9 @@ describe('Class IdempotencyHandler', () => { }); describe('Method: handle', () => { - test('when IdempotencyAlreadyInProgressError is thrown, it retries once', async () => { + it('retries once when IdempotencyAlreadyInProgressError is thrown', async () => { // Prepare - const saveInProgressSpy = jest + const saveInProgressSpy = vi .spyOn(persistenceStore, 'saveInProgress') .mockRejectedValueOnce(new IdempotencyItemAlreadyExistsError()); @@ -201,9 +179,9 @@ describe('Class IdempotencyHandler', () => { expect(saveInProgressSpy).toHaveBeenCalledTimes(1); }); - test('when IdempotencyAlreadyInProgressError is thrown and it contains the existing item, it returns it directly', async () => { + it('returns the existing record when IdempotencyAlreadyInProgressError is thrown', async () => { // Prepare - const saveInProgressSpy = jest + const saveInProgressSpy = vi .spyOn(persistenceStore, 'saveInProgress') .mockRejectedValueOnce( new IdempotencyItemAlreadyExistsError( @@ -215,7 +193,7 @@ describe('Class IdempotencyHandler', () => { }) ) ); - const getRecordSpy = jest.spyOn(persistenceStore, 'getRecord'); + const getRecordSpy = vi.spyOn(persistenceStore, 'getRecord'); // Act & Assess await expect(idempotentHandler.handle()).resolves.toEqual('Hi'); @@ -223,12 +201,12 @@ describe('Class IdempotencyHandler', () => { expect(getRecordSpy).toHaveBeenCalledTimes(0); }); - test('when IdempotencyInconsistentStateError is thrown, it retries until max retries are exhausted', async () => { + it('retries until max retries are exhausted when IdempotencyInconsistentStateError is thrown', async () => { // Prepare - const mockProcessIdempotency = jest + const mockProcessIdempotency = vi .spyOn(persistenceStore, 'saveInProgress') .mockRejectedValue(new IdempotencyItemAlreadyExistsError()); - jest.spyOn(persistenceStore, 'getRecord').mockResolvedValue( + vi.spyOn(persistenceStore, 'getRecord').mockResolvedValue( new IdempotencyRecord({ status: IdempotencyRecordStatus.EXPIRED, idempotencyKey: 'idempotencyKey', @@ -244,10 +222,10 @@ describe('Class IdempotencyHandler', () => { }); describe('Method: getFunctionResult', () => { - test('when function returns a result, it saves the successful result and returns it', async () => { + it('stores the completed result and returns the value of the idempotent function', async () => { // Prepare mockFunctionToMakeIdempotent.mockResolvedValue('result'); - const mockSaveSuccessfulResult = jest + const mockSaveSuccessfulResult = vi .spyOn(mockIdempotencyOptions.persistenceStore, 'saveSuccess') .mockResolvedValue(); @@ -258,10 +236,10 @@ describe('Class IdempotencyHandler', () => { expect(mockSaveSuccessfulResult).toHaveBeenCalledTimes(1); }); - test('when function throws an error, it deletes the in progress record and throws the error', async () => { + it('deletes the in progress record and throws when the idempotent function throws', async () => { // Prepare mockFunctionToMakeIdempotent.mockRejectedValue(new Error('Some error')); - const mockDeleteInProgress = jest + const mockDeleteInProgress = vi .spyOn(mockIdempotencyOptions.persistenceStore, 'deleteRecord') .mockResolvedValue(); @@ -272,26 +250,28 @@ describe('Class IdempotencyHandler', () => { expect(mockDeleteInProgress).toHaveBeenCalledTimes(1); }); - test('when deleteRecord throws an error, it wraps the error to IdempotencyPersistenceLayerError', async () => { + it('throws and wraps the error thrown by the underlying deleteRecord', async () => { // Prepare mockFunctionToMakeIdempotent.mockRejectedValue(new Error('Some error')); - const mockDeleteInProgress = jest + const mockDeleteInProgress = vi .spyOn(mockIdempotencyOptions.persistenceStore, 'deleteRecord') .mockRejectedValue(new Error('Some error')); // Act & Assess - await expect(idempotentHandler.getFunctionResult()).rejects.toThrow({ - name: 'IdempotencyPersistenceLayerError', - message: 'Failed to delete record from idempotency store', - cause: new Error('Some error'), - }); + await expect(idempotentHandler.getFunctionResult()).rejects.toMatchObject( + { + name: 'IdempotencyPersistenceLayerError', + message: 'Failed to delete record from idempotency store', + cause: new Error('Some error'), + } + ); expect(mockDeleteInProgress).toHaveBeenCalledTimes(1); }); - test('when saveSuccessfulResult throws an error, it wraps the error to IdempotencyPersistenceLayerError', async () => { + it('throws and wraps the error thrown by the underlying saveSuccessfulResult', async () => { // Prepare mockFunctionToMakeIdempotent.mockResolvedValue('result'); - const mockSaveSuccessfulResult = jest + const mockSaveSuccessfulResult = vi .spyOn(mockIdempotencyOptions.persistenceStore, 'saveSuccess') .mockRejectedValue(new Error('Some error')); diff --git a/packages/idempotency/tests/unit/deepSort.test.ts b/packages/idempotency/tests/unit/deepSort.test.ts index 59a8a2cfb1..e37c6c6d91 100644 --- a/packages/idempotency/tests/unit/deepSort.test.ts +++ b/packages/idempotency/tests/unit/deepSort.test.ts @@ -1,33 +1,29 @@ -/** - * Test deepSort Function - * - * @group unit/idempotency/deepSort - */ +import { describe, expect, it } from 'vitest'; import { deepSort } from '../../src/deepSort'; describe('Function: deepSort', () => { - test('can sort string correctly', () => { + it('can sort string correctly', () => { expect(deepSort('test')).toEqual('test'); }); - test('can sort number correctly', () => { + it('can sort number correctly', () => { expect(deepSort(5)).toEqual(5); }); - test('can sort boolean correctly', () => { + it('can sort boolean correctly', () => { expect(deepSort(true)).toEqual(true); expect(deepSort(false)).toEqual(false); }); - test('can sort null correctly', () => { + it('can sort null correctly', () => { expect(deepSort(null)).toEqual(null); }); - test('can sort undefined correctly', () => { + it('can sort undefined correctly', () => { expect(deepSort(undefined)).toEqual(undefined); }); - test('can sort object with nested keys correctly', () => { + it('can sort object with nested keys correctly', () => { // Prepare const input = { name: 'John', @@ -56,7 +52,7 @@ describe('Function: deepSort', () => { ); }); - test('can sort deeply nested structures', () => { + it('can sort deeply nested structures', () => { // Prepare const input = { z: [{ b: { d: 4, c: 3 }, a: { f: 6, e: 5 } }], @@ -75,7 +71,7 @@ describe('Function: deepSort', () => { ); }); - test('can sort JSON array with objects containing words as keys and nested objects/arrays correctly', () => { + it('can sort JSON array with objects containing words as keys and nested objects/arrays correctly', () => { // Prepare const input = [ { @@ -150,7 +146,7 @@ describe('Function: deepSort', () => { ); }); - test('handles empty objects and arrays correctly', () => { + it('handles empty objects and arrays correctly', () => { expect(deepSort({})).toEqual({}); expect(deepSort([])).toEqual([]); }); diff --git a/packages/idempotency/tests/unit/idempotencyDecorator.test.ts b/packages/idempotency/tests/unit/idempotencyDecorator.test.ts index 0ad36d10d3..8a64b19afe 100644 --- a/packages/idempotency/tests/unit/idempotencyDecorator.test.ts +++ b/packages/idempotency/tests/unit/idempotencyDecorator.test.ts @@ -1,323 +1,11 @@ import type { LambdaInterface } from '@aws-lambda-powertools/commons/types'; import context from '@aws-lambda-powertools/testing-utils/context'; import type { Context } from 'aws-lambda'; -import { IdempotencyRecordStatus } from '../../src/constants.js'; -import { - IdempotencyAlreadyInProgressError, - IdempotencyConfig, - IdempotencyInconsistentStateError, - IdempotencyItemAlreadyExistsError, - IdempotencyPersistenceLayerError, - idempotent, -} from '../../src/index.js'; -/** - * Test Function Wrapper - * - * @group unit/idempotency/decorator - */ -import { - BasePersistenceLayer, - IdempotencyRecord, -} from '../../src/persistence/index.js'; -import type { IdempotencyRecordOptions } from '../../src/types/index.js'; - -const mockSaveInProgress = jest - .spyOn(BasePersistenceLayer.prototype, 'saveInProgress') - .mockImplementation(); -const mockSaveSuccess = jest - .spyOn(BasePersistenceLayer.prototype, 'saveSuccess') - .mockImplementation(); -const mockGetRecord = jest - .spyOn(BasePersistenceLayer.prototype, 'getRecord') - .mockImplementation(); - -const mockConfig: IdempotencyConfig = new IdempotencyConfig({}); - -class PersistenceLayerTestClass extends BasePersistenceLayer { - protected _deleteRecord = jest.fn(); - protected _getRecord = jest.fn(); - protected _putRecord = jest.fn(); - protected _updateRecord = jest.fn(); -} - -const functionalityToDecorate = jest.fn(); - -class TestinClassWithLambdaHandler { - @idempotent({ - persistenceStore: new PersistenceLayerTestClass(), - }) - public async testing( - record: Record, - _context: Context - ): Promise { - functionalityToDecorate(record); - - return 'Hi'; - } -} - -class TestingClassWithFunctionDecorator { - public async handler( - record: Record, - context: Context - ): Promise { - mockConfig.registerLambdaContext(context); - - return this.proccessRecord(record, 'bar'); - } - - @idempotent({ - persistenceStore: new PersistenceLayerTestClass(), - config: mockConfig, - dataIndexArgument: 0, - }) - public async proccessRecord( - record: Record, - _foo: string - ): Promise { - functionalityToDecorate(record); - - return 'Processed Record'; - } -} - -describe('Given a class with a function to decorate', (classWithLambdaHandler = new TestinClassWithLambdaHandler(), classWithFunctionDecorator = new TestingClassWithFunctionDecorator()) => { - const keyValueToBeSaved = 'thisWillBeSaved'; - const inputRecord = { - testingKey: keyValueToBeSaved, - otherKey: 'thisWillNot', - }; - beforeEach(() => { - jest.clearAllMocks(); - jest.resetAllMocks(); - }); - - describe('When wrapping a function with no previous executions', () => { - beforeEach(async () => { - await classWithFunctionDecorator.handler(inputRecord, context); - }); - - test('Then it will save the record to INPROGRESS', () => { - expect(mockSaveInProgress).toHaveBeenCalledWith( - inputRecord, - context.getRemainingTimeInMillis() - ); - }); - - test('Then it will call the function that was decorated', () => { - expect(functionalityToDecorate).toHaveBeenCalledWith(inputRecord); - }); - - test('Then it will save the record to COMPLETED with function return value', () => { - expect(mockSaveSuccess).toHaveBeenCalledWith( - inputRecord, - 'Processed Record' - ); - }); - }); - describe('When wrapping a handler function with no previous executions', () => { - beforeEach(async () => { - await classWithLambdaHandler.testing(inputRecord, context); - }); - - test('Then it will save the record to INPROGRESS', () => { - expect(mockSaveInProgress).toHaveBeenCalledWith( - inputRecord, - context.getRemainingTimeInMillis() - ); - }); - - test('Then it will call the function that was decorated', () => { - expect(functionalityToDecorate).toHaveBeenCalledWith(inputRecord); - }); - - test('Then it will save the record to COMPLETED with function return value', () => { - expect(mockSaveSuccess).toHaveBeenCalledWith(inputRecord, 'Hi'); - }); - }); - - describe('When decorating a function with previous execution that is INPROGRESS', () => { - let resultingError: Error; - beforeEach(async () => { - mockSaveInProgress.mockRejectedValue( - new IdempotencyItemAlreadyExistsError() - ); - const idempotencyOptions: IdempotencyRecordOptions = { - idempotencyKey: 'key', - status: IdempotencyRecordStatus.INPROGRESS, - }; - mockGetRecord.mockResolvedValue( - new IdempotencyRecord(idempotencyOptions) - ); - try { - await classWithLambdaHandler.testing(inputRecord, context); - } catch (e) { - resultingError = e as Error; - } - }); - - test('Then it will attempt to save the record to INPROGRESS', () => { - expect(mockSaveInProgress).toHaveBeenCalledWith( - inputRecord, - context.getRemainingTimeInMillis() - ); - }); - - test('Then it will get the previous execution record', () => { - expect(mockGetRecord).toHaveBeenCalledWith(inputRecord); - }); - - test('Then it will not call the function that was decorated', () => { - expect(functionalityToDecorate).not.toHaveBeenCalled(); - }); - - test('Then an IdempotencyAlreadyInProgressError is thrown', () => { - expect(resultingError).toBeInstanceOf(IdempotencyAlreadyInProgressError); - }); - }); - - describe('When decorating a function with previous execution that is EXPIRED', () => { - let resultingError: Error; - beforeEach(async () => { - mockSaveInProgress.mockRejectedValue( - new IdempotencyItemAlreadyExistsError() - ); - const idempotencyOptions: IdempotencyRecordOptions = { - idempotencyKey: 'key', - status: IdempotencyRecordStatus.EXPIRED, - }; - mockGetRecord.mockResolvedValue( - new IdempotencyRecord(idempotencyOptions) - ); - try { - await classWithLambdaHandler.testing(inputRecord, context); - } catch (e) { - resultingError = e as Error; - } - }); - - test('Then it will attempt to save the record to INPROGRESS', () => { - expect(mockSaveInProgress).toHaveBeenCalledWith( - inputRecord, - context.getRemainingTimeInMillis() - ); - }); - - test('Then it will get the previous execution record', () => { - expect(mockGetRecord).toHaveBeenCalledWith(inputRecord); - }); - - test('Then it will not call the function that was decorated', () => { - expect(functionalityToDecorate).not.toHaveBeenCalled(); - }); - - test('Then an IdempotencyInconsistentStateError is thrown', () => { - expect(resultingError).toBeInstanceOf(IdempotencyInconsistentStateError); - }); - }); - - describe('When wrapping a function with previous execution that is COMPLETED', () => { - beforeEach(async () => { - mockSaveInProgress.mockRejectedValue( - new IdempotencyItemAlreadyExistsError() - ); - const idempotencyOptions: IdempotencyRecordOptions = { - idempotencyKey: 'key', - status: IdempotencyRecordStatus.COMPLETED, - responseData: 'Hi', - }; - - mockGetRecord.mockResolvedValue( - new IdempotencyRecord(idempotencyOptions) - ); - await classWithLambdaHandler.testing(inputRecord, context); - }); - - test('Then it will attempt to save the record to INPROGRESS', () => { - expect(mockSaveInProgress).toHaveBeenCalledWith( - inputRecord, - context.getRemainingTimeInMillis() - ); - }); - - test('Then it will get the previous execution record', () => { - expect(mockGetRecord).toHaveBeenCalledWith(inputRecord); - }); - - test('Then it will not call decorated functionality', () => { - expect(functionalityToDecorate).not.toHaveBeenCalledWith(inputRecord); - }); - }); - - describe('When wrapping a function with issues saving the record', () => { - class TestinClassWithLambdaHandlerWithConfig { - @idempotent({ - persistenceStore: new PersistenceLayerTestClass(), - config: new IdempotencyConfig({ lambdaContext: context }), - }) - public testing(record: Record): string { - functionalityToDecorate(record); - - return 'Hi'; - } - } - - let resultingError: Error; - beforeEach(async () => { - mockSaveInProgress.mockRejectedValue(new Error('RandomError')); - const classWithLambdaHandlerWithConfig = - new TestinClassWithLambdaHandlerWithConfig(); - try { - await classWithLambdaHandlerWithConfig.testing(inputRecord); - } catch (e) { - resultingError = e as Error; - } - }); - - test('Then it will attempt to save the record to INPROGRESS', () => { - expect(mockSaveInProgress).toHaveBeenCalledWith( - inputRecord, - context.getRemainingTimeInMillis() - ); - }); - - test('Then an IdempotencyPersistenceLayerError is thrown', () => { - expect(resultingError).toBeInstanceOf(IdempotencyPersistenceLayerError); - }); - }); - - describe('When idempotency is disabled', () => { - beforeAll(async () => { - process.env.POWERTOOLS_IDEMPOTENCY_DISABLED = 'true'; - class TestingClassWithIdempotencyDisabled { - @idempotent({ - persistenceStore: new PersistenceLayerTestClass(), - config: new IdempotencyConfig({ lambdaContext: context }), - }) - public async testing( - record: Record, - _context: Context - ): Promise { - functionalityToDecorate(record); - - return 'Hi'; - } - } - const classWithoutIdempotencyDisabled = - new TestingClassWithIdempotencyDisabled(); - await classWithoutIdempotencyDisabled.testing(inputRecord, context); - }); - - test('Then it will skip ipdemotency', async () => { - expect(mockSaveInProgress).not.toHaveBeenCalled(); - expect(mockSaveSuccess).not.toHaveBeenCalled(); - }); - - afterAll(() => { - process.env.POWERTOOLS_IDEMPOTENCY_DISABLED = undefined; - }); - }); +import { describe, expect, it } from 'vitest'; +import { idempotent } from '../../src/index.js'; +import { PersistenceLayerTestClass } from '../helpers/idempotencyUtils.js'; +describe('Given a class with a function to decorate', () => { it('maintains the scope of the decorated function', async () => { // Prepare class TestClass implements LambdaInterface { diff --git a/packages/idempotency/tests/unit/makeIdempotent.test.ts b/packages/idempotency/tests/unit/makeIdempotent.test.ts index 92da9b026c..4fdc58cb65 100644 --- a/packages/idempotency/tests/unit/makeIdempotent.test.ts +++ b/packages/idempotency/tests/unit/makeIdempotent.test.ts @@ -1,11 +1,7 @@ -/** - * Test makeIdempotent function wrapper and middleware - * - * @group unit/idempotency - */ import context from '@aws-lambda-powertools/testing-utils/context'; import middy from '@middy/core'; import type { Context } from 'aws-lambda'; +import { afterAll, beforeEach, describe, expect, it, vi } from 'vitest'; import { MAX_RETRIES } from '../../src/constants.js'; import { IdempotencyConfig, @@ -36,12 +32,9 @@ describe('Function: makeIdempotent', () => { }; beforeEach(() => { - jest.clearAllMocks(); - jest.restoreAllMocks(); + vi.clearAllMocks(); + vi.restoreAllMocks(); process.env = { ...ENVIRONMENT_VARIABLES }; - jest.spyOn(console, 'debug').mockImplementation(() => null); - jest.spyOn(console, 'warn').mockImplementation(() => null); - jest.spyOn(console, 'error').mockImplementation(() => null); }); afterAll(() => { @@ -63,11 +56,11 @@ describe('Function: makeIdempotent', () => { type === 'wrapper' ? makeIdempotent(fn, mockIdempotencyOptions) : middy(fn).use(makeHandlerIdempotent(mockIdempotencyOptions)); - const saveInProgressSpy = jest.spyOn( + const saveInProgressSpy = vi.spyOn( mockIdempotencyOptions.persistenceStore, 'saveInProgress' ); - const saveSuccessSpy = jest.spyOn( + const saveSuccessSpy = vi.spyOn( mockIdempotencyOptions.persistenceStore, 'saveSuccess' ); @@ -99,11 +92,11 @@ describe('Function: makeIdempotent', () => { type === 'wrapper' ? makeIdempotent(fnError, mockIdempotencyOptions) : middy(fnError).use(makeHandlerIdempotent(mockIdempotencyOptions)); - const saveInProgressSpy = jest.spyOn( + const saveInProgressSpy = vi.spyOn( mockIdempotencyOptions.persistenceStore, 'saveInProgress' ); - const deleteRecordSpy = jest.spyOn( + const deleteRecordSpy = vi.spyOn( mockIdempotencyOptions.persistenceStore, 'deleteRecord' ); @@ -136,12 +129,13 @@ describe('Function: makeIdempotent', () => { : middy(fnSuccessfull).use( makeHandlerIdempotent(mockIdempotencyOptions) ); - jest - .spyOn(mockIdempotencyOptions.persistenceStore, 'saveInProgress') - .mockRejectedValue(new Error('Something went wrong')); + vi.spyOn( + mockIdempotencyOptions.persistenceStore, + 'saveInProgress' + ).mockRejectedValue(new Error('Something went wrong')); // Act && Assess - await expect(handler(event, context)).rejects.toThrow({ + await expect(handler(event, context)).rejects.toMatchObject({ name: 'IdempotencyPersistenceLayerError', message: 'Failed to save in progress record to idempotency store', cause: new Error('Something went wrong'), @@ -159,12 +153,13 @@ describe('Function: makeIdempotent', () => { : middy(fnSuccessfull).use( makeHandlerIdempotent(mockIdempotencyOptions) ); - jest - .spyOn(mockIdempotencyOptions.persistenceStore, 'saveSuccess') - .mockRejectedValue(new Error('Something went wrong')); + vi.spyOn( + mockIdempotencyOptions.persistenceStore, + 'saveSuccess' + ).mockRejectedValue(new Error('Something went wrong')); // Act && Assess - await expect(handler(event, context)).rejects.toThrow({ + await expect(handler(event, context)).rejects.toMatchObject({ name: 'IdempotencyPersistenceLayerError', message: 'Failed to update success record to idempotency store', cause: new Error('Something went wrong'), @@ -180,12 +175,13 @@ describe('Function: makeIdempotent', () => { type === 'wrapper' ? makeIdempotent(fnError, mockIdempotencyOptions) : middy(fnError).use(makeHandlerIdempotent(mockIdempotencyOptions)); - jest - .spyOn(mockIdempotencyOptions.persistenceStore, 'deleteRecord') - .mockRejectedValue(new Error('Something went wrong')); + vi.spyOn( + mockIdempotencyOptions.persistenceStore, + 'deleteRecord' + ).mockRejectedValue(new Error('Something went wrong')); // Act && Assess - await expect(handler(event, context)).rejects.toThrow({ + await expect(handler(event, context)).rejects.toMatchObject({ name: 'IdempotencyPersistenceLayerError', message: 'Failed to delete record from idempotency store', cause: new Error('Something went wrong'), @@ -208,9 +204,10 @@ describe('Function: makeIdempotent', () => { : middy(fnSuccessfull).use( makeHandlerIdempotent(mockIdempotencyOptions) ); - jest - .spyOn(mockIdempotencyOptions.persistenceStore, 'saveInProgress') - .mockRejectedValue(new IdempotencyItemAlreadyExistsError()); + vi.spyOn( + mockIdempotencyOptions.persistenceStore, + 'saveInProgress' + ).mockRejectedValue(new IdempotencyItemAlreadyExistsError()); const stubRecord = new IdempotencyRecord({ idempotencyKey: 'idempotencyKey', expiryTimestamp: Date.now() + 10000, @@ -219,7 +216,7 @@ describe('Function: makeIdempotent', () => { payloadHash: 'payloadHash', status: IdempotencyRecordStatus.COMPLETED, }); - const getRecordSpy = jest + const getRecordSpy = vi .spyOn(mockIdempotencyOptions.persistenceStore, 'getRecord') .mockResolvedValue(stubRecord); @@ -248,9 +245,10 @@ describe('Function: makeIdempotent', () => { : middy(fnSuccessfull).use( makeHandlerIdempotent(mockIdempotencyOptions) ); - jest - .spyOn(mockIdempotencyOptions.persistenceStore, 'saveInProgress') - .mockRejectedValue(new IdempotencyItemAlreadyExistsError()); + vi.spyOn( + mockIdempotencyOptions.persistenceStore, + 'saveInProgress' + ).mockRejectedValue(new IdempotencyItemAlreadyExistsError()); const stubRecordInconsistent = new IdempotencyRecord({ idempotencyKey: 'idempotencyKey', expiryTimestamp: Date.now() + 10000, @@ -267,7 +265,7 @@ describe('Function: makeIdempotent', () => { payloadHash: 'payloadHash', status: IdempotencyRecordStatus.COMPLETED, }); - const getRecordSpy = jest + const getRecordSpy = vi .spyOn(mockIdempotencyOptions.persistenceStore, 'getRecord') .mockResolvedValueOnce(stubRecordInconsistent) .mockResolvedValueOnce(stubRecord); @@ -296,9 +294,10 @@ describe('Function: makeIdempotent', () => { : middy(fnSuccessfull).use( makeHandlerIdempotent(mockIdempotencyOptions) ); - jest - .spyOn(mockIdempotencyOptions.persistenceStore, 'saveInProgress') - .mockRejectedValue(new IdempotencyItemAlreadyExistsError()); + vi.spyOn( + mockIdempotencyOptions.persistenceStore, + 'saveInProgress' + ).mockRejectedValue(new IdempotencyItemAlreadyExistsError()); const stubRecordInconsistent = new IdempotencyRecord({ idempotencyKey: 'idempotencyKey', expiryTimestamp: Date.now() + 10000, @@ -307,7 +306,7 @@ describe('Function: makeIdempotent', () => { payloadHash: 'payloadHash', status: IdempotencyRecordStatus.EXPIRED, }); - const getRecordSpy = jest + const getRecordSpy = vi .spyOn(mockIdempotencyOptions.persistenceStore, 'getRecord') .mockResolvedValue(stubRecordInconsistent); @@ -337,11 +336,11 @@ describe('Function: makeIdempotent', () => { : middy(fnSuccessfull).use( makeHandlerIdempotent(mockIdempotencyOptions) ); - const saveInProgressSpy = jest.spyOn( + const saveInProgressSpy = vi.spyOn( mockIdempotencyOptions.persistenceStore, 'saveInProgress' ); - const saveSuccessSpy = jest.spyOn( + const saveSuccessSpy = vi.spyOn( mockIdempotencyOptions.persistenceStore, 'saveSuccess' ); @@ -376,11 +375,11 @@ describe('Function: makeIdempotent', () => { type === 'wrapper' ? makeIdempotent(fnSuccessfull, options) : middy(fnSuccessfull).use(makeHandlerIdempotent(options)); - const saveInProgressSpy = jest.spyOn( + const saveInProgressSpy = vi.spyOn( mockIdempotencyOptions.persistenceStore, 'saveInProgress' ); - const saveSuccessSpy = jest.spyOn( + const saveSuccessSpy = vi.spyOn( mockIdempotencyOptions.persistenceStore, 'saveSuccess' ); @@ -405,11 +404,11 @@ describe('Function: makeIdempotent', () => { config, } ); - const saveInProgressSpy = jest.spyOn( + const saveInProgressSpy = vi.spyOn( mockIdempotencyOptions.persistenceStore, 'saveInProgress' ); - const saveSuccessSpy = jest.spyOn( + const saveSuccessSpy = vi.spyOn( mockIdempotencyOptions.persistenceStore, 'saveSuccess' ); @@ -441,11 +440,11 @@ describe('Function: makeIdempotent', () => { dataIndexArgument: 1, } ); - const saveInProgressSpy = jest.spyOn( + const saveInProgressSpy = vi.spyOn( mockIdempotencyOptions.persistenceStore, 'saveInProgress' ); - const saveSuccessSpy = jest.spyOn( + const saveSuccessSpy = vi.spyOn( mockIdempotencyOptions.persistenceStore, 'saveSuccess' ); @@ -475,7 +474,7 @@ describe('Function: makeIdempotent', () => { }), }) ); - const deleteRecordSpy = jest.spyOn( + const deleteRecordSpy = vi.spyOn( mockIdempotencyOptions.persistenceStore, 'deleteRecord' ); @@ -492,7 +491,7 @@ describe('Function: makeIdempotent', () => { }; const handler = makeIdempotent(fn, mockIdempotencyOptions); - const saveSuccessSpy = jest.spyOn( + const saveSuccessSpy = vi.spyOn( mockIdempotencyOptions.persistenceStore, 'saveSuccess' ); @@ -511,11 +510,12 @@ describe('Function: makeIdempotent', () => { const handler = middy(fnSuccessfull).use( makeHandlerIdempotent(mockIdempotencyOptions) ); - jest - .spyOn(mockIdempotencyOptions.persistenceStore, 'saveInProgress') - .mockImplementationOnce(() => { - throw 'Something went wrong'; - }); + vi.spyOn( + mockIdempotencyOptions.persistenceStore, + 'saveInProgress' + ).mockImplementationOnce(() => { + throw 'Something went wrong'; + }); const stubRecordInconsistent = new IdempotencyRecord({ idempotencyKey: 'idempotencyKey', expiryTimestamp: Date.now() + 10000, @@ -524,7 +524,7 @@ describe('Function: makeIdempotent', () => { payloadHash: 'payloadHash', status: IdempotencyRecordStatus.EXPIRED, }); - const getRecordSpy = jest + const getRecordSpy = vi .spyOn(mockIdempotencyOptions.persistenceStore, 'getRecord') .mockResolvedValue(stubRecordInconsistent); diff --git a/packages/idempotency/tests/unit/persistence/BasePersistenceLayer.test.ts b/packages/idempotency/tests/unit/persistence/BasePersistenceLayer.test.ts index 76de4ff9e3..65cb40be11 100644 --- a/packages/idempotency/tests/unit/persistence/BasePersistenceLayer.test.ts +++ b/packages/idempotency/tests/unit/persistence/BasePersistenceLayer.test.ts @@ -1,57 +1,52 @@ -/** - * Test BasePersistenceLayer class - * - * @group unit/idempotency/persistence/base - */ import { createHash } from 'node:crypto'; import context from '@aws-lambda-powertools/testing-utils/context'; +import { + afterAll, + beforeAll, + beforeEach, + describe, + expect, + it, + vi, +} from 'vitest'; import { IdempotencyConfig, - IdempotencyRecordStatus, IdempotencyItemAlreadyExistsError, - IdempotencyValidationError, IdempotencyKeyError, + IdempotencyRecordStatus, + IdempotencyValidationError, } from '../../../src/index.js'; -import { - BasePersistenceLayer, - IdempotencyRecord, -} from '../../../src/persistence/index.js'; +import { IdempotencyRecord } from '../../../src/persistence/index.js'; import type { IdempotencyConfigOptions } from '../../../src/types/index.js'; +import { PersistenceLayerTestClass } from '../../helpers/idempotencyUtils.js'; -jest.mock('node:crypto', () => ({ - createHash: jest.fn().mockReturnValue({ - update: jest.fn(), - digest: jest.fn().mockReturnValue('mocked-hash'), +vi.mock('node:crypto', () => ({ + createHash: vi.fn().mockReturnValue({ + update: vi.fn(), + digest: vi.fn().mockReturnValue('mocked-hash'), }), })); describe('Class: BasePersistenceLayer', () => { const ENVIRONMENT_VARIABLES = process.env; - class PersistenceLayerTestClass extends BasePersistenceLayer { - public _deleteRecord = jest.fn(); - public _getRecord = jest.fn(); - public _putRecord = jest.fn(); - public _updateRecord = jest.fn(); - } - beforeAll(() => { - jest.useFakeTimers().setSystemTime(new Date()); + vi.useFakeTimers().setSystemTime(new Date()); }); beforeEach(() => { - jest.clearAllMocks(); - jest.resetModules(); + vi.clearAllMocks(); + vi.resetModules(); process.env = { ...ENVIRONMENT_VARIABLES }; }); afterAll(() => { process.env = ENVIRONMENT_VARIABLES; - jest.useRealTimers(); + vi.useRealTimers(); }); describe('Method: constructor', () => { - test('when initialized with no arguments, it initializes with default values', () => { + it('initializes with default values', () => { // Prepare & Act const persistenceLayer = new PersistenceLayerTestClass(); @@ -71,7 +66,7 @@ describe('Class: BasePersistenceLayer', () => { }); describe('Method: configure', () => { - test('when configured with a function name, it appends the function name to the idempotency key prefix', () => { + it('appends the function name to the idempotency key prefix', () => { // Prepare const config = new IdempotencyConfig({}); const persistenceLayer = new PersistenceLayerTestClass(); @@ -85,7 +80,7 @@ describe('Class: BasePersistenceLayer', () => { ); }); - test('when configured with an empty config object, it initializes the persistence layer with default configs', () => { + it('uses default config when no option is provided', () => { // Prepare const config = new IdempotencyConfig({}); const persistenceLayer = new PersistenceLayerTestClass(); @@ -108,7 +103,7 @@ describe('Class: BasePersistenceLayer', () => { ); }); - test('when configured with a config object, it initializes the persistence layer with the provided configs', () => { + it('initializes the persistence layer with the provided configs', () => { // Prepare const configOptions: IdempotencyConfigOptions = { eventKeyJmesPath: 'eventKeyJmesPath', @@ -141,7 +136,7 @@ describe('Class: BasePersistenceLayer', () => { ); }); - test('when called twice, it returns without reconfiguring the persistence layer', () => { + it('returns the same config instance when called multiple times', () => { // Prepare const config = new IdempotencyConfig({ eventKeyJmesPath: 'eventKeyJmesPath', @@ -166,14 +161,14 @@ describe('Class: BasePersistenceLayer', () => { }); describe('Method: deleteRecord', () => { - test('when called, it calls the _deleteRecord method with the correct arguments', async () => { + it('calls the _deleteRecord method with the correct arguments', async () => { // Prepare const persistenceLayer = new PersistenceLayerTestClass(); const baseIdempotencyRecord = new IdempotencyRecord({ idempotencyKey: 'idempotencyKey', status: IdempotencyRecordStatus.EXPIRED, }); - const deleteRecordSpy = jest.spyOn(persistenceLayer, '_deleteRecord'); + const deleteRecordSpy = vi.spyOn(persistenceLayer, '_deleteRecord'); // Act await persistenceLayer.deleteRecord({ foo: 'bar' }); @@ -188,7 +183,7 @@ describe('Class: BasePersistenceLayer', () => { ); }); - test('when called, it deletes the record from the local cache', async () => { + it('it deletes the record from the local cache', async () => { // Prepare const persistenceLayer = new PersistenceLayerTestClass(); persistenceLayer.configure({ @@ -201,7 +196,7 @@ describe('Class: BasePersistenceLayer', () => { status: IdempotencyRecordStatus.EXPIRED, }); await persistenceLayer.saveSuccess({ foo: 'bar' }, { bar: 'baz' }); - const deleteRecordSpy = jest.spyOn(persistenceLayer, '_deleteRecord'); + const deleteRecordSpy = vi.spyOn(persistenceLayer, '_deleteRecord'); // Act await persistenceLayer.deleteRecord({ foo: 'bar' }); @@ -218,7 +213,7 @@ describe('Class: BasePersistenceLayer', () => { }); describe('Method: getRecord', () => { - test('when called, it calls the _getRecord method with the correct arguments', async () => { + it('calls the _getRecord method with the correct arguments', async () => { // Prepare const persistenceLayer = new PersistenceLayerTestClass(); persistenceLayer.configure({ @@ -226,7 +221,7 @@ describe('Class: BasePersistenceLayer', () => { eventKeyJmesPath: 'foo', }), }); - const getRecordSpy = jest.spyOn(persistenceLayer, '_getRecord'); + const getRecordSpy = vi.spyOn(persistenceLayer, '_getRecord'); // Act await persistenceLayer.getRecord({ foo: 'bar' }); @@ -237,7 +232,7 @@ describe('Class: BasePersistenceLayer', () => { ); }); - test('when called and payload validation fails due to hash mismatch, it throws an IdempotencyValidationError', async () => { + it("throws an IdempotencyValidationError when the hashes don't match", async () => { // Prepare const persistenceLayer = new PersistenceLayerTestClass(); persistenceLayer.configure({ @@ -250,9 +245,7 @@ describe('Class: BasePersistenceLayer', () => { status: IdempotencyRecordStatus.INPROGRESS, payloadHash: 'different-hash', }); - jest - .spyOn(persistenceLayer, '_getRecord') - .mockReturnValue(existingRecord); + vi.spyOn(persistenceLayer, '_getRecord').mockReturnValue(existingRecord); // Act & Assess await expect(persistenceLayer.getRecord({ foo: 'bar' })).rejects.toThrow( @@ -263,7 +256,7 @@ describe('Class: BasePersistenceLayer', () => { ); }); - test('when called and the hash generation fails, and throwOnNoIdempotencyKey is disabled, it logs a warning', async () => { + it('logs a warning when the idempotency key cannot be found', async () => { // Prepare const persistenceLayer = new PersistenceLayerTestClass(); persistenceLayer.configure({ @@ -272,7 +265,9 @@ describe('Class: BasePersistenceLayer', () => { eventKeyJmesPath: 'bar', }), }); - const logWarningSpy = jest.spyOn(console, 'warn').mockImplementation(); + const logWarningSpy = vi + .spyOn(console, 'warn') + .mockImplementation(() => ({})); // Act await persistenceLayer.getRecord({ foo: 'bar' }); @@ -283,7 +278,7 @@ describe('Class: BasePersistenceLayer', () => { ); }); - test('when called and the hash generation fails, and throwOnNoIdempotencyKey is enabled, it throws', async () => { + it('throws an error when throwOnNoIdempotencyKey is enabled and the key is not found', async () => { // Prepare const persistenceLayer = new PersistenceLayerTestClass(); persistenceLayer.configure({ @@ -304,7 +299,7 @@ describe('Class: BasePersistenceLayer', () => { ); }); - test('when called twice with the same payload, it retrieves the record from the local cache', async () => { + it('uses the record from the local cache when called multiple times', async () => { // Prepare const persistenceLayer = new PersistenceLayerTestClass(); persistenceLayer.configure({ @@ -312,7 +307,7 @@ describe('Class: BasePersistenceLayer', () => { useLocalCache: true, }), }); - const getRecordSpy = jest + const getRecordSpy = vi .spyOn(persistenceLayer, '_getRecord') .mockReturnValue( new IdempotencyRecord({ @@ -330,7 +325,7 @@ describe('Class: BasePersistenceLayer', () => { expect(getRecordSpy).toHaveBeenCalledTimes(1); }); - test('when called twice with the same payload, if it founds an expired record in the local cache, it retrieves it', async () => { + it('loads the value from the persistence layer when the record in the local cache has expired', async () => { // Prepare const persistenceLayer = new PersistenceLayerTestClass(); persistenceLayer.configure({ @@ -338,7 +333,7 @@ describe('Class: BasePersistenceLayer', () => { useLocalCache: true, }), }); - const getRecordSpy = jest + const getRecordSpy = vi .spyOn(persistenceLayer, '_getRecord') .mockReturnValue( new IdempotencyRecord({ @@ -359,10 +354,10 @@ describe('Class: BasePersistenceLayer', () => { }); describe('Method: saveInProgress', () => { - test('when called, it calls the _putRecord method with the correct arguments', async () => { + it('calls the _putRecord method with the correct arguments', async () => { // Prepare const persistenceLayer = new PersistenceLayerTestClass(); - const putRecordSpy = jest.spyOn(persistenceLayer, '_putRecord'); + const putRecordSpy = vi.spyOn(persistenceLayer, '_putRecord'); const remainingTimeInMs = 2000; // Act @@ -381,11 +376,11 @@ describe('Class: BasePersistenceLayer', () => { ); }); - test('when called without remainingTimeInMillis, it logs a warning and then calls the _putRecord method', async () => { + it('logs a warning when unable to call remainingTimeInMillis() from the context', async () => { // Prepare const persistenceLayer = new PersistenceLayerTestClass(); - const putRecordSpy = jest.spyOn(persistenceLayer, '_putRecord'); - const logWarningSpy = jest + const putRecordSpy = vi.spyOn(persistenceLayer, '_putRecord'); + const logWarningSpy = vi .spyOn(console, 'warn') .mockImplementation(() => ({})); @@ -399,7 +394,7 @@ describe('Class: BasePersistenceLayer', () => { ); }); - test('when called and there is already a completed record in the cache, it throws an IdempotencyItemAlreadyExistsError', async () => { + it('throws an `IdempotencyItemAlreadyExistsError` when there is already a completed record in the cache', async () => { // Prepare const persistenceLayer = new PersistenceLayerTestClass(); persistenceLayer.configure({ @@ -407,7 +402,7 @@ describe('Class: BasePersistenceLayer', () => { useLocalCache: true, }), }); - const putRecordSpy = jest.spyOn(persistenceLayer, '_putRecord'); + const putRecordSpy = vi.spyOn(persistenceLayer, '_putRecord'); await persistenceLayer.saveSuccess({ foo: 'bar' }, { bar: 'baz' }); // Act & Assess @@ -429,10 +424,10 @@ describe('Class: BasePersistenceLayer', () => { }); describe('Method: saveSuccess', () => { - test('when called, it calls the _updateRecord method with the correct arguments', async () => { + it('calls the _updateRecord method with the correct arguments', async () => { // Prepare const persistenceLayer = new PersistenceLayerTestClass(); - const updateRecordSpy = jest.spyOn(persistenceLayer, '_updateRecord'); + const updateRecordSpy = vi.spyOn(persistenceLayer, '_updateRecord'); const result = { bar: 'baz' }; // Act diff --git a/packages/idempotency/tests/unit/persistence/DynamoDbPersistenceLayer.test.ts b/packages/idempotency/tests/unit/persistence/DynamoDbPersistenceLayer.test.ts index a7c041cd6c..0649305d56 100644 --- a/packages/idempotency/tests/unit/persistence/DynamoDbPersistenceLayer.test.ts +++ b/packages/idempotency/tests/unit/persistence/DynamoDbPersistenceLayer.test.ts @@ -1,86 +1,65 @@ -/** - * Test DynamoDBPersistenceLayer class - * - * @group unit/idempotency/persistence/dynamodb - */ -import { DynamoDBPersistenceLayer } from '../../../src/persistence/DynamoDBPersistenceLayer.js'; -import { IdempotencyRecord } from '../../../src/persistence/index.js'; -import type { DynamoDBPersistenceOptions } from '../../../src/types/DynamoDBPersistence.js'; -import { - IdempotencyRecordStatus, - IdempotencyItemAlreadyExistsError, - IdempotencyItemNotFoundError, -} from '../../../src/index.js'; +import { addUserAgentMiddleware } from '@aws-lambda-powertools/commons'; import { ConditionalCheckFailedException, + DeleteItemCommand, DynamoDBClient, - PutItemCommand, GetItemCommand, + PutItemCommand, UpdateItemCommand, - DeleteItemCommand, } from '@aws-sdk/client-dynamodb'; import { marshall } from '@aws-sdk/util-dynamodb'; import { mockClient } from 'aws-sdk-client-mock'; -import { addUserAgentMiddleware } from '@aws-lambda-powertools/commons'; -import 'aws-sdk-client-mock-jest'; +import { + afterAll, + afterEach, + beforeAll, + describe, + expect, + it, + vi, +} from 'vitest'; +import { + IdempotencyItemAlreadyExistsError, + IdempotencyItemNotFoundError, + IdempotencyRecordStatus, +} from '../../../src/index.js'; +import { IdempotencyRecord } from '../../../src/persistence/index.js'; +import type { DynamoDBPersistenceOptions } from '../../../src/types/DynamoDBPersistence.js'; +import { DynamoDBPersistenceLayerTestClass } from '../../helpers/idempotencyUtils.js'; const getFutureTimestamp = (seconds: number): number => new Date().getTime() + seconds * 1000; -jest.mock('@aws-lambda-powertools/commons', () => ({ - ...jest.requireActual('@aws-lambda-powertools/commons'), - addUserAgentMiddleware: jest.fn(), +vi.mock('@aws-lambda-powertools/commons', async (importOriginal) => ({ + ...(await importOriginal()), + addUserAgentMiddleware: vi.fn(), })); +const dummyTableName = 'someTable'; +const dummyKey = 'someKey'; +const persistenceLayer = new DynamoDBPersistenceLayerTestClass({ + tableName: dummyTableName, +}); + describe('Class: DynamoDBPersistenceLayer', () => { - const ENVIRONMENT_VARIABLES = process.env; const client = mockClient(DynamoDBClient); - const dummyTableName = 'someTable'; - const dummyKey = 'someKey'; - - class TestDynamoDBPersistenceLayer extends DynamoDBPersistenceLayer { - public _deleteRecord(record: IdempotencyRecord): Promise { - return super._deleteRecord(record); - } - - public _getRecord(idempotencyKey: string): Promise { - return super._getRecord(idempotencyKey); - } - - public _putRecord(_record: IdempotencyRecord): Promise { - return super._putRecord(_record); - } - - public _updateRecord(record: IdempotencyRecord): Promise { - return super._updateRecord(record); - } - } beforeAll(() => { - jest.useFakeTimers().setSystemTime(new Date()); - }); - - beforeEach(() => { - jest.clearAllMocks(); - process.env = { ...ENVIRONMENT_VARIABLES }; + vi.useFakeTimers().setSystemTime(new Date()); }); afterEach(() => { + vi.clearAllMocks(); + vi.resetAllMocks(); client.reset(); }); afterAll(() => { - process.env = ENVIRONMENT_VARIABLES; - jest.useRealTimers(); + vi.useRealTimers(); }); describe('Method: constructor', () => { - test('when instantiated with minimum options it creates an instance with default values', () => { - // Prepare & Act - const persistenceLayer = new TestDynamoDBPersistenceLayer({ - tableName: dummyTableName, - }); - + it('creates an instance with default values', () => { // Assess expect(persistenceLayer).toEqual( expect.objectContaining({ @@ -96,23 +75,24 @@ describe('Class: DynamoDBPersistenceLayer', () => { ); }); - test('when instantiated with specific options it creates an instance with correct values', () => { + it('creates an instance with the provided values', () => { // Prepare - const testDynamoDBPersistenceLayerOptions: DynamoDBPersistenceOptions = { - tableName: dummyTableName, - keyAttr: dummyKey, - statusAttr: 'someStatusAttr', - expiryAttr: 'someExpiryAttr', - inProgressExpiryAttr: 'someInProgressExpiryAttr', - dataAttr: 'someDataAttr', - validationKeyAttr: 'someValidationKeyAttr', - staticPkValue: 'someStaticPkValue', - sortKeyAttr: 'someSortKeyAttr', - }; + const DynamoDBPersistenceLayerTestClassOptions: DynamoDBPersistenceOptions = + { + tableName: dummyTableName, + keyAttr: dummyKey, + statusAttr: 'someStatusAttr', + expiryAttr: 'someExpiryAttr', + inProgressExpiryAttr: 'someInProgressExpiryAttr', + dataAttr: 'someDataAttr', + validationKeyAttr: 'someValidationKeyAttr', + staticPkValue: 'someStaticPkValue', + sortKeyAttr: 'someSortKeyAttr', + }; // Act - const persistenceLayer = new TestDynamoDBPersistenceLayer( - testDynamoDBPersistenceLayerOptions + const persistenceLayer = new DynamoDBPersistenceLayerTestClass( + DynamoDBPersistenceLayerTestClassOptions ); // Assess @@ -120,42 +100,39 @@ describe('Class: DynamoDBPersistenceLayer', () => { expect.objectContaining({ tableName: dummyTableName, keyAttr: dummyKey, - statusAttr: testDynamoDBPersistenceLayerOptions.statusAttr, - expiryAttr: testDynamoDBPersistenceLayerOptions.expiryAttr, + statusAttr: DynamoDBPersistenceLayerTestClassOptions.statusAttr, + expiryAttr: DynamoDBPersistenceLayerTestClassOptions.expiryAttr, inProgressExpiryAttr: - testDynamoDBPersistenceLayerOptions.inProgressExpiryAttr, - dataAttr: testDynamoDBPersistenceLayerOptions.dataAttr, + DynamoDBPersistenceLayerTestClassOptions.inProgressExpiryAttr, + dataAttr: DynamoDBPersistenceLayerTestClassOptions.dataAttr, validationKeyAttr: - testDynamoDBPersistenceLayerOptions.validationKeyAttr, - staticPkValue: testDynamoDBPersistenceLayerOptions.staticPkValue, - sortKeyAttr: testDynamoDBPersistenceLayerOptions.sortKeyAttr, + DynamoDBPersistenceLayerTestClassOptions.validationKeyAttr, + staticPkValue: DynamoDBPersistenceLayerTestClassOptions.staticPkValue, + sortKeyAttr: DynamoDBPersistenceLayerTestClassOptions.sortKeyAttr, }) ); }); - test('when instantiated with a sortKeyAttr that has same value of keyAttr, it throws', () => { - // Prepare - const testDynamoDBPersistenceLayerOptions: DynamoDBPersistenceOptions = { - tableName: dummyTableName, - keyAttr: dummyKey, - sortKeyAttr: dummyKey, - }; - + it('throws when sortKeyAttr and keyAttr have the same value', () => { // Act & Assess expect( () => - new TestDynamoDBPersistenceLayer(testDynamoDBPersistenceLayerOptions) + new DynamoDBPersistenceLayerTestClass({ + tableName: dummyTableName, + keyAttr: dummyKey, + sortKeyAttr: dummyKey, + }) ).toThrowError( `keyAttr [${dummyKey}] and sortKeyAttr [${dummyKey}] cannot be the same!` ); }); - test('when instantiated with a custom AWS SDK client it uses that client', () => { + it('uses the AWS SDK client provided and appends the UA middleware', () => { // Prepare const awsSdkV3Client = new DynamoDBClient({}); // Act - const persistenceLayer = new TestDynamoDBPersistenceLayer({ + const persistenceLayer = new DynamoDBPersistenceLayerTestClass({ tableName: dummyTableName, awsSdkV3Client, }); @@ -174,16 +151,11 @@ describe('Class: DynamoDBPersistenceLayer', () => { }); it('falls back on a new SDK client and logs a warning when an unknown object is provided instead of a client', async () => { - // Prepare - const awsSdkV3Client = {}; - const options: DynamoDBPersistenceOptions = { - tableName: dummyTableName, - awsSdkV3Client: awsSdkV3Client as DynamoDBClient, - }; - const consoleWarnSpy = jest.spyOn(console, 'warn').mockImplementation(); - // Act - const persistenceLayer = new TestDynamoDBPersistenceLayer(options); + const persistenceLayer = new DynamoDBPersistenceLayerTestClass({ + tableName: dummyTableName, + awsSdkV3Client: {} as DynamoDBClient, + }); // Assess expect(persistenceLayer).toEqual( @@ -196,7 +168,7 @@ describe('Class: DynamoDBPersistenceLayer', () => { }), }) ); - expect(consoleWarnSpy).toHaveBeenNthCalledWith( + expect(console.warn).toHaveBeenNthCalledWith( 1, 'awsSdkV3Client is not an AWS SDK v3 client, using default client' ); @@ -212,11 +184,8 @@ describe('Class: DynamoDBPersistenceLayer', () => { }); describe('Method: _putRecord', () => { - test('when called with a record that meets conditions, it puts record in DynamoDB table', async () => { + it('puts the record in DynamoDB', async () => { // Prepare - const persistenceLayer = new TestDynamoDBPersistenceLayer({ - tableName: dummyTableName, - }); const status = IdempotencyRecordStatus.EXPIRED; const expiryTimestamp = 0; const record = new IdempotencyRecord({ @@ -252,9 +221,9 @@ describe('Class: DynamoDBPersistenceLayer', () => { }); }); - test('when called with a record that uses composite key, it puts record in DynamoDB table', async () => { + it('puts the record in DynamoDB when using the provided composite key', async () => { // Prepare - const persistenceLayer = new TestDynamoDBPersistenceLayer({ + const persistenceLayer = new DynamoDBPersistenceLayerTestClass({ tableName: dummyTableName, staticPkValue: 'idempotency#my-lambda-function', sortKeyAttr: 'sortKey', @@ -295,11 +264,8 @@ describe('Class: DynamoDBPersistenceLayer', () => { }); }); - test('when called with a record that has inProgressExpiryTimestamp, it puts record in DynamoDB table', async () => { + it('puts the record in DynamoDB when using an in progress expiry timestamp', async () => { // Prepare - const persistenceLayer = new TestDynamoDBPersistenceLayer({ - tableName: dummyTableName, - }); const status = IdempotencyRecordStatus.INPROGRESS; const expiryTimestamp = getFutureTimestamp(10); const inProgressExpiryTimestamp = getFutureTimestamp(5); @@ -338,14 +304,11 @@ describe('Class: DynamoDBPersistenceLayer', () => { }); }); - test('when called and and payload validation is enabled it puts record in DynamoDB table', async () => { + it('puts record in DynamoDB table when using payload validation', async () => { // Prepare - const persistenceLayer = new TestDynamoDBPersistenceLayer({ - tableName: dummyTableName, - }); - jest - .spyOn(persistenceLayer, 'isPayloadValidationEnabled') - .mockReturnValue(true); + vi.spyOn(persistenceLayer, 'isPayloadValidationEnabled').mockReturnValue( + true + ); const status = IdempotencyRecordStatus.EXPIRED; const expiryTimestamp = 0; const record = new IdempotencyRecord({ @@ -383,12 +346,8 @@ describe('Class: DynamoDBPersistenceLayer', () => { }); }); - test('when called with a record that fails any condition, it throws IdempotencyItemAlreadyExistsError', async () => { + it('throws when called with a record that fails any condition', async () => { // Prepare - const persistenceLayer = new TestDynamoDBPersistenceLayer({ - tableName: dummyTableName, - }); - const record = new IdempotencyRecord({ idempotencyKey: dummyKey, status: IdempotencyRecordStatus.EXPIRED, @@ -422,19 +381,13 @@ describe('Class: DynamoDBPersistenceLayer', () => { ); }); - test('when encountering an unknown error, it throws the causing error', async () => { + it('throws when encountering an unknown error', async () => { // Prepare - const persistenceLayer = new TestDynamoDBPersistenceLayer({ - tableName: dummyTableName, - }); - const status = IdempotencyRecordStatus.EXPIRED; - const expiryTimestamp = 0; - const inProgressExpiryTimestamp = 0; const record = new IdempotencyRecord({ idempotencyKey: dummyKey, - status, - expiryTimestamp, - inProgressExpiryTimestamp, + status: IdempotencyRecordStatus.EXPIRED, + expiryTimestamp: 0, + inProgressExpiryTimestamp: 0, }); client.on(PutItemCommand).rejects(new Error()); @@ -444,39 +397,8 @@ describe('Class: DynamoDBPersistenceLayer', () => { }); describe('Method: _getRecord', () => { - test('it calls DynamoDB with correct parameters', async () => { + it('gets the record from DynamoDB', async () => { // Prepare - const persistenceLayer = new TestDynamoDBPersistenceLayer({ - tableName: dummyTableName, - }); - client.on(GetItemCommand).resolves({ - Item: marshall({ - id: dummyKey, - status: IdempotencyRecordStatus.INPROGRESS, - expiration: getFutureTimestamp(15), - in_progress_expiration: getFutureTimestamp(10), - data: {}, - }), - }); - - // Act - await persistenceLayer._getRecord(dummyKey); - - // Assess - expect(client).toReceiveCommandWith(GetItemCommand, { - TableName: dummyTableName, - Key: marshall({ - id: dummyKey, - }), - ConsistentRead: true, - }); - }); - - test('when called with a record whose key exists, it gets the correct record', async () => { - // Prepare - const persistenceLayer = new TestDynamoDBPersistenceLayer({ - tableName: dummyTableName, - }); const status = IdempotencyRecordStatus.INPROGRESS; const expiryTimestamp = getFutureTimestamp(15); const inProgressExpiryTimestamp = getFutureTimestamp(10); @@ -495,6 +417,13 @@ describe('Class: DynamoDBPersistenceLayer', () => { const record = await persistenceLayer._getRecord(dummyKey); // Assess + expect(client).toReceiveCommandWith(GetItemCommand, { + TableName: dummyTableName, + Key: marshall({ + id: dummyKey, + }), + ConsistentRead: true, + }); expect(record).toBeInstanceOf(IdempotencyRecord); expect(record.getStatus()).toEqual(IdempotencyRecordStatus.INPROGRESS); expect(record.idempotencyKey).toEqual(dummyKey); @@ -505,11 +434,8 @@ describe('Class: DynamoDBPersistenceLayer', () => { expect(record.expiryTimestamp).toEqual(expiryTimestamp); }); - test('when called with a record whose key does not exist, it throws IdempotencyItemNotFoundError', async () => { + it('throws when the record does not exist', async () => { // Prepare - const persistenceLayer = new TestDynamoDBPersistenceLayer({ - tableName: dummyTableName, - }); client.on(GetItemCommand).resolves({ Item: undefined }); // Act & Assess @@ -518,9 +444,9 @@ describe('Class: DynamoDBPersistenceLayer', () => { ); }); - test('when called with a record in a table that use composite key, it builds the request correctly', async () => { + it('it builds the request correctly when using composite keys', async () => { // Prepare - const persistenceLayer = new TestDynamoDBPersistenceLayer({ + const persistenceLayer = new DynamoDBPersistenceLayerTestClass({ tableName: dummyTableName, staticPkValue: 'idempotency#my-lambda-function', sortKeyAttr: 'sortKey', @@ -548,9 +474,9 @@ describe('Class: DynamoDBPersistenceLayer', () => { }); }); - test('when called with a record that had the ', async () => { + it('gets the record and validates the hash correctly', async () => { // Prepare - const persistenceLayer = new TestDynamoDBPersistenceLayer({ + const persistenceLayer = new DynamoDBPersistenceLayerTestClass({ tableName: dummyTableName, staticPkValue: 'idempotency#my-lambda-function', sortKeyAttr: 'sortKey', @@ -580,11 +506,8 @@ describe('Class: DynamoDBPersistenceLayer', () => { }); describe('Method: _updateRecord', () => { - test('when called to update a record, it updates the item with the correct parameters', async () => { + it('it updates the item with the correct parameters', async () => { // Prepare - const persistenceLayer = new TestDynamoDBPersistenceLayer({ - tableName: dummyTableName, - }); const status = IdempotencyRecordStatus.EXPIRED; const expiryTimestamp = Date.now(); const record = new IdempotencyRecord({ @@ -611,7 +534,7 @@ describe('Class: DynamoDBPersistenceLayer', () => { '#response_data': 'data', }, ExpressionAttributeValues: marshall({ - ':status': IdempotencyRecordStatus.EXPIRED, + ':status': status, ':expiry': expiryTimestamp, ':response_data': {}, }), @@ -620,9 +543,6 @@ describe('Class: DynamoDBPersistenceLayer', () => { it('updates the item when the response_data is undefined', async () => { // Prepare - const persistenceLayer = new TestDynamoDBPersistenceLayer({ - tableName: dummyTableName, - }); const status = IdempotencyRecordStatus.EXPIRED; const expiryTimestamp = Date.now(); const record = new IdempotencyRecord({ @@ -647,25 +567,22 @@ describe('Class: DynamoDBPersistenceLayer', () => { '#expiry': 'expiration', }, ExpressionAttributeValues: marshall({ - ':status': IdempotencyRecordStatus.EXPIRED, + ':status': status, ':expiry': expiryTimestamp, }), }); }); - test('when called to update a record and payload validation is enabled, it adds the payload hash to the update expression', async () => { + it('uses the payload hash in the expression when payload validation is enabled', async () => { // Prepare - const persistenceLayer = new TestDynamoDBPersistenceLayer({ - tableName: dummyTableName, - }); - jest - .spyOn(persistenceLayer, 'isPayloadValidationEnabled') - .mockImplementation(() => true); - const status = IdempotencyRecordStatus.EXPIRED; + vi.spyOn( + persistenceLayer, + 'isPayloadValidationEnabled' + ).mockImplementation(() => true); const expiryTimestamp = Date.now(); const record = new IdempotencyRecord({ idempotencyKey: dummyKey, - status, + status: IdempotencyRecordStatus.EXPIRED, expiryTimestamp, responseData: {}, payloadHash: 'someHash', @@ -699,17 +616,12 @@ describe('Class: DynamoDBPersistenceLayer', () => { }); describe('Method: _deleteRecord', () => { - test('when called with a valid record, it calls the delete operation with the correct parameters', async () => { + it('deletes the record using the correct parameters', async () => { // Prepare - const persistenceLayer = new TestDynamoDBPersistenceLayer({ - tableName: dummyTableName, - }); - const status = IdempotencyRecordStatus.EXPIRED; - const expiryTimestamp = Date.now(); const record = new IdempotencyRecord({ idempotencyKey: dummyKey, - status, - expiryTimestamp, + status: IdempotencyRecordStatus.EXPIRED, + expiryTimestamp: Date.now(), }); // Act @@ -722,26 +634,4 @@ describe('Class: DynamoDBPersistenceLayer', () => { }); }); }); - - test('_putRecord throws Error when Item is undefined', async () => { - // Prepare - const persistenceLayer = new TestDynamoDBPersistenceLayer({ - tableName: dummyTableName, - }); - const mockRecord = new IdempotencyRecord({ - idempotencyKey: 'test-key', - status: 'INPROGRESS', - expiryTimestamp: Date.now(), - }); - - DynamoDBClient.prototype.send = jest.fn().mockRejectedValueOnce( - new ConditionalCheckFailedException({ - message: 'Conditional check failed', - $metadata: {}, - }) - ); - await expect( - persistenceLayer._putRecord(mockRecord) - ).rejects.toThrowError(); - }); }); diff --git a/packages/idempotency/tests/unit/persistence/IdempotencyRecord.test.ts b/packages/idempotency/tests/unit/persistence/IdempotencyRecord.test.ts index 38728bcef9..710ece3f07 100644 --- a/packages/idempotency/tests/unit/persistence/IdempotencyRecord.test.ts +++ b/packages/idempotency/tests/unit/persistence/IdempotencyRecord.test.ts @@ -1,102 +1,60 @@ -/** - * Test IdempotencyRecord class - * - * @group unit/idempotency/persistence/idempotencyRecord - */ -import { IdempotencyRecord } from '../../../src/persistence/IdempotencyRecord.js'; +import { afterAll, beforeAll, describe, expect, it, vi } from 'vitest'; import { - IdempotencyRecordStatus, IdempotencyInvalidStatusError, + IdempotencyRecordStatus, } from '../../../src/index.js'; +import { IdempotencyRecord } from '../../../src/persistence/IdempotencyRecord.js'; import type { IdempotencyRecordStatusValue } from '../../../src/types/index.js'; const mockIdempotencyKey = '123'; const mockData = undefined; -const mockInProgressExpiry = 123; +let mockInProgressExpiry: number; +let mockExpiryTimestamp: number; const mockPayloadHash = '123'; -describe('Given an INPROGRESS record that has already expired', () => { - let idempotencyRecord: IdempotencyRecord; - beforeEach(() => { - const mockNowAfterExpiryTime = 1487076708000; - const expiryTimeBeforeNow = 1487076707; - Date.now = jest.fn(() => mockNowAfterExpiryTime); - idempotencyRecord = new IdempotencyRecord({ - idempotencyKey: mockIdempotencyKey, - status: IdempotencyRecordStatus.INPROGRESS, - expiryTimestamp: expiryTimeBeforeNow, - inProgressExpiryTimestamp: mockInProgressExpiry, - responseData: mockData, - payloadHash: mockPayloadHash, - }); +describe('class: IdempotencyRecord', () => { + beforeAll(() => { + vi.useFakeTimers().setSystemTime(new Date()); + mockInProgressExpiry = Date.now() + 10_000; + mockExpiryTimestamp = Date.now() + 20_000; }); - describe('When checking the status of the idempotency record', () => { - let resultingStatus: IdempotencyRecordStatusValue; - beforeEach(() => { - resultingStatus = idempotencyRecord.getStatus(); - }); - test('Then the status is EXPIRED', () => { - expect(resultingStatus).toEqual(IdempotencyRecordStatus.EXPIRED); - }); + afterAll(() => { + vi.useRealTimers(); }); -}); -describe('Given an idempotency record that is not expired', () => { - let idempotencyRecord: IdempotencyRecord; - beforeEach(() => { - const mockNowBeforeExiryTime = 1487076707000; - const expiryTimeAfterNow = 1487076708; - Date.now = jest.fn(() => mockNowBeforeExiryTime); - idempotencyRecord = new IdempotencyRecord({ + it('returns the response data', () => { + // Prepare + const idempotencyRecord = new IdempotencyRecord({ idempotencyKey: mockIdempotencyKey, status: IdempotencyRecordStatus.INPROGRESS, - expiryTimestamp: expiryTimeAfterNow, + expiryTimestamp: mockExpiryTimestamp, inProgressExpiryTimestamp: mockInProgressExpiry, responseData: mockData, payloadHash: mockPayloadHash, }); - }); - describe('When checking the status of the idempotency record', () => { - test('Then the status is EXPIRED', () => { - expect(idempotencyRecord.getStatus()).toEqual( - IdempotencyRecordStatus.INPROGRESS - ); - }); - test('Then the record is returned', () => { - expect(idempotencyRecord.getResponse()).toEqual(mockData); - }); + // Act + const response = idempotencyRecord.getResponse(); + + // Assess + expect(response).toEqual(mockData); }); -}); -describe('Given an idempotency record that has a status not in the IdempotencyRecordStatus enum', () => { - let idempotencyRecord: IdempotencyRecord; - beforeEach(() => { - const mockNowBeforeExiryTime = 1487076707000; - const expiryTimeAfterNow = 1487076708; - Date.now = jest.fn(() => mockNowBeforeExiryTime); - idempotencyRecord = new IdempotencyRecord({ + it('throws an error if the status is invalid', () => { + // Prepare + const idempotencyRecord = new IdempotencyRecord({ idempotencyKey: mockIdempotencyKey, status: 'NOT_A_STATUS' as IdempotencyRecordStatusValue, - expiryTimestamp: expiryTimeAfterNow, + expiryTimestamp: mockExpiryTimestamp, inProgressExpiryTimestamp: mockInProgressExpiry, responseData: mockData, payloadHash: mockPayloadHash, }); - }); - describe('When checking the status of the idempotency record', () => { - let resultingError: Error; - beforeEach(() => { - try { - idempotencyRecord.getStatus(); - } catch (e: unknown) { - resultingError = e as Error; - } - }); - test('Then an IdempotencyInvalidStatusError is thrown ', () => { - expect(resultingError).toBeInstanceOf(IdempotencyInvalidStatusError); - }); + // Act + expect(() => idempotencyRecord.getStatus()).toThrow( + IdempotencyInvalidStatusError + ); }); }); diff --git a/packages/idempotency/vitest.config.ts b/packages/idempotency/vitest.config.ts new file mode 100644 index 0000000000..9f1196ef1f --- /dev/null +++ b/packages/idempotency/vitest.config.ts @@ -0,0 +1,8 @@ +import { defineProject } from 'vitest/config'; + +export default defineProject({ + test: { + environment: 'node', + setupFiles: ['../testing/src/setupEnv.ts'], + }, +}); diff --git a/packages/testing/package.json b/packages/testing/package.json index 9044e97e80..81803b2d43 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -106,6 +106,7 @@ "promise-retry": "^2.0.1" }, "devDependencies": { - "@types/promise-retry": "^1.1.6" + "@types/promise-retry": "^1.1.6", + "aws-sdk-client-mock-vitest": "^4.0.0" } } diff --git a/packages/testing/src/setupEnv.ts b/packages/testing/src/setupEnv.ts new file mode 100644 index 0000000000..334d7c25c9 --- /dev/null +++ b/packages/testing/src/setupEnv.ts @@ -0,0 +1,31 @@ +import { toReceiveCommandWith } from 'aws-sdk-client-mock-vitest'; +import type { CustomMatcher } from 'aws-sdk-client-mock-vitest'; +import { expect, vi } from 'vitest'; + +expect.extend({ toReceiveCommandWith }); + +// Mock console methods to prevent output during tests +vi.spyOn(console, 'error').mockReturnValue(); +vi.spyOn(console, 'warn').mockReturnValue(); +vi.spyOn(console, 'debug').mockReturnValue(); +vi.spyOn(console, 'info').mockReturnValue(); +vi.spyOn(console, 'log').mockReturnValue(); + +declare module 'vitest' { + // biome-ignore lint/suspicious/noExplicitAny: vitest typings expect an any type + interface Assertion extends CustomMatcher {} + interface AsymmetricMatchersContaining extends CustomMatcher {} +} + +// Set up environment variables for testing +process.env._X_AMZN_TRACE_ID = '1-abcdef12-3456abcdef123456abcdef12'; +process.env.AWS_LAMBDA_FUNCTION_NAME = 'my-lambda-function'; +process.env.AWS_EXECUTION_ENV = 'nodejs20.x'; +process.env.AWS_LAMBDA_FUNCTION_MEMORY_SIZE = '128'; +if ( + process.env.AWS_REGION === undefined && + process.env.CDK_DEFAULT_REGION === undefined +) { + process.env.AWS_REGION = 'eu-west-1'; +} +process.env._HANDLER = 'index.handler'; diff --git a/vitest.config.ts b/vitest.config.ts index 54cf34dc82..989b2c970a 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -16,7 +16,7 @@ export default defineConfig({ 'packages/batch/src/types.ts', 'packages/commons/src/types/**', 'packages/event-handler/**', - 'packages/idempotency/**', + 'packages/idempotency/src/types/**', 'packages/jmespath/src/types.ts', 'packages/logger/**', 'packages/metrics/**', @@ -26,5 +26,6 @@ export default defineConfig({ 'packages/tracer/**', ], }, + setupFiles: ['./packages/testing/src/setupEnv.ts'], }, }); From 6d4b3de0f14a85da50adeeb4f662aca9e8cca2bb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 26 Sep 2024 23:12:52 +0200 Subject: [PATCH 35/52] chore(deps): bump mkdocs-material from 9.5.36 to 9.5.38 in /docs (#3121) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Andrea Amorosi --- docs/requirements.in | 2 +- docs/requirements.txt | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/requirements.in b/docs/requirements.in index e3fe1cca91..4a7aa709a2 100644 --- a/docs/requirements.in +++ b/docs/requirements.in @@ -1,4 +1,4 @@ mike==1.1.2 -mkdocs-material==9.5.36 +mkdocs-material==9.5.38 mkdocs-git-revision-date-plugin==0.3.2 mkdocs-exclude==1.0.2 \ No newline at end of file diff --git a/docs/requirements.txt b/docs/requirements.txt index 0cb25cb0aa..a3a9e80687 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -235,9 +235,9 @@ mkdocs-get-deps==0.2.0 \ mkdocs-git-revision-date-plugin==0.3.2 \ --hash=sha256:2e67956cb01823dd2418e2833f3623dee8604cdf223bddd005fe36226a56f6ef # via -r requirements.in -mkdocs-material==9.5.36 \ - --hash=sha256:140456f761320f72b399effc073fa3f8aac744c77b0970797c201cae2f6c967f \ - --hash=sha256:36734c1fd9404bea74236242ba3359b267fc930c7233b9fd086b0898825d0ac9 +mkdocs-material==9.5.38 \ + --hash=sha256:1843c5171ad6b489550aeaf7358e5b7128cc03ddcf0fb4d91d19aa1e691a63b8 \ + --hash=sha256:d4779051d52ba9f1e7e344b34de95449c7c366c212b388e4a2db9a3db043c228 # via -r requirements.in mkdocs-material-extensions==1.3.1 \ --hash=sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443 \ From 39c860855b7b278421244d6431e7680c5bea63ec Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Fri, 27 Sep 2024 02:45:37 +0200 Subject: [PATCH 36/52] test(event-handler): migrate to vitest (#3126) --- ...sable-run-linting-check-and-unit-tests.yml | 9 +++--- .husky/pre-push | 3 +- packages/event-handler/jest.config.cjs | 29 ------------------- packages/event-handler/package.json | 6 ++-- packages/event-handler/tests/tsconfig.json | 4 +-- .../event-handler/tests/unit/index.test.ts | 10 ++----- packages/event-handler/vitest.config.ts | 8 +++++ vitest.config.ts | 2 +- 8 files changed, 23 insertions(+), 48 deletions(-) delete mode 100644 packages/event-handler/jest.config.cjs create mode 100644 packages/event-handler/vitest.config.ts diff --git a/.github/workflows/reusable-run-linting-check-and-unit-tests.yml b/.github/workflows/reusable-run-linting-check-and-unit-tests.yml index f98a91353e..b6e8a36e95 100644 --- a/.github/workflows/reusable-run-linting-check-and-unit-tests.yml +++ b/.github/workflows/reusable-run-linting-check-and-unit-tests.yml @@ -44,7 +44,8 @@ jobs: "packages/batch", "packages/commons", "packages/jmespath", - "packages/idempotency" + "packages/idempotency", + "packages/event-handler" ] fail-fast: false steps: @@ -91,16 +92,14 @@ jobs: -w packages/tracer \ -w packages/metrics \ -w packages/parameters \ - -w packages/parser \ - -w packages/event-handler + -w packages/parser - name: Run unit tests run: | npm t -w packages/logger \ -w packages/tracer \ -w packages/metrics \ -w packages/parameters \ - -w packages/parser \ - -w packages/event-handler + -w packages/parser check-examples: runs-on: ubuntu-latest env: diff --git a/.husky/pre-push b/.husky/pre-push index a6182662c5..29e324aa7b 100755 --- a/.husky/pre-push +++ b/.husky/pre-push @@ -3,7 +3,6 @@ npm t \ -w packages/metrics \ -w packages/tracer \ -w packages/parameters \ - -w packages/parser \ - -w packages/event-handler + -w packages/parser npx vitest --run --coverage --changed="$(git merge-base HEAD main)" \ No newline at end of file diff --git a/packages/event-handler/jest.config.cjs b/packages/event-handler/jest.config.cjs deleted file mode 100644 index d5dec2b8f0..0000000000 --- a/packages/event-handler/jest.config.cjs +++ /dev/null @@ -1,29 +0,0 @@ -module.exports = { - displayName: { - name: 'Powertools for AWS Lambda (TypeScript) utility: EVENT HANDLER', - color: 'blue', - }, - runner: 'groups', - moduleNameMapper: { - '^(\\.{1,2}/.*)\\.js$': '$1', - }, - transform: { - '^.+\\.ts?$': 'ts-jest', - }, - moduleFileExtensions: ['js', 'ts'], - collectCoverageFrom: ['**/src/**/*.ts', '!**/node_modules/**'], - testMatch: ['**/?(*.)+(spec|test).ts'], - roots: ['/src', '/tests'], - testPathIgnorePatterns: ['/node_modules/'], - testEnvironment: 'node', - coveragePathIgnorePatterns: ['/node_modules/', 'src/types/index.ts'], - coverageThreshold: { - global: { - statements: 100, - branches: 100, - functions: 100, - lines: 100, - }, - }, - coverageReporters: ['json-summary', 'text', 'lcov'] -}; diff --git a/packages/event-handler/package.json b/packages/event-handler/package.json index 3031eb6e3f..3696fcac2a 100644 --- a/packages/event-handler/package.json +++ b/packages/event-handler/package.json @@ -8,8 +8,10 @@ }, "private": true, "scripts": { - "test": "npm run test:unit", - "test:unit": "jest --group=unit --detectOpenHandles --coverage --verbose", + "test": "vitest --run", + "test:unit": "vitest --run", + "test:unit:coverage": "vitest --run tests/unit --coverage.enabled --coverage.thresholds.100 --coverage.include='src/**'", + "test:unit:types": "echo 'Not Implemented'", "test:e2e:nodejs18x": "echo \"Not implemented\"", "test:e2e:nodejs20x": "echo \"Not implemented\"", "test:e2e": "echo \"Not implemented\"", diff --git a/packages/event-handler/tests/tsconfig.json b/packages/event-handler/tests/tsconfig.json index 45ba862a85..39f442212e 100644 --- a/packages/event-handler/tests/tsconfig.json +++ b/packages/event-handler/tests/tsconfig.json @@ -1,8 +1,8 @@ { "extends": "../tsconfig.json", "compilerOptions": { - "rootDir": "../", + "rootDir": "../../", "noEmit": true }, - "include": ["../src/**/*", "./**/*"] + "include": ["../../testing/src/setupEnv.ts", "../src/**/*", "./**/*"] } diff --git a/packages/event-handler/tests/unit/index.test.ts b/packages/event-handler/tests/unit/index.test.ts index c53ef9e1ce..cc067e7c70 100644 --- a/packages/event-handler/tests/unit/index.test.ts +++ b/packages/event-handler/tests/unit/index.test.ts @@ -1,16 +1,12 @@ -/** - * Test Event Handler - * - * @group unit/event-handler - */ +import { afterAll, beforeEach, describe, expect, it, vi } from 'vitest'; import { foo } from '../../src/index.js'; describe('Event Handler', () => { const ENVIRONMENT_VARIABLES = process.env; beforeEach(() => { - jest.clearAllMocks(); - jest.resetModules(); + vi.clearAllMocks(); + vi.resetModules(); process.env = { ...ENVIRONMENT_VARIABLES }; }); diff --git a/packages/event-handler/vitest.config.ts b/packages/event-handler/vitest.config.ts new file mode 100644 index 0000000000..9f1196ef1f --- /dev/null +++ b/packages/event-handler/vitest.config.ts @@ -0,0 +1,8 @@ +import { defineProject } from 'vitest/config'; + +export default defineProject({ + test: { + environment: 'node', + setupFiles: ['../testing/src/setupEnv.ts'], + }, +}); diff --git a/vitest.config.ts b/vitest.config.ts index 989b2c970a..81203c1290 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -15,7 +15,7 @@ export default defineConfig({ ...coverageConfigDefaults.exclude, 'packages/batch/src/types.ts', 'packages/commons/src/types/**', - 'packages/event-handler/**', + 'packages/event-handler/src/types/**', 'packages/idempotency/src/types/**', 'packages/jmespath/src/types.ts', 'packages/logger/**', From e31279af90446050a7974fbe25c34758f64915f9 Mon Sep 17 00:00:00 2001 From: Asifur Rahman Arnab Date: Fri, 27 Sep 2024 20:41:20 +0600 Subject: [PATCH 37/52] feat(batch): sequential async processing of records for `BatchProcessor` (#3109) Co-authored-by: Andrea Amorosi --- docs/utilities/batch.md | 15 +- .../batch/sequentialAsyncProcessing.ts | 18 + packages/batch/src/BasePartialProcessor.ts | 40 +- packages/batch/src/types.ts | 7 + .../batch/tests/unit/BatchProcessor.test.ts | 353 ++++++------ .../tests/unit/processPartialResponse.test.ts | 542 +++++++++--------- 6 files changed, 533 insertions(+), 442 deletions(-) create mode 100644 examples/snippets/batch/sequentialAsyncProcessing.ts diff --git a/docs/utilities/batch.md b/docs/utilities/batch.md index e49ab6b98e..ec0e4ba108 100644 --- a/docs/utilities/batch.md +++ b/docs/utilities/batch.md @@ -416,7 +416,10 @@ For such cases we recommend to use the `BatchProcessorSync` and `processPartialR *If your function is `async` returning a `Promise`, use `BatchProcessor` and `processPartialResponse` * If your function is not `async`, use `BatchProcessorSync` and `processPartialResponseSync` -The difference between the two processors in implementation is that `BatchProcessor` uses `Promise.all()` while `BatchProcessorSync` loops through each record to preserve the order. +The difference between the two processors is in how they handle record processing: + +* **`BatchProcessor`**: By default, it processes records in parallel using `Promise.all()`. However, it also offers an [option](#sequential-async-processing) to process records sequentially, preserving the order. +* **`BatchProcessorSync`**: Always processes records sequentially, ensuring the order is preserved by looping through each record one by one. ???+ question "When is this useful?" @@ -477,6 +480,16 @@ Let's suppose you'd like to add a metric named `BatchRecordFailures` for each ba --8<-- "examples/snippets/batch/extendingFailure.ts" ``` +### Sequential async processing + +By default, the `BatchProcessor` processes records in parallel using `Promise.all()`. However, if you need to preserve the order of records, you can set the `processInParallel` option to `false` to process records sequentially. + +!!! important "If the `processInParallel` option is not provided, the `BatchProcessor` will process records in parallel." + +```typescript hl_lines="8 17" title="Sequential async processing" +--8<-- "examples/snippets/batch/sequentialAsyncProcessing.ts" +``` + ### Create your own partial processor You can create your own partial batch processor from scratch by inheriting the `BasePartialProcessor` class, and implementing the `prepare()`, `clean()`, `processRecord()` and `processRecordSync()` abstract methods. diff --git a/examples/snippets/batch/sequentialAsyncProcessing.ts b/examples/snippets/batch/sequentialAsyncProcessing.ts new file mode 100644 index 0000000000..10ae24262e --- /dev/null +++ b/examples/snippets/batch/sequentialAsyncProcessing.ts @@ -0,0 +1,18 @@ +import { + BatchProcessor, + EventType, + processPartialResponse, +} from '@aws-lambda-powertools/batch'; +import type { SQSHandler, SQSRecord } from 'aws-lambda'; + +const processor = new BatchProcessor(EventType.SQS); + +const recordHandler = async (_record: SQSRecord): Promise => { + // Process the record +}; + +export const handler: SQSHandler = async (event, context) => + processPartialResponse(event, recordHandler, processor, { + context, + processInParallel: false, + }); diff --git a/packages/batch/src/BasePartialProcessor.ts b/packages/batch/src/BasePartialProcessor.ts index 2e7e9bf8ac..68bcac467d 100644 --- a/packages/batch/src/BasePartialProcessor.ts +++ b/packages/batch/src/BasePartialProcessor.ts @@ -98,7 +98,7 @@ abstract class BasePartialProcessor { public abstract prepare(): void; /** - * Process all records with an asyncronous handler + * Process all records with an asynchronous handler * * Once called, the processor will create an array of promises to process each record * and wait for all of them to settle before returning the results. @@ -122,11 +122,11 @@ abstract class BasePartialProcessor { } this.prepare(); - const processingPromises: Promise[] = - this.records.map((record) => this.processRecord(record)); - - const processedRecords: (SuccessResponse | FailureResponse)[] = - await Promise.all(processingPromises); + // Default to `true` if `processInParallel` is not specified. + const processInParallel = this.options?.processInParallel ?? true; + const processedRecords = processInParallel + ? await this.#processRecordsInParallel() + : await this.#processRecordsSequentially(); this.clean(); @@ -134,9 +134,9 @@ abstract class BasePartialProcessor { } /** - * Process a record with an asyncronous handler + * Process a record with an asynchronous handler * - * An implementation of this method is required for asyncronous processors. + * An implementation of this method is required for asynchronous processors. * * When implementing this method, you should at least call the successHandler method * when a record succeeds processing and the failureHandler method when a record @@ -249,6 +249,30 @@ abstract class BasePartialProcessor { return entry; } + + /** + * Processes records in parallel using `Promise.all`. + */ + async #processRecordsInParallel(): Promise< + (SuccessResponse | FailureResponse)[] + > { + return Promise.all( + this.records.map((record) => this.processRecord(record)) + ); + } + + /** + * Processes records sequentially, ensuring that each record is processed one after the other. + */ + async #processRecordsSequentially(): Promise< + (SuccessResponse | FailureResponse)[] + > { + const processedRecords: (SuccessResponse | FailureResponse)[] = []; + for (const record of this.records) { + processedRecords.push(await this.processRecord(record)); + } + return processedRecords; + } } export { BasePartialProcessor }; diff --git a/packages/batch/src/types.ts b/packages/batch/src/types.ts index 7e60704535..3748c03e95 100644 --- a/packages/batch/src/types.ts +++ b/packages/batch/src/types.ts @@ -14,6 +14,7 @@ import type { SqsFifoPartialProcessor } from './SqsFifoPartialProcessor.js'; * @property context The context object provided by the AWS Lambda runtime * @property skipGroupOnError The option to group on error during processing * @property throwOnFullBatchFailure The option to throw an error if the entire batch fails + * @property processInParallel Indicates whether the records should be processed in parallel */ type BatchProcessingOptions = { /** @@ -30,6 +31,12 @@ type BatchProcessingOptions = { * Set this to false to prevent throwing an error if the entire batch fails. */ throwOnFullBatchFailure?: boolean; + /** + * Indicates whether the records should be processed in parallel. + * When set to `true`, the records will be processed in parallel using `Promise.all`. + * When set to `false`, the records will be processed sequentially. + */ + processInParallel?: T extends SqsFifoPartialProcessor ? never : boolean; }; /** diff --git a/packages/batch/tests/unit/BatchProcessor.test.ts b/packages/batch/tests/unit/BatchProcessor.test.ts index e49ee4c30f..650354d968 100644 --- a/packages/batch/tests/unit/BatchProcessor.test.ts +++ b/packages/batch/tests/unit/BatchProcessor.test.ts @@ -35,198 +35,211 @@ describe('Class: AsyncBatchProcessor', () => { process.env = ENVIRONMENT_VARIABLES; }); - describe('Asynchronously processing SQS Records', () => { - it('completes processing with no failures', async () => { - // Prepare - const firstRecord = sqsRecordFactory('success'); - const secondRecord = sqsRecordFactory('success'); - const records = [firstRecord, secondRecord]; - const processor = new BatchProcessor(EventType.SQS); - - // Act - processor.register(records, asyncSqsRecordHandler); - const processedMessages = await processor.process(); - - // Assess - expect(processedMessages).toStrictEqual([ - ['success', firstRecord.body, firstRecord], - ['success', secondRecord.body, secondRecord], - ]); - }); - - it('completes processing with with some failures', async () => { - // Prepare - const firstRecord = sqsRecordFactory('failure'); - const secondRecord = sqsRecordFactory('success'); - const thirdRecord = sqsRecordFactory('fail'); - const records = [firstRecord, secondRecord, thirdRecord]; - const processor = new BatchProcessor(EventType.SQS); - - // Act - processor.register(records, asyncSqsRecordHandler); - const processedMessages = await processor.process(); - - // Assess - expect(processedMessages[1]).toStrictEqual([ - 'success', - secondRecord.body, - secondRecord, - ]); - expect(processor.failureMessages.length).toBe(2); - expect(processor.response()).toStrictEqual({ - batchItemFailures: [ - { itemIdentifier: firstRecord.messageId }, - { itemIdentifier: thirdRecord.messageId }, - ], + describe('Asynchronously processing', () => { + const cases = [ + { + description: 'in parallel', + options: { processInParallel: true }, + }, + { + description: 'sequentially', + options: { processInParallel: false }, + }, + ]; + + describe.each(cases)('SQS Records $description', ({ options }) => { + it('completes processing with no failures', async () => { + // Prepare + const firstRecord = sqsRecordFactory('success'); + const secondRecord = sqsRecordFactory('success'); + const records = [firstRecord, secondRecord]; + const processor = new BatchProcessor(EventType.SQS); + + // Act + processor.register(records, asyncSqsRecordHandler, options); + const processedMessages = await processor.process(); + + // Assess + expect(processedMessages).toStrictEqual([ + ['success', firstRecord.body, firstRecord], + ['success', secondRecord.body, secondRecord], + ]); }); - }); - - it('completes processing with all failures', async () => { - // Prepare - const firstRecord = sqsRecordFactory('failure'); - const secondRecord = sqsRecordFactory('failure'); - const thirdRecord = sqsRecordFactory('fail'); - const records = [firstRecord, secondRecord, thirdRecord]; - const processor = new BatchProcessor(EventType.SQS); - - // Act - processor.register(records, asyncSqsRecordHandler); - - // Assess - await expect(processor.process()).rejects.toThrowError( - FullBatchFailureError - ); - }); - }); - - describe('Asynchronously processing Kinesis Records', () => { - it('completes processing with no failures', async () => { - // Prepare - const firstRecord = kinesisRecordFactory('success'); - const secondRecord = kinesisRecordFactory('success'); - const records = [firstRecord, secondRecord]; - const processor = new BatchProcessor(EventType.KinesisDataStreams); - - // Act - processor.register(records, asyncKinesisRecordHandler); - const processedMessages = await processor.process(); + it('completes processing with with some failures', async () => { + // Prepare + const firstRecord = sqsRecordFactory('failure'); + const secondRecord = sqsRecordFactory('success'); + const thirdRecord = sqsRecordFactory('fail'); + const records = [firstRecord, secondRecord, thirdRecord]; + const processor = new BatchProcessor(EventType.SQS); + + // Act + processor.register(records, asyncSqsRecordHandler, options); + const processedMessages = await processor.process(); + + // Assess + expect(processedMessages[1]).toStrictEqual([ + 'success', + secondRecord.body, + secondRecord, + ]); + expect(processor.failureMessages.length).toBe(2); + expect(processor.response()).toStrictEqual({ + batchItemFailures: [ + { itemIdentifier: firstRecord.messageId }, + { itemIdentifier: thirdRecord.messageId }, + ], + }); + }); - // Assess - expect(processedMessages).toStrictEqual([ - ['success', firstRecord.kinesis.data, firstRecord], - ['success', secondRecord.kinesis.data, secondRecord], - ]); - }); + it('completes processing with all failures', async () => { + // Prepare + const firstRecord = sqsRecordFactory('failure'); + const secondRecord = sqsRecordFactory('failure'); + const thirdRecord = sqsRecordFactory('fail'); - it('completes processing with some failures', async () => { - // Prepare - const firstRecord = kinesisRecordFactory('failure'); - const secondRecord = kinesisRecordFactory('success'); - const thirdRecord = kinesisRecordFactory('fail'); - const records = [firstRecord, secondRecord, thirdRecord]; - const processor = new BatchProcessor(EventType.KinesisDataStreams); + const records = [firstRecord, secondRecord, thirdRecord]; + const processor = new BatchProcessor(EventType.SQS); - // Act - processor.register(records, asyncKinesisRecordHandler); - const processedMessages = await processor.process(); + // Act + processor.register(records, asyncSqsRecordHandler, options); - // Assess - expect(processedMessages[1]).toStrictEqual([ - 'success', - secondRecord.kinesis.data, - secondRecord, - ]); - expect(processor.failureMessages.length).toBe(2); - expect(processor.response()).toStrictEqual({ - batchItemFailures: [ - { itemIdentifier: firstRecord.kinesis.sequenceNumber }, - { itemIdentifier: thirdRecord.kinesis.sequenceNumber }, - ], + // Assess + await expect(processor.process()).rejects.toThrowError( + FullBatchFailureError + ); }); }); - it('completes processing with all failures', async () => { - // Prepare - const firstRecord = kinesisRecordFactory('failure'); - const secondRecord = kinesisRecordFactory('failure'); - const thirdRecord = kinesisRecordFactory('fail'); - - const records = [firstRecord, secondRecord, thirdRecord]; - const processor = new BatchProcessor(EventType.KinesisDataStreams); + describe.each(cases)('Kinesis Records $description', ({ options }) => { + it('completes processing with no failures', async () => { + // Prepare + const firstRecord = kinesisRecordFactory('success'); + const secondRecord = kinesisRecordFactory('success'); + const records = [firstRecord, secondRecord]; + const processor = new BatchProcessor(EventType.KinesisDataStreams); + + // Act + processor.register(records, asyncKinesisRecordHandler, options); + const processedMessages = await processor.process(); + + // Assess + expect(processedMessages).toStrictEqual([ + ['success', firstRecord.kinesis.data, firstRecord], + ['success', secondRecord.kinesis.data, secondRecord], + ]); + }); - // Act - processor.register(records, asyncKinesisRecordHandler); + it('completes processing with some failures', async () => { + // Prepare + const firstRecord = kinesisRecordFactory('failure'); + const secondRecord = kinesisRecordFactory('success'); + const thirdRecord = kinesisRecordFactory('fail'); + const records = [firstRecord, secondRecord, thirdRecord]; + const processor = new BatchProcessor(EventType.KinesisDataStreams); + + // Act + processor.register(records, asyncKinesisRecordHandler, options); + const processedMessages = await processor.process(); + + // Assess + expect(processedMessages[1]).toStrictEqual([ + 'success', + secondRecord.kinesis.data, + secondRecord, + ]); + expect(processor.failureMessages.length).toBe(2); + expect(processor.response()).toStrictEqual({ + batchItemFailures: [ + { itemIdentifier: firstRecord.kinesis.sequenceNumber }, + { itemIdentifier: thirdRecord.kinesis.sequenceNumber }, + ], + }); + }); - // Assess - await expect(processor.process()).rejects.toThrowError( - FullBatchFailureError - ); - }); - }); + it('completes processing with all failures', async () => { + // Prepare + const firstRecord = kinesisRecordFactory('failure'); + const secondRecord = kinesisRecordFactory('failure'); + const thirdRecord = kinesisRecordFactory('fail'); - describe('Asynchronously processing DynamoDB Records', () => { - it('completes processing with no failures', async () => { - // Prepare - const firstRecord = dynamodbRecordFactory('success'); - const secondRecord = dynamodbRecordFactory('success'); - const records = [firstRecord, secondRecord]; - const processor = new BatchProcessor(EventType.DynamoDBStreams); + const records = [firstRecord, secondRecord, thirdRecord]; + const processor = new BatchProcessor(EventType.KinesisDataStreams); - // Act - processor.register(records, asyncDynamodbRecordHandler); - const processedMessages = await processor.process(); + // Act + processor.register(records, asyncKinesisRecordHandler, options); - // Assess - expect(processedMessages).toStrictEqual([ - ['success', firstRecord.dynamodb?.NewImage?.Message, firstRecord], - ['success', secondRecord.dynamodb?.NewImage?.Message, secondRecord], - ]); + // Assess + await expect(processor.process()).rejects.toThrowError( + FullBatchFailureError + ); + }); }); - it('completes processing with some failures', async () => { - // Prepare - const firstRecord = dynamodbRecordFactory('failure'); - const secondRecord = dynamodbRecordFactory('success'); - const thirdRecord = dynamodbRecordFactory('fail'); - const records = [firstRecord, secondRecord, thirdRecord]; - const processor = new BatchProcessor(EventType.DynamoDBStreams); - - // Act - processor.register(records, asyncDynamodbRecordHandler); - const processedMessages = await processor.process(); + describe.each(cases)('DynamoDB Records $description', ({ options }) => { + it('completes processing with no failures', async () => { + // Prepare + const firstRecord = dynamodbRecordFactory('success'); + const secondRecord = dynamodbRecordFactory('success'); + const records = [firstRecord, secondRecord]; + const processor = new BatchProcessor(EventType.DynamoDBStreams); + + // Act + processor.register(records, asyncDynamodbRecordHandler, options); + const processedMessages = await processor.process(); + + // Assess + expect(processedMessages).toStrictEqual([ + ['success', firstRecord.dynamodb?.NewImage?.Message, firstRecord], + ['success', secondRecord.dynamodb?.NewImage?.Message, secondRecord], + ]); + }); - // Assess - expect(processedMessages[1]).toStrictEqual([ - 'success', - secondRecord.dynamodb?.NewImage?.Message, - secondRecord, - ]); - expect(processor.failureMessages.length).toBe(2); - expect(processor.response()).toStrictEqual({ - batchItemFailures: [ - { itemIdentifier: firstRecord.dynamodb?.SequenceNumber }, - { itemIdentifier: thirdRecord.dynamodb?.SequenceNumber }, - ], + it('completes processing with some failures', async () => { + // Prepare + const firstRecord = dynamodbRecordFactory('failure'); + const secondRecord = dynamodbRecordFactory('success'); + const thirdRecord = dynamodbRecordFactory('fail'); + const records = [firstRecord, secondRecord, thirdRecord]; + const processor = new BatchProcessor(EventType.DynamoDBStreams); + + // Act + processor.register(records, asyncDynamodbRecordHandler, options); + const processedMessages = await processor.process(); + + // Assess + expect(processedMessages[1]).toStrictEqual([ + 'success', + secondRecord.dynamodb?.NewImage?.Message, + secondRecord, + ]); + expect(processor.failureMessages.length).toBe(2); + expect(processor.response()).toStrictEqual({ + batchItemFailures: [ + { itemIdentifier: firstRecord.dynamodb?.SequenceNumber }, + { itemIdentifier: thirdRecord.dynamodb?.SequenceNumber }, + ], + }); }); - }); - it('completes processing with all failures', async () => { - // Prepare - const firstRecord = dynamodbRecordFactory('failure'); - const secondRecord = dynamodbRecordFactory('failure'); - const thirdRecord = dynamodbRecordFactory('fail'); + it('completes processing with all failures', async () => { + // Prepare + const firstRecord = dynamodbRecordFactory('failure'); + const secondRecord = dynamodbRecordFactory('failure'); + const thirdRecord = dynamodbRecordFactory('fail'); - const records = [firstRecord, secondRecord, thirdRecord]; - const processor = new BatchProcessor(EventType.DynamoDBStreams); + const records = [firstRecord, secondRecord, thirdRecord]; + const processor = new BatchProcessor(EventType.DynamoDBStreams); - // Act - processor.register(records, asyncDynamodbRecordHandler); + // Act + processor.register(records, asyncDynamodbRecordHandler, options); - // Assess - await expect(processor.process()).rejects.toThrowError( - FullBatchFailureError - ); + // Assess + await expect(processor.process()).rejects.toThrowError( + FullBatchFailureError + ); + }); }); }); diff --git a/packages/batch/tests/unit/processPartialResponse.test.ts b/packages/batch/tests/unit/processPartialResponse.test.ts index 2b2ec185ad..54d0ef6fec 100644 --- a/packages/batch/tests/unit/processPartialResponse.test.ts +++ b/packages/batch/tests/unit/processPartialResponse.test.ts @@ -36,6 +36,62 @@ describe('Function: processPartialResponse()', () => { context, }; + const handlerWithSqsEvent = async ( + event: SQSEvent, + options: BatchProcessingOptions + ) => { + const processor = new BatchProcessor(EventType.SQS); + + const handler = async ( + event: SQSEvent, + _context: Context + ): Promise => + processPartialResponse(event, asyncSqsRecordHandler, processor, options); + + return handler(event, context); + }; + + const handlerWithKinesisEvent = async ( + event: KinesisStreamEvent, + options: BatchProcessingOptions + ) => { + const processor = new BatchProcessor(EventType.KinesisDataStreams); + + const handler = async ( + event: KinesisStreamEvent, + _context: Context + ): Promise => + processPartialResponse( + event, + asyncKinesisRecordHandler, + processor, + options + ); + + return handler(event, context); + }; + + const handlerWithDynamoDBEvent = async ( + event: DynamoDBStreamEvent, + options: BatchProcessingOptions + ) => { + const processor = new BatchProcessor(EventType.DynamoDBStreams); + + const handler = async ( + event: DynamoDBStreamEvent, + _context: Context + ): Promise => { + return await processPartialResponse( + event, + asyncDynamodbRecordHandler, + processor, + options + ); + }; + + return handler(event, context); + }; + beforeEach(() => { vi.clearAllMocks(); process.env = { ...ENVIRONMENT_VARIABLES }; @@ -46,304 +102,264 @@ describe('Function: processPartialResponse()', () => { }); describe('Process partial response function call tests', () => { - it('Process partial response function call with asynchronous handler', async () => { - // Prepare - const records = [ - sqsRecordFactory('success'), - sqsRecordFactory('success'), - ]; - const batch = { Records: records }; - const processor = new BatchProcessor(EventType.SQS); - - // Act - const ret = await processPartialResponse( - batch, - asyncSqsRecordHandler, - processor - ); + const cases = [ + { + description: 'in parallel', + processingOptions: { processInParallel: true }, + }, + { + description: 'sequentially', + processingOptions: { processInParallel: false }, + }, + ]; + + describe.each(cases)('$description', ({ processingOptions }) => { + it('Process partial response function call with asynchronous handler', async () => { + // Prepare + const records = [ + sqsRecordFactory('success'), + sqsRecordFactory('success'), + ]; + const batch = { Records: records }; + const processor = new BatchProcessor(EventType.SQS); - // Assess - expect(ret).toStrictEqual({ batchItemFailures: [] }); - }); + // Act + const ret = await processPartialResponse( + batch, + asyncSqsRecordHandler, + processor, + processingOptions + ); - it('Process partial response function call with context provided', async () => { - // Prepare - const records = [ - sqsRecordFactory('success'), - sqsRecordFactory('success'), - ]; - const batch = { Records: records }; - const processor = new BatchProcessor(EventType.SQS); - - // Act - const ret = await processPartialResponse( - batch, - asyncHandlerWithContext, - processor, - options - ); + // Assess + expect(ret).toStrictEqual({ batchItemFailures: [] }); + }); - // Assess - expect(ret).toStrictEqual({ batchItemFailures: [] }); - }); + it('Process partial response function call with context provided', async () => { + // Prepare + const records = [ + sqsRecordFactory('success'), + sqsRecordFactory('success'), + ]; + const batch = { Records: records }; + const processor = new BatchProcessor(EventType.SQS); - it('Process partial response function call with asynchronous handler for full batch failure', async () => { - // Prepare - const records = [sqsRecordFactory('fail'), sqsRecordFactory('fail')]; - const batch = { Records: records }; - const processor = new BatchProcessor(EventType.SQS); + // Act + const ret = await processPartialResponse( + batch, + asyncHandlerWithContext, + processor, + { + ...processingOptions, + ...options, + } + ); - // Act & Assess - await expect( - processPartialResponse(batch, asyncSqsRecordHandler, processor) - ).rejects.toThrow(FullBatchFailureError); - }); + // Assess + expect(ret).toStrictEqual({ batchItemFailures: [] }); + }); - it('Process partial response function call with asynchronous handler for full batch failure when `throwOnFullBatchFailure` is `true`', async () => { - // Prepare - const records = [sqsRecordFactory('fail'), sqsRecordFactory('fail')]; - const batch = { Records: records }; - const processor = new BatchProcessor(EventType.SQS); + it('Process partial response function call with asynchronous handler for full batch failure', async () => { + // Prepare + const records = [sqsRecordFactory('fail'), sqsRecordFactory('fail')]; + const batch = { Records: records }; + const processor = new BatchProcessor(EventType.SQS); + + // Act & Assess + await expect( + processPartialResponse( + batch, + asyncSqsRecordHandler, + processor, + processingOptions + ) + ).rejects.toThrow(FullBatchFailureError); + }); - // Act & Assess - await expect( - processPartialResponse(batch, asyncSqsRecordHandler, processor, { - ...options, - throwOnFullBatchFailure: true, - }) - ).rejects.toThrow(FullBatchFailureError); - }); + it('Process partial response function call with asynchronous handler for full batch failure when `throwOnFullBatchFailure` is `true`', async () => { + // Prepare + const records = [sqsRecordFactory('fail'), sqsRecordFactory('fail')]; + const batch = { Records: records }; + const processor = new BatchProcessor(EventType.SQS); + + // Act & Assess + await expect( + processPartialResponse(batch, asyncSqsRecordHandler, processor, { + ...processingOptions, + ...options, + throwOnFullBatchFailure: true, + }) + ).rejects.toThrow(FullBatchFailureError); + }); - it('Process partial response function call with asynchronous handler for full batch failure when `throwOnFullBatchFailure` is `false`', async () => { - // Prepare - const records = [sqsRecordFactory('fail'), sqsRecordFactory('fail')]; - const batch = { Records: records }; - const processor = new BatchProcessor(EventType.SQS); + it('Process partial response function call with asynchronous handler for full batch failure when `throwOnFullBatchFailure` is `false`', async () => { + // Prepare + const records = [sqsRecordFactory('fail'), sqsRecordFactory('fail')]; + const batch = { Records: records }; + const processor = new BatchProcessor(EventType.SQS); - // Act - const response = await processPartialResponse( - batch, - asyncSqsRecordHandler, - processor, - { - ...options, - throwOnFullBatchFailure: false, - } - ); + // Act + const response = await processPartialResponse( + batch, + asyncSqsRecordHandler, + processor, + { + ...processingOptions, + ...options, + throwOnFullBatchFailure: false, + } + ); - // Assess - expect(response).toStrictEqual({ - batchItemFailures: [ - { itemIdentifier: records[0].messageId }, - { itemIdentifier: records[1].messageId }, - ], + // Assess + expect(response).toStrictEqual({ + batchItemFailures: [ + { itemIdentifier: records[0].messageId }, + { itemIdentifier: records[1].messageId }, + ], + }); }); }); }); describe('Process partial response function call through handler', () => { - it('Process partial response through handler with SQS event', async () => { - // Prepare - const records = [ - sqsRecordFactory('success'), - sqsRecordFactory('success'), - ]; - const processor = new BatchProcessor(EventType.SQS); - const event: SQSEvent = { Records: records }; - - const handler = async ( - event: SQSEvent, - _context: Context - ): Promise => { - return processPartialResponse(event, asyncSqsRecordHandler, processor); - }; - - // Act - const result = await handler(event, context); - - // Assess - expect(result).toStrictEqual({ batchItemFailures: [] }); - }); - - it('Process partial response through handler with Kinesis event', async () => { - // Prepare - const records = [ - kinesisRecordFactory('success'), - kinesisRecordFactory('success'), - ]; - const processor = new BatchProcessor(EventType.KinesisDataStreams); - const event: KinesisStreamEvent = { Records: records }; - - const handler = async ( - event: KinesisStreamEvent, - _context: Context - ): Promise => { - return await processPartialResponse( - event, - asyncKinesisRecordHandler, - processor - ); - }; - - // Act - const result = await handler(event, context); + const cases = [ + { + description: 'in parallel', + processingOptions: { processInParallel: true }, + }, + { + description: 'sequentially', + processingOptions: { processInParallel: false }, + }, + ]; + + describe.each(cases)('$description', ({ processingOptions }) => { + it('Process partial response through handler with SQS event', async () => { + // Prepare + const records = [ + sqsRecordFactory('success'), + sqsRecordFactory('success'), + ]; + const event: SQSEvent = { Records: records }; - // Assess - expect(result).toStrictEqual({ batchItemFailures: [] }); - }); + // Act + const result = await handlerWithSqsEvent(event, processingOptions); - it('Process partial response through handler with DynamoDB event', async () => { - // Prepare - const records = [ - dynamodbRecordFactory('success'), - dynamodbRecordFactory('success'), - ]; - const processor = new BatchProcessor(EventType.DynamoDBStreams); - const event: DynamoDBStreamEvent = { Records: records }; - - const handler = async ( - event: DynamoDBStreamEvent, - _context: Context - ): Promise => { - return await processPartialResponse( - event, - asyncDynamodbRecordHandler, - processor - ); - }; + // Assess + expect(result).toStrictEqual({ batchItemFailures: [] }); + }); - // Act - const result = await handler(event, context); + it('Process partial response through handler with Kinesis event', async () => { + // Prepare + const records = [ + kinesisRecordFactory('success'), + kinesisRecordFactory('success'), + ]; + const event: KinesisStreamEvent = { Records: records }; - // Assess - expect(result).toStrictEqual({ batchItemFailures: [] }); - }); + // Act + const result = await handlerWithKinesisEvent(event, processingOptions); - it('Process partial response through handler for SQS records with incorrect event type', async () => { - // Prepare - const processor = new BatchProcessor(EventType.SQS); + // Assess + expect(result).toStrictEqual({ batchItemFailures: [] }); + }); - const handler = async ( - event: SQSEvent, - _context: Context - ): Promise => { - return await processPartialResponse( - event, - asyncSqsRecordHandler, - processor - ); - }; + it('Process partial response through handler with DynamoDB event', async () => { + // Prepare + const records = [ + dynamodbRecordFactory('success'), + dynamodbRecordFactory('success'), + ]; + const event: DynamoDBStreamEvent = { Records: records }; - try { // Act - await handler({} as unknown as SQSEvent, context); - } catch (error) { + const result = await handlerWithDynamoDBEvent(event, processingOptions); + // Assess - assert(error instanceof UnexpectedBatchTypeError); - expect(error.message).toBe( - `Unexpected batch type. Possible values are: ${Object.keys( - EventType - ).join(', ')}` - ); - } - }); + expect(result).toStrictEqual({ batchItemFailures: [] }); + }); - it('Process partial response through handler with context provided', async () => { - // Prepare - const records = [ - sqsRecordFactory('success'), - sqsRecordFactory('success'), - ]; - const processor = new BatchProcessor(EventType.SQS); - const event: SQSEvent = { Records: records }; - - const handler = async ( - event: SQSEvent, - context: Context - ): Promise => { - const options: BatchProcessingOptions = { context: context }; - - return await processPartialResponse( - event, - asyncHandlerWithContext, - processor, - options - ); - }; + it('Process partial response through handler for SQS records with incorrect event type', async () => { + try { + // Act + await handlerWithSqsEvent( + {} as unknown as SQSEvent, + processingOptions + ); + } catch (error) { + // Assess + assert(error instanceof UnexpectedBatchTypeError); + expect(error.message).toBe( + `Unexpected batch type. Possible values are: ${Object.keys( + EventType + ).join(', ')}` + ); + } + }); - // Act - const result = await handler(event, context); + it('Process partial response through handler with context provided', async () => { + // Prepare + const records = [ + sqsRecordFactory('success'), + sqsRecordFactory('success'), + ]; + const event: SQSEvent = { Records: records }; - // Assess - expect(result).toStrictEqual({ batchItemFailures: [] }); - }); + // Act + const result = await handlerWithSqsEvent(event, { + context, + ...processingOptions, + }); - it('Process partial response through handler for full batch failure', async () => { - // Prepare - const records = [sqsRecordFactory('fail'), sqsRecordFactory('fail')]; - const processor = new BatchProcessor(EventType.SQS); - const event: SQSEvent = { Records: records }; - - const handler = async ( - event: SQSEvent, - _context: Context - ): Promise => { - return processPartialResponse(event, asyncSqsRecordHandler, processor); - }; - - // Act & Assess - await expect(handler(event, context)).rejects.toThrow( - FullBatchFailureError - ); - }); + // Assess + expect(result).toStrictEqual({ batchItemFailures: [] }); + }); - it('Process partial response through handler for full batch failure when `throwOnFullBatchFailure` is `true`', async () => { - // Prepare - const records = [sqsRecordFactory('fail'), sqsRecordFactory('fail')]; - const processor = new BatchProcessor(EventType.SQS); - const event: SQSEvent = { Records: records }; - - const handler = async ( - event: SQSEvent, - _context: Context - ): Promise => { - return processPartialResponse(event, asyncSqsRecordHandler, processor, { - ...options, - throwOnFullBatchFailure: true, - }); - }; + it('Process partial response through handler for full batch failure', async () => { + // Prepare + const records = [sqsRecordFactory('fail'), sqsRecordFactory('fail')]; + const event: SQSEvent = { Records: records }; - // Act & Assess - await expect(handler(event, context)).rejects.toThrow( - FullBatchFailureError - ); - }); + // Act & Assess + await expect( + handlerWithSqsEvent(event, processingOptions) + ).rejects.toThrow(FullBatchFailureError); + }); + + it('Process partial response through handler for full batch failure when `throwOnFullBatchFailure` is `true`', async () => { + // Prepare + const records = [sqsRecordFactory('fail'), sqsRecordFactory('fail')]; + const event: SQSEvent = { Records: records }; + + // Act & Assess + await expect( + handlerWithSqsEvent(event, { + ...options, + ...processingOptions, + throwOnFullBatchFailure: true, + }) + ).rejects.toThrow(FullBatchFailureError); + }); - it('Process partial response through handler for full batch failure when `throwOnFullBatchFailure` is `false`', async () => { - // Prepare - const records = [sqsRecordFactory('fail'), sqsRecordFactory('fail')]; - const processor = new BatchProcessor(EventType.SQS); - const event: SQSEvent = { Records: records }; - - const handler = async ( - event: SQSEvent, - _context: Context - ): Promise => { - return processPartialResponse(event, asyncSqsRecordHandler, processor, { + it('Process partial response through handler for full batch failure when `throwOnFullBatchFailure` is `false`', async () => { + // Prepare + const records = [sqsRecordFactory('fail'), sqsRecordFactory('fail')]; + const event: SQSEvent = { Records: records }; + + // Act + const response = await handlerWithSqsEvent(event, { ...options, + ...processingOptions, throwOnFullBatchFailure: false, }); - }; - - // Act - const response = await handler(event, context); - // Assess - expect(response).toStrictEqual({ - batchItemFailures: [ - { itemIdentifier: records[0].messageId }, - { itemIdentifier: records[1].messageId }, - ], + // Assess + expect(response).toStrictEqual({ + batchItemFailures: [ + { itemIdentifier: records[0].messageId }, + { itemIdentifier: records[1].messageId }, + ], + }); }); }); }); From 6b65ab4473057527ad5f2f4a3752a8ab54ff62a3 Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Fri, 27 Sep 2024 17:15:29 +0200 Subject: [PATCH 38/52] test(logger): migrate to vitest & custom matchers (#3131) Co-authored-by: Alexander Schueren --- ...sable-run-linting-check-and-unit-tests.yml | 11 +- .husky/pre-push | 1 - packages/logger/package.json | 7 +- packages/logger/src/Logger.ts | 5 +- packages/logger/tests/tsconfig.json | 10 +- .../logger/tests/unit/configFromEnv.test.ts | 8 +- packages/logger/tests/unit/formatters.test.ts | 79 +++++------ .../tests/unit/initializeLogger.test.ts | 74 +++++----- .../tests/unit/injectLambdaContext.test.ts | 44 +++--- packages/logger/tests/unit/logEvent.test.ts | 35 ++--- packages/logger/tests/unit/logLevels.test.ts | 60 ++++++--- packages/logger/tests/unit/sampling.test.ts | 26 ++-- .../logger/tests/unit/workingWithkeys.test.ts | 127 ++++++++++-------- packages/logger/vitest.config.ts | 8 ++ packages/testing/src/setupEnv.ts | 96 ++++++++++++- vitest.config.ts | 2 +- 16 files changed, 354 insertions(+), 239 deletions(-) create mode 100644 packages/logger/vitest.config.ts diff --git a/.github/workflows/reusable-run-linting-check-and-unit-tests.yml b/.github/workflows/reusable-run-linting-check-and-unit-tests.yml index b6e8a36e95..9f5e7354de 100644 --- a/.github/workflows/reusable-run-linting-check-and-unit-tests.yml +++ b/.github/workflows/reusable-run-linting-check-and-unit-tests.yml @@ -43,9 +43,10 @@ jobs: workspace: [ "packages/batch", "packages/commons", - "packages/jmespath", + "packages/event-handler", "packages/idempotency", - "packages/event-handler" + "packages/jmespath", + "packages/logger", ] fail-fast: false steps: @@ -88,15 +89,13 @@ jobs: nodeVersion: ${{ matrix.version }} - name: Run linting run: | - npm run lint -w packages/logger \ - -w packages/tracer \ + npm run lint -w -w packages/tracer \ -w packages/metrics \ -w packages/parameters \ -w packages/parser - name: Run unit tests run: | - npm t -w packages/logger \ - -w packages/tracer \ + npm t -w packages/tracer \ -w packages/metrics \ -w packages/parameters \ -w packages/parser diff --git a/.husky/pre-push b/.husky/pre-push index 29e324aa7b..2b304916c9 100755 --- a/.husky/pre-push +++ b/.husky/pre-push @@ -1,5 +1,4 @@ npm t \ - -w packages/logger \ -w packages/metrics \ -w packages/tracer \ -w packages/parameters \ diff --git a/packages/logger/package.json b/packages/logger/package.json index 56272630ea..79e27f5ff1 100644 --- a/packages/logger/package.json +++ b/packages/logger/package.json @@ -10,9 +10,10 @@ "access": "public" }, "scripts": { - "test": "npm run test:unit", - "test:unit": "jest --group=unit --detectOpenHandles --coverage --verbose", - "jest": "jest --detectOpenHandles --verbose", + "test": "vitest --run tests/unit", + "test:unit": "vitest --run tests/unit", + "test:unit:coverage": "vitest --run tests/unit --coverage.enabled --coverage.thresholds.100 --coverage.include='src/**'", + "test:unit:types": "echo 'Not Implemented'", "test:e2e:nodejs18x": "RUNTIME=nodejs18x jest --group=e2e", "test:e2e:nodejs20x": "RUNTIME=nodejs20x jest --group=e2e", "test:e2e": "jest --group=e2e", diff --git a/packages/logger/src/Logger.ts b/packages/logger/src/Logger.ts index de806ac146..647f5e4ada 100644 --- a/packages/logger/src/Logger.ts +++ b/packages/logger/src/Logger.ts @@ -418,8 +418,7 @@ class Logger extends Utility implements LoggerInterface { /** * @deprecated This method is deprecated and will be removed in the future major versions. Use {@link resetKeys()} instead. */ - /* istanbul ignore next */ - public static injectLambdaContextAfterOrOnError( + /* v8 ignore start */ public static injectLambdaContextAfterOrOnError( logger: Logger, _persistentAttributes: LogAttributes, options?: InjectLambdaContextOptions @@ -427,7 +426,7 @@ class Logger extends Utility implements LoggerInterface { if (options && (options.clearState || options?.resetKeys)) { logger.resetKeys(); } - } + } /* v8 ignore stop */ /** * @deprecated - This method is deprecated and will be removed in the next major version. diff --git a/packages/logger/tests/tsconfig.json b/packages/logger/tests/tsconfig.json index 45ba862a85..195239b807 100644 --- a/packages/logger/tests/tsconfig.json +++ b/packages/logger/tests/tsconfig.json @@ -1,8 +1,12 @@ { "extends": "../tsconfig.json", "compilerOptions": { - "rootDir": "../", + "rootDir": "../../", "noEmit": true }, - "include": ["../src/**/*", "./**/*"] -} + "include": [ + "../../testing/src/setupEnv.ts", + "../src/**/*", + "./**/*" + ] +} \ No newline at end of file diff --git a/packages/logger/tests/unit/configFromEnv.test.ts b/packages/logger/tests/unit/configFromEnv.test.ts index 905f343e66..87cf414d31 100644 --- a/packages/logger/tests/unit/configFromEnv.test.ts +++ b/packages/logger/tests/unit/configFromEnv.test.ts @@ -1,16 +1,10 @@ -/** - * Test Logger EnvironmentVariablesService class - * - * @group unit/logger/config - */ -import { beforeEach, describe, expect, it, jest } from '@jest/globals'; +import { beforeEach, describe, expect, it } from 'vitest'; import { EnvironmentVariablesService } from '../../src/config/EnvironmentVariablesService.js'; describe('Class: EnvironmentVariablesService', () => { const ENVIRONMENT_VARIABLES = process.env; beforeEach(() => { - jest.resetModules(); process.env = { ...ENVIRONMENT_VARIABLES }; }); diff --git a/packages/logger/tests/unit/formatters.test.ts b/packages/logger/tests/unit/formatters.test.ts index 7bdde1ff4d..3250b95d69 100644 --- a/packages/logger/tests/unit/formatters.test.ts +++ b/packages/logger/tests/unit/formatters.test.ts @@ -1,17 +1,5 @@ -/** - * Test Logger formatter - * - * @group unit/logger/logFormatter - */ import { AssertionError } from 'node:assert'; -import { - afterAll, - beforeEach, - describe, - expect, - it, - jest, -} from '@jest/globals'; +import { afterAll, beforeEach, describe, expect, it, vi } from 'vitest'; import { EnvironmentVariablesService } from '../../src/config/EnvironmentVariablesService.js'; import { PowertoolsLogFormatter } from '../../src/formatter/PowertoolsLogFormatter.js'; import { @@ -73,8 +61,6 @@ const unformattedAttributes: UnformattedAttributes = { process.env.POWERTOOLS_DEV = 'true'; -const logSpy = jest.spyOn(console, 'info'); - const logger = new Logger(); const jsonReplacerFn: CustomJsonReplacerFn = (_: string, value: unknown) => @@ -120,14 +106,13 @@ describe('Formatters', () => { beforeEach(() => { process.env = { ...ENVIRONMENT_VARIABLES }; const mockDate = new Date(1466424490000); - jest.useFakeTimers().setSystemTime(mockDate); - jest.resetAllMocks(); + vi.useFakeTimers().setSystemTime(mockDate); + vi.resetAllMocks(); unformattedAttributes.timestamp = mockDate; }); afterAll(() => { - jest.useRealTimers(); - unformattedAttributes.timestamp = new Date(); + vi.useRealTimers(); }); // #region base log keys @@ -477,7 +462,7 @@ describe('Formatters', () => { Difference between UTC and `America/New_York`(GMT -04.00) is 240 minutes. The positive value indicates that `America/New_York` is behind UTC. */ - jest.spyOn(Date.prototype, 'getTimezoneOffset').mockReturnValue(240); + vi.spyOn(Date.prototype, 'getTimezoneOffset').mockReturnValue(240); // Act const timestamp = formatterWithEnv.formatTimestamp(new Date()); @@ -493,7 +478,7 @@ describe('Formatters', () => { Difference between UTC and `America/New_York`(GMT -04.00) is 240 minutes. The positive value indicates that `America/New_York` is behind UTC. */ - jest.spyOn(Date.prototype, 'getTimezoneOffset').mockReturnValue(240); + vi.spyOn(Date.prototype, 'getTimezoneOffset').mockReturnValue(240); // Act const timestamp = formatterWithEnv.formatTimestamp(new Date()); @@ -509,7 +494,7 @@ describe('Formatters', () => { Difference between UTC and `America/New_York`(GMT -04.00) is 240 minutes. The positive value indicates that `America/New_York` is behind UTC. */ - jest.spyOn(Date.prototype, 'getTimezoneOffset').mockReturnValue(240); + vi.spyOn(Date.prototype, 'getTimezoneOffset').mockReturnValue(240); // Act const timestamp = formatterWithEnv.formatTimestamp(new Date()); @@ -521,12 +506,12 @@ describe('Formatters', () => { it('it formats the timestamp to ISO 8601 with correct milliseconds for `Asia/Dhaka` timezone', () => { // Prepare process.env.TZ = 'Asia/Dhaka'; - jest.useFakeTimers().setSystemTime(new Date('2016-06-20T12:08:10.910Z')); + vi.setSystemTime(new Date('2016-06-20T12:08:10.910Z')); /* Difference between UTC and `Asia/Dhaka`(GMT +06.00) is 360 minutes. The negative value indicates that `Asia/Dhaka` is ahead of UTC. */ - jest.spyOn(Date.prototype, 'getTimezoneOffset').mockReturnValue(-360); + vi.spyOn(Date.prototype, 'getTimezoneOffset').mockReturnValue(-360); const formatter = new PowertoolsLogFormatter({ envVarsService: new EnvironmentVariablesService(), }); @@ -542,12 +527,12 @@ describe('Formatters', () => { // Prepare process.env.TZ = 'Asia/Dhaka'; const mockDate = new Date('2016-06-20T20:08:10.910Z'); - jest.useFakeTimers().setSystemTime(mockDate); + vi.setSystemTime(mockDate); /* Difference between UTC and `Asia/Dhaka`(GMT +06.00) is 360 minutes. The negative value indicates that `Asia/Dhaka` is ahead of UTC. */ - jest.spyOn(Date.prototype, 'getTimezoneOffset').mockReturnValue(-360); + vi.spyOn(Date.prototype, 'getTimezoneOffset').mockReturnValue(-360); const formatter = new PowertoolsLogFormatter({ envVarsService: new EnvironmentVariablesService(), }); @@ -566,7 +551,7 @@ describe('Formatters', () => { Difference between UTC and `Asia/Dhaka`(GMT +06.00) is 360 minutes. The negative value indicates that `Asia/Dhaka` is ahead of UTC. */ - jest.spyOn(Date.prototype, 'getTimezoneOffset').mockReturnValue(-360); + vi.spyOn(Date.prototype, 'getTimezoneOffset').mockReturnValue(-360); const formatter = new PowertoolsLogFormatter(); // Act @@ -579,7 +564,7 @@ describe('Formatters', () => { it('defaults to :UTC when the TZ env variable is set to :/etc/localtime', () => { // Prepare process.env.TZ = ':/etc/localtime'; - jest.spyOn(Date.prototype, 'getTimezoneOffset').mockReturnValue(0); + vi.spyOn(Date.prototype, 'getTimezoneOffset').mockReturnValue(0); const formatter = new PowertoolsLogFormatter({ envVarsService: new EnvironmentVariablesService(), }); @@ -676,8 +661,9 @@ describe('Formatters', () => { logger.info('foo', { circularObject }); // Assess - expect(logSpy).toHaveBeenCalledTimes(1); - expect(JSON.parse(logSpy.mock.calls[0][0])).toEqual( + expect(console.info).toHaveBeenCalledTimes(1); + expect(console.info).toHaveLoggedNth( + 1, expect.objectContaining({ level: 'INFO', message: 'foo', @@ -696,8 +682,9 @@ describe('Formatters', () => { logger.info('foo', bigIntValue); // Assess - expect(logSpy).toHaveBeenCalledTimes(1); - expect(JSON.parse(logSpy.mock.calls[0][0])).toEqual( + expect(console.info).toHaveBeenCalledTimes(1); + expect(console.info).toHaveLoggedNth( + 1, expect.objectContaining({ level: 'INFO', message: 'foo', @@ -720,8 +707,9 @@ describe('Formatters', () => { logger.info('foo', values); // Assess - expect(logSpy).toHaveBeenCalledTimes(1); - expect(JSON.parse(logSpy.mock.calls[0][0])).toEqual( + expect(console.info).toHaveBeenCalledTimes(1); + expect(console.info).toHaveLoggedNth( + 1, expect.objectContaining({ level: 'INFO', message: 'foo', @@ -738,8 +726,9 @@ describe('Formatters', () => { loggerWithReplacer.info('foo', valueWithSet); // Assess - expect(logSpy).toHaveBeenCalledTimes(1); - expect(JSON.parse(logSpy.mock.calls[0][0])).toEqual( + expect(console.info).toHaveBeenCalledTimes(1); + expect(console.info).toHaveLoggedNth( + 1, expect.objectContaining({ level: 'INFO', message: 'foo', @@ -759,8 +748,9 @@ describe('Formatters', () => { loggerWithReplacer.info('foo', valueWithSetAndBigInt); // Assess - expect(logSpy).toHaveBeenCalledTimes(1); - expect(JSON.parse(logSpy.mock.calls[0][0])).toEqual( + expect(console.info).toHaveBeenCalledTimes(1); + expect(console.info).toHaveLoggedNth( + 1, expect.objectContaining({ level: 'INFO', message: 'foo', @@ -778,8 +768,9 @@ describe('Formatters', () => { childLogger.info('foo', { foo: new Set([1, 2]) }); // Assess - expect(logSpy).toHaveBeenCalledTimes(1); - expect(JSON.parse(logSpy.mock.calls[0][0])).toEqual( + expect(console.info).toHaveBeenCalledTimes(1); + expect(console.info).toHaveLoggedNth( + 1, expect.objectContaining({ level: 'INFO', message: 'foo', @@ -795,8 +786,8 @@ describe('Formatters', () => { loggerWithCustomLogFormatter.info('foo'); // Assess - expect(logSpy).toHaveBeenCalledTimes(1); - expect(JSON.parse(logSpy.mock.calls[0][0])).toEqual({ + expect(console.info).toHaveBeenCalledTimes(1); + expect(console.info).toHaveLoggedNth(1, { logLevel: 12, message: 'foo', timestamp: expect.any(String), @@ -811,8 +802,8 @@ describe('Formatters', () => { childLogger.info('foo'); // Assess - expect(logSpy).toHaveBeenCalledTimes(1); - expect(JSON.parse(logSpy.mock.calls[0][0])).toEqual({ + expect(console.info).toHaveBeenCalledTimes(1); + expect(console.info).toHaveLoggedNth(1, { logLevel: 12, message: 'foo', timestamp: expect.any(String), diff --git a/packages/logger/tests/unit/initializeLogger.test.ts b/packages/logger/tests/unit/initializeLogger.test.ts index 4cc6310fcc..28bc5aa942 100644 --- a/packages/logger/tests/unit/initializeLogger.test.ts +++ b/packages/logger/tests/unit/initializeLogger.test.ts @@ -1,20 +1,13 @@ -/** - * Logger log levels tests - * - * @group unit/logger/logger/logLevels - */ -import { beforeEach, describe, expect, it, jest } from '@jest/globals'; +import { type Mock, beforeEach, describe, expect, it, vi } from 'vitest'; import { Logger } from '../../src/Logger.js'; import { LogJsonIndent, LogLevel } from '../../src/constants.js'; -const logSpy = jest.spyOn(console, 'info'); - describe('Log levels', () => { const ENVIRONMENT_VARIABLES = process.env; beforeEach(() => { process.env = { ...ENVIRONMENT_VARIABLES, POWERTOOLS_DEV: 'true' }; - jest.resetAllMocks(); + vi.resetAllMocks(); }); it('uses the default service name when none is provided', () => { @@ -26,8 +19,9 @@ describe('Log levels', () => { logger.info('Hello, world!'); // Assess - expect(logSpy).toHaveBeenCalledTimes(1); - expect(JSON.parse(logSpy.mock.calls[0][0])).toStrictEqual( + expect(console.info).toHaveBeenCalledTimes(1); + expect(console.info).toHaveLoggedNth( + 1, expect.objectContaining({ service: 'service_undefined' }) ); }); @@ -41,8 +35,9 @@ describe('Log levels', () => { logger.info('Hello, world!'); // Assess - expect(logSpy).toHaveBeenCalledTimes(1); - expect(JSON.parse(logSpy.mock.calls[0][0])).toStrictEqual( + expect(console.info).toHaveBeenCalledTimes(1); + expect(console.info).toHaveLoggedNth( + 1, expect.objectContaining({ service: 'hello-world' }) ); }); @@ -56,8 +51,9 @@ describe('Log levels', () => { logger.info('Hello, world!'); // Assess - expect(logSpy).toHaveBeenCalledTimes(1); - expect(JSON.parse(logSpy.mock.calls[0][0])).toStrictEqual( + expect(console.info).toHaveBeenCalledTimes(1); + expect(console.info).toHaveLoggedNth( + 1, expect.objectContaining({ service: 'hello-world' }) ); }); @@ -72,15 +68,15 @@ describe('Log levels', () => { childLogger.info('Hello, world!'); // Assess - expect(logSpy).toHaveBeenCalledTimes(1); - expect(JSON.parse(logSpy.mock.calls[0][0])).toStrictEqual( + expect(console.info).toHaveBeenCalledTimes(1); + expect(console.info).toHaveLoggedNth( + 1, expect.objectContaining({ service: 'child-service' }) ); }); it('creates a child logger that is distinct from the parent logger', () => { // Prepare - const debugSpy = jest.spyOn(console, 'debug'); const logger = new Logger({ logLevel: LogLevel.CRITICAL }); const childLogger = logger.createChild({ logLevel: LogLevel.DEBUG, @@ -93,8 +89,9 @@ describe('Log levels', () => { childLogger.debug('Hello, world!'); // Assess - expect(debugSpy).toHaveBeenCalledTimes(1); - expect(JSON.parse(debugSpy.mock.calls[0][0])).toStrictEqual( + expect(console.debug).toHaveBeenCalledTimes(1); + expect(console.debug).toHaveLoggedNth( + 1, expect.objectContaining({ service: 'child-service', foo: 'bar', @@ -105,15 +102,6 @@ describe('Log levels', () => { it('`logRecordOrder` should be passed down to child logger', () => { // Prepare - const logger = new Logger({ logRecordOrder: ['service', 'timestamp'] }); - const childLogger = logger.createChild({ serviceName: 'child-service' }); - - // Act - logger.info('Hello, world!'); - childLogger.info('Hello, world from child!'); - - // Assess - expect(logSpy).toHaveBeenCalledTimes(2); const expectedKeys = [ 'service', 'timestamp', @@ -122,9 +110,19 @@ describe('Log levels', () => { 'sampling_rate', 'xray_trace_id', ]; - logSpy.mock.calls.forEach((call, index) => { - expect(Object.keys(JSON.parse(call[0]))).toEqual(expectedKeys); - }); + const logger = new Logger({ logRecordOrder: ['service', 'timestamp'] }); + const childLogger = logger.createChild({ serviceName: 'child-service' }); + + // Act + logger.info('Hello, world!'); + childLogger.info('Hello, world from child!'); + + // Assess + expect(console.info).toHaveBeenCalledTimes(2); + // For this test don't care about the values, just the order of the keys + const calls = (console.info as Mock).mock.calls; + expect(Object.keys(JSON.parse(calls[0][0]))).toEqual(expectedKeys); + expect(Object.keys(JSON.parse(calls[1][0]))).toEqual(expectedKeys); }); it("doesn't use the global console object by default", () => { @@ -140,29 +138,29 @@ describe('Log levels', () => { it('uses pretty print when POWERTOOLS_DEV is set', () => { // Prepare const mockDate = new Date(1466424490000); - jest.useFakeTimers().setSystemTime(mockDate); + vi.useFakeTimers().setSystemTime(mockDate); const logger = new Logger(); // Act logger.info('Hello, world!'); // Assess - expect(logSpy).toHaveBeenCalledTimes(1); - expect(logSpy).toHaveBeenCalledWith( + expect(console.info).toHaveBeenCalledTimes(1); + expect(console.info).toHaveBeenCalledWith( JSON.stringify( { level: 'INFO', message: 'Hello, world!', sampling_rate: 0, - service: 'hello-world', + service: 'service_undefined', timestamp: '2016-06-20T12:08:10.000Z', - xray_trace_id: '1-5759e988-bd862e3fe1be46a994272793', + xray_trace_id: '1-abcdef12-3456abcdef123456abcdef12', }, null, LogJsonIndent.PRETTY ) ); - jest.useRealTimers(); + vi.useRealTimers(); }); }); diff --git a/packages/logger/tests/unit/injectLambdaContext.test.ts b/packages/logger/tests/unit/injectLambdaContext.test.ts index edff5790a5..07a76e151d 100644 --- a/packages/logger/tests/unit/injectLambdaContext.test.ts +++ b/packages/logger/tests/unit/injectLambdaContext.test.ts @@ -1,12 +1,7 @@ -/** - * Logger injectLambdaContext tests - * - * @group unit/logger/logger/injectLambdaContext - */ import context from '@aws-lambda-powertools/testing-utils/context'; -import { beforeEach, describe, expect, it, jest } from '@jest/globals'; import middy from '@middy/core'; import type { Context } from 'aws-lambda'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; import { Logger } from '../../src/Logger.js'; import { injectLambdaContext } from '../../src/middleware/middy.js'; @@ -23,8 +18,6 @@ const getContextLogEntries = (overrides?: Record) => ({ ...overrides, }); -const logSpy = jest.spyOn(console, 'info'); - describe('Inject Lambda Context', () => { const ENVIRONMENT_VARIABLES = process.env; @@ -33,7 +26,7 @@ describe('Inject Lambda Context', () => { ...ENVIRONMENT_VARIABLES, POWERTOOLS_DEV: 'true', }; - jest.resetAllMocks(); + vi.resetAllMocks(); }); it('adds the context to log messages when the feature is enabled', () => { @@ -45,8 +38,9 @@ describe('Inject Lambda Context', () => { logger.info('Hello, world!'); // Assess - expect(logSpy).toHaveBeenCalledTimes(1); - expect(JSON.parse(logSpy.mock.calls[0][0])).toStrictEqual( + expect(console.info).toHaveBeenCalledTimes(1); + expect(console.info).toHaveLoggedNth( + 1, expect.objectContaining({ message: 'Hello, world!', ...getContextLogEntries(), @@ -68,8 +62,9 @@ describe('Inject Lambda Context', () => { logger.info('Hello, world!'); // Assess - expect(logSpy).toHaveBeenCalledTimes(2); - expect(JSON.parse(logSpy.mock.calls[1][0])).toStrictEqual( + expect(console.info).toHaveBeenCalledTimes(2); + expect(console.info).toHaveLoggedNth( + 2, expect.objectContaining({ message: 'Hello, world!', ...getContextLogEntries({ @@ -91,8 +86,9 @@ describe('Inject Lambda Context', () => { await handler(event, context); // Assess - expect(logSpy).toHaveBeenCalledTimes(1); - expect(JSON.parse(logSpy.mock.calls[0][0])).toStrictEqual( + expect(console.info).toHaveBeenCalledTimes(1); + expect(console.info).toHaveLoggedNth( + 1, expect.objectContaining({ message: 'Hello, world!', ...getContextLogEntries(), @@ -113,15 +109,17 @@ describe('Inject Lambda Context', () => { await handler(event, context); // Assess - expect(logSpy).toHaveBeenCalledTimes(2); - expect(JSON.parse(logSpy.mock.calls[0][0])).toStrictEqual( + expect(console.info).toHaveBeenCalledTimes(2); + expect(console.info).toHaveLoggedNth( + 1, expect.objectContaining({ message: 'Hello, world!', service: 'parent', ...getContextLogEntries(), }) ); - expect(JSON.parse(logSpy.mock.calls[1][0])).toStrictEqual( + expect(console.info).toHaveLoggedNth( + 2, expect.objectContaining({ message: 'Hello, world!', service: 'child', @@ -156,8 +154,9 @@ describe('Inject Lambda Context', () => { await handler(event, context); // Assess - expect(logSpy).toHaveBeenCalledTimes(1); - expect(JSON.parse(logSpy.mock.calls[0][0])).toStrictEqual( + expect(console.info).toHaveBeenCalledTimes(1); + expect(console.info).toHaveLoggedNth( + 1, expect.objectContaining({ message: 'Hello, world!', ...getContextLogEntries(), @@ -175,8 +174,9 @@ describe('Inject Lambda Context', () => { childLogger.info('Hello, world!'); // Assess - expect(logSpy).toHaveBeenCalledTimes(1); - expect(JSON.parse(logSpy.mock.calls[0][0])).toStrictEqual( + expect(console.info).toHaveBeenCalledTimes(1); + expect(console.info).toHaveLoggedNth( + 1, expect.objectContaining({ message: 'Hello, world!', service: 'child', diff --git a/packages/logger/tests/unit/logEvent.test.ts b/packages/logger/tests/unit/logEvent.test.ts index 2ac66c11ef..17ed444534 100644 --- a/packages/logger/tests/unit/logEvent.test.ts +++ b/packages/logger/tests/unit/logEvent.test.ts @@ -1,12 +1,7 @@ -/** - * Logger log event tests - * - * @group unit/logger/logger/logEvent - */ import context from '@aws-lambda-powertools/testing-utils/context'; -import { beforeEach, describe, expect, it, jest } from '@jest/globals'; import middy from '@middy/core'; import type { Context } from 'aws-lambda'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; import { Logger } from '../../src/Logger.js'; import { injectLambdaContext } from '../../src/middleware/middy.js'; @@ -14,8 +9,6 @@ const event = { foo: 'bar', }; -const logSpy = jest.spyOn(console, 'info'); - describe('Log event', () => { const ENVIRONMENT_VARIABLES = process.env; @@ -25,7 +18,7 @@ describe('Log event', () => { POWERTOOLS_LOGGER_LOG_EVENT: 'true', POWERTOOLS_DEV: 'true', }; - jest.resetAllMocks(); + vi.resetAllMocks(); }); it('logs the event with the correct log level and message', () => { @@ -36,10 +29,8 @@ describe('Log event', () => { logger.logEventIfEnabled(event); // Assess - expect(logSpy).toHaveBeenCalledTimes(1); - expect(JSON.parse(logSpy.mock.calls[0][0])).toStrictEqual( - expect.objectContaining({ event }) - ); + expect(console.info).toHaveBeenCalledTimes(1); + expect(console.info).toHaveLoggedNth(1, expect.objectContaining({ event })); }); it("doesn't log the event when the feature is disabled", () => { @@ -51,7 +42,7 @@ describe('Log event', () => { logger.logEventIfEnabled(event); // Assess - expect(logSpy).not.toHaveBeenCalled(); + expect(console.info).not.toHaveBeenCalled(); }); it('respects the overwrite flag when provided', () => { @@ -62,7 +53,7 @@ describe('Log event', () => { logger.logEventIfEnabled(event, false); // Assess - expect(logSpy).not.toHaveBeenCalled(); + expect(console.info).not.toHaveBeenCalled(); }); it('logs the event when logEvent is set in the Middy.js middleware', async () => { @@ -76,8 +67,9 @@ describe('Log event', () => { await handler(event, context); // Assess - expect(logSpy).toHaveBeenCalledTimes(1); - expect(JSON.parse(logSpy.mock.calls[0][0])).toStrictEqual( + expect(console.info).toHaveBeenCalledTimes(1); + expect(console.info).toHaveLoggedNth( + 1, expect.objectContaining({ event, function_arn: @@ -104,8 +96,9 @@ describe('Log event', () => { await handler(event, context); // Assess - expect(logSpy).toHaveBeenCalledTimes(1); - expect(JSON.parse(logSpy.mock.calls[0][0])).toStrictEqual( + expect(console.info).toHaveBeenCalledTimes(1); + expect(console.info).toHaveLoggedNth( + 1, expect.objectContaining({ event, function_arn: @@ -129,7 +122,7 @@ describe('Log event', () => { await handler(event, context); // Assess - expect(logSpy).toHaveBeenCalledTimes(1); + expect(console.info).toHaveBeenCalledTimes(1); }); it('passes down the log event configuration to child loggers', () => { @@ -142,6 +135,6 @@ describe('Log event', () => { childLogger.logEventIfEnabled(event); // Assess - expect(logSpy).not.toHaveBeenCalled(); + expect(console.info).not.toHaveBeenCalled(); }); }); diff --git a/packages/logger/tests/unit/logLevels.test.ts b/packages/logger/tests/unit/logLevels.test.ts index f5017436c7..1e92f302d9 100644 --- a/packages/logger/tests/unit/logLevels.test.ts +++ b/packages/logger/tests/unit/logLevels.test.ts @@ -1,11 +1,7 @@ -/** - * Logger log levels tests - * - * @group unit/logger/logger/logLevels - */ -import { beforeEach, describe, expect, it, jest } from '@jest/globals'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; import { Logger } from '../../src/Logger.js'; import { LogLevel, LogLevelThreshold } from '../../src/constants.js'; +import type { ConfigServiceInterface } from '../../src/types/ConfigServiceInterface.js'; import type { LogFunction, LogLevel as LogLevelType, @@ -38,7 +34,7 @@ describe('Log levels', () => { beforeEach(() => { process.env = { ...ENVIRONMENT_VARIABLES, POWERTOOLS_DEV: 'true' }; - jest.resetAllMocks(); + vi.resetAllMocks(); }); it('sets the correct log level when initialized with a log level', () => { @@ -96,6 +92,36 @@ describe('Log levels', () => { ); }); + it('sets the correct log level when setting the POWERTOOLS_LOG_LEVEL environment variable', () => { + // Prepare + process.env.POWERTOOLS_LOG_LEVEL = LogLevel.CRITICAL; + + // Act + const logger = new Logger(); + + // Assess + expect(logger.level).toBe(LogLevelThreshold.CRITICAL); + expect(logger.getLevelName()).toBe(LogLevel.CRITICAL); + }); + + it('sets the correct log level when using a custom config service', () => { + // Prepare + process.env.POWERTOOLS_LOG_LEVEL = undefined; + const customConfigService = { + getLogLevel: () => LogLevel.WARN, + getCurrentEnvironment: vi.fn(), + getServiceName: vi.fn(), + getSampleRateValue: vi.fn(), + } as unknown as ConfigServiceInterface; + + // Act + const logger = new Logger({ customConfigService }); + + // Assess + expect(logger.level).toBe(LogLevelThreshold.WARN); + expect(logger.getLevelName()).toBe(LogLevel.WARN); + }); + it.each([ { level: LogLevel.TRACE }, { level: LogLevel.DEBUG }, @@ -105,15 +131,17 @@ describe('Log levels', () => { { level: LogLevel.CRITICAL }, ])('logs at the correct level when calling $level()', ({ level }) => { // Prepare - const logSpy = jest.spyOn(console, getConsoleMethod(level)); + const consoleMethod = getConsoleMethod(level); const logger = new Logger({ logLevel: level }); // Act logger[level.toLowerCase() as keyof LogFunction]('foo'); // Assess - expect(logSpy).toHaveBeenCalledTimes(1); - expect(logSpy).toHaveBeenCalledWith(expect.stringContaining(level)); + expect(console[consoleMethod]).toHaveBeenCalledTimes(1); + expect(console[consoleMethod]).toHaveLogged( + expect.objectContaining({ level: level }) + ); }); it.each([ @@ -126,14 +154,14 @@ describe('Log levels', () => { "doesn't log when calling a level more verbose than the current log level ($level vs $moreVerboseLevel)", ({ level, moreVerboseLevel }) => { // Prepare - const logSpy = jest.spyOn(console, getConsoleMethod(moreVerboseLevel)); + const consoleMethod = getConsoleMethod(moreVerboseLevel); const logger = new Logger({ logLevel: level }); // Act logger[moreVerboseLevel.toLowerCase() as keyof LogFunction]('foo'); // Assess - expect(logSpy).not.toHaveBeenCalled(); + expect(console[consoleMethod]).not.toHaveBeenCalled(); } ); @@ -147,14 +175,14 @@ describe('Log levels', () => { 'logs when calling a level less verbose than the current log level ($level vs $lessVerboseLevel)', ({ level, lessVerboseLevel }) => { // Prepare - const logSpy = jest.spyOn(console, getConsoleMethod(lessVerboseLevel)); + const consoleMethod = getConsoleMethod(lessVerboseLevel); const logger = new Logger({ logLevel: level }); // Act logger[lessVerboseLevel.toLowerCase() as keyof LogFunction]('foo'); // Assess - expect(logSpy).toHaveBeenCalledTimes(1); + expect(console[consoleMethod]).toHaveBeenCalledTimes(1); } ); @@ -164,7 +192,7 @@ describe('Log levels', () => { process.env.LOG_LEVEL = undefined; process.env.POWERTOOLS_LOG_LEVEL = undefined; const logger = new Logger(); - const warningSpy = jest.spyOn(logger, 'warn'); + const warningSpy = vi.spyOn(logger, 'warn'); // Act logger.setLogLevel(LogLevel.WARN); @@ -183,7 +211,7 @@ describe('Log levels', () => { process.env.AWS_LAMBDA_LOG_LEVEL = LogLevel.INFO; process.env.LOG_LEVEL = undefined; process.env.POWERTOOLS_LOG_LEVEL = undefined; - const warningSpy = jest.spyOn(console, 'warn'); + const warningSpy = vi.spyOn(console, 'warn'); // Act const logger = new Logger({ logLevel: LogLevel.DEBUG }); diff --git a/packages/logger/tests/unit/sampling.test.ts b/packages/logger/tests/unit/sampling.test.ts index 2f8e0ce959..086be99908 100644 --- a/packages/logger/tests/unit/sampling.test.ts +++ b/packages/logger/tests/unit/sampling.test.ts @@ -1,9 +1,4 @@ -/** - * Log Sampling - * - * @group unit/logger/logger/sampling - */ -import { beforeEach, describe, expect, it, jest } from '@jest/globals'; +import { beforeEach, describe, expect, it } from 'vitest'; import { EnvironmentVariablesService } from '../../src/config/EnvironmentVariablesService.js'; import { LogLevel, LogLevelThreshold, Logger } from '../../src/index.js'; @@ -20,8 +15,6 @@ class CustomConfigService extends EnvironmentVariablesService { } } -const logSpy = jest.spyOn(console, 'info'); - describe('Log sampling', () => { const ENVIRONMENT_VARIABLES = process.env; @@ -30,16 +23,16 @@ describe('Log sampling', () => { }); it('informs the customer that sample rate is setting the level to DEBUG', () => { - // Prepare - const debugSpy = jest.spyOn(console, 'debug'); - // Act new Logger({ sampleRateValue: 1, logLevel: LogLevel.CRITICAL }); // Assess - expect(debugSpy).toHaveBeenCalledTimes(1); - expect(debugSpy).toHaveBeenCalledWith( - expect.stringContaining('Setting log level to DEBUG due to sampling rate') + expect(console.debug).toHaveBeenCalledTimes(1); + expect(console.debug).toHaveLoggedNth( + 1, + expect.objectContaining({ + message: 'Setting log level to DEBUG due to sampling rate', + }) ); }); @@ -172,8 +165,9 @@ describe('Log sampling', () => { childLogger.info('Hello, world!'); // Assess - expect(logSpy).toHaveBeenCalledTimes(1); - expect(JSON.parse(logSpy.mock.calls[0][0])).toStrictEqual( + expect(console.info).toHaveBeenCalledTimes(1); + expect(console.info).toHaveLoggedNth( + 1, expect.objectContaining({ sampling_rate: 0.5 }) ); }); diff --git a/packages/logger/tests/unit/workingWithkeys.test.ts b/packages/logger/tests/unit/workingWithkeys.test.ts index 976ef9aba5..15c8da50d2 100644 --- a/packages/logger/tests/unit/workingWithkeys.test.ts +++ b/packages/logger/tests/unit/workingWithkeys.test.ts @@ -1,18 +1,11 @@ -/** - * Logger working with keys tests - * - * @group unit/logger/logger/keys - */ import context from '@aws-lambda-powertools/testing-utils/context'; -import { beforeEach, describe, expect, it, jest } from '@jest/globals'; import middy from '@middy/core'; import type { Context } from 'aws-lambda'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; import { Logger } from '../../src/Logger.js'; import { injectLambdaContext } from '../../src/middleware/middy.js'; import type { ConstructorOptions } from '../../src/types/Logger.js'; -const logSpy = jest.spyOn(console, 'info'); - describe('Working with keys', () => { const ENVIRONMENT_VARIABLES = process.env; @@ -21,7 +14,7 @@ describe('Working with keys', () => { ...ENVIRONMENT_VARIABLES, POWERTOOLS_DEV: 'true', }; - jest.resetAllMocks(); + vi.resetAllMocks(); }); it.each([ @@ -127,10 +120,8 @@ describe('Working with keys', () => { logger.info(...inputs); // Assess - expect(logSpy).toHaveBeenCalledTimes(1); - expect(JSON.parse(logSpy.mock.calls[0][0])).toStrictEqual( - expect.objectContaining(expected) - ); + expect(console.info).toHaveBeenCalledTimes(1); + expect(console.info).toHaveLoggedNth(1, expect.objectContaining(expected)); }); it('adds the temporary keys to log messages', () => { @@ -145,14 +136,16 @@ describe('Working with keys', () => { logger.info('Hello, world!'); // Assess - expect(logSpy).toHaveBeenCalledTimes(2); - expect(JSON.parse(logSpy.mock.calls[0][0])).toStrictEqual( + expect(console.info).toHaveBeenCalledTimes(2); + expect(console.info).toHaveLoggedNth( + 1, expect.objectContaining({ message: 'Hello, world!', foo: 'bar', }) ); - expect(JSON.parse(logSpy.mock.calls[1][0])).toStrictEqual( + expect(console.info).toHaveLoggedNth( + 2, expect.objectContaining({ message: 'Hello, world!', foo: 'bar', @@ -175,14 +168,16 @@ describe('Working with keys', () => { logger.info('Hello, world!'); // Assess - expect(logSpy).toHaveBeenCalledTimes(2); - expect(JSON.parse(logSpy.mock.calls[0][0])).toStrictEqual( + expect(console.info).toHaveBeenCalledTimes(2); + expect(console.info).toHaveLoggedNth( + 1, expect.objectContaining({ message: 'Hello, world!', foo: 'bar', }) ); - expect(JSON.parse(logSpy.mock.calls[1][0])).toStrictEqual( + expect(console.info).toHaveLoggedNth( + 2, expect.objectContaining({ message: 'Hello, world!', foo: 'baz', @@ -203,14 +198,16 @@ describe('Working with keys', () => { logger.info('Hello, world!'); // Assess - expect(logSpy).toHaveBeenCalledTimes(2); - expect(JSON.parse(logSpy.mock.calls[0][0])).toStrictEqual( + expect(console.info).toHaveBeenCalledTimes(2); + expect(console.info).toHaveLoggedNth( + 1, expect.objectContaining({ message: 'Hello, world!', foo: 'bar', }) ); - expect(JSON.parse(logSpy.mock.calls[1][0])).toStrictEqual( + expect(console.info).toHaveLoggedNth( + 2, expect.not.objectContaining({ foo: 'bar', }) @@ -229,8 +226,9 @@ describe('Working with keys', () => { logger.info('Hello, world!'); // Assess - expect(logSpy).toHaveBeenCalledTimes(1); - expect(JSON.parse(logSpy.mock.calls[0][0])).toStrictEqual( + expect(console.info).toHaveBeenCalledTimes(1); + expect(console.info).toHaveLoggedNth( + 1, expect.objectContaining({ message: 'Hello, world!', foo: 'bar', @@ -250,8 +248,9 @@ describe('Working with keys', () => { logger.info('Hello, world!'); // Assess - expect(logSpy).toHaveBeenCalledTimes(1); - expect(JSON.parse(logSpy.mock.calls[0][0])).toStrictEqual( + expect(console.info).toHaveBeenCalledTimes(1); + expect(console.info).toHaveLoggedNth( + 1, expect.objectContaining({ message: 'Hello, world!', foo: 'bar', @@ -274,8 +273,9 @@ describe('Working with keys', () => { logger.info('Hello, world!'); // Assess - expect(logSpy).toHaveBeenCalledTimes(1); - expect(JSON.parse(logSpy.mock.calls[0][0])).toStrictEqual( + expect(console.info).toHaveBeenCalledTimes(1); + expect(console.info).toHaveLoggedNth( + 1, expect.objectContaining({ message: 'Hello, world!', foo: 'baz', @@ -297,8 +297,9 @@ describe('Working with keys', () => { logger.info('Hello, world!'); // Assess - expect(logSpy).toHaveBeenCalledTimes(1); - expect(JSON.parse(logSpy.mock.calls[0][0])).toStrictEqual( + expect(console.info).toHaveBeenCalledTimes(1); + expect(console.info).toHaveLoggedNth( + 1, expect.objectContaining({ message: 'Hello, world!', foo: 'baz', @@ -322,8 +323,9 @@ describe('Working with keys', () => { logger.info('Hello, world!'); // Assess - expect(logSpy).toHaveBeenCalledTimes(1); - expect(JSON.parse(logSpy.mock.calls[0][0])).toStrictEqual( + expect(console.info).toHaveBeenCalledTimes(1); + expect(console.info).toHaveLoggedNth( + 1, expect.objectContaining({ message: 'Hello, world!', foo: 'bar', @@ -351,8 +353,9 @@ describe('Working with keys', () => { logger.info('Hello, world!'); // Assess - expect(logSpy).toHaveBeenCalledTimes(1); - expect(JSON.parse(logSpy.mock.calls[0][0])).toStrictEqual( + expect(console.info).toHaveBeenCalledTimes(1); + expect(console.info).toHaveLoggedNth( + 1, expect.not.objectContaining({ foo: 'bar', }) @@ -375,8 +378,9 @@ describe('Working with keys', () => { logger.info('Hello, world!'); // Assess - expect(logSpy).toHaveBeenCalledTimes(1); - expect(JSON.parse(logSpy.mock.calls[0][0])).toStrictEqual( + expect(console.info).toHaveBeenCalledTimes(1); + expect(console.info).toHaveLoggedNth( + 1, expect.objectContaining({ foo: 'bar', }) @@ -396,8 +400,9 @@ describe('Working with keys', () => { logger.info('Hello, world!'); // Assess - expect(logSpy).toHaveBeenCalledTimes(1); - expect(JSON.parse(logSpy.mock.calls[0][0])).toStrictEqual( + expect(console.info).toHaveBeenCalledTimes(1); + expect(console.info).toHaveLoggedNth( + 1, expect.not.objectContaining({ foo: 'bar', }) @@ -419,8 +424,9 @@ describe('Working with keys', () => { logger.info('Hello, world!'); // Assess - expect(logSpy).toHaveBeenCalledTimes(1); - expect(JSON.parse(logSpy.mock.calls[0][0])).toStrictEqual( + expect(console.info).toHaveBeenCalledTimes(1); + expect(console.info).toHaveLoggedNth( + 1, expect.objectContaining({ foo: 'bar', }) @@ -448,13 +454,15 @@ describe('Working with keys', () => { await handler(false, context); // Assess - expect(logSpy).toHaveBeenCalledTimes(2); - expect(JSON.parse(logSpy.mock.calls[0][0])).toStrictEqual( + expect(console.info).toHaveBeenCalledTimes(2); + expect(console.info).toHaveLoggedNth( + 1, expect.objectContaining({ foo: 'baz', }) ); - expect(JSON.parse(logSpy.mock.calls[1][0])).toStrictEqual( + expect(console.info).toHaveLoggedNth( + 2, expect.objectContaining({ foo: 'bar', }) @@ -486,13 +494,15 @@ describe('Working with keys', () => { await handler(false, context); // Assess - expect(logSpy).toHaveBeenCalledTimes(2); - expect(JSON.parse(logSpy.mock.calls[0][0])).toStrictEqual( + expect(console.info).toHaveBeenCalledTimes(2); + expect(console.info).toHaveLoggedNth( + 1, expect.objectContaining({ foo: 'baz', }) ); - expect(JSON.parse(logSpy.mock.calls[1][0])).toStrictEqual( + expect(console.info).toHaveLoggedNth( + 2, expect.objectContaining({ foo: 'bar', }) @@ -524,10 +534,11 @@ describe('Working with keys', () => { logger.info('Hello, world!'); // Assess - expect(logSpy).toHaveBeenCalledTimes(1); - expect(JSON.parse(logSpy.mock.calls[0][0])).toStrictEqual( + expect(console.info).toHaveBeenCalledTimes(1); + expect(console.info).toHaveLoggedNth( + 1, expect.objectContaining({ - xray_trace_id: '1-5759e988-bd862e3fe1be46a994272793', + xray_trace_id: '1-abcdef12-3456abcdef123456abcdef12', }) ); }); @@ -560,8 +571,9 @@ describe('Working with keys', () => { logger.info('Hello, world!'); // Assess - expect(logSpy).toHaveBeenCalledTimes(1); - expect(JSON.parse(logSpy.mock.calls[0][0])).toStrictEqual( + expect(console.info).toHaveBeenCalledTimes(1); + expect(console.info).toHaveLoggedNth( + 1, expect.not.objectContaining({ foo: 'bar', }) @@ -597,14 +609,15 @@ describe('Working with keys', () => { bar: 'baz', }, } as unknown as ConstructorOptions); - const warnSpy = jest.spyOn(console, 'warn'); // Assess - expect(warnSpy).toHaveBeenCalledTimes(1); - expect(warnSpy).toHaveBeenCalledWith( - expect.stringContaining( - 'Both persistentLogAttributes and persistentKeys options were provided. Using persistentKeys as persistentLogAttributes is deprecated and will be removed in future releases' - ) + expect(console.warn).toHaveBeenCalledTimes(1); + expect(console.warn).toHaveLoggedNth( + 1, + expect.objectContaining({ + message: + 'Both persistentLogAttributes and persistentKeys options were provided. Using persistentKeys as persistentLogAttributes is deprecated and will be removed in future releases', + }) ); }); }); diff --git a/packages/logger/vitest.config.ts b/packages/logger/vitest.config.ts new file mode 100644 index 0000000000..9f1196ef1f --- /dev/null +++ b/packages/logger/vitest.config.ts @@ -0,0 +1,8 @@ +import { defineProject } from 'vitest/config'; + +export default defineProject({ + test: { + environment: 'node', + setupFiles: ['../testing/src/setupEnv.ts'], + }, +}); diff --git a/packages/testing/src/setupEnv.ts b/packages/testing/src/setupEnv.ts index 334d7c25c9..f0d7b06c47 100644 --- a/packages/testing/src/setupEnv.ts +++ b/packages/testing/src/setupEnv.ts @@ -11,9 +11,103 @@ vi.spyOn(console, 'debug').mockReturnValue(); vi.spyOn(console, 'info').mockReturnValue(); vi.spyOn(console, 'log').mockReturnValue(); +expect.extend({ + toHaveLogged(received, expected) { + const calls = received.mock.calls; + const messages = new Array(calls.length); + for (const [idx, call] of calls.entries()) { + const [rawMessage] = call; + try { + messages[idx] = JSON.parse(rawMessage); + } catch (error) { + messages[idx] = rawMessage; + } + if (this.equals(messages[idx], expected)) { + return { + message: () => '', + pass: true, + }; + } + } + + return { + message: () => 'Expected function to have logged provided object', + pass: false, + actual: messages, + expected, + }; + }, + toHaveLoggedNth(received, nth, expected) { + const call = received.mock.calls[nth - 1]; + if (!call) { + return { + message: () => + `Expected function to have logged provided object during ${nth} call`, + pass: false, + actual: 'No log found at index', + expected, + }; + } + const [rawMessage] = call; + const message = JSON.parse(rawMessage); + if (this.equals(message, expected)) { + return { + message: () => '', + pass: true, + }; + } + + return { + message: () => 'Expected function to have logged provided object', + pass: false, + actual: message, + expected, + }; + }, +}); + declare module 'vitest' { // biome-ignore lint/suspicious/noExplicitAny: vitest typings expect an any type - interface Assertion extends CustomMatcher {} + interface Assertion extends CustomMatcher { + /** + * Asserts that the logger function has been called with the expected log message + * during any call. + * + * @example + * ```ts + * vi.spyOn(console, 'info').mockReturnValue(); + * + * expect(console.info).toHaveLogged( + * expect.objectContaining({ + * message: 'Hello, world!', + * }) + * ); + * ``` + * + * @param expected - The expected log message + */ + toHaveLogged(expected: Record): void; + /** + * Asserts that the logger function has been called with the expected log message + * during the specific nth call. + * + * @example + * ```ts + * vi.spyOn(console, 'info').mockReturnValue(); + * + * expect(console.info).toHaveLoggedNth( + * 1, + * expect.objectContaining({ + * message: 'Hello, world!', + * }) + * ); + * ``` + * + * @param nth - The index of the call to check + * @param expected - The expected log message + */ + toHaveLoggedNth(nth: number, expected: Record): void; + } interface AsymmetricMatchersContaining extends CustomMatcher {} } diff --git a/vitest.config.ts b/vitest.config.ts index 81203c1290..86ff981bfb 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -18,7 +18,7 @@ export default defineConfig({ 'packages/event-handler/src/types/**', 'packages/idempotency/src/types/**', 'packages/jmespath/src/types.ts', - 'packages/logger/**', + 'packages/logger/src/types/**', 'packages/metrics/**', 'packages/parameters/**', 'packages/parser/**', From 67813313702aaeb9441a573be0acbe60f51a8781 Mon Sep 17 00:00:00 2001 From: Asifur Rahman Arnab Date: Mon, 30 Sep 2024 13:45:53 +0600 Subject: [PATCH 39/52] refactor(logger): use `LogLevelThreshold` constant inside `Logger` class (#3133) --- packages/logger/src/Logger.ts | 53 +++++++++++------------------ packages/logger/src/types/Logger.ts | 10 ------ packages/logger/src/types/index.ts | 1 - 3 files changed, 19 insertions(+), 45 deletions(-) diff --git a/packages/logger/src/Logger.ts b/packages/logger/src/Logger.ts index 647f5e4ada..2a4a81d53b 100644 --- a/packages/logger/src/Logger.ts +++ b/packages/logger/src/Logger.ts @@ -9,7 +9,7 @@ import type { import type { Context, Handler } from 'aws-lambda'; import merge from 'lodash.merge'; import { EnvironmentVariablesService } from './config/EnvironmentVariablesService.js'; -import { LogJsonIndent } from './constants.js'; +import { LogJsonIndent, LogLevelThreshold } from './constants.js'; import type { LogFormatter } from './formatter/LogFormatter.js'; import type { LogItem } from './formatter/LogItem.js'; import { PowertoolsLogFormatter } from './formatter/PowertoolsLogFormatter.js'; @@ -23,7 +23,6 @@ import type { LogItemExtraInput, LogItemMessage, LogLevel, - LogLevelThresholds, LoggerInterface, } from './types/Logger.js'; import type { PowertoolsLogData } from './types/logKeys.js'; @@ -120,21 +119,7 @@ class Logger extends Utility implements LoggerInterface { /** * Log level used internally by the current instance of Logger. */ - private logLevel = 12; - /** - * Log level thresholds used internally by the current instance of Logger. - * - * The levels are in ascending order from the most verbose to the least verbose (no logs). - */ - private readonly logLevelThresholds: LogLevelThresholds = { - TRACE: 6, - DEBUG: 8, - INFO: 12, - WARN: 16, - ERROR: 20, - CRITICAL: 24, - SILENT: 28, - }; + private logLevel: number = LogLevelThreshold.INFO; /** * Persistent log attributes that will be logged in all log items. */ @@ -170,7 +155,7 @@ class Logger extends Utility implements LoggerInterface { * * We keep this value to be able to reset the log level to the initial value when the sample rate is refreshed. */ - #initialLogLevel = this.logLevelThresholds.INFO; + #initialLogLevel: number = LogLevelThreshold.INFO; /** * Replacer function used to serialize the log items. */ @@ -298,7 +283,7 @@ class Logger extends Utility implements LoggerInterface { input: LogItemMessage, ...extraInput: LogItemExtraInput ): void { - this.processLogItem(this.logLevelThresholds.CRITICAL, input, extraInput); + this.processLogItem(LogLevelThreshold.CRITICAL, input, extraInput); } /** @@ -308,7 +293,7 @@ class Logger extends Utility implements LoggerInterface { * @param extraInput - The extra input to log. */ public debug(input: LogItemMessage, ...extraInput: LogItemExtraInput): void { - this.processLogItem(this.logLevelThresholds.DEBUG, input, extraInput); + this.processLogItem(LogLevelThreshold.DEBUG, input, extraInput); } /** @@ -318,7 +303,7 @@ class Logger extends Utility implements LoggerInterface { * @param extraInput - The extra input to log. */ public error(input: LogItemMessage, ...extraInput: LogItemExtraInput): void { - this.processLogItem(this.logLevelThresholds.ERROR, input, extraInput); + this.processLogItem(LogLevelThreshold.ERROR, input, extraInput); } /** @@ -354,7 +339,7 @@ class Logger extends Utility implements LoggerInterface { * @param extraInput - The extra input to log. */ public info(input: LogItemMessage, ...extraInput: LogItemExtraInput): void { - this.processLogItem(this.logLevelThresholds.INFO, input, extraInput); + this.processLogItem(LogLevelThreshold.INFO, input, extraInput); } /** @@ -561,7 +546,7 @@ class Logger extends Utility implements LoggerInterface { public setLogLevel(logLevel: LogLevel): void { if (this.awsLogLevelShortCircuit(logLevel)) return; if (this.isValidLogLevel(logLevel)) { - this.logLevel = this.logLevelThresholds[logLevel]; + this.logLevel = LogLevelThreshold[logLevel]; } else { throw new Error(`Invalid log level: ${logLevel}`); } @@ -599,7 +584,7 @@ class Logger extends Utility implements LoggerInterface { * @param extraInput - The extra input to log. */ public trace(input: LogItemMessage, ...extraInput: LogItemExtraInput): void { - this.processLogItem(this.logLevelThresholds.TRACE, input, extraInput); + this.processLogItem(LogLevelThreshold.TRACE, input, extraInput); } /** @@ -609,7 +594,7 @@ class Logger extends Utility implements LoggerInterface { * @param extraInput - The extra input to log. */ public warn(input: LogItemMessage, ...extraInput: LogItemExtraInput): void { - this.processLogItem(this.logLevelThresholds.WARN, input, extraInput); + this.processLogItem(LogLevelThreshold.WARN, input, extraInput); } /** @@ -684,11 +669,11 @@ class Logger extends Utility implements LoggerInterface { private awsLogLevelShortCircuit(selectedLogLevel?: string): boolean { const awsLogLevel = this.getEnvVarsService().getAwsLogLevel(); if (this.isValidLogLevel(awsLogLevel)) { - this.logLevel = this.logLevelThresholds[awsLogLevel]; + this.logLevel = LogLevelThreshold[awsLogLevel]; if ( this.isValidLogLevel(selectedLogLevel) && - this.logLevel > this.logLevelThresholds[selectedLogLevel] + this.logLevel > LogLevelThreshold[selectedLogLevel] ) { this.warn( `Current log level (${selectedLogLevel}) does not match AWS Lambda Advanced Logging Controls minimum log level (${awsLogLevel}). This can lead to data loss, consider adjusting them.` @@ -800,7 +785,7 @@ class Logger extends Utility implements LoggerInterface { */ private getLogLevelNameFromNumber(logLevel: number): Uppercase { let found: Uppercase | undefined; - for (const [key, value] of Object.entries(this.logLevelThresholds)) { + for (const [key, value] of Object.entries(LogLevelThreshold)) { if (value === logLevel) { found = key as Uppercase; break; @@ -826,7 +811,7 @@ class Logger extends Utility implements LoggerInterface { private isValidLogLevel( logLevel?: LogLevel | string ): logLevel is Uppercase { - return typeof logLevel === 'string' && logLevel in this.logLevelThresholds; + return typeof logLevel === 'string' && logLevel in LogLevelThreshold; } /** @@ -854,7 +839,7 @@ class Logger extends Utility implements LoggerInterface { log.prepareForPrint(); const consoleMethod = - logLevel === this.logLevelThresholds.CRITICAL + logLevel === LogLevelThreshold.CRITICAL ? 'error' : (this.getLogLevelNameFromNumber(logLevel).toLowerCase() as keyof Omit< LogFunction, @@ -947,7 +932,7 @@ class Logger extends Utility implements LoggerInterface { if (this.awsLogLevelShortCircuit(constructorLogLevel)) return; if (this.isValidLogLevel(constructorLogLevel)) { - this.logLevel = this.logLevelThresholds[constructorLogLevel]; + this.logLevel = LogLevelThreshold[constructorLogLevel]; this.#initialLogLevel = this.logLevel; return; @@ -956,14 +941,14 @@ class Logger extends Utility implements LoggerInterface { ?.getLogLevel() ?.toUpperCase(); if (this.isValidLogLevel(customConfigValue)) { - this.logLevel = this.logLevelThresholds[customConfigValue]; + this.logLevel = LogLevelThreshold[customConfigValue]; this.#initialLogLevel = this.logLevel; return; } const envVarsValue = this.getEnvVarsService()?.getLogLevel()?.toUpperCase(); if (this.isValidLogLevel(envVarsValue)) { - this.logLevel = this.logLevelThresholds[envVarsValue]; + this.logLevel = LogLevelThreshold[envVarsValue]; this.#initialLogLevel = this.logLevel; return; @@ -990,7 +975,7 @@ class Logger extends Utility implements LoggerInterface { this.powertoolsLogData.sampleRateValue = value; if ( - this.logLevel > this.logLevelThresholds.DEBUG && + this.logLevel > LogLevelThreshold.DEBUG && value && randomInt(0, 100) / 100 <= value ) { diff --git a/packages/logger/src/types/Logger.ts b/packages/logger/src/types/Logger.ts index 72292ea2b8..94a7e6e372 100644 --- a/packages/logger/src/types/Logger.ts +++ b/packages/logger/src/types/Logger.ts @@ -19,15 +19,6 @@ type LogLevel = | (typeof LogLevelList)[keyof typeof LogLevelList] | Lowercase<(typeof LogLevelList)[keyof typeof LogLevelList]>; -/** - * Type definition for the log level thresholds. - * - * Each log level has a corresponding number that represents its severity. - */ -type LogLevelThresholds = { - [key in Uppercase]: number; -}; - /** * Type definition for a function that logs messages at different levels to the console. */ @@ -215,7 +206,6 @@ type LoggerInterface = { export type { Environment, - LogLevelThresholds, LogAttributes, LogLevel, LogFunction, diff --git a/packages/logger/src/types/index.ts b/packages/logger/src/types/index.ts index 8933cef721..9544419a66 100644 --- a/packages/logger/src/types/index.ts +++ b/packages/logger/src/types/index.ts @@ -1,6 +1,5 @@ export type { Environment, - LogLevelThresholds, LogAttributes, LogLevel, LogItemMessage, From 0600c13c935336fa2617997be31d658e60601d60 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Oct 2024 09:58:36 +0200 Subject: [PATCH 40/52] chore(deps): bump @aws-sdk/client-lambda from 3.658.1 to 3.659.0 in the aws-sdk-v3 group across 1 directory (#3127) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- packages/testing/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4238c2f73a..4971f7336b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -560,9 +560,9 @@ } }, "node_modules/@aws-sdk/client-lambda": { - "version": "3.658.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.658.1.tgz", - "integrity": "sha512-KmsbyvUYhNYyZWdgWTmVfbe+0MLiUj0Ah+50kwTeh6lozwf39LfiZv+gXigbCGDUYaVQuOJXxFgSdqdFx0eKDA==", + "version": "3.659.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.659.0.tgz", + "integrity": "sha512-0XBIcMBDm56iOjC0k1EjJR3ewXr2gFNtVRmdchtT7XPe2bYQY4L+K0Xk9TNLoEZAhFuFkh129I2pMrmlaDEl/Q==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", @@ -17890,7 +17890,7 @@ "license": "MIT-0", "dependencies": { "@aws-cdk/cli-lib-alpha": "^2.160.0-alpha.0", - "@aws-sdk/client-lambda": "^3.658.1", + "@aws-sdk/client-lambda": "^3.659.0", "@smithy/util-utf8": "^3.0.0", "aws-cdk-lib": "^2.160.0", "esbuild": "^0.24.0", diff --git a/packages/testing/package.json b/packages/testing/package.json index 81803b2d43..246ff3840a 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -99,7 +99,7 @@ "homepage": "https://github.com/aws-powertools/powertools-lambda-typescript/tree/main/packages/testing#readme", "dependencies": { "@aws-cdk/cli-lib-alpha": "^2.160.0-alpha.0", - "@aws-sdk/client-lambda": "^3.658.1", + "@aws-sdk/client-lambda": "^3.659.0", "@smithy/util-utf8": "^3.0.0", "aws-cdk-lib": "^2.160.0", "esbuild": "^0.24.0", From 404b302bef504d25d58ad6b67ac1e3b24154b1a1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Oct 2024 10:45:40 +0200 Subject: [PATCH 41/52] chore(deps): bump @types/node from 22.7.2 to 22.7.4 (#3139) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- examples/app/package.json | 4 ++-- package-lock.json | 12 ++++++------ package.json | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/examples/app/package.json b/examples/app/package.json index 86a8640386..6fcddf13af 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -29,7 +29,7 @@ }, "devDependencies": { "@types/aws-lambda": "^8.10.145", - "@types/node": "22.7.2", + "@types/node": "22.7.4", "aws-cdk": "^2.160.0", "aws-cdk-lib": "^2.160.0", "constructs": "^10.3.0", @@ -49,7 +49,7 @@ "@aws-sdk/lib-dynamodb": "^3.658.1", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.145", - "@types/node": "22.7.2", + "@types/node": "22.7.4", "constructs": "^10.3.0", "esbuild": "^0.24.0", "typescript": "^5.6.2" diff --git a/package-lock.json b/package-lock.json index 4971f7336b..f8799d9340 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,7 +28,7 @@ "@biomejs/biome": "^1.9.0", "@types/aws-lambda": "^8.10.145", "@types/jest": "^29.5.13", - "@types/node": "^22.7.2", + "@types/node": "^22.7.4", "@vitest/coverage-v8": "^2.1.1", "husky": "^9.1.6", "jest": "^29.7.0", @@ -65,14 +65,14 @@ "@aws-sdk/lib-dynamodb": "^3.658.1", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.145", - "@types/node": "22.7.2", + "@types/node": "22.7.4", "constructs": "^10.3.0", "esbuild": "^0.24.0", "typescript": "^5.6.2" }, "devDependencies": { "@types/aws-lambda": "^8.10.145", - "@types/node": "22.7.2", + "@types/node": "22.7.4", "aws-cdk": "^2.160.0", "aws-cdk-lib": "^2.160.0", "constructs": "^10.3.0", @@ -5305,9 +5305,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "22.7.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.2.tgz", - "integrity": "sha512-866lXSrpGpgyHBZUa2m9YNWqHDjjM0aBTJlNtYaGEw4rqY/dcD7deRVTbBBAJelfA7oaGDbNftXF/TL/A6RgoA==", + "version": "22.7.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.4.tgz", + "integrity": "sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg==", "dependencies": { "undici-types": "~6.19.2" } diff --git a/package.json b/package.json index 222166126d..950210fd2e 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,7 @@ "@biomejs/biome": "^1.9.0", "@types/aws-lambda": "^8.10.145", "@types/jest": "^29.5.13", - "@types/node": "^22.7.2", + "@types/node": "^22.7.4", "@vitest/coverage-v8": "^2.1.1", "husky": "^9.1.6", "jest": "^29.7.0", From 876a7037a9f64de4acb1a233be20a4a5612e2116 Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Thu, 3 Oct 2024 02:02:26 +0200 Subject: [PATCH 42/52] test(logger): switch e2e tests to vitest (#3148) --- packages/logger/jest.config.cjs | 30 ------------------- packages/logger/package.json | 8 ++--- .../tests/e2e/basicFeatures.middy.test.ts | 6 +--- .../tests/e2e/childLogger.manual.test.ts | 6 +--- .../e2e/logEventEnvVarSetting.middy.test.ts | 6 +--- .../tests/e2e/sampleRate.decorator.test.ts | 6 +--- 6 files changed, 8 insertions(+), 54 deletions(-) delete mode 100644 packages/logger/jest.config.cjs diff --git a/packages/logger/jest.config.cjs b/packages/logger/jest.config.cjs deleted file mode 100644 index 0aeadae05f..0000000000 --- a/packages/logger/jest.config.cjs +++ /dev/null @@ -1,30 +0,0 @@ -module.exports = { - displayName: { - name: 'Powertools for AWS Lambda (TypeScript) utility: LOGGER', - color: 'cyan', - }, - runner: 'groups', - moduleNameMapper: { - '^(\\.{1,2}/.*)\\.js$': '$1', - }, - transform: { - '^.+\\.ts?$': 'ts-jest', - }, - moduleFileExtensions: ['js', 'ts'], - collectCoverageFrom: ['**/src/**/*.ts', '!**/node_modules/**'], - testMatch: ['**/?(*.)+(spec|test).ts'], - roots: ['/src', '/tests'], - testPathIgnorePatterns: ['/node_modules/'], - testEnvironment: 'node', - coveragePathIgnorePatterns: ['/node_modules/', 'src/types/index.ts'], - coverageThreshold: { - global: { - statements: 100, - branches: 100, - functions: 100, - lines: 100, - }, - }, - coverageReporters: ['json-summary', 'text', 'lcov'], - setupFiles: ['/tests/helpers/setupEnv.ts'], -}; diff --git a/packages/logger/package.json b/packages/logger/package.json index 79e27f5ff1..a5760007ce 100644 --- a/packages/logger/package.json +++ b/packages/logger/package.json @@ -14,10 +14,10 @@ "test:unit": "vitest --run tests/unit", "test:unit:coverage": "vitest --run tests/unit --coverage.enabled --coverage.thresholds.100 --coverage.include='src/**'", "test:unit:types": "echo 'Not Implemented'", - "test:e2e:nodejs18x": "RUNTIME=nodejs18x jest --group=e2e", - "test:e2e:nodejs20x": "RUNTIME=nodejs20x jest --group=e2e", - "test:e2e": "jest --group=e2e", - "watch": "jest --watch --group=unit", + "test:unit:watch": "vitest tests/unit", + "test:e2e:nodejs18x": "RUNTIME=nodejs18x vitest --run tests/e2e", + "test:e2e:nodejs20x": "RUNTIME=nodejs20x vitest --run tests/e2e", + "test:e2e": "vitest --run tests/e2e", "build:cjs": "tsc --build tsconfig.json && echo '{ \"type\": \"commonjs\" }' > lib/cjs/package.json", "build:esm": "tsc --build tsconfig.esm.json && echo '{ \"type\": \"module\" }' > lib/esm/package.json", "build": "npm run build:esm & npm run build:cjs", diff --git a/packages/logger/tests/e2e/basicFeatures.middy.test.ts b/packages/logger/tests/e2e/basicFeatures.middy.test.ts index 086e31c7a7..9f373c718d 100644 --- a/packages/logger/tests/e2e/basicFeatures.middy.test.ts +++ b/packages/logger/tests/e2e/basicFeatures.middy.test.ts @@ -1,8 +1,3 @@ -/** - * Test logger basic features - * - * @group e2e/logger/basicFeatures - */ import { join } from 'node:path'; import { TestInvocationLogs, @@ -10,6 +5,7 @@ import { invokeFunction, } from '@aws-lambda-powertools/testing-utils'; import type { APIGatewayAuthorizerResult } from 'aws-lambda'; +import { afterAll, beforeAll, describe, expect, it } from 'vitest'; import { LoggerTestNodejsFunction } from '../helpers/resources.js'; import { RESOURCE_NAME_PREFIX, diff --git a/packages/logger/tests/e2e/childLogger.manual.test.ts b/packages/logger/tests/e2e/childLogger.manual.test.ts index 3fe16a9446..a52584ab25 100644 --- a/packages/logger/tests/e2e/childLogger.manual.test.ts +++ b/packages/logger/tests/e2e/childLogger.manual.test.ts @@ -1,14 +1,10 @@ -/** - * Test logger child logger - * - * @group e2e/logger/childLogger - */ import { join } from 'node:path'; import { TestInvocationLogs, TestStack, invokeFunction, } from '@aws-lambda-powertools/testing-utils'; +import { afterAll, beforeAll, describe, expect, it } from 'vitest'; import { LoggerTestNodejsFunction } from '../helpers/resources.js'; import { RESOURCE_NAME_PREFIX, diff --git a/packages/logger/tests/e2e/logEventEnvVarSetting.middy.test.ts b/packages/logger/tests/e2e/logEventEnvVarSetting.middy.test.ts index 32656be427..21c2dad621 100644 --- a/packages/logger/tests/e2e/logEventEnvVarSetting.middy.test.ts +++ b/packages/logger/tests/e2e/logEventEnvVarSetting.middy.test.ts @@ -1,14 +1,10 @@ -/** - * Test logger basic features - * - * @group e2e/logger/logEventEnvVarSetting - */ import { join } from 'node:path'; import { TestInvocationLogs, TestStack, invokeFunction, } from '@aws-lambda-powertools/testing-utils'; +import { afterAll, beforeAll, describe, expect, it } from 'vitest'; import { LoggerTestNodejsFunction } from '../helpers/resources.js'; import { RESOURCE_NAME_PREFIX, diff --git a/packages/logger/tests/e2e/sampleRate.decorator.test.ts b/packages/logger/tests/e2e/sampleRate.decorator.test.ts index 56f59f266b..011a72d02d 100644 --- a/packages/logger/tests/e2e/sampleRate.decorator.test.ts +++ b/packages/logger/tests/e2e/sampleRate.decorator.test.ts @@ -1,8 +1,3 @@ -/** - * Test logger sample rate feature - * - * @group e2e/logger/sampleRate - */ import { randomUUID } from 'node:crypto'; import { join } from 'node:path'; import { @@ -10,6 +5,7 @@ import { TestStack, invokeFunction, } from '@aws-lambda-powertools/testing-utils'; +import { afterAll, beforeAll, describe, expect, it } from 'vitest'; import { LoggerTestNodejsFunction } from '../helpers/resources.js'; import { RESOURCE_NAME_PREFIX, From c97d379e47371e2074960bf6d5164ae8428056fc Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Thu, 3 Oct 2024 09:41:06 +0200 Subject: [PATCH 43/52] test(idempotency): switch e2e tests to vitest (#3149) --- packages/idempotency/jest.config.cjs | 31 ------------------- packages/idempotency/package.json | 11 ++++--- .../tests/e2e/idempotentDecorator.test.ts | 30 ++++++++---------- .../tests/e2e/makeHandlerIdempotent.test.ts | 22 ++++++------- .../tests/e2e/makeIdempotent.test.ts | 14 +++------ 5 files changed, 33 insertions(+), 75 deletions(-) delete mode 100644 packages/idempotency/jest.config.cjs diff --git a/packages/idempotency/jest.config.cjs b/packages/idempotency/jest.config.cjs deleted file mode 100644 index 758a5e9f23..0000000000 --- a/packages/idempotency/jest.config.cjs +++ /dev/null @@ -1,31 +0,0 @@ -module.exports = { - displayName: { - name: 'Powertools for AWS Lambda (TypeScript) utility: IDEMPOTENCY', - color: 'yellow', - }, - runner: 'groups', - preset: 'ts-jest', - moduleNameMapper: { - '^(\\.{1,2}/.*)\\.js$': '$1', - }, - transform: { - '^.+\\.ts?$': 'ts-jest', - }, - moduleFileExtensions: ['js', 'ts'], - collectCoverageFrom: ['**/src/**/*.ts', '!**/node_modules/**'], - testMatch: ['**/?(*.)+(spec|test).ts'], - roots: ['/src', '/tests'], - testPathIgnorePatterns: ['/node_modules/'], - testEnvironment: 'node', - coveragePathIgnorePatterns: ['/node_modules/', '/types/'], - coverageThreshold: { - global: { - statements: 100, - branches: 100, - functions: 100, - lines: 100, - }, - }, - coverageReporters: ['json-summary', 'text', 'lcov'], - setupFiles: ['/tests/helpers/populateEnvironmentVariables.ts'], -}; diff --git a/packages/idempotency/package.json b/packages/idempotency/package.json index d350f22cb6..b497763579 100644 --- a/packages/idempotency/package.json +++ b/packages/idempotency/package.json @@ -10,13 +10,14 @@ "access": "public" }, "scripts": { - "test": "vitest --run", - "test:unit": "vitest --run", + "test": "vitest --run tests/unit", + "test:unit": "vitest --run tests/unit", "test:unit:coverage": "vitest --run tests/unit --coverage.enabled --coverage.thresholds.100 --coverage.include='src/**'", "test:unit:types": "echo 'Not Implemented'", - "test:e2e:nodejs18x": "RUNTIME=nodejs18x jest --group=e2e", - "test:e2e:nodejs20x": "RUNTIME=nodejs20x jest --group=e2e", - "test:e2e": "jest --group=e2e", + "test:unit:watch": "vitest tests/unit", + "test:e2e:nodejs18x": "RUNTIME=nodejs18x vitest --run tests/e2e", + "test:e2e:nodejs20x": "RUNTIME=nodejs20x vitest --run tests/e2e", + "test:e2e": "vitest --run tests/e2e", "build:cjs": "tsc --build tsconfig.json && echo '{ \"type\": \"commonjs\" }' > lib/cjs/package.json", "build:esm": "tsc --build tsconfig.esm.json && echo '{ \"type\": \"module\" }' > lib/esm/package.json", "build": "npm run build:esm & npm run build:cjs", diff --git a/packages/idempotency/tests/e2e/idempotentDecorator.test.ts b/packages/idempotency/tests/e2e/idempotentDecorator.test.ts index ca22922e83..00f0aa236d 100644 --- a/packages/idempotency/tests/e2e/idempotentDecorator.test.ts +++ b/packages/idempotency/tests/e2e/idempotentDecorator.test.ts @@ -1,8 +1,3 @@ -/** - * Test idempotency decorator - * - * @group e2e/idempotency/decorator - */ import { createHash } from 'node:crypto'; import { join } from 'node:path'; import { @@ -14,6 +9,7 @@ import { DynamoDBClient } from '@aws-sdk/client-dynamodb'; import { ScanCommand } from '@aws-sdk/lib-dynamodb'; import { Duration } from 'aws-cdk-lib'; import { AttributeType } from 'aws-cdk-lib/aws-dynamodb'; +import { afterAll, beforeAll, describe, expect, it } from 'vitest'; import { IdempotencyTestNodejsFunctionAndDynamoTable } from '../helpers/resources.js'; import { RESOURCE_NAME_PREFIX, @@ -166,8 +162,8 @@ describe('Idempotency e2e test decorator, default settings', () => { tableNameDataIndex = testStack.findAndGetStackOutputValue('dataIndexTable'); }, SETUP_TIMEOUT); - test( - 'when called twice with the same payload, it returns the same result and runs the handler once', + it( + 'returns the same result and runs the handler once when called multiple times', async () => { const payload = { foo: 'bar' }; @@ -208,8 +204,8 @@ describe('Idempotency e2e test decorator, default settings', () => { TEST_CASE_TIMEOUT ); - test( - 'when called twice in parallel, the handler is called only once', + it( + 'handles parallel invocations correctly', async () => { const payload = { foo: 'bar' }; const payloadHash = createHash('md5') @@ -256,8 +252,8 @@ describe('Idempotency e2e test decorator, default settings', () => { TEST_CASE_TIMEOUT ); - test( - 'when the function times out, the second request is processed correctly by the handler', + it( + 'recovers from a timed out request and processes the next one', async () => { const payload = { foo: 'bar' }; const payloadHash = createHash('md5') @@ -311,8 +307,8 @@ describe('Idempotency e2e test decorator, default settings', () => { TEST_CASE_TIMEOUT ); - test( - 'when the idempotency record is expired, the second request is processed correctly by the handler', + it( + 'recovers from an expired idempotency record and processes the next request', async () => { const payload = { foo: 'baz', @@ -385,8 +381,8 @@ describe('Idempotency e2e test decorator, default settings', () => { TEST_CASE_TIMEOUT ); - test( - 'when called with customized function wrapper, it creates ddb entry with custom attributes', + it( + 'uses the provided custom idempotency record attributes', async () => { const payload = { foo: 'bar' }; const payloadHash = createHash('md5') @@ -425,8 +421,8 @@ describe('Idempotency e2e test decorator, default settings', () => { TEST_CASE_TIMEOUT ); - test( - 'when called twice for with different payload using data index arugment, it returns the same result and runs the handler once', + it( + 'takes the data index argument into account when making the function idempotent', async () => { const payload = [{ id: '1234' }, { id: '5678' }]; const payloadHash = createHash('md5') diff --git a/packages/idempotency/tests/e2e/makeHandlerIdempotent.test.ts b/packages/idempotency/tests/e2e/makeHandlerIdempotent.test.ts index f8f5339c91..f6a2cfbf63 100644 --- a/packages/idempotency/tests/e2e/makeHandlerIdempotent.test.ts +++ b/packages/idempotency/tests/e2e/makeHandlerIdempotent.test.ts @@ -1,8 +1,3 @@ -/** - * Test makeHandlerIdempotent middleware - * - * @group e2e/idempotency/makeHandlerIdempotent - */ import { createHash } from 'node:crypto'; import { join } from 'node:path'; import { @@ -13,6 +8,7 @@ import { import { DynamoDBClient } from '@aws-sdk/client-dynamodb'; import { ScanCommand } from '@aws-sdk/lib-dynamodb'; import { Duration } from 'aws-cdk-lib'; +import { afterAll, beforeAll, describe, expect, it } from 'vitest'; import { IdempotencyTestNodejsFunctionAndDynamoTable } from '../helpers/resources.js'; import { RESOURCE_NAME_PREFIX, @@ -116,8 +112,8 @@ describe('Idempotency E2E tests, middy middleware usage', () => { tableNameExpired = testStack.findAndGetStackOutputValue('expiredTable'); }, SETUP_TIMEOUT); - test( - 'when called twice with the same payload, it returns the same result and runs the handler once', + it( + 'returns the same result and runs the handler once when called multiple times', async () => { // Prepare const payload = { @@ -166,8 +162,8 @@ describe('Idempotency E2E tests, middy middleware usage', () => { TEST_CASE_TIMEOUT ); - test( - 'when two identical requests are sent in parallel, the handler is called only once', + it( + 'handles parallel invocations correctly', async () => { // Prepare const payload = { @@ -224,8 +220,8 @@ describe('Idempotency E2E tests, middy middleware usage', () => { TEST_CASE_TIMEOUT ); - test( - 'when the function times out, the second request is processed correctly by the handler', + it( + 'recovers from a timed out request and processes the next one', async () => { // Prepare const payload = { @@ -287,8 +283,8 @@ describe('Idempotency E2E tests, middy middleware usage', () => { TEST_CASE_TIMEOUT ); - test( - 'when the idempotency record is expired, the second request is processed correctly by the handler', + it( + 'recovers from an expired idempotency record and processes the next request', async () => { // Prepare const payload = { diff --git a/packages/idempotency/tests/e2e/makeIdempotent.test.ts b/packages/idempotency/tests/e2e/makeIdempotent.test.ts index 9ae7609198..d510a0c893 100644 --- a/packages/idempotency/tests/e2e/makeIdempotent.test.ts +++ b/packages/idempotency/tests/e2e/makeIdempotent.test.ts @@ -1,8 +1,3 @@ -/** - * Test makeIdempotent function - * - * @group e2e/idempotency/makeIdempotent - */ import { createHash } from 'node:crypto'; import { join } from 'node:path'; import { @@ -13,6 +8,7 @@ import { import { DynamoDBClient } from '@aws-sdk/client-dynamodb'; import { ScanCommand } from '@aws-sdk/lib-dynamodb'; import { AttributeType } from 'aws-cdk-lib/aws-dynamodb'; +import { afterAll, beforeAll, describe, expect, it } from 'vitest'; import { IdempotencyTestNodejsFunctionAndDynamoTable } from '../helpers/resources.js'; import { RESOURCE_NAME_PREFIX, @@ -167,8 +163,8 @@ describe('Idempotency E2E tests, wrapper function usage', () => { TEST_CASE_TIMEOUT ); - test( - 'when called with customized function wrapper, it creates ddb entry with custom attributes', + it( + 'creates a DynamoDB item with the correct attributes', async () => { // Prepare const payload = { @@ -281,8 +277,8 @@ describe('Idempotency E2E tests, wrapper function usage', () => { TEST_CASE_TIMEOUT ); - test( - 'when called twice with the same payload, it returns the same result and runs the handler once', + it( + 'calls the wrapped function once and always returns the same result when called multiple times', async () => { // Prepare const payload = { From 686e5240696edf7f8376f7a810a9d5be451b4f9f Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Thu, 3 Oct 2024 17:51:29 +0200 Subject: [PATCH 44/52] chore(metrics): expose `MetricsInterface` as return type of single metric and further improve API docs (#3145) Co-authored-by: Leandro Damascena --- packages/metrics/README.md | 124 ++--- packages/metrics/src/Metrics.ts | 459 +++++++++++------ .../src/config/EnvironmentVariablesService.ts | 8 +- packages/metrics/src/constants.ts | 26 + packages/metrics/src/middleware/middy.ts | 39 +- .../src/types/ConfigServiceInterface.ts | 4 +- packages/metrics/src/types/Metrics.ts | 466 +++++++++++++++++- .../metrics/src/types/MetricsInterface.ts | 32 -- packages/metrics/src/types/index.ts | 2 +- packages/metrics/tests/unit/Metrics.test.ts | 12 +- 10 files changed, 862 insertions(+), 310 deletions(-) delete mode 100644 packages/metrics/src/types/MetricsInterface.ts diff --git a/packages/metrics/README.md b/packages/metrics/README.md index 40f7036aa7..abe9180f5a 100644 --- a/packages/metrics/README.md +++ b/packages/metrics/README.md @@ -1,15 +1,14 @@ -# Powertools for AWS Lambda (TypeScript) +# Powertools for AWS Lambda (TypeScript) Powertools for AWS Lambda (TypeScript) is a developer toolkit to implement Serverless [best practices and increase developer velocity](https://docs.powertools.aws.dev/lambda/typescript/latest/#features). You can use the library in both TypeScript and JavaScript code bases. -- [Intro](#intro) - [Usage](#usage) - - [Basic usage](#basic-usage) - [Flushing metrics](#flushing-metrics) - [Capturing cold start as a metric](#capturing-cold-start-as-a-metric) - - [Adding metadata](#adding-metadata) + - [Class method decorator](#class-method-decorator) + - [Middy.js middleware](#middyjs-middleware) - [Contribute](#contribute) - [Roadmap](#roadmap) - [Connect](#connect) @@ -19,88 +18,71 @@ You can use the library in both TypeScript and JavaScript code bases. - [Using Lambda Layer](#using-lambda-layer) - [License](#license) -## Intro - ## Usage +The library provides a utility function to emit metrics to CloudWatch using [Embedded Metric Format (EMF)](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Embedded_Metric_Format.html). + To get started, install the library by running: ```sh npm i @aws-lambda-powertools/metrics ``` -### Basic usage +After initializing the Metrics class, you can add metrics using the [https://docs.powertools.aws.dev/lambda/typescript/latest/core/metrics/#creating-metrics](`addMetric()`) method. The metrics are stored in a buffer and are flushed when calling [https://docs.powertools.aws.dev/lambda/typescript/latest/core/metrics/#flushing-metrics](`publishStoredMetrics()`). -The library provides a utility function to emit metrics to CloudWatch using [Embedded Metric Format (EMF)](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Embedded_Metric_Format.html). +Each metric can also have dimensions and metadata added to it. ```ts -import { MetricUnit, Metrics } from '@aws-lambda-powertools/metrics'; +import { Metrics, MetricUnit } from '@aws-lambda-powertools/metrics'; const metrics = new Metrics({ namespace: 'serverlessAirline', serviceName: 'orders', + defaultDimensions: { environment: process.env.ENVIRONMENT }, }); -export const handler = async ( - _event: unknown, - _context: unknown -): Promise => { +export const handler = async (event: { requestId: string }) => { + metrics.addMetadata('request_id', event.requestId); metrics.addMetric('successfulBooking', MetricUnit.Count, 1); + metrics.publishStoredMetrics(); }; ``` ### Flushing metrics -As you finish adding all your metrics, you need to serialize and "flush them" by calling publishStoredMetrics(). This will print the metrics to standard output. - -You can flush metrics automatically using one of the following methods: +As you finish adding all your metrics, you need to serialize and "flush them" by calling `publishStoredMetrics()`, which will emit the metrics to stdout in the Embedded Metric Format (EMF). The metrics are then picked up by the Lambda runtime and sent to CloudWatch. -- manually by calling `publishStoredMetrics()` at the end of your Lambda function +The `publishStoredMetrics()` method is synchronous and will block the event loop until the metrics are flushed. If you want Metrics to flush automatically at the end of your Lambda function, you can use the `@logMetrics()` decorator or the `logMetrics()` middleware. -```ts -import { MetricUnit, Metrics } from '@aws-lambda-powertools/metrics'; - -const metrics = new Metrics({ - namespace: 'serverlessAirline', - serviceName: 'orders', -}); +### Capturing cold start as a metric -export const handler = async ( - _event: unknown, - _context: unknown -): Promise => { - metrics.addMetric('successfulBooking', MetricUnit.Count, 1); - metrics.publishStoredMetrics(); -}; -``` +With Metrics, you can capture cold start as a metric by calling the `captureColdStartMetric()` method. This method will add a metric with the name `ColdStart` and the value `1` to the metrics buffer. -- middy compatible middleware `logMetrics()` +This metric is flushed automatically as soon as the method is called, to ensure that the cold start is captured regardless of whether the metrics are flushed manually or automatically. ```ts -import { MetricUnit, Metrics } from '@aws-lambda-powertools/metrics'; -import { logMetrics } from '@aws-lambda-powertools/metrics/middleware'; -import middy from '@middy/core'; +import { Metrics, MetricUnit } from '@aws-lambda-powertools/metrics'; const metrics = new Metrics({ namespace: 'serverlessAirline', serviceName: 'orders', }); -const lambdaHandler = async ( - _event: unknown, - _context: unknown -): Promise => { - metrics.addMetric('successfulBooking', MetricUnit.Count, 1); +export const handler = async (event: { requestId: string }) => { + metrics.captureColdStartMetric(); }; - -export const handler = middy(lambdaHandler).use(logMetrics(metrics)); ``` -- using decorator `@logMetrics()` +Note that we don't emit a `ColdStart` metric with value `0` when the function is warm, as this would result in a high volume of metrics being emitted to CloudWatch, so you'll need to rely on the absence of the `ColdStart` metric to determine if the function is warm. + +### Class method decorator + +If you are using TypeScript and are comfortable with writing classes, you can use the `@logMetrics()` decorator to automatically flush metrics at the end of your Lambda function as well as configure additional options such as throwing an error if no metrics are added, capturing cold start as a metric, and more. ```ts +import type { Context } from 'aws-lambda'; import type { LambdaInterface } from '@aws-lambda-powertools/commons/types'; -import { MetricUnit, Metrics } from '@aws-lambda-powertools/metrics'; +import { Metrics, MetricUnit } from '@aws-lambda-powertools/metrics'; const metrics = new Metrics({ namespace: 'serverlessAirline', @@ -108,45 +90,27 @@ const metrics = new Metrics({ }); class Lambda implements LambdaInterface { - @metrics.logMetrics() - public async handler(_event: unknown, _context: unknown): Promise { + ⁣@metrics.logMetrics({ captureColdStartMetric: true, throwOnEmptyMetrics: true }) + public async handler(event: { requestId: string }, _: Context) { + metrics.addMetadata('request_id', event.requestId); metrics.addMetric('successfulBooking', MetricUnit.Count, 1); } } const handlerClass = new Lambda(); -export const handler = handlerClass.handler.bind(handlerClass); +export const handler = handlerClass.handler.bind(handlerClass); ``` -Using the Middy middleware or decorator will automatically validate, serialize, and flush all your metrics. - -### Capturing cold start as a metric - -You can optionally capture cold start metrics with the logMetrics middleware or decorator via the captureColdStartMetric param. - -```ts -import type { LambdaInterface } from '@aws-lambda-powertools/commons/types'; -import { MetricUnit, Metrics } from '@aws-lambda-powertools/metrics'; - -const metrics = new Metrics({ - namespace: 'serverlessAirline', - serviceName: 'orders', -}); +Decorators are a Stage 3 proposal for JavaScript and are not yet part of the ECMAScript standard. The current implmementation in this library is based on the legacy TypeScript decorator syntax enabled by the [`experimentalDecorators` flag](https://www.typescriptlang.org/tsconfig/#experimentalDecorators) set to `true` in the `tsconfig.json` file. -export class MyFunction implements LambdaInterface { - @metrics.logMetrics({ captureColdStartMetric: true }) - public async handler(_event: unknown, _context: unknown): Promise { - metrics.addMetric('successfulBooking', MetricUnit.Count, 1); - } -} -``` +### Middy.js middleware -### Adding metadata +If instead you are using [Middy.js](http://middy.js.org) and prefer to use middleware, you can use the `@logMetrics()` middleware to do the same as the class method decorator. -You can add high-cardinality data as part of your Metrics log with the `addMetadata` method. This is useful when you want to search highly contextual information along with your metrics in your logs. +The `@logMetrics()` middleware can be used with Middy.js to automatically flush metrics at the end of your Lambda function as well as configure additional options such as throwing an error if no metrics are added, capturing cold start as a metric, and set default dimensions. ```ts -import { MetricUnit, Metrics } from '@aws-lambda-powertools/metrics'; +import { Metrics, MetricUnit } from '@aws-lambda-powertools/metrics'; import { logMetrics } from '@aws-lambda-powertools/metrics/middleware'; import middy from '@middy/core'; @@ -155,17 +119,17 @@ const metrics = new Metrics({ serviceName: 'orders', }); -const lambdaHandler = async ( - _event: unknown, - _context: unknown -): Promise => { +export const handler = middy(async (event) => { + metrics.addMetadata('request_id', event.requestId); metrics.addMetric('successfulBooking', MetricUnit.Count, 1); - metrics.addMetadata('bookingId', '7051cd10-6283-11ec-90d6-0242ac120003'); -}; - -export const handler = middy(lambdaHandler).use(logMetrics(metrics)); +}).use(logMetrics(metrics, { + captureColdStartMetric: true, + throwOnEmptyMetrics: true, +})); ``` +The `logMetrics()` middleware is compatible with `@middy/core@3.x` and above. + ## Contribute If you are interested in contributing to this project, please refer to our [Contributing Guidelines](https://github.com/aws-powertools/powertools-lambda-typescript/blob/main/CONTRIBUTING.md). diff --git a/packages/metrics/src/Metrics.ts b/packages/metrics/src/Metrics.ts index 9ce41a20ef..d34419dc28 100644 --- a/packages/metrics/src/Metrics.ts +++ b/packages/metrics/src/Metrics.ts @@ -26,64 +26,62 @@ import type { } from './types/index.js'; /** - * ## Intro - * Metrics creates custom metrics asynchronously by logging metrics to standard output following Amazon CloudWatch Embedded Metric Format (EMF). + * The Metrics utility creates custom metrics asynchronously by logging metrics to standard output following {@link https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Embedded_Metric_Format.html | Amazon CloudWatch Embedded Metric Format (EMF)}. * * These metrics can be visualized through Amazon CloudWatch Console. * - * ## Key features - * * Aggregate up to 100 metrics using a single CloudWatch EMF object (large JSON blob) - * * Validate against common metric definitions mistakes (metric unit, values, max dimensions, max metrics, etc) - * * Metrics are created asynchronously by CloudWatch service, no custom stacks needed - * * Context manager to create a one off metric with a different dimension + * **Key features** + * * Aggregating up to 100 metrics using a single CloudWatch EMF object (large JSON blob). + * * Validating your metrics against common metric definitions mistakes (for example, metric unit, values, max dimensions, max metrics). + * * Metrics are created asynchronously by the CloudWatch service. You do not need any custom stacks, and there is no impact to Lambda function latency. + * * Creating a one-off metric with different dimensions. * - * ## Usage - * - * ### Functions usage with middleware - * - * Using this middleware on your handler function will automatically flush metrics after the function returns or throws an error. - * Additionally, you can configure the middleware to easily: - * * ensure that at least one metric is emitted before you flush them - * * capture a `ColdStart` a metric - * * set default dimensions for all your metrics + * After initializing the Metrics class, you can add metrics using the {@link Metrics.addMetric | `addMetric()`} method. + * The metrics are stored in a buffer and are flushed when calling {@link Metrics.publishStoredMetrics | `publishStoredMetrics()`}. + * Each metric can have dimensions and metadata added to it. * * @example * ```typescript - * import { Metrics } from '@aws-lambda-powertools/metrics'; - * import { logMetrics } from '@aws-lambda-powertools/metrics/middleware'; - * import middy from '@middy/core'; + * import { Metrics, MetricUnit } from '@aws-lambda-powertools/metrics'; * - * const metrics = new Metrics({ namespace: 'serverlessAirline', serviceName: 'orders' }); + * const metrics = new Metrics({ + * namespace: 'serverlessAirline', + * serviceName: 'orders', + * defaultDimensions: { environment: 'dev' }, + * }); * - * const lambdaHandler = async (_event: unknown, _context: unknown) => { - * ... + * export const handler = async (event: { requestId: string }) => { + * metrics.addMetadata('request_id', event.requestId); + * metrics.addMetric('successfulBooking', MetricUnit.Count, 1); + * metrics.publishStoredMetrics(); * }; - * - * export const handler = middy(lambdaHandler).use(logMetrics(metrics)); * ``` * - * ### Object oriented way with decorator + * If you don't want to manually flush the metrics, you can use the {@link Metrics.logMetrics | `logMetrics()`} decorator or + * the Middy.js middleware to automatically flush the metrics after the handler function returns or throws an error. * - * If you are used to TypeScript Class usage to encapsulate your Lambda handler you can leverage the {@link Metrics.logMetrics} decorator to automatically: - * * capture a `ColdStart` metric - * * flush buffered metrics - * * throw on empty metrics + * In addition to this, the decorator and middleware can also be configured to capture a `ColdStart` metric and + * set default dimensions for all metrics. + * + * **Class method decorator** * * @example * * ```typescript - * import { Metrics, MetricUnit } from '@aws-lambda-powertools/metrics'; + * import type { Context } from 'aws-lambda'; * import type { LambdaInterface } from '@aws-lambda-powertools/commons/types'; + * import { Metrics, MetricUnit } from '@aws-lambda-powertools/metrics'; * - * const metrics = new Metrics({ namespace: 'serverlessAirline', serviceName: 'orders' }); + * const metrics = new Metrics({ + * namespace: 'serverlessAirline', + * serviceName: 'orders' + * }); * * class Lambda implements LambdaInterface { - * // Decorate your handler with the logMetrics decorator * ⁣@metrics.logMetrics({ captureColdStartMetric: true, throwOnEmptyMetrics: true }) - * public handler(_event: unknown, _context: unknown): Promise { - * // ... - * metrics.addMetric('test-metric', MetricUnit.Count, 10); - * // ... + * public async handler(_event: { requestId: string }, _: Context) { + * metrics.addMetadata('request_id', event.requestId); + * metrics.addMetric('successfulBooking', MetricUnit.Count, 1); * } * } * @@ -91,23 +89,35 @@ import type { * export const handler = handlerClass.handler.bind(handlerClass); * ``` * - * ### Standard function + * Note that decorators are a Stage 3 proposal for JavaScript and are not yet part of the ECMAScript standard. + * The current implmementation in this library is based on the legacy TypeScript decorator syntax enabled by the [`experimentalDecorators` flag](https://www.typescriptlang.org/tsconfig/#experimentalDecorators) + * set to `true` in the `tsconfig.json` file. * - * If you are used to classic JavaScript functions, you can leverage the different methods provided to create and publish metrics. + * **Middy.js middleware** * * @example * * ```typescript * import { Metrics, MetricUnit } from '@aws-lambda-powertools/metrics'; + * import { logMetrics } from '@aws-lambda-powertools/metrics/middleware'; + * import middy from '@middy/core'; * - * const metrics = new Metrics({ namespace: 'serverlessAirline', serviceName: 'orders' }); + * const metrics = new Metrics({ + * namespace: 'serverlessAirline', + * serviceName: 'orders' + * }); * - * export const handler = async (_event: unknown, __context: unknown): Promise => { - * metrics.captureColdStartMetric(); - * metrics.addMetric('test-metric', MetricUnit.Count, 10); - * metrics.publishStoredMetrics(); - * }; + * export const handler = middy(async () => { + * metrics.addMetadata('request_id', event.requestId); + * metrics.addMetric('successfulBooking', MetricUnit.Count, 1); + * }).use(logMetrics(metrics, { + * captureColdStartMetric: true, + * throwOnEmptyMetrics: true, + * })); * ``` + * + * The `logMetrics()` middleware is compatible with `@middy/core@3.x` and above. + * */ class Metrics extends Utility implements MetricsInterface { /** @@ -186,13 +196,16 @@ class Metrics extends Utility implements MetricsInterface { } /** - * Add a dimension to the metrics. + * Add a dimension to metrics. * - * A dimension is a key-value pair that is used to group metrics. + * A dimension is a key-value pair that is used to group metrics, and it is included in all metrics emitted after it is added. * - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch_concepts.html#Dimension for more details. - * @param name The name of the dimension - * @param value The value of the dimension + * When calling the {@link Metrics.publishStoredMetrics | `publishStoredMetrics()`} method, the dimensions are cleared. This type of + * dimension is useful when you want to add request-specific dimensions to your metrics. If you want to add dimensions that are + * included in all metrics, use the {@link Metrics.setDefaultDimensions | `setDefaultDimensions()`} method. + * + * @param name - The name of the dimension + * @param value - The value of the dimension */ public addDimension(name: string, value: string): void { if (MAX_DIMENSION_COUNT <= this.getCurrentDimensionsCount()) { @@ -206,11 +219,15 @@ class Metrics extends Utility implements MetricsInterface { /** * Add multiple dimensions to the metrics. * - * A dimension is a key-value pair that is used to group metrics. + * This method is useful when you want to add multiple dimensions to the metrics at once. + * + * When calling the {@link Metrics.publishStoredMetrics | `publishStoredMetrics()`} method, the dimensions are cleared. This type of + * dimension is useful when you want to add request-specific dimensions to your metrics. If you want to add dimensions that are + * included in all metrics, use the {@link Metrics.setDefaultDimensions | `setDefaultDimensions()`} method. * - * @param dimensions A key-value pair of dimensions + * @param dimensions - An object with key-value pairs of dimensions */ - public addDimensions(dimensions: { [key: string]: string }): void { + public addDimensions(dimensions: Dimensions): void { const newDimensions = { ...this.dimensions }; for (const dimensionName of Object.keys(dimensions)) { newDimensions[dimensionName] = dimensions[dimensionName]; @@ -226,12 +243,31 @@ class Metrics extends Utility implements MetricsInterface { } /** - * A high-cardinality data part of your Metrics log. + * A metadata key-value pair to be included with metrics. * + * You can use this method to add high-cardinality data as part of your metrics. * This is useful when you want to search highly contextual information along with your metrics in your logs. * - * @param key The key of the metadata - * @param value The value of the metadata + * Note that the metadata is not included in the Amazon CloudWatch UI, but it can be used to search and filter logs. + * + * @example + * ```typescript + * import { Metrics } from '@aws-lambda-powertools/metrics'; + * + * const metrics = new Metrics({ + * namespace: 'serverlessAirline', + * serviceName: 'orders' + * }); + * + * export const handler = async (event) => { + * metrics.addMetadata('request_id', event.requestId); + * metrics.addMetric('successfulBooking', MetricUnit.Count, 1); + * metrics.publishStoredMetrics(); + * }; + * ``` + * + * @param key - The key of the metadata + * @param value - The value of the metadata */ public addMetadata(key: string, value: string): void { this.metadata[key] = value; @@ -240,38 +276,36 @@ class Metrics extends Utility implements MetricsInterface { /** * Add a metric to the metrics buffer. * - * By default, metrics are buffered and flushed at the end of the Lambda invocation - * or when calling {@link Metrics.publishStoredMetrics}. + * By default, metrics are buffered and flushed when calling {@link Metrics.publishStoredMetrics | `publishStoredMetrics()`} method, + * or at the end of the handler function when using the {@link Metrics.logMetrics | `logMetrics()`} decorator or the Middy.js middleware. * - * You can add a metric by specifying the metric name, unit, and value. For convenience, - * we provide a set of constants for the most common units in {@link MetricUnit}. + * Metrics are emitted to standard output in the Amazon CloudWatch EMF (Embedded Metric Format) schema. * - * @example - * ```typescript - * import { Metrics, MetricUnit } from '@aws-lambda-powertools/metrics'; - * - * const metrics = new Metrics({ namespace: 'serverlessAirline', serviceName: 'orders' }); - * - * metrics.addMetric('successfulBooking', MetricUnit.Count, 1); - * ``` + * You can add a metric by specifying the metric name, unit, and value. For convenience, + * we provide a set of constants for the most common units in the {@link MetricUnits | MetricUnit} dictionary object. * - * Optionally, you can specify the metric resolution, which can be either `High` or `Standard`. - * By default, metrics are published with a resolution of `Standard`, click [here](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch_concepts.html#Resolution_definition) - * to learn more about metric resolutions. + * Optionally, you can specify a {@link https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch_concepts.html#Resolution_definition | resolution}, which can be either `High` or `Standard`, using the {@link MetricResolutions | MetricResolution} dictionary object. + * By default, metrics are published with a resolution of `Standard`. * * @example * ```typescript - * import { Metrics, MetricUnit, MetricResolution } from '@aws-lambda-powertools/metrics'; + * import { Metrics, MetricUnit } from '@aws-lambda-powertools/metrics'; * - * const metrics = new Metrics({ namespace: 'serverlessAirline', serviceName: 'orders' }); + * const metrics = new Metrics({ + * namespace: 'serverlessAirline', + * serviceName: 'orders' + * }); * - * metrics.addMetric('successfulBooking', MetricUnit.Count, 1, MetricResolution.High); + * export const handler = async () => { + * metrics.addMetric('successfulBooking', MetricUnit.Count, 1); + * metrics.publishStoredMetrics(); + * }; * ``` * - * @param name The metric name - * @param unit The metric unit - * @param value The metric value - * @param resolution - The metric resolution + * @param name - The metric name + * @param unit - The metric unit, see {@link MetricUnits | MetricUnit} + * @param value - The metric value + * @param resolution - The metric resolution, see {@link MetricResolutions | MetricResolution} */ public addMetric( name: string, @@ -284,23 +318,27 @@ class Metrics extends Utility implements MetricsInterface { } /** - * Create a singleMetric to capture cold start. + * Immediately emit a `ColdStart` metric if this is a cold start invocation. * - * If it's a cold start invocation, this feature will: - * * Create a separate EMF blob that contains a single metric named ColdStart - * * Add function_name and service dimensions + * A cold start is when AWS Lambda initializes a new instance of your function. To take advantage of this feature, + * you must instantiate the Metrics class outside of the handler function. * - * This has the advantage of keeping cold start metric separate from your application metrics, where you might have unrelated dimensions, - * as well as avoiding potential data loss from metrics not being published for other reasons. + * By using this method, the metric will be emitted immediately without you having to call {@link Metrics.publishStoredMetrics | `publishStoredMetrics()`}. + * + * If you are using the {@link Metrics.logMetrics | `logMetrics()`} decorator, or the Middy.js middleware, you can enable this + * feature by setting the `captureColdStartMetric` option to `true`. * * @example * ```typescript * import { Metrics } from '@aws-lambda-powertools/metrics'; * - * const metrics = new Metrics({ namespace: 'serverlessAirline', serviceName: 'orders' }); + * const metrics = new Metrics({ + * namespace: 'serverlessAirline', + * serviceName: 'orders' + * }); * - * export const handler = async (_event: unknown, __context: unknown): Promise => { - * metrics.captureColdStartMetric(); + * export const handler = async () => { + * metrics.captureColdStartMetric(); * }; * ``` */ @@ -320,21 +358,71 @@ class Metrics extends Utility implements MetricsInterface { } /** - * Clear all default dimensions. + * Clear all previously set default dimensions. + * + * This will remove all default dimensions set by the {@link Metrics.setDefaultDimensions | `setDefaultDimensions()`} method + * or via the `defaultDimensions` parameter in the constructor. + * + * @example + * ```typescript + * import { Metrics } from '@aws-lambda-powertools/metrics'; + * + * const metrics = new Metrics({ + * namespace: 'serverlessAirline', + * serviceName: 'orders', + * defaultDimensions: { environment: 'dev' }, + * }); + * + * metrics.setDefaultDimensions({ region: 'us-west-2' }); + * + * // both environment and region dimensions are removed + * metrics.clearDefaultDimensions(); + * ``` */ public clearDefaultDimensions(): void { this.defaultDimensions = {}; } /** - * Clear all dimensions. + * Clear all the dimensions added to the Metrics instance via {@link Metrics.addDimension | `addDimension()`} or {@link Metrics.addDimensions | `addDimensions()`}. + * + * These dimensions are normally cleared when calling {@link Metrics.publishStoredMetrics | `publishStoredMetrics()`}, but + * you can use this method to clear specific dimensions that you no longer need at runtime. + * + * This method does not clear the default dimensions set via {@link Metrics.setDefaultDimensions | `setDefaultDimensions()`} or via + * the `defaultDimensions` parameter in the constructor. + * + * @example + * ```typescript + * import { Metrics } from '@aws-lambda-powertools/metrics'; + * + * const metrics = new Metrics({ + * namespace: 'serverlessAirline', + * serviceName: 'orders' + * }); + * + * export const handler = async () => { + * metrics.addDimension('region', 'us-west-2'); + * + * // ... + * + * metrics.clearDimensions(); // olnly the region dimension is removed + * }; + * ``` + * + * The method is primarily intended for internal use, but it is exposed for advanced use cases. */ public clearDimensions(): void { this.dimensions = {}; } /** - * Clear all metadata. + * Clear all the metadata added to the Metrics instance. + * + * Metadata is normally cleared when calling {@link Metrics.publishStoredMetrics | `publishStoredMetrics()`}, but + * you can use this method to clear specific metadata that you no longer need at runtime. + * + * The method is primarily intended for internal use, but it is exposed for advanced use cases. */ public clearMetadata(): void { this.metadata = {}; @@ -342,26 +430,39 @@ class Metrics extends Utility implements MetricsInterface { /** * Clear all the metrics stored in the buffer. + * + * This is useful when you want to clear the metrics stored in the buffer without publishing them. + * + * The method is primarily intended for internal use, but it is exposed for advanced use cases. */ public clearMetrics(): void { this.storedMetrics = {}; } /** - * A decorator automating coldstart capture, throw on empty metrics and publishing metrics on handler exit. + * A class method decorator to automatically log metrics after the method returns or throws an error. + * + * The decorator can be used with TypeScript classes and can be configured to optionally capture a `ColdStart` metric (see {@link Metrics.captureColdStartMetric | `captureColdStartMetric()`}), + * throw an error if no metrics are emitted (see {@link Metrics.setThrowOnEmptyMetrics | `setThrowOnEmptyMetrics()`}), + * and set default dimensions for all metrics (see {@link Metrics.setDefaultDimensions | `setDefaultDimensions()`}). * * @example * * ```typescript - * import { Metrics } from '@aws-lambda-powertools/metrics'; + * import type { Context } from 'aws-lambda'; * import type { LambdaInterface } from '@aws-lambda-powertools/commons/types'; + * import { Metrics, MetricUnit } from '@aws-lambda-powertools/metrics'; * - * const metrics = new Metrics({ namespace: 'serverlessAirline', serviceName: 'orders' }); + * const metrics = new Metrics({ + * namespace: 'serverlessAirline', + * serviceName: 'orders' + * }); * * class Lambda implements LambdaInterface { - * @metrics.logMetrics({ captureColdStartMetric: true }) - * public handler(_event: unknown, __context: unknown): Promise { - * // ... + * ⁣@metrics.logMetrics({ captureColdStartMetric: true }) + * public async handler(_event: { requestId: string }, _: Context) { + * metrics.addMetadata('request_id', event.requestId); + * metrics.addMetric('successfulBooking', MetricUnit.Count, 1); * } * } * @@ -369,13 +470,18 @@ class Metrics extends Utility implements MetricsInterface { * export const handler = handlerClass.handler.bind(handlerClass); * ``` * - * @param options - The options to configure the logMetrics decorator + * You can configure the decorator with the following options: + * - `captureColdStartMetric` - Whether to capture a `ColdStart` metric + * - `defaultDimensions` - Default dimensions to add to all metrics + * - `throwOnEmptyMetrics` - Whether to throw an error if no metrics are emitted + * + * @param options - Options to configure the behavior of the decorator, see {@link ExtraOptions} */ public logMetrics(options: ExtraOptions = {}): HandlerMethodDecorator { const { throwOnEmptyMetrics, defaultDimensions, captureColdStartMetric } = options; if (throwOnEmptyMetrics) { - this.throwOnEmptyMetrics(); + this.setThrowOnEmptyMetrics(throwOnEmptyMetrics); } if (defaultDimensions !== undefined) { this.setDefaultDimensions(defaultDimensions); @@ -411,18 +517,23 @@ class Metrics extends Utility implements MetricsInterface { } /** - * Synchronous function to actually publish your metrics. (Not needed if using logMetrics decorator). - * It will create a new EMF blob and log it to standard output to be then ingested by Cloudwatch logs and processed automatically for metrics creation. + * Flush the stored metrics to standard output. * - * @example + * The method empties the metrics buffer and emits the metrics to standard output in the Amazon CloudWatch EMF (Embedded Metric Format) schema. + * + * When using the {@link Metrics.logMetrics | `logMetrics()`} decorator, or the Middy.js middleware, the metrics are automatically flushed after the handler function returns or throws an error. * + * @example * ```typescript * import { Metrics, MetricUnit } from '@aws-lambda-powertools/metrics'; * - * const metrics = new Metrics({ namespace: 'serverlessAirline', serviceName: 'orders' }); // Sets metric namespace, and service as a metric dimension + * const metrics = new Metrics({ + * namespace: 'serverlessAirline', + * serviceName: 'orders' + * }); * - * export const handler = async (_event: unknown, __context: unknown): Promise => { - * metrics.addMetric('test-metric', MetricUnit.Count, 10); + * export const handler = async () => { + * metrics.addMetric('successfulBooking', MetricUnit.Count, 1); * metrics.publishStoredMetrics(); * }; * ``` @@ -443,14 +554,16 @@ class Metrics extends Utility implements MetricsInterface { } /** - * Function to create a new metric object compliant with the EMF (Embedded Metric Format) schema which - * includes the metric name, unit, and optionally storage resolution. + * Serialize the stored metrics into a JSON object compliant with the Amazon CloudWatch EMF (Embedded Metric Format) schema. * - * The function will create a new EMF blob and log it to standard output to be then ingested by Cloudwatch - * logs and processed automatically for metrics creation. + * The EMF schema is a JSON object that contains the following properties: + * - `_aws`: An object containing the timestamp and the CloudWatch metrics. + * - `CloudWatchMetrics`: An array of CloudWatch metrics objects. + * - `Namespace`: The namespace of the metrics. + * - `Dimensions`: An array of dimensions for the metrics. + * - `Metrics`: An array of metric definitions. * - * @returns metrics as JSON object compliant EMF Schema Specification - * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Embedded_Metric_Format_Specification.html for more details + * The object is then emitted to standard output, which in AWS Lambda is picked up by CloudWatch logs and processed asynchronously. */ public serializeMetrics(): EmfOutput { // Storage resolution is included only for High resolution metrics @@ -515,7 +628,26 @@ class Metrics extends Utility implements MetricsInterface { /** * Set default dimensions that will be added to all metrics. * - * @param dimensions The default dimensions to be added to all metrics. + * This method will merge the provided dimensions with the existing default dimensions. + * + * @example + * ```typescript + * import { Metrics } from '@aws-lambda-powertools/metrics'; + * + * const metrics = new Metrics({ + * namespace: 'serverlessAirline', + * serviceName: 'orders', + * defaultDimensions: { environment: 'dev' }, + * }); + * + * // Default dimensions will contain both region and environment + * metrics.setDefaultDimensions({ + * region: 'us-west-2', + * environment: 'prod', + * }); + * ``` + * + * @param dimensions - The dimensions to be added to the default dimensions object */ public setDefaultDimensions(dimensions: Dimensions | undefined): void { const targetDimensions = { @@ -529,28 +661,69 @@ class Metrics extends Utility implements MetricsInterface { } /** - * Sets the function name to be added to the metric. + * Set the function name to be added to each metric as a dimension. + * + * When using the {@link Metrics.logMetrics | `logMetrics()`} decorator, or the Middy.js middleware, the function + * name is automatically inferred from the Lambda context. + * + * @example + * ```typescript + * import { Metrics } from '@aws-lambda-powertools/metrics'; + * + * const metrics = new Metrics({ + * namespace: 'serverlessAirline', + * serviceName: 'orders' + * }); + * + * metrics.setFunctionName('my-function-name'); + * ``` + * + * @param name - The function name + */ + public setFunctionName(name: string): void { + this.functionName = name; + } + + /** + * Set the flag to throw an error if no metrics are emitted. * - * @param value The function name to be added to the metric. + * You can use this method to enable or disable this opt-in feature. This is useful if you want to ensure + * that at least one metric is emitted when flushing the metrics. This can be useful to catch bugs where + * metrics are not being emitted as expected. + * + * @param enabled - Whether to throw an error if no metrics are emitted */ - public setFunctionName(value: string): void { - this.functionName = value; + public setThrowOnEmptyMetrics(enabled: boolean): void { + this.shouldThrowOnEmptyMetrics = enabled; } /** - * CloudWatch EMF uses the same dimensions across all your metrics. Use singleMetric if you have a metric that should have different dimensions. + * Create a new Metrics instance configured to immediately flush a single metric. * - * You don't need to call publishStoredMetrics() after calling addMetric for a singleMetrics, they will be flushed directly. + * CloudWatch EMF uses the same dimensions and timestamp across all your metrics, this is useful when you have a metric that should have different dimensions + * or when you want to emit a single metric without buffering it. * - * @example + * This method is used internally by the {@link Metrics.captureColdStartMetric | `captureColdStartMetric()`} method to emit the `ColdStart` metric immediately + * after the handler function is called. * + * @example * ```typescript - * const singleMetric = metrics.singleMetric(); - * singleMetric.addDimension('InnerDimension', 'true'); - * singleMetric.addMetric('single-metric', MetricUnit.Percent, 50); - * ``` + * import { Metrics } from '@aws-lambda-powertools/metrics'; * - * @returns the Metrics + * const metrics = new Metrics({ + * namespace: 'serverlessAirline', + * serviceName: 'orders' + * }); + * + * export const handler = async () => { + * const singleMetric = metrics.singleMetric(); + * // The single metric will be emitted immediately + * singleMetric.addMetric('coldStart', MetricUnit.Count, 1); + * + * // These other metrics will be buffered and emitted when calling `publishStoredMetrics()` + * metrics.addMetric('successfulBooking', MetricUnit.Count, 1); + * metrics.publishStoredMetrics(); + * }; */ public singleMetric(): Metrics { return new Metrics({ @@ -562,29 +735,14 @@ class Metrics extends Utility implements MetricsInterface { } /** - * Throw an Error if the metrics buffer is empty. - * - * @example - * - * ```typescript - * import { Metrics } from '@aws-lambda-powertools/metrics'; - * - * const metrics = new Metrics({ namespace: 'serverlessAirline', serviceName:'orders' }); - * - * export const handler = async (_event: unknown, __context: unknown): Promise => { - * metrics.throwOnEmptyMetrics(); - * metrics.publishStoredMetrics(); // will throw since no metrics added. - * }; - * ``` + * @deprecated Use {@link Metrics.setThrowOnEmptyMetrics | `setThrowOnEmptyMetrics()`} instead. */ public throwOnEmptyMetrics(): void { this.shouldThrowOnEmptyMetrics = true; } /** - * Gets the current number of dimensions stored. - * - * @returns the number of dimensions currently stored + * Gets the current number of dimensions count. */ private getCurrentDimensionsCount(): number { return ( @@ -616,8 +774,8 @@ class Metrics extends Utility implements MetricsInterface { * the same name. If the units are inconsistent, we throw an error as this is likely a bug or typo. * This can happen if a metric is added without using the `MetricUnit` helper in JavaScript codebases. * - * @param name The name of the metric - * @param unit The unit of the metric + * @param name - The name of the metric + * @param unit - The unit of the metric */ private isNewMetric(name: string, unit: MetricUnit): boolean { if (this.storedMetrics[name]) { @@ -634,11 +792,10 @@ class Metrics extends Utility implements MetricsInterface { } /** - * Initialize the console property as an instance of the internal version of Console() class (PR #748) + * Initialize the console property as an instance of the internal version of `Console()` class (PR #748) * or as the global node console if the `POWERTOOLS_DEV' env variable is set and has truthy value. * * @private - * @returns {void} */ private setConsole(): void { if (!this.getEnvVarsService().isDevMode()) { @@ -674,7 +831,7 @@ class Metrics extends Utility implements MetricsInterface { /** * Set the namespace to be used. * - * @param namespace The namespace to be used + * @param namespace - The namespace to be used */ private setNamespace(namespace: string | undefined): void { this.namespace = (namespace || @@ -687,7 +844,7 @@ class Metrics extends Utility implements MetricsInterface { * * This method is used during the initialization of the Metrics instance. * - * @param options The options to be used + * @param options - The options to be used */ private setOptions(options: MetricsOptions): Metrics { const { @@ -712,7 +869,7 @@ class Metrics extends Utility implements MetricsInterface { /** * Set the service to be used. * - * @param service The service to be used + * @param service - The service to be used */ private setService(service: string | undefined): void { const targetService = @@ -729,12 +886,12 @@ class Metrics extends Utility implements MetricsInterface { * Store a metric in the buffer. * * If the buffer is full, or the metric reaches the maximum number of values, - * the buffer is published to stdout. + * the metrics are flushed to stdout. * - * @param name The name of the metric to store - * @param unit The unit of the metric to store - * @param value The value of the metric to store - * @param resolution The resolution of the metric to store + * @param name - The name of the metric to store + * @param unit - The unit of the metric to store + * @param value - The value of the metric to store + * @param resolution - The resolution of the metric to store */ private storeMetric( name: string, diff --git a/packages/metrics/src/config/EnvironmentVariablesService.ts b/packages/metrics/src/config/EnvironmentVariablesService.ts index da6670dcce..5f277e3010 100644 --- a/packages/metrics/src/config/EnvironmentVariablesService.ts +++ b/packages/metrics/src/config/EnvironmentVariablesService.ts @@ -1,6 +1,12 @@ import { EnvironmentVariablesService as CommonEnvironmentVariablesService } from '@aws-lambda-powertools/commons'; import type { ConfigServiceInterface } from '../types/ConfigServiceInterface.js'; +/** + * Class EnvironmentVariablesService + * + * This class is used to return environment variables that are available in the runtime of + * the current Lambda invocation. + */ class EnvironmentVariablesService extends CommonEnvironmentVariablesService implements ConfigServiceInterface @@ -8,7 +14,7 @@ class EnvironmentVariablesService private namespaceVariable = 'POWERTOOLS_METRICS_NAMESPACE'; /** - * It returns the value of the POWERTOOLS_METRICS_NAMESPACE environment variable. + * Get the value of the `POWERTOOLS_METRICS_NAMESPACE` environment variable. */ public getNamespace(): string { return this.get(this.namespaceVariable); diff --git a/packages/metrics/src/constants.ts b/packages/metrics/src/constants.ts index a3c2ee9e4c..18edeb0516 100644 --- a/packages/metrics/src/constants.ts +++ b/packages/metrics/src/constants.ts @@ -1,9 +1,30 @@ +/** + * The dimension key for the cold start metric. + */ const COLD_START_METRIC = 'ColdStart'; +/** + * The default namespace for metrics. + */ const DEFAULT_NAMESPACE = 'default_namespace'; +/** + * The maximum number of metrics that can be emitted in a single EMF blob. + */ const MAX_METRICS_SIZE = 100; +/** + * The maximum number of metric values that can be emitted in a single metric. + */ const MAX_METRIC_VALUES_SIZE = 100; +/** + * The maximum number of dimensions that can be added to a metric (0-indexed). + */ const MAX_DIMENSION_COUNT = 29; +/** + * The unit of the metric. + * + * @see {@link https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch_concepts.html#Unit | Amazon CloudWatch Units} + * @see {@link https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_MetricDatum.html | Amazon CloudWatch MetricDatum} + */ const MetricUnit = { Seconds: 'Seconds', Microseconds: 'Microseconds', @@ -34,6 +55,11 @@ const MetricUnit = { NoUnit: 'None', } as const; +/** + * The resolution of the metric. + * + * @see {@link https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch_concepts.html#Resolution_definition | Amazon CloudWatch Resolution} + */ const MetricResolution = { Standard: 60, High: 1, diff --git a/packages/metrics/src/middleware/middy.ts b/packages/metrics/src/middleware/middy.ts index 8274383829..e02a39d79a 100644 --- a/packages/metrics/src/middleware/middy.ts +++ b/packages/metrics/src/middleware/middy.ts @@ -7,31 +7,40 @@ import type { Metrics } from '../Metrics.js'; import type { ExtraOptions } from '../types/Metrics.js'; /** - * A middy middleware automating capture of metadata and annotations on segments or subsegments for a Lambda Handler. + * A Middy.js middleware automating capture of Amazon CloudWatch metrics. * - * Using this middleware on your handler function will automatically flush metrics after the function returns or throws an error. - * Additionally, you can configure the middleware to easily: - * * ensure that at least one metric is emitted before you flush them - * * capture a `ColdStart` a metric - * * set default dimensions for all your metrics + * This middleware is compatible with `@middy/core@3.x` and above. + * + * The middleware automatically flushes metrics after the handler function returns or throws an error, + * so you don't need to call {@link Metrics.publishStoredMetrics | `publishStoredMetrics()`} manually. * * @example * ```typescript - * import { Metrics } from '@aws-lambda-powertools/metrics'; + * import { Metrics, MetricUnit } from '@aws-lambda-powertools/metrics'; * import { logMetrics } from '@aws-lambda-powertools/metrics/middleware'; * import middy from '@middy/core'; * - * const metrics = new Metrics({ namespace: 'serverlessAirline', serviceName: 'orders' }); - * - * const lambdaHandler = async (_event: any, _context: any) => { - * ... - * }; + * const metrics = new Metrics({ + * namespace: 'serverlessAirline', + * serviceName: 'orders' + * }); * - * export const handler = middy(lambdaHandler).use(logMetrics(metrics)); + * export const handler = middy(async () => { + * metrics.addMetadata('request_id', event.requestId); + * metrics.addMetric('successfulBooking', MetricUnit.Count, 1); + * }).use(logMetrics(metrics, { + * captureColdStartMetric: true, + * throwOnEmptyMetrics: true, + * })); * ``` * + * You can configure the middleware with the following options: + * - `captureColdStartMetric`: Whether to capture a `ColdStart` metric + * - `defaultDimensions`: Default dimensions to add to all metrics + * - `throwOnEmptyMetrics`: Whether to throw an error if no metrics are emitted + * * @param target - The Metrics instance to use for emitting metrics - * @param options - (_optional_) Options for the middleware + * @param options - Options to configure the middleware, see {@link ExtraOptions} */ const logMetrics = ( target: Metrics | Metrics[], @@ -57,7 +66,7 @@ const logMetrics = ( const { throwOnEmptyMetrics, defaultDimensions, captureColdStartMetric } = options; if (throwOnEmptyMetrics) { - metrics.throwOnEmptyMetrics(); + metrics.setThrowOnEmptyMetrics(throwOnEmptyMetrics); } if (defaultDimensions !== undefined) { metrics.setDefaultDimensions(defaultDimensions); diff --git a/packages/metrics/src/types/ConfigServiceInterface.ts b/packages/metrics/src/types/ConfigServiceInterface.ts index 3f8557f399..81caa2d53b 100644 --- a/packages/metrics/src/types/ConfigServiceInterface.ts +++ b/packages/metrics/src/types/ConfigServiceInterface.ts @@ -9,9 +9,7 @@ import type { ConfigServiceInterface as ConfigServiceBaseInterface } from '@aws- */ interface ConfigServiceInterface extends ConfigServiceBaseInterface { /** - * It returns the value of the POWERTOOLS_METRICS_NAMESPACE environment variable. - * - * @returns {string} + * Get the value of the `POWERTOOLS_METRICS_NAMESPACE` environment variable. */ getNamespace(): string; } diff --git a/packages/metrics/src/types/Metrics.ts b/packages/metrics/src/types/Metrics.ts index 3b0a163134..1c65dc5212 100644 --- a/packages/metrics/src/types/Metrics.ts +++ b/packages/metrics/src/types/Metrics.ts @@ -1,19 +1,68 @@ +import type { HandlerMethodDecorator } from '@aws-lambda-powertools/commons/types'; import type { - MetricResolution as MetricResolutionList, - MetricUnit as MetricUnitList, + MetricResolution as MetricResolutions, + MetricUnit as MetricUnits, } from '../constants.js'; import type { ConfigServiceInterface } from './ConfigServiceInterface.js'; +/** + * A set of key-value pairs that define the dimensions of a metric. + */ type Dimensions = Record; +/** + * Options to configure the Metrics class. + * + * @example + * ```typescript + * import { Metrics } from '@aws-lambda-powertools/metrics'; + * + * const metrics = new Metrics({ + * namespace: 'serverlessAirline', + * serviceName: 'orders', + * singleMetric: true, + * }); + * ``` + */ type MetricsOptions = { + /** + * A custom configuration service to use for retrieving configuration values. + * + * @default undefined + */ customConfigService?: ConfigServiceInterface; + /** + * The namespace to use for all metrics. + * + * @default undefined + */ namespace?: string; + /** + * The service name to use for all metrics. + * + * @default undefined + */ serviceName?: string; + /** + * Whether to configure the Metrics class to emit a single metric as soon as it is added. + * + * @default false + * @see {@link MetricsInterface.singleMetric | `singleMetric()`} + */ singleMetric?: boolean; + /** + * The default dimensions to add to all metrics. + * + * @default {} + * @see {@link MetricsInterface.setDefaultDimensions | `setDefaultDimensions()`} + */ defaultDimensions?: Dimensions; }; +/** + * The output of the {@link MetricsInterface.serializeMetrics | `serializeMetrics()`} method, + * compliant with the {@link https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Embedded_Metric_Format.html | Amazon CloudWatch Embedded Metric Format (EMF)}. + */ type EmfOutput = Readonly<{ [key: string]: string | number | object; _aws: { @@ -27,35 +76,50 @@ type EmfOutput = Readonly<{ }>; /** - * Options for the metrics decorator - * - * Usage: - * - * ```typescript - * - * const metricsOptions: MetricsOptions = { - * throwOnEmptyMetrics: true, - * defaultDimensions: {'environment': 'dev'}, - * captureColdStartMetric: true, - * } - * - * @metrics.logMetric(metricsOptions) - * public handler(event: any, context: any, callback: any) { - * // ... - * } - * ``` + * Options to customize the behavior of the {@link MetricsInterface.logMetrics | `logMetrics()`} decorator or Middy.js middleware. */ type ExtraOptions = { + /** + * Whether to throw an error if no metrics are emitted. + * + * @default false + * @see {@link MetricsInterface.publishStoredMetrics | `publishStoredMetrics()`} + */ throwOnEmptyMetrics?: boolean; + /** + * Default dimensions to add to all metrics. + * + * @default {} + * @see {@link MetricsInterface.setDefaultDimensions | `setDefaultDimensions()`} + */ defaultDimensions?: Dimensions; + /** + * Whether to capture a `ColdStart` metric. + * + * @default false + * @see {@link MetricsInterface.captureColdStartMetric | `captureColdStartMetric()`} + */ captureColdStartMetric?: boolean; }; +/** + * A list of possible metric resolutions. + * + * @see {@link https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch_concepts.html#Resolution_definition | Amazon CloudWatch Resolution} + */ type MetricResolution = - (typeof MetricResolutionList)[keyof typeof MetricResolutionList]; + (typeof MetricResolutions)[keyof typeof MetricResolutions]; -type MetricUnit = (typeof MetricUnitList)[keyof typeof MetricUnitList]; +/** + * A list of possible metric units. + * + * @see {@link https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch_concepts.html#Unit | Amazon CloudWatch Units} + */ +type MetricUnit = (typeof MetricUnits)[keyof typeof MetricUnits]; +/** + * Data structure to store a metric that has been added to the Metrics class. + */ type StoredMetric = { name: string; unit: MetricUnit; @@ -63,14 +127,373 @@ type StoredMetric = { resolution: MetricResolution; }; +/** + * A map of stored metrics, where the key is the metric name and the value is the stored metric. + */ type StoredMetrics = Record; +/** + * A definition of a metric that can be added to the Metrics class. + */ type MetricDefinition = { Name: string; Unit: MetricUnit; StorageResolution?: MetricResolution; }; +interface MetricsInterface { + /** + * Add a dimension to metrics. + * + * A dimension is a key-value pair that is used to group metrics, and it is included in all metrics emitted after it is added. + * + * When calling the {@link MetricsInterface.publishStoredMetrics | `publishStoredMetrics()`} method, the dimensions are cleared. This type of + * dimension is useful when you want to add request-specific dimensions to your metrics. If you want to add dimensions that are + * included in all metrics, use the {@link MetricsInterface.setDefaultDimensions | `setDefaultDimensions()`} method. + * + * @param name - The name of the dimension + * @param value - The value of the dimension + */ + addDimension(name: string, value: string): void; + /** + * Add multiple dimensions to the metrics. + * + * This method is useful when you want to add multiple dimensions to the metrics at once. + * + * When calling the {@link MetricsInterface.publishStoredMetrics | `publishStoredMetrics()`} method, the dimensions are cleared. This type of + * dimension is useful when you want to add request-specific dimensions to your metrics. If you want to add dimensions that are + * included in all metrics, use the {@link MetricsInterface.setDefaultDimensions | `setDefaultDimensions()`} method. + * + * @param dimensions - An object with key-value pairs of dimensions + */ + addDimensions(dimensions: Dimensions): void; + /** + * A metadata key-value pair to be included with metrics. + * + * You can use this method to add high-cardinality data as part of your metrics. + * This is useful when you want to search highly contextual information along with your metrics in your logs. + * + * Note that the metadata is not included in the Amazon CloudWatch UI, but it can be used to search and filter logs. + * + * @example + * ```typescript + * import { Metrics } from '@aws-lambda-powertools/metrics'; + * + * const metrics = new Metrics({ + * namespace: 'serverlessAirline', + * serviceName: 'orders' + * }); + * + * export const handler = async (event) => { + * metrics.addMetadata('request_id', event.requestId); + * metrics.addMetric('successfulBooking', MetricUnit.Count, 1); + * metrics.publishStoredMetrics(); + * }; + * ``` + * + * @param key - The key of the metadata + * @param value - The value of the metadata + */ + addMetadata(key: string, value: string): void; + /** + * Add a metric to the metrics buffer. + * + * By default, metrics are buffered and flushed when calling {@link MetricsInterface.publishStoredMetrics | `publishStoredMetrics()`} method, + * or at the end of the handler function when using the {@link MetricsInterface.logMetrics | `logMetrics()`} decorator or the Middy.js middleware. + * + * Metrics are emitted to standard output in the Amazon CloudWatch EMF (Embedded Metric Format) schema. In AWS Lambda, the logs are + * automatically picked up by CloudWatch logs and processed asynchronously. + * + * You can add a metric by specifying the metric name, unit, and value. For convenience, + * we provide a set of constants for the most common units in the {@link MetricUnits | MetricUnit} dictionary object. + * + * Optionally, you can specify a {@link https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch_concepts.html#Resolution_definition | resolution}, which can be either `High` or `Standard`, using the {@link MetricResolutions | MetricResolution} dictionary object. + * By default, metrics are published with a resolution of `Standard`. + * + * @example + * ```typescript + * import { Metrics, MetricUnit } from '@aws-lambda-powertools/metrics'; + * + * const metrics = new Metrics({ + * namespace: 'serverlessAirline', + * serviceName: 'orders' + * }); + * + * export const handler = async () => { + * metrics.addMetric('successfulBooking', MetricUnit.Count, 1); + * metrics.publishStoredMetrics(); + * }; + * ``` + * + * @param name - The metric name + * @param unit - The metric unit, see {@link MetricUnits | MetricUnit} + * @param value - The metric value + * @param resolution - The metric resolution, see {@link MetricResolutions | MetricResolution} + */ + addMetric( + name: string, + unit: MetricUnit, + value: number, + resolution?: MetricResolution + ): void; + /** + * Immediately emit a `ColdStart` metric if this is a cold start invocation. + * + * A cold start is when AWS Lambda initializes a new instance of your function. To take advantage of this feature, + * you must instantiate the Metrics class outside of the handler function. + * + * By using this method, the metric will be emitted immediately without you having to call {@link MetricsInterface.publishStoredMetrics | `publishStoredMetrics()`}. + * + * If you are using the {@link MetricsInterface.logMetrics | `logMetrics()`} decorator, or the Middy.js middleware, you can enable this + * feature by setting the `captureColdStartMetric` option to `true`. + * + * @example + * ```typescript + * import { Metrics } from '@aws-lambda-powertools/metrics'; + * + * const metrics = new Metrics({ + * namespace: 'serverlessAirline', + * serviceName: 'orders' + * }); + * + * export const handler = async () => { + * metrics.captureColdStartMetric(); + * }; + * ``` + */ + captureColdStartMetric(): void; + /** + * Clear all previously set default dimensions. + * + * This will remove all default dimensions set by the {@link MetricsInterface.setDefaultDimensions | `setDefaultDimensions()`} method + * or via the `defaultDimensions` parameter in the constructor. + * + * @example + * ```typescript + * import { Metrics } from '@aws-lambda-powertools/metrics'; + * + * const metrics = new Metrics({ + * namespace: 'serverlessAirline', + * serviceName: 'orders', + * defaultDimensions: { environment: 'dev' }, + * }); + * + * metrics.setDefaultDimensions({ region: 'us-west-2' }); + * + * // both environment and region dimensions are removed + * metrics.clearDefaultDimensions(); + * ``` + */ + clearDefaultDimensions(): void; + /** + * Clear all the dimensions added to the Metrics instance via {@link MetricsInterface.addDimension | `addDimension()`} or {@link MetricsInterface.addDimensions | `addDimensions()`}. + * + * These dimensions are normally cleared when calling {@link MetricsInterface.publishStoredMetrics | `publishStoredMetrics()`}, but + * you can use this method to clear specific dimensions that you no longer need at runtime. + * + * This method does not clear the default dimensions set via {@link MetricsInterface.setDefaultDimensions | `setDefaultDimensions()`} or via + * the `defaultDimensions` parameter in the constructor. + * + * @example + * ```typescript + * import { Metrics } from '@aws-lambda-powertools/metrics'; + * + * const metrics = new Metrics({ + * namespace: 'serverlessAirline', + * serviceName: 'orders' + * }); + * + * export const handler = async () => { + * metrics.addDimension('region', 'us-west-2'); + * + * // ... + * + * metrics.clearDimensions(); // olnly the region dimension is removed + * }; + * ``` + * + * The method is primarily intended for internal use, but it is exposed for advanced use cases. + */ + clearDimensions(): void; + /** + * Clear all the metadata added to the Metrics instance. + * + * Metadata is normally cleared when calling {@link MetricsInterface.publishStoredMetrics | `publishStoredMetrics()`}, but + * you can use this method to clear specific metadata that you no longer need at runtime. + * + * The method is primarily intended for internal use, but it is exposed for advanced use cases. + */ + clearMetadata(): void; + /** + * Clear all the metrics stored in the buffer. + * + * This is useful when you want to clear the metrics stored in the buffer without publishing them. + * + * The method is primarily intended for internal use, but it is exposed for advanced use cases. + */ + clearMetrics(): void; + /** + * A class method decorator to automatically log metrics after the method returns or throws an error. + * + * The decorator can be used with TypeScript classes and can be configured to optionally capture a `ColdStart` metric (see {@link MetricsInterface.captureColdStartMetric | `captureColdStartMetric()`}), + * throw an error if no metrics are emitted (see {@link MetricsInterface.setThrowOnEmptyMetrics | `setThrowOnEmptyMetrics()`}), + * and set default dimensions for all metrics (see {@link MetricsInterface.setDefaultDimensions | `setDefaultDimensions()`}). + * + * @example + * + * ```typescript + * import { Metrics } from '@aws-lambda-powertools/metrics'; + * import type { LambdaInterface } from '@aws-lambda-powertools/commons/types'; + * + * const metrics = new Metrics({ + * namespace: 'serverlessAirline', + * serviceName: 'orders' + * }); + * + * class Lambda implements LambdaInterface { + * ⁣@metrics.logMetrics({ captureColdStartMetric: true }) + * public handler(_event: unknown, _context: unknown) { + * // ... + * } + * } + * + * const handlerClass = new Lambda(); + * export const handler = handlerClass.handler.bind(handlerClass); + * ``` + * + * You can configure the decorator with the following options: + * - `captureColdStartMetric`: Whether to capture a `ColdStart` metric + * - `defaultDimensions`: Default dimensions to add to all metrics + * - `throwOnEmptyMetrics`: Whether to throw an error if no metrics are emitted + * + * @param options - Options to configure the behavior of the decorator, see {@link ExtraOptions} + */ + logMetrics(options?: ExtraOptions): HandlerMethodDecorator; + /** + * Flush the stored metrics to standard output. + * + * The method empties the metrics buffer and emits the metrics to standard output in the Amazon CloudWatch EMF (Embedded Metric Format) schema. + * + * When using the {@link MetricsInterface.logMetrics | `logMetrics()`} decorator, or the Middy.js middleware, the metrics are automatically flushed after the handler function returns or throws an error. + * + * @example + * ```typescript + * import { Metrics, MetricUnit } from '@aws-lambda-powertools/metrics'; + * + * const metrics = new Metrics({ + * namespace: 'serverlessAirline', + * serviceName: 'orders' + * }); + * + * export const handler = async () => { + * metrics.addMetric('successfulBooking', MetricUnit.Count, 1); + * metrics.publishStoredMetrics(); + * }; + * ``` + */ + publishStoredMetrics(): void; + /** + * Serialize the stored metrics into a JSON object compliant with the Amazon CloudWatch EMF (Embedded Metric Format) schema. + * + * The EMF schema is a JSON object that contains the following properties: + * - `_aws`: An object containing the timestamp and the CloudWatch metrics. + * - `CloudWatchMetrics`: An array of CloudWatch metrics objects. + * - `Namespace`: The namespace of the metrics. + * - `Dimensions`: An array of dimensions for the metrics. + * - `Metrics`: An array of metric definitions. + * + * The serialized object is returned for later use. + * + * This is primarily an internal method used by the Metrics class, but it is exposed for advanced use cases. + */ + serializeMetrics(): EmfOutput; + /** + * Set default dimensions that will be added to all metrics. + * + * This method will merge the provided dimensions with the existing default dimensions. + * + * @example + * ```typescript + * import { Metrics } from '@aws-lambda-powertools/metrics'; + * + * const metrics = new Metrics({ + * namespace: 'serverlessAirline', + * serviceName: 'orders', + * defaultDimensions: { environment: 'dev' }, + * }); + * + * // Default dimensions will contain both region and environment + * metrics.setDefaultDimensions({ + * region: 'us-west-2', + * environment: 'prod', + * }); + * ``` + * + * @param dimensions - The dimensions to be added to the default dimensions object + */ + setDefaultDimensions(dimensions: Dimensions | undefined): void; + /** + * Set the function name to be added to each metric as a dimension. + * + * When using the {@link MetricsInterface.logMetrics | `logMetrics()`} decorator, or the Middy.js middleware, the function + * name is automatically inferred from the Lambda context. + * + * @example + * ```typescript + * import { Metrics } from '@aws-lambda-powertools/metrics'; + * + * const metrics = new Metrics({ + * namespace: 'serverlessAirline', + * serviceName: 'orders' + * }); + * + * metrics.setFunctionName('my-function-name'); + * ``` + * + * @param name - The function name + */ + setFunctionName(name: string): void; + /** + * Set the flag to throw an error if no metrics are emitted. + * + * You can use this method to enable or disable this opt-in feature. This is useful if you want to ensure + * that at least one metric is emitted when flushing the metrics. This can be useful to catch bugs where + * metrics are not being emitted as expected. + * + * @param enabled - Whether to throw an error if no metrics are emitted + */ + setThrowOnEmptyMetrics(enabled: boolean): void; + /** + * Create a new Metrics instance configured to immediately flush a single metric. + * + * CloudWatch EMF uses the same dimensions and timestamp across all your metrics, this is useful when you have a metric that should have different dimensions + * or when you want to emit a single metric without buffering it. + * + * This method is used internally by the {@link MetricsInterface.captureColdStartMetric | `captureColdStartMetric()`} method to emit the `ColdStart` metric immediately + * after the handler function is called. + * + * @example + * ```typescript + * import { Metrics } from '@aws-lambda-powertools/metrics'; + * + * const metrics = new Metrics({ + * namespace: 'serverlessAirline', + * serviceName: 'orders' + * }); + * + * export const handler = async () => { + * const singleMetric = metrics.singleMetric(); + * // The single metric will be emitted immediately + * singleMetric.addMetric('coldStart', MetricUnit.Count, 1); + * + * // These other metrics will be buffered and emitted when calling `publishStoredMetrics()` + * metrics.addMetric('successfulBooking', MetricUnit.Count, 1); + * metrics.publishStoredMetrics(); + * }; + */ + singleMetric(): MetricsInterface; +} + export type { MetricsOptions, Dimensions, @@ -81,4 +504,5 @@ export type { MetricDefinition, MetricResolution, MetricUnit, + MetricsInterface, }; diff --git a/packages/metrics/src/types/MetricsInterface.ts b/packages/metrics/src/types/MetricsInterface.ts deleted file mode 100644 index ccc3e9f7c5..0000000000 --- a/packages/metrics/src/types/MetricsInterface.ts +++ /dev/null @@ -1,32 +0,0 @@ -import type { HandlerMethodDecorator } from '@aws-lambda-powertools/commons/types'; -import type { Metrics } from '../Metrics.js'; -import type { - Dimensions, - EmfOutput, - MetricResolution, - MetricUnit, - MetricsOptions, -} from './Metrics.js'; - -interface MetricsInterface { - addDimension(name: string, value: string): void; - addDimensions(dimensions: { [key: string]: string }): void; - addMetadata(key: string, value: string): void; - addMetric( - name: string, - unit: MetricUnit, - value: number, - resolution?: MetricResolution - ): void; - clearDimensions(): void; - clearMetadata(): void; - clearMetrics(): void; - clearDefaultDimensions(): void; - logMetrics(options?: MetricsOptions): HandlerMethodDecorator; - publishStoredMetrics(): void; - serializeMetrics(): EmfOutput; - setDefaultDimensions(dimensions: Dimensions | undefined): void; - singleMetric(): Metrics; -} - -export type { MetricsInterface }; diff --git a/packages/metrics/src/types/index.ts b/packages/metrics/src/types/index.ts index 7d30ec8888..6cb26881a1 100644 --- a/packages/metrics/src/types/index.ts +++ b/packages/metrics/src/types/index.ts @@ -8,6 +8,6 @@ export type { MetricDefinition, MetricResolution, MetricUnit, + MetricsInterface, } from './Metrics.js'; export type { ConfigServiceInterface } from './ConfigServiceInterface.js'; -export type { MetricsInterface } from './MetricsInterface.js'; diff --git a/packages/metrics/tests/unit/Metrics.test.ts b/packages/metrics/tests/unit/Metrics.test.ts index e1f69b3d8a..b68d2b7e38 100644 --- a/packages/metrics/tests/unit/Metrics.test.ts +++ b/packages/metrics/tests/unit/Metrics.test.ts @@ -1112,7 +1112,7 @@ describe('Class: Metrics', () => { let publishStoredMetricsSpy: jest.SpyInstance; let addMetricSpy: jest.SpyInstance; let captureColdStartMetricSpy: jest.SpyInstance; - let throwOnEmptyMetricsSpy: jest.SpyInstance; + let setThrowOnEmptyMetricsSpy: jest.SpyInstance; let setDefaultDimensionsSpy: jest.SpyInstance; const decoratorLambdaExpectedReturnValue = 'Lambda invoked!'; const decoratorLambdaMetric = 'decorator-lambda-test-metric'; @@ -1122,7 +1122,7 @@ describe('Class: Metrics', () => { publishStoredMetricsSpy = jest.spyOn(metrics, 'publishStoredMetrics'); addMetricSpy = jest.spyOn(metrics, 'addMetric'); captureColdStartMetricSpy = jest.spyOn(metrics, 'captureColdStartMetric'); - throwOnEmptyMetricsSpy = jest.spyOn(metrics, 'throwOnEmptyMetrics'); + setThrowOnEmptyMetricsSpy = jest.spyOn(metrics, 'setThrowOnEmptyMetrics'); setDefaultDimensionsSpy = jest.spyOn(metrics, 'setDefaultDimensions'); }); @@ -1145,7 +1145,7 @@ describe('Class: Metrics', () => { ); expect(publishStoredMetricsSpy).toBeCalledTimes(1); expect(captureColdStartMetricSpy).not.toBeCalled(); - expect(throwOnEmptyMetricsSpy).not.toBeCalled(); + expect(setThrowOnEmptyMetricsSpy).not.toBeCalled(); expect(setDefaultDimensionsSpy).not.toBeCalled(); }); @@ -1170,7 +1170,7 @@ describe('Class: Metrics', () => { ); expect(captureColdStartMetricSpy).toBeCalledTimes(1); expect(publishStoredMetricsSpy).toBeCalledTimes(1); - expect(throwOnEmptyMetricsSpy).not.toBeCalled(); + expect(setThrowOnEmptyMetricsSpy).not.toBeCalled(); expect(setDefaultDimensionsSpy).not.toBeCalled(); }); @@ -1193,7 +1193,7 @@ describe('Class: Metrics', () => { MetricUnit.Count, 1 ); - expect(throwOnEmptyMetricsSpy).toBeCalledTimes(1); + expect(setThrowOnEmptyMetricsSpy).toBeCalledTimes(1); expect(publishStoredMetricsSpy).toBeCalledTimes(1); expect(captureColdStartMetricSpy).not.toBeCalled(); expect(setDefaultDimensionsSpy).not.toBeCalled(); @@ -1227,7 +1227,7 @@ describe('Class: Metrics', () => { defaultDimensions ); expect(publishStoredMetricsSpy).toBeCalledTimes(1); - expect(throwOnEmptyMetricsSpy).not.toBeCalled(); + expect(setThrowOnEmptyMetricsSpy).not.toBeCalled(); expect(captureColdStartMetricSpy).not.toBeCalled(); }); From 869b6fced659ad820ffe79a0b905022061570974 Mon Sep 17 00:00:00 2001 From: Asifur Rahman Arnab Date: Fri, 4 Oct 2024 23:20:33 +0600 Subject: [PATCH 45/52] feat(idempotency): ability to specify JMESPath custom functions (#3150) Co-authored-by: Andrea Amorosi --- docs/utilities/idempotency.md | 11 +++++++ .../workingWithCustomJmesPathFunctions.ts | 31 +++++++++++++++++++ packages/idempotency/src/IdempotencyConfig.ts | 4 ++- .../src/types/IdempotencyOptions.ts | 5 +++ .../tests/unit/IdempotencyConfig.test.ts | 20 ++++++++++++ packages/jmespath/src/PowertoolsFunctions.ts | 2 +- 6 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 examples/snippets/idempotency/workingWithCustomJmesPathFunctions.ts diff --git a/docs/utilities/idempotency.md b/docs/utilities/idempotency.md index 75a9618f00..28b2f3a085 100644 --- a/docs/utilities/idempotency.md +++ b/docs/utilities/idempotency.md @@ -573,6 +573,7 @@ Idempotent decorator can be further configured with **`IdempotencyConfig`** as s | ----------------------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | **eventKeyJmespath** | `''` | JMESPath expression to extract the idempotency key from the event record using [built-in functions](./jmespath.md#built-in-jmespath-functions){target="_blank"} | | **payloadValidationJmespath** | `''` | JMESPath expression to validate that the specified fields haven't changed across requests for the same idempotency key _e.g., payload tampering._ | +| **jmesPathOptions** | `undefined` | Custom JMESPath functions to use when parsing the JMESPath expressions. See [Custom JMESPath Functions](idempotency.md#custom-jmespath-functions) | | **throwOnNoIdempotencyKey** | `false` | Throw an error if no idempotency key was found in the request | | **expiresAfterSeconds** | 3600 | The number of seconds to wait before a record is expired, allowing a new transaction with the same idempotency key | | **useLocalCache** | `false` | Whether to cache idempotency results in-memory to save on persistence storage latency and costs | @@ -657,6 +658,16 @@ Without payload validation, we would have returned the same result as we did for By using **`payloadValidationJmesPath="amount"`**, we prevent this potentially confusing behavior and instead throw an error. +### Custom JMESPath Functions + +You can provide custom JMESPath functions for evaluating JMESPath expressions by passing them through the **`jmesPathOptions`** parameter. In this example, we use a custom function, `my_fancy_function`, to parse the payload as a JSON object instead of a string. + +=== "Custom JMESPath functions" + + ```typescript hl_lines="16 20 28-29" + --8<-- "examples/snippets/idempotency/workingWithCustomJmesPathFunctions.ts" + ``` + ### Making idempotency key required If you want to enforce that an idempotency key is required, you can set **`throwOnNoIdempotencyKey`** to `true`. diff --git a/examples/snippets/idempotency/workingWithCustomJmesPathFunctions.ts b/examples/snippets/idempotency/workingWithCustomJmesPathFunctions.ts new file mode 100644 index 0000000000..2d3380c011 --- /dev/null +++ b/examples/snippets/idempotency/workingWithCustomJmesPathFunctions.ts @@ -0,0 +1,31 @@ +import type { JSONValue } from '@aws-lambda-powertools/commons/types'; +import { + IdempotencyConfig, + makeIdempotent, +} from '@aws-lambda-powertools/idempotency'; +import { DynamoDBPersistenceLayer } from '@aws-lambda-powertools/idempotency/dynamodb'; +import { + Functions, + PowertoolsFunctions, +} from '@aws-lambda-powertools/jmespath/functions'; + +const persistenceStore = new DynamoDBPersistenceLayer({ + tableName: 'idempotencyTableName', +}); + +class MyFancyFunctions extends PowertoolsFunctions { + @Functions.signature({ + argumentsSpecs: [['string']], + }) + public funcMyFancyFunction(value: string): JSONValue { + return JSON.parse(value); + } +} + +export const handler = makeIdempotent(async () => true, { + persistenceStore, + config: new IdempotencyConfig({ + eventKeyJmesPath: 'my_fancy_function(body).["user", "productId"]', + jmesPathOptions: new MyFancyFunctions(), + }), +}); diff --git a/packages/idempotency/src/IdempotencyConfig.ts b/packages/idempotency/src/IdempotencyConfig.ts index 84e943d8ce..b93a14e5be 100644 --- a/packages/idempotency/src/IdempotencyConfig.ts +++ b/packages/idempotency/src/IdempotencyConfig.ts @@ -70,7 +70,9 @@ class IdempotencyConfig { public constructor(config: IdempotencyConfigOptions) { this.eventKeyJmesPath = config.eventKeyJmesPath ?? ''; this.payloadValidationJmesPath = config.payloadValidationJmesPath; - this.jmesPathOptions = { customFunctions: new PowertoolsFunctions() }; + this.jmesPathOptions = { + customFunctions: config.jmesPathOptions ?? new PowertoolsFunctions(), + }; this.throwOnNoIdempotencyKey = config.throwOnNoIdempotencyKey ?? false; this.expiresAfterSeconds = config.expiresAfterSeconds ?? 3600; // 1 hour default this.useLocalCache = config.useLocalCache ?? false; diff --git a/packages/idempotency/src/types/IdempotencyOptions.ts b/packages/idempotency/src/types/IdempotencyOptions.ts index b9ca069fc9..b366abb526 100644 --- a/packages/idempotency/src/types/IdempotencyOptions.ts +++ b/packages/idempotency/src/types/IdempotencyOptions.ts @@ -1,4 +1,5 @@ import type { JSONValue } from '@aws-lambda-powertools/commons/types'; +import type { Functions } from '@aws-lambda-powertools/jmespath/functions'; import type { Context, Handler } from 'aws-lambda'; import type { IdempotencyConfig } from '../IdempotencyConfig.js'; import type { BasePersistenceLayer } from '../persistence/BasePersistenceLayer.js'; @@ -168,6 +169,10 @@ type IdempotencyConfigOptions = { * An optional JMESPath expression to extract the payload to be validated from the event record */ payloadValidationJmesPath?: string; + /** + * Custom JMESPath functions to use when parsing the JMESPath expressions + */ + jmesPathOptions?: Functions; /** * Throw an error if no idempotency key was found in the request, defaults to `false` */ diff --git a/packages/idempotency/tests/unit/IdempotencyConfig.test.ts b/packages/idempotency/tests/unit/IdempotencyConfig.test.ts index fef85a96d5..8174c7727d 100644 --- a/packages/idempotency/tests/unit/IdempotencyConfig.test.ts +++ b/packages/idempotency/tests/unit/IdempotencyConfig.test.ts @@ -1,3 +1,8 @@ +import type { JSONValue } from '@aws-lambda-powertools/commons/types'; +import { + Functions, + PowertoolsFunctions, +} from '@aws-lambda-powertools/jmespath/functions'; import context from '@aws-lambda-powertools/testing-utils/context'; import { afterAll, beforeEach, describe, expect, it } from 'vitest'; import { IdempotencyConfig } from '../../src/index.js'; @@ -32,12 +37,23 @@ describe('Class: IdempotencyConfig', () => { useLocalCache: false, hashFunction: 'md5', lambdaContext: undefined, + jmesPathOptions: expect.objectContaining({ + customFunctions: expect.any(PowertoolsFunctions), + }), }) ); }); it('initializes the config with the provided configs', () => { // Prepare + class MyFancyFunctions extends Functions { + @Functions.signature({ + argumentsSpecs: [['string']], + }) + public funcMyFancyFunction(value: string): JSONValue { + return JSON.parse(value); + } + } const configOptions: IdempotencyConfigOptions = { eventKeyJmesPath: 'eventKeyJmesPath', payloadValidationJmesPath: 'payloadValidationJmesPath', @@ -46,6 +62,7 @@ describe('Class: IdempotencyConfig', () => { useLocalCache: true, hashFunction: 'hashFunction', lambdaContext: context, + jmesPathOptions: new MyFancyFunctions(), }; // Act @@ -61,6 +78,9 @@ describe('Class: IdempotencyConfig', () => { useLocalCache: true, hashFunction: 'hashFunction', lambdaContext: context, + jmesPathOptions: expect.objectContaining({ + customFunctions: expect.any(MyFancyFunctions), + }), }) ); }); diff --git a/packages/jmespath/src/PowertoolsFunctions.ts b/packages/jmespath/src/PowertoolsFunctions.ts index fcdc86b668..fc353aa8b0 100644 --- a/packages/jmespath/src/PowertoolsFunctions.ts +++ b/packages/jmespath/src/PowertoolsFunctions.ts @@ -58,4 +58,4 @@ class PowertoolsFunctions extends Functions { } } -export { PowertoolsFunctions }; +export { PowertoolsFunctions, Functions }; From 0c44517b17611fb7d6a9a622fccb8b354267890c Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Fri, 4 Oct 2024 22:29:52 +0200 Subject: [PATCH 46/52] docs(parser): highlight `JSONStringify` helper (#3158) --- docs/utilities/parser.md | 30 ++++++++++---- .../extendAPIGatewayProxyEventV2Schema.ts | 14 +++++++ examples/snippets/parser/extendAlbSchema.ts | 6 ++- examples/snippets/parser/extendSqsSchema.ts | 4 +- .../exampleAPIGatewayProxyEventV2.json | 41 +++++++++++++++++++ .../{ => samples}/exampleAlbPayload.json | 0 .../parser/{ => samples}/examplePayload.json | 0 .../{ => samples}/exampleSqsPayload.json | 0 packages/parser/src/helpers.ts | 22 +++++++++- packages/parser/typedoc.json | 3 +- 10 files changed, 107 insertions(+), 13 deletions(-) create mode 100644 examples/snippets/parser/extendAPIGatewayProxyEventV2Schema.ts create mode 100644 examples/snippets/parser/samples/exampleAPIGatewayProxyEventV2.json rename examples/snippets/parser/{ => samples}/exampleAlbPayload.json (100%) rename examples/snippets/parser/{ => samples}/examplePayload.json (100%) rename examples/snippets/parser/{ => samples}/exampleSqsPayload.json (100%) diff --git a/docs/utilities/parser.md b/docs/utilities/parser.md index a9fc26f3d3..10a0a9077b 100644 --- a/docs/utilities/parser.md +++ b/docs/utilities/parser.md @@ -106,13 +106,15 @@ You can extend every built-in schema to include your own schema, and yet have al === "Example payload" ```json - --8<-- "examples/snippets/parser/examplePayload.json" + --8<-- "examples/snippets/parser/samples/examplePayload.json" ``` +### JSON stringified payloads + If you want to extend a schema and transform a JSON stringified payload to an object, you can use helper function `JSONStringified`: === "AlbSchema with JSONStringified" - ```typescript hl_lines="12" + ```typescript hl_lines="11" --8<-- "examples/snippets/parser/extendAlbSchema.ts" ``` @@ -121,20 +123,34 @@ If you want to extend a schema and transform a JSON stringified payload to an ob === "ALB example payload" ```json hl_lines="26" - --8<-- "examples/snippets/parser/exampleAlbPayload.json" + --8<-- "examples/snippets/parser/samples/exampleAlbPayload.json" + ``` + +=== "APIGatewayProxyEventV2Schema with JSONStringified" + ```typescript hl_lines="6" + --8<-- + examples/snippets/parser/extendAPIGatewayProxyEventV2Schema.ts::4 + examples/snippets/parser/extendAPIGatewayProxyEventV2Schema.ts:6: + --8<-- + ``` + + 1. This is compatible also with API Gateway REST API schemas + +=== "API Gateway HTTP API example payload" + + ```json hl_lines="39" + --8<-- "examples/snippets/parser/samples/exampleAPIGatewayProxyEventV2.json" ``` === "SQS Schema with JSONStringified" - ```typescript hl_lines="23-25 30 34" + ```typescript hl_lines="16" --8<-- "examples/snippets/parser/extendSqsSchema.ts" ``` - 1. make sure to set your schema to the correct key in the JSON payload - === "SQS example payload" ```json hl_lines="6 28" - --8<-- "examples/snippets/parser/exampleSqsPayload.json" + --8<-- "examples/snippets/parser/samples/exampleSqsPayload.json" ``` ## Envelopes diff --git a/examples/snippets/parser/extendAPIGatewayProxyEventV2Schema.ts b/examples/snippets/parser/extendAPIGatewayProxyEventV2Schema.ts new file mode 100644 index 0000000000..7282564a0b --- /dev/null +++ b/examples/snippets/parser/extendAPIGatewayProxyEventV2Schema.ts @@ -0,0 +1,14 @@ +import { JSONStringified } from '@aws-lambda-powertools/parser/helpers'; +import { APIGatewayProxyEventV2Schema } from '@aws-lambda-powertools/parser/schemas/api-gatewayv2'; +import { z } from 'zod'; + +// biome-ignore format: we need the comment in the next line to stay there to annotate the code snippet in the docs +const extendedSchema = APIGatewayProxyEventV2Schema.extend({ // (1)! + body: JSONStringified( + z.object({ + name: z.string(), + age: z.number(), + }) + ), +}); +type ExtendedAPIGatewayEvent = z.infer; diff --git a/examples/snippets/parser/extendAlbSchema.ts b/examples/snippets/parser/extendAlbSchema.ts index 8e3a62ce42..ed7c8cf35b 100644 --- a/examples/snippets/parser/extendAlbSchema.ts +++ b/examples/snippets/parser/extendAlbSchema.ts @@ -1,5 +1,5 @@ import { JSONStringified } from '@aws-lambda-powertools/parser/helpers'; -import { AlbSchema } from '@aws-lambda-powertools/parser/schemas'; +import { AlbSchema } from '@aws-lambda-powertools/parser/schemas/alb'; import { z } from 'zod'; const customSchema = z.object({ @@ -8,5 +8,7 @@ const customSchema = z.object({ }); const extendedSchema = AlbSchema.extend({ - body: JSONStringified(customSchema), // (1)! + body: JSONStringified(customSchema), }); + +type ExtendedAlbEvent = z.infer; diff --git a/examples/snippets/parser/extendSqsSchema.ts b/examples/snippets/parser/extendSqsSchema.ts index f9a6ce11ac..0a1d36c072 100644 --- a/examples/snippets/parser/extendSqsSchema.ts +++ b/examples/snippets/parser/extendSqsSchema.ts @@ -2,7 +2,7 @@ import { JSONStringified } from '@aws-lambda-powertools/parser/helpers'; import { SqsRecordSchema, SqsSchema, -} from '@aws-lambda-powertools/parser/schemas'; +} from '@aws-lambda-powertools/parser/schemas/sqs'; import { z } from 'zod'; const customSchema = z.object({ @@ -17,3 +17,5 @@ const extendedSchema = SqsSchema.extend({ }) ), }); + +type ExtendedSqsEvent = z.infer; diff --git a/examples/snippets/parser/samples/exampleAPIGatewayProxyEventV2.json b/examples/snippets/parser/samples/exampleAPIGatewayProxyEventV2.json new file mode 100644 index 0000000000..c3cbd7fc40 --- /dev/null +++ b/examples/snippets/parser/samples/exampleAPIGatewayProxyEventV2.json @@ -0,0 +1,41 @@ +{ + "version": "2.0", + "routeKey": "POST /lambda", + "rawPath": "/lambda", + "rawQueryString": "", + "headers": { + "accept": "*/*", + "accept-encoding": "gzip, deflate", + "authorization": "Bearer foo", + "content-length": "0", + "host": "lsw1ro4ipb.execute-api.eu-west-1.amazonaws.com", + "user-agent": "HTTPie/3.2.2", + "x-amzn-trace-id": "Root=1-66705bc7-2b4257df30cbee696ef2cf28", + "x-forwarded-for": "15.248.3.126", + "x-forwarded-port": "443", + "x-forwarded-proto": "https" + }, + "requestContext": { + "accountId": "123456789012", + "apiId": "lsw1ro4ipb", + "authorizer": { + "lambda": null + }, + "domainName": "lsw1ro4ipb.execute-api.eu-west-1.amazonaws.com", + "domainPrefix": "lsw1ro4ipb", + "http": { + "method": "POST", + "path": "/lambda", + "protocol": "HTTP/1.1", + "sourceIp": "15.248.3.126", + "userAgent": "HTTPie/3.2.2" + }, + "requestId": "ZhNHJhhLjoEEPiw=", + "routeKey": "POST /lambda", + "stage": "$default", + "time": "17/Jun/2024:15:52:39 +0000", + "timeEpoch": 1718639559080 + }, + "body": "{\"name\":\"John\",\"age\":42}", + "isBase64Encoded": false +} \ No newline at end of file diff --git a/examples/snippets/parser/exampleAlbPayload.json b/examples/snippets/parser/samples/exampleAlbPayload.json similarity index 100% rename from examples/snippets/parser/exampleAlbPayload.json rename to examples/snippets/parser/samples/exampleAlbPayload.json diff --git a/examples/snippets/parser/examplePayload.json b/examples/snippets/parser/samples/examplePayload.json similarity index 100% rename from examples/snippets/parser/examplePayload.json rename to examples/snippets/parser/samples/examplePayload.json diff --git a/examples/snippets/parser/exampleSqsPayload.json b/examples/snippets/parser/samples/exampleSqsPayload.json similarity index 100% rename from examples/snippets/parser/exampleSqsPayload.json rename to examples/snippets/parser/samples/exampleSqsPayload.json diff --git a/packages/parser/src/helpers.ts b/packages/parser/src/helpers.ts index 39cd29a019..10915620d7 100644 --- a/packages/parser/src/helpers.ts +++ b/packages/parser/src/helpers.ts @@ -1,13 +1,30 @@ import { type ZodTypeAny, z } from 'zod'; +/** + * @typedef {import('../schemas/alb').AlbSchema} AlbSchema + */ /** * A helper function to parse a JSON string and validate it against a schema. - * Use it for built-in schemas like `AlbSchema`, `ApiGatewaySchema`, etc. to extend them with your customer schema. + * + * Use it for built-in schemas like `AlbSchema`, `ApiGatewaySchema`, etc. that have some fields that are JSON stringified + * and extend them with your custom schema. + * + * For example, if you have an event with a JSON stringified body similar to the following: + * + * ```json + * { + * // ... other fields + * "body": "{\"name\": \"John\", \"age\": 30}", + * "isBase64Encoded": false, + * } + * ``` + * + * You can extend any built-in schema with your custom schema using the `JSONStringified` helper function. * * @example * ```typescript * import { JSONStringified } from '@aws-lambda-powertools/parser/helpers'; - * import { AlbSchema } from '@aws-lambda-powertools/parser/schemas'; + * import { AlbSchema } from '@aws-lambda-powertools/parser/schemas/alb'; * import { z } from 'zod'; * * const customSchema = z.object({ @@ -19,6 +36,7 @@ import { type ZodTypeAny, z } from 'zod'; * body: JSONStringified(customSchema), * }); * + * type ExtendedAlbEvent = z.infer; * ``` * * @param schema - The schema to validate the JSON string against diff --git a/packages/parser/typedoc.json b/packages/parser/typedoc.json index 5a14ab2b5f..bda7b8332e 100644 --- a/packages/parser/typedoc.json +++ b/packages/parser/typedoc.json @@ -5,7 +5,8 @@ "./src/middleware/parser.ts", "./src/types/index.ts", "./src/envelopes/index.ts", - "./src/schemas/index.ts" + "./src/schemas/index.ts", + "./src/helpers.ts" ], "readme": "README.md" } From 489c8ad9f261caa0e6e60a4d8fe177c1d6f0507f Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Mon, 7 Oct 2024 10:35:35 +0200 Subject: [PATCH 47/52] chore(maintenance): add Flyweight customer reference (#3161) --- README.md | 1 + docs/index.md | 3 +++ packages/batch/README.md | 1 + packages/commons/README.md | 1 + packages/event-handler/README.md | 1 + packages/idempotency/README.md | 1 + packages/jmespath/README.md | 1 + packages/logger/README.md | 1 + packages/metrics/README.md | 1 + packages/parameters/README.md | 1 + packages/parser/README.md | 1 + packages/tracer/README.md | 1 + 12 files changed, 14 insertions(+) diff --git a/README.md b/README.md index 7ad7296861..8699c9f978 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,7 @@ The following companies, among others, use Powertools: - [Caylent](https://caylent.com/) - [Certible](https://www.certible.com/) - [Elva](https://elva-group.com) +- [Flyweight](https://flyweight.io/) - [globaldatanet](https://globaldatanet.com/) - [Hashnode](https://hashnode.com/) - [LocalStack](https://localstack.cloud/) diff --git a/docs/index.md b/docs/index.md index 53f1914bde..19e2f0c4b5 100644 --- a/docs/index.md +++ b/docs/index.md @@ -407,6 +407,9 @@ Knowing which companies are using this library is important to help prioritize t [**Elva**](https://elva-group.com){target="_blank" rel="nofollow"} { .card } +[**Flyweight**](https://flyweight.io/){target="_blank" rel="nofollow"} +{ .card } + [**globaldatanet**](https://globaldatanet.com/){target="_blank" rel="nofollow"} { .card } diff --git a/packages/batch/README.md b/packages/batch/README.md index bf435ab553..fb6d8ade44 100644 --- a/packages/batch/README.md +++ b/packages/batch/README.md @@ -174,6 +174,7 @@ The following companies, among others, use Powertools: - [Caylent](https://caylent.com/) - [Certible](https://www.certible.com/) - [Elva](https://elva-group.com) +- [Flyweight](https://flyweight.io/) - [globaldatanet](https://globaldatanet.com/) - [Hashnode](https://hashnode.com/) - [LocalStack](https://localstack.cloud/) diff --git a/packages/commons/README.md b/packages/commons/README.md index f69422722e..8aa47fd986 100644 --- a/packages/commons/README.md +++ b/packages/commons/README.md @@ -124,6 +124,7 @@ The following companies, among others, use Powertools: - [Caylent](https://caylent.com/) - [Certible](https://www.certible.com/) - [Elva](https://elva-group.com) +- [Flyweight](https://flyweight.io/) - [globaldatanet](https://globaldatanet.com/) - [Hashnode](https://hashnode.com/) - [LocalStack](https://localstack.cloud/) diff --git a/packages/event-handler/README.md b/packages/event-handler/README.md index c256cd31bf..094ced856e 100644 --- a/packages/event-handler/README.md +++ b/packages/event-handler/README.md @@ -51,6 +51,7 @@ The following companies, among others, use Powertools: - [Caylent](https://caylent.com/) - [Certible](https://www.certible.com/) - [Elva](https://elva-group.com) +- [Flyweight](https://flyweight.io/) - [globaldatanet](https://globaldatanet.com/) - [Hashnode](https://hashnode.com/) - [LocalStack](https://localstack.cloud/) diff --git a/packages/idempotency/README.md b/packages/idempotency/README.md index 294dad5f8e..bd86eaec58 100644 --- a/packages/idempotency/README.md +++ b/packages/idempotency/README.md @@ -345,6 +345,7 @@ The following companies, among others, use Powertools: - [Caylent](https://caylent.com/) - [Certible](https://www.certible.com/) - [Elva](https://elva-group.com) +- [Flyweight](https://flyweight.io/) - [globaldatanet](https://globaldatanet.com/) - [Hashnode](https://hashnode.com/) - [LocalStack](https://localstack.cloud/) diff --git a/packages/jmespath/README.md b/packages/jmespath/README.md index 6d27573f1d..f7dcad568f 100644 --- a/packages/jmespath/README.md +++ b/packages/jmespath/README.md @@ -200,6 +200,7 @@ The following companies, among others, use Powertools: - [Caylent](https://caylent.com/) - [Certible](https://www.certible.com/) - [Elva](https://elva-group.com) +- [Flyweight](https://flyweight.io/) - [globaldatanet](https://globaldatanet.com/) - [Hashnode](https://hashnode.com/) - [LocalStack](https://localstack.cloud/) diff --git a/packages/logger/README.md b/packages/logger/README.md index 609fc9c5e5..9c563c9547 100644 --- a/packages/logger/README.md +++ b/packages/logger/README.md @@ -241,6 +241,7 @@ The following companies, among others, use Powertools: - [Caylent](https://caylent.com/) - [Certible](https://www.certible.com/) - [Elva](https://elva-group.com) +- [Flyweight](https://flyweight.io/) - [globaldatanet](https://globaldatanet.com/) - [Hashnode](https://hashnode.com/) - [LocalStack](https://localstack.cloud/) diff --git a/packages/metrics/README.md b/packages/metrics/README.md index abe9180f5a..c74a07a113 100644 --- a/packages/metrics/README.md +++ b/packages/metrics/README.md @@ -162,6 +162,7 @@ The following companies, among others, use Powertools: - [Caylent](https://caylent.com/) - [Certible](https://www.certible.com/) - [Elva](https://elva-group.com) +- [Flyweight](https://flyweight.io/) - [globaldatanet](https://globaldatanet.com/) - [Hashnode](https://hashnode.com/) - [LocalStack](https://localstack.cloud/) diff --git a/packages/parameters/README.md b/packages/parameters/README.md index 2cffa1a69c..d3544d96b7 100644 --- a/packages/parameters/README.md +++ b/packages/parameters/README.md @@ -227,6 +227,7 @@ The following companies, among others, use Powertools: - [Caylent](https://caylent.com/) - [Certible](https://www.certible.com/) - [Elva](https://elva-group.com) +- [Flyweight](https://flyweight.io/) - [globaldatanet](https://globaldatanet.com/) - [Hashnode](https://hashnode.com/) - [LocalStack](https://localstack.cloud/) diff --git a/packages/parser/README.md b/packages/parser/README.md index 1ac5d3cd98..d18ab9b107 100644 --- a/packages/parser/README.md +++ b/packages/parser/README.md @@ -314,6 +314,7 @@ The following companies, among others, use Powertools: - [Caylent](https://caylent.com/) - [Certible](https://www.certible.com/) - [Elva](https://elva-group.com) +- [Flyweight](https://flyweight.io/) - [globaldatanet](https://globaldatanet.com/) - [Hashnode](https://hashnode.com/) - [LocalStack](https://localstack.cloud/) diff --git a/packages/tracer/README.md b/packages/tracer/README.md index 1e0253454e..421418f139 100644 --- a/packages/tracer/README.md +++ b/packages/tracer/README.md @@ -152,6 +152,7 @@ The following companies, among others, use Powertools: - [Caylent](https://caylent.com/) - [Certible](https://www.certible.com/) - [Elva](https://elva-group.com) +- [Flyweight](https://flyweight.io/) - [globaldatanet](https://globaldatanet.com/) - [Hashnode](https://hashnode.com/) - [LocalStack](https://localstack.cloud/) From 7be70a1ab157955af7c627e609f424e870c95f2d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Oct 2024 10:47:53 +0200 Subject: [PATCH 48/52] chore(deps): bump github/codeql-action from 3.26.9 to 3.26.11 (#3157) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Andrea Amorosi --- .github/workflows/ossf_scorecard.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ossf_scorecard.yml b/.github/workflows/ossf_scorecard.yml index 928a115d1e..6ca576e7e9 100644 --- a/.github/workflows/ossf_scorecard.yml +++ b/.github/workflows/ossf_scorecard.yml @@ -43,6 +43,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@461ef6c76dfe95d5c364de2f431ddbd31a417628 # v3.26.9 + uses: github/codeql-action/upload-sarif@6db8d6351fd0be61f9ed8ebd12ccd35dcec51fea # v3.26.11 with: sarif_file: results.sarif From 39b805b030c75756952b9434947e8c611e5295ab Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Oct 2024 11:06:13 +0200 Subject: [PATCH 49/52] chore(deps): bump the aws-sdk-v3 group across 1 directory with 9 updates (#3156) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Andrea Amorosi --- examples/app/package.json | 4 +- examples/snippets/package.json | 10 +- package-lock.json | 1545 +++++++++++++++-------------- packages/idempotency/package.json | 4 +- packages/metrics/package.json | 2 +- packages/parameters/package.json | 10 +- packages/testing/package.json | 2 +- packages/tracer/package.json | 4 +- 8 files changed, 792 insertions(+), 789 deletions(-) diff --git a/examples/app/package.json b/examples/app/package.json index 6fcddf13af..514ad72018 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -45,8 +45,8 @@ "@aws-lambda-powertools/metrics": "^2.8.0", "@aws-lambda-powertools/parameters": "^2.8.0", "@aws-lambda-powertools/tracer": "^2.8.0", - "@aws-sdk/client-ssm": "^3.658.1", - "@aws-sdk/lib-dynamodb": "^3.658.1", + "@aws-sdk/client-ssm": "^3.664.0", + "@aws-sdk/lib-dynamodb": "^3.664.0", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.145", "@types/node": "22.7.4", diff --git a/examples/snippets/package.json b/examples/snippets/package.json index ebddada035..cca7a0dc37 100644 --- a/examples/snippets/package.json +++ b/examples/snippets/package.json @@ -32,11 +32,11 @@ "@aws-lambda-powertools/parameters": "^2.8.0", "@aws-lambda-powertools/parser": "^2.8.0", "@aws-lambda-powertools/tracer": "^2.8.0", - "@aws-sdk/client-appconfigdata": "^3.658.1", - "@aws-sdk/client-dynamodb": "^3.658.1", - "@aws-sdk/client-secrets-manager": "^3.658.1", - "@aws-sdk/client-ssm": "^3.658.1", - "@aws-sdk/util-dynamodb": "^3.658.1", + "@aws-sdk/client-appconfigdata": "^3.664.0", + "@aws-sdk/client-dynamodb": "^3.664.0", + "@aws-sdk/client-secrets-manager": "^3.664.0", + "@aws-sdk/client-ssm": "^3.664.0", + "@aws-sdk/util-dynamodb": "^3.664.0", "@middy/core": "^4.7.0", "aws-sdk": "^2.1691.0", "aws-sdk-client-mock": "^4.0.2", diff --git a/package-lock.json b/package-lock.json index f8799d9340..68386685ae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -61,8 +61,8 @@ "@aws-lambda-powertools/metrics": "^2.8.0", "@aws-lambda-powertools/parameters": "^2.8.0", "@aws-lambda-powertools/tracer": "^2.8.0", - "@aws-sdk/client-ssm": "^3.658.1", - "@aws-sdk/lib-dynamodb": "^3.658.1", + "@aws-sdk/client-ssm": "^3.664.0", + "@aws-sdk/lib-dynamodb": "^3.664.0", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.145", "@types/node": "22.7.4", @@ -110,11 +110,11 @@ "@aws-lambda-powertools/parameters": "^2.8.0", "@aws-lambda-powertools/parser": "^2.8.0", "@aws-lambda-powertools/tracer": "^2.8.0", - "@aws-sdk/client-appconfigdata": "^3.658.1", - "@aws-sdk/client-dynamodb": "^3.658.1", - "@aws-sdk/client-secrets-manager": "^3.658.1", - "@aws-sdk/client-ssm": "^3.658.1", - "@aws-sdk/util-dynamodb": "^3.658.1", + "@aws-sdk/client-appconfigdata": "^3.664.0", + "@aws-sdk/client-dynamodb": "^3.664.0", + "@aws-sdk/client-secrets-manager": "^3.664.0", + "@aws-sdk/client-ssm": "^3.664.0", + "@aws-sdk/util-dynamodb": "^3.664.0", "@middy/core": "^4.7.0", "aws-sdk": "^2.1691.0", "aws-sdk-client-mock": "^4.0.2", @@ -399,51 +399,51 @@ "link": true }, "node_modules/@aws-sdk/client-appconfigdata": { - "version": "3.658.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-appconfigdata/-/client-appconfigdata-3.658.1.tgz", - "integrity": "sha512-FBlbbxCE4+QYY1XS8JWO9sO2UH4GAMlGMQ8MlQCyadQlgyzcUiCyrZfLQuQi8BP2AstkExJcAm3RHaiDituoSg==", + "version": "3.664.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-appconfigdata/-/client-appconfigdata-3.664.0.tgz", + "integrity": "sha512-kVmVk6Qkd8ZzmNqIRyxpqmGBxlVrFq0RralG6w1mGD/R4GLkBp8c+2aUvtnCsDdjtXBo08S2SrmMqr77x4IBxQ==", "dev": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.658.1", - "@aws-sdk/client-sts": "3.658.1", - "@aws-sdk/core": "3.658.1", - "@aws-sdk/credential-provider-node": "3.658.1", - "@aws-sdk/middleware-host-header": "3.654.0", - "@aws-sdk/middleware-logger": "3.654.0", - "@aws-sdk/middleware-recursion-detection": "3.654.0", - "@aws-sdk/middleware-user-agent": "3.654.0", - "@aws-sdk/region-config-resolver": "3.654.0", - "@aws-sdk/types": "3.654.0", - "@aws-sdk/util-endpoints": "3.654.0", - "@aws-sdk/util-user-agent-browser": "3.654.0", - "@aws-sdk/util-user-agent-node": "3.654.0", - "@smithy/config-resolver": "^3.0.8", - "@smithy/core": "^2.4.6", - "@smithy/fetch-http-handler": "^3.2.8", - "@smithy/hash-node": "^3.0.6", - "@smithy/invalid-dependency": "^3.0.6", - "@smithy/middleware-content-length": "^3.0.8", - "@smithy/middleware-endpoint": "^3.1.3", - "@smithy/middleware-retry": "^3.0.21", - "@smithy/middleware-serde": "^3.0.6", - "@smithy/middleware-stack": "^3.0.6", - "@smithy/node-config-provider": "^3.1.7", - "@smithy/node-http-handler": "^3.2.3", - "@smithy/protocol-http": "^4.1.3", - "@smithy/smithy-client": "^3.3.5", - "@smithy/types": "^3.4.2", - "@smithy/url-parser": "^3.0.6", + "@aws-sdk/client-sso-oidc": "3.664.0", + "@aws-sdk/client-sts": "3.664.0", + "@aws-sdk/core": "3.664.0", + "@aws-sdk/credential-provider-node": "3.664.0", + "@aws-sdk/middleware-host-header": "3.664.0", + "@aws-sdk/middleware-logger": "3.664.0", + "@aws-sdk/middleware-recursion-detection": "3.664.0", + "@aws-sdk/middleware-user-agent": "3.664.0", + "@aws-sdk/region-config-resolver": "3.664.0", + "@aws-sdk/types": "3.664.0", + "@aws-sdk/util-endpoints": "3.664.0", + "@aws-sdk/util-user-agent-browser": "3.664.0", + "@aws-sdk/util-user-agent-node": "3.664.0", + "@smithy/config-resolver": "^3.0.9", + "@smithy/core": "^2.4.7", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/hash-node": "^3.0.7", + "@smithy/invalid-dependency": "^3.0.7", + "@smithy/middleware-content-length": "^3.0.9", + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/middleware-retry": "^3.0.22", + "@smithy/middleware-serde": "^3.0.7", + "@smithy/middleware-stack": "^3.0.7", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/protocol-http": "^4.1.4", + "@smithy/smithy-client": "^3.3.6", + "@smithy/types": "^3.5.0", + "@smithy/url-parser": "^3.0.7", "@smithy/util-base64": "^3.0.0", "@smithy/util-body-length-browser": "^3.0.0", "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.21", - "@smithy/util-defaults-mode-node": "^3.0.21", - "@smithy/util-endpoints": "^2.1.2", - "@smithy/util-middleware": "^3.0.6", - "@smithy/util-retry": "^3.0.6", - "@smithy/util-stream": "^3.1.8", + "@smithy/util-defaults-mode-browser": "^3.0.22", + "@smithy/util-defaults-mode-node": "^3.0.22", + "@smithy/util-endpoints": "^2.1.3", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-retry": "^3.0.7", + "@smithy/util-stream": "^3.1.9", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, @@ -452,53 +452,53 @@ } }, "node_modules/@aws-sdk/client-cloudwatch": { - "version": "3.658.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch/-/client-cloudwatch-3.658.1.tgz", - "integrity": "sha512-qBCxDkiURRfBiFIeQB4HbYU/uQCN9fQi7GfE7lJufJQ18hM+QrBiegIbgUnR79R0UUQnMb5tKZpq6yqbahqUmg==", + "version": "3.664.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch/-/client-cloudwatch-3.664.0.tgz", + "integrity": "sha512-jFclwmjZNzXSLOWEwhiNeVwBLZ9BTGZS1j8ks84bglh4RjpaTad4+VzZ72Y9VHv+qfn4Sz6fkNvk1iwca7cX4g==", "dev": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.658.1", - "@aws-sdk/client-sts": "3.658.1", - "@aws-sdk/core": "3.658.1", - "@aws-sdk/credential-provider-node": "3.658.1", - "@aws-sdk/middleware-host-header": "3.654.0", - "@aws-sdk/middleware-logger": "3.654.0", - "@aws-sdk/middleware-recursion-detection": "3.654.0", - "@aws-sdk/middleware-user-agent": "3.654.0", - "@aws-sdk/region-config-resolver": "3.654.0", - "@aws-sdk/types": "3.654.0", - "@aws-sdk/util-endpoints": "3.654.0", - "@aws-sdk/util-user-agent-browser": "3.654.0", - "@aws-sdk/util-user-agent-node": "3.654.0", - "@smithy/config-resolver": "^3.0.8", - "@smithy/core": "^2.4.6", - "@smithy/fetch-http-handler": "^3.2.8", - "@smithy/hash-node": "^3.0.6", - "@smithy/invalid-dependency": "^3.0.6", - "@smithy/middleware-compression": "^3.0.10", - "@smithy/middleware-content-length": "^3.0.8", - "@smithy/middleware-endpoint": "^3.1.3", - "@smithy/middleware-retry": "^3.0.21", - "@smithy/middleware-serde": "^3.0.6", - "@smithy/middleware-stack": "^3.0.6", - "@smithy/node-config-provider": "^3.1.7", - "@smithy/node-http-handler": "^3.2.3", - "@smithy/protocol-http": "^4.1.3", - "@smithy/smithy-client": "^3.3.5", - "@smithy/types": "^3.4.2", - "@smithy/url-parser": "^3.0.6", + "@aws-sdk/client-sso-oidc": "3.664.0", + "@aws-sdk/client-sts": "3.664.0", + "@aws-sdk/core": "3.664.0", + "@aws-sdk/credential-provider-node": "3.664.0", + "@aws-sdk/middleware-host-header": "3.664.0", + "@aws-sdk/middleware-logger": "3.664.0", + "@aws-sdk/middleware-recursion-detection": "3.664.0", + "@aws-sdk/middleware-user-agent": "3.664.0", + "@aws-sdk/region-config-resolver": "3.664.0", + "@aws-sdk/types": "3.664.0", + "@aws-sdk/util-endpoints": "3.664.0", + "@aws-sdk/util-user-agent-browser": "3.664.0", + "@aws-sdk/util-user-agent-node": "3.664.0", + "@smithy/config-resolver": "^3.0.9", + "@smithy/core": "^2.4.7", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/hash-node": "^3.0.7", + "@smithy/invalid-dependency": "^3.0.7", + "@smithy/middleware-compression": "^3.0.11", + "@smithy/middleware-content-length": "^3.0.9", + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/middleware-retry": "^3.0.22", + "@smithy/middleware-serde": "^3.0.7", + "@smithy/middleware-stack": "^3.0.7", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/protocol-http": "^4.1.4", + "@smithy/smithy-client": "^3.3.6", + "@smithy/types": "^3.5.0", + "@smithy/url-parser": "^3.0.7", "@smithy/util-base64": "^3.0.0", "@smithy/util-body-length-browser": "^3.0.0", "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.21", - "@smithy/util-defaults-mode-node": "^3.0.21", - "@smithy/util-endpoints": "^2.1.2", - "@smithy/util-middleware": "^3.0.6", - "@smithy/util-retry": "^3.0.6", + "@smithy/util-defaults-mode-browser": "^3.0.22", + "@smithy/util-defaults-mode-node": "^3.0.22", + "@smithy/util-endpoints": "^2.1.3", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-retry": "^3.0.7", "@smithy/util-utf8": "^3.0.0", - "@smithy/util-waiter": "^3.1.5", + "@smithy/util-waiter": "^3.1.6", "tslib": "^2.6.2" }, "engines": { @@ -506,52 +506,52 @@ } }, "node_modules/@aws-sdk/client-dynamodb": { - "version": "3.658.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.658.1.tgz", - "integrity": "sha512-RUMMadGecgIZ8J8IU1+SE5OC7MNyToq929hIqWNmlCwPdmveG4TsUmm+dJ2k+G7AwyzumB252Kkb8kdbLJ6H3g==", + "version": "3.664.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.664.0.tgz", + "integrity": "sha512-HLsooNGC2HL4pbv7CtWwb6xWoN9+9Sn1DyqW4Z0v+Pqp/IXN7QRGloPd+TKc2iHt3z5IjyevRvWSZf4Zo9RTQA==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.658.1", - "@aws-sdk/client-sts": "3.658.1", - "@aws-sdk/core": "3.658.1", - "@aws-sdk/credential-provider-node": "3.658.1", - "@aws-sdk/middleware-endpoint-discovery": "3.654.0", - "@aws-sdk/middleware-host-header": "3.654.0", - "@aws-sdk/middleware-logger": "3.654.0", - "@aws-sdk/middleware-recursion-detection": "3.654.0", - "@aws-sdk/middleware-user-agent": "3.654.0", - "@aws-sdk/region-config-resolver": "3.654.0", - "@aws-sdk/types": "3.654.0", - "@aws-sdk/util-endpoints": "3.654.0", - "@aws-sdk/util-user-agent-browser": "3.654.0", - "@aws-sdk/util-user-agent-node": "3.654.0", - "@smithy/config-resolver": "^3.0.8", - "@smithy/core": "^2.4.6", - "@smithy/fetch-http-handler": "^3.2.8", - "@smithy/hash-node": "^3.0.6", - "@smithy/invalid-dependency": "^3.0.6", - "@smithy/middleware-content-length": "^3.0.8", - "@smithy/middleware-endpoint": "^3.1.3", - "@smithy/middleware-retry": "^3.0.21", - "@smithy/middleware-serde": "^3.0.6", - "@smithy/middleware-stack": "^3.0.6", - "@smithy/node-config-provider": "^3.1.7", - "@smithy/node-http-handler": "^3.2.3", - "@smithy/protocol-http": "^4.1.3", - "@smithy/smithy-client": "^3.3.5", - "@smithy/types": "^3.4.2", - "@smithy/url-parser": "^3.0.6", + "@aws-sdk/client-sso-oidc": "3.664.0", + "@aws-sdk/client-sts": "3.664.0", + "@aws-sdk/core": "3.664.0", + "@aws-sdk/credential-provider-node": "3.664.0", + "@aws-sdk/middleware-endpoint-discovery": "3.664.0", + "@aws-sdk/middleware-host-header": "3.664.0", + "@aws-sdk/middleware-logger": "3.664.0", + "@aws-sdk/middleware-recursion-detection": "3.664.0", + "@aws-sdk/middleware-user-agent": "3.664.0", + "@aws-sdk/region-config-resolver": "3.664.0", + "@aws-sdk/types": "3.664.0", + "@aws-sdk/util-endpoints": "3.664.0", + "@aws-sdk/util-user-agent-browser": "3.664.0", + "@aws-sdk/util-user-agent-node": "3.664.0", + "@smithy/config-resolver": "^3.0.9", + "@smithy/core": "^2.4.7", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/hash-node": "^3.0.7", + "@smithy/invalid-dependency": "^3.0.7", + "@smithy/middleware-content-length": "^3.0.9", + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/middleware-retry": "^3.0.22", + "@smithy/middleware-serde": "^3.0.7", + "@smithy/middleware-stack": "^3.0.7", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/protocol-http": "^4.1.4", + "@smithy/smithy-client": "^3.3.6", + "@smithy/types": "^3.5.0", + "@smithy/url-parser": "^3.0.7", "@smithy/util-base64": "^3.0.0", "@smithy/util-body-length-browser": "^3.0.0", "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.21", - "@smithy/util-defaults-mode-node": "^3.0.21", - "@smithy/util-endpoints": "^2.1.2", - "@smithy/util-middleware": "^3.0.6", - "@smithy/util-retry": "^3.0.6", + "@smithy/util-defaults-mode-browser": "^3.0.22", + "@smithy/util-defaults-mode-node": "^3.0.22", + "@smithy/util-endpoints": "^2.1.3", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-retry": "^3.0.7", "@smithy/util-utf8": "^3.0.0", - "@smithy/util-waiter": "^3.1.5", + "@smithy/util-waiter": "^3.1.6", "tslib": "^2.6.2", "uuid": "^9.0.1" }, @@ -560,55 +560,55 @@ } }, "node_modules/@aws-sdk/client-lambda": { - "version": "3.659.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.659.0.tgz", - "integrity": "sha512-0XBIcMBDm56iOjC0k1EjJR3ewXr2gFNtVRmdchtT7XPe2bYQY4L+K0Xk9TNLoEZAhFuFkh129I2pMrmlaDEl/Q==", + "version": "3.664.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.664.0.tgz", + "integrity": "sha512-+EgHZLt/jm4ld4v85EGPtvCkZLsYkhUXVchdrLRwzxyl3oip+qh4/ZlaepvjLOWbzW8A+1NiRBxVuQdHRzIKYw==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.658.1", - "@aws-sdk/client-sts": "3.658.1", - "@aws-sdk/core": "3.658.1", - "@aws-sdk/credential-provider-node": "3.658.1", - "@aws-sdk/middleware-host-header": "3.654.0", - "@aws-sdk/middleware-logger": "3.654.0", - "@aws-sdk/middleware-recursion-detection": "3.654.0", - "@aws-sdk/middleware-user-agent": "3.654.0", - "@aws-sdk/region-config-resolver": "3.654.0", - "@aws-sdk/types": "3.654.0", - "@aws-sdk/util-endpoints": "3.654.0", - "@aws-sdk/util-user-agent-browser": "3.654.0", - "@aws-sdk/util-user-agent-node": "3.654.0", - "@smithy/config-resolver": "^3.0.8", - "@smithy/core": "^2.4.6", - "@smithy/eventstream-serde-browser": "^3.0.9", - "@smithy/eventstream-serde-config-resolver": "^3.0.6", - "@smithy/eventstream-serde-node": "^3.0.8", - "@smithy/fetch-http-handler": "^3.2.8", - "@smithy/hash-node": "^3.0.6", - "@smithy/invalid-dependency": "^3.0.6", - "@smithy/middleware-content-length": "^3.0.8", - "@smithy/middleware-endpoint": "^3.1.3", - "@smithy/middleware-retry": "^3.0.21", - "@smithy/middleware-serde": "^3.0.6", - "@smithy/middleware-stack": "^3.0.6", - "@smithy/node-config-provider": "^3.1.7", - "@smithy/node-http-handler": "^3.2.3", - "@smithy/protocol-http": "^4.1.3", - "@smithy/smithy-client": "^3.3.5", - "@smithy/types": "^3.4.2", - "@smithy/url-parser": "^3.0.6", + "@aws-sdk/client-sso-oidc": "3.664.0", + "@aws-sdk/client-sts": "3.664.0", + "@aws-sdk/core": "3.664.0", + "@aws-sdk/credential-provider-node": "3.664.0", + "@aws-sdk/middleware-host-header": "3.664.0", + "@aws-sdk/middleware-logger": "3.664.0", + "@aws-sdk/middleware-recursion-detection": "3.664.0", + "@aws-sdk/middleware-user-agent": "3.664.0", + "@aws-sdk/region-config-resolver": "3.664.0", + "@aws-sdk/types": "3.664.0", + "@aws-sdk/util-endpoints": "3.664.0", + "@aws-sdk/util-user-agent-browser": "3.664.0", + "@aws-sdk/util-user-agent-node": "3.664.0", + "@smithy/config-resolver": "^3.0.9", + "@smithy/core": "^2.4.7", + "@smithy/eventstream-serde-browser": "^3.0.10", + "@smithy/eventstream-serde-config-resolver": "^3.0.7", + "@smithy/eventstream-serde-node": "^3.0.9", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/hash-node": "^3.0.7", + "@smithy/invalid-dependency": "^3.0.7", + "@smithy/middleware-content-length": "^3.0.9", + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/middleware-retry": "^3.0.22", + "@smithy/middleware-serde": "^3.0.7", + "@smithy/middleware-stack": "^3.0.7", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/protocol-http": "^4.1.4", + "@smithy/smithy-client": "^3.3.6", + "@smithy/types": "^3.5.0", + "@smithy/url-parser": "^3.0.7", "@smithy/util-base64": "^3.0.0", "@smithy/util-body-length-browser": "^3.0.0", "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.21", - "@smithy/util-defaults-mode-node": "^3.0.21", - "@smithy/util-endpoints": "^2.1.2", - "@smithy/util-middleware": "^3.0.6", - "@smithy/util-retry": "^3.0.6", - "@smithy/util-stream": "^3.1.8", + "@smithy/util-defaults-mode-browser": "^3.0.22", + "@smithy/util-defaults-mode-node": "^3.0.22", + "@smithy/util-endpoints": "^2.1.3", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-retry": "^3.0.7", + "@smithy/util-stream": "^3.1.9", "@smithy/util-utf8": "^3.0.0", - "@smithy/util-waiter": "^3.1.5", + "@smithy/util-waiter": "^3.1.6", "tslib": "^2.6.2" }, "engines": { @@ -616,50 +616,50 @@ } }, "node_modules/@aws-sdk/client-secrets-manager": { - "version": "3.658.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.658.1.tgz", - "integrity": "sha512-RpsY5KKIzBaJDKXtXTlFHiV+hOntZVTL94SsKhdcA9+FQvVPQh9Qrck1JPLxBAWHmcwhYD7svJnSoYLSkMgVgw==", + "version": "3.664.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.664.0.tgz", + "integrity": "sha512-7zZgXsgwZsJIXu2WnhHSQV6+nvKl6bHtJhj/l1fOQi8TaZB/cXWZzH5wMvwbupXEHqih4ME6odee8vLnaexsnw==", "dev": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.658.1", - "@aws-sdk/client-sts": "3.658.1", - "@aws-sdk/core": "3.658.1", - "@aws-sdk/credential-provider-node": "3.658.1", - "@aws-sdk/middleware-host-header": "3.654.0", - "@aws-sdk/middleware-logger": "3.654.0", - "@aws-sdk/middleware-recursion-detection": "3.654.0", - "@aws-sdk/middleware-user-agent": "3.654.0", - "@aws-sdk/region-config-resolver": "3.654.0", - "@aws-sdk/types": "3.654.0", - "@aws-sdk/util-endpoints": "3.654.0", - "@aws-sdk/util-user-agent-browser": "3.654.0", - "@aws-sdk/util-user-agent-node": "3.654.0", - "@smithy/config-resolver": "^3.0.8", - "@smithy/core": "^2.4.6", - "@smithy/fetch-http-handler": "^3.2.8", - "@smithy/hash-node": "^3.0.6", - "@smithy/invalid-dependency": "^3.0.6", - "@smithy/middleware-content-length": "^3.0.8", - "@smithy/middleware-endpoint": "^3.1.3", - "@smithy/middleware-retry": "^3.0.21", - "@smithy/middleware-serde": "^3.0.6", - "@smithy/middleware-stack": "^3.0.6", - "@smithy/node-config-provider": "^3.1.7", - "@smithy/node-http-handler": "^3.2.3", - "@smithy/protocol-http": "^4.1.3", - "@smithy/smithy-client": "^3.3.5", - "@smithy/types": "^3.4.2", - "@smithy/url-parser": "^3.0.6", + "@aws-sdk/client-sso-oidc": "3.664.0", + "@aws-sdk/client-sts": "3.664.0", + "@aws-sdk/core": "3.664.0", + "@aws-sdk/credential-provider-node": "3.664.0", + "@aws-sdk/middleware-host-header": "3.664.0", + "@aws-sdk/middleware-logger": "3.664.0", + "@aws-sdk/middleware-recursion-detection": "3.664.0", + "@aws-sdk/middleware-user-agent": "3.664.0", + "@aws-sdk/region-config-resolver": "3.664.0", + "@aws-sdk/types": "3.664.0", + "@aws-sdk/util-endpoints": "3.664.0", + "@aws-sdk/util-user-agent-browser": "3.664.0", + "@aws-sdk/util-user-agent-node": "3.664.0", + "@smithy/config-resolver": "^3.0.9", + "@smithy/core": "^2.4.7", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/hash-node": "^3.0.7", + "@smithy/invalid-dependency": "^3.0.7", + "@smithy/middleware-content-length": "^3.0.9", + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/middleware-retry": "^3.0.22", + "@smithy/middleware-serde": "^3.0.7", + "@smithy/middleware-stack": "^3.0.7", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/protocol-http": "^4.1.4", + "@smithy/smithy-client": "^3.3.6", + "@smithy/types": "^3.5.0", + "@smithy/url-parser": "^3.0.7", "@smithy/util-base64": "^3.0.0", "@smithy/util-body-length-browser": "^3.0.0", "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.21", - "@smithy/util-defaults-mode-node": "^3.0.21", - "@smithy/util-endpoints": "^2.1.2", - "@smithy/util-middleware": "^3.0.6", - "@smithy/util-retry": "^3.0.6", + "@smithy/util-defaults-mode-browser": "^3.0.22", + "@smithy/util-defaults-mode-node": "^3.0.22", + "@smithy/util-endpoints": "^2.1.3", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-retry": "^3.0.7", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2", "uuid": "^9.0.1" @@ -669,51 +669,51 @@ } }, "node_modules/@aws-sdk/client-ssm": { - "version": "3.658.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-ssm/-/client-ssm-3.658.1.tgz", - "integrity": "sha512-L0fn/hDkkcDpSE5aLi+ntbbIE6rXc4NQRDtMyyWdTI9wVZvCQzvDRt4fQaVzknT26Z7QckoB952pIV0OCzpRgA==", + "version": "3.664.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ssm/-/client-ssm-3.664.0.tgz", + "integrity": "sha512-s1wXIx4OWQ+qaBLvIzkFHtYCyTmG8AtnHrL+in7KXAVcGTy2uyTy0wsTCHaUUhZSxYnu1beE/B5tJ6Stv5gjlw==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.658.1", - "@aws-sdk/client-sts": "3.658.1", - "@aws-sdk/core": "3.658.1", - "@aws-sdk/credential-provider-node": "3.658.1", - "@aws-sdk/middleware-host-header": "3.654.0", - "@aws-sdk/middleware-logger": "3.654.0", - "@aws-sdk/middleware-recursion-detection": "3.654.0", - "@aws-sdk/middleware-user-agent": "3.654.0", - "@aws-sdk/region-config-resolver": "3.654.0", - "@aws-sdk/types": "3.654.0", - "@aws-sdk/util-endpoints": "3.654.0", - "@aws-sdk/util-user-agent-browser": "3.654.0", - "@aws-sdk/util-user-agent-node": "3.654.0", - "@smithy/config-resolver": "^3.0.8", - "@smithy/core": "^2.4.6", - "@smithy/fetch-http-handler": "^3.2.8", - "@smithy/hash-node": "^3.0.6", - "@smithy/invalid-dependency": "^3.0.6", - "@smithy/middleware-content-length": "^3.0.8", - "@smithy/middleware-endpoint": "^3.1.3", - "@smithy/middleware-retry": "^3.0.21", - "@smithy/middleware-serde": "^3.0.6", - "@smithy/middleware-stack": "^3.0.6", - "@smithy/node-config-provider": "^3.1.7", - "@smithy/node-http-handler": "^3.2.3", - "@smithy/protocol-http": "^4.1.3", - "@smithy/smithy-client": "^3.3.5", - "@smithy/types": "^3.4.2", - "@smithy/url-parser": "^3.0.6", + "@aws-sdk/client-sso-oidc": "3.664.0", + "@aws-sdk/client-sts": "3.664.0", + "@aws-sdk/core": "3.664.0", + "@aws-sdk/credential-provider-node": "3.664.0", + "@aws-sdk/middleware-host-header": "3.664.0", + "@aws-sdk/middleware-logger": "3.664.0", + "@aws-sdk/middleware-recursion-detection": "3.664.0", + "@aws-sdk/middleware-user-agent": "3.664.0", + "@aws-sdk/region-config-resolver": "3.664.0", + "@aws-sdk/types": "3.664.0", + "@aws-sdk/util-endpoints": "3.664.0", + "@aws-sdk/util-user-agent-browser": "3.664.0", + "@aws-sdk/util-user-agent-node": "3.664.0", + "@smithy/config-resolver": "^3.0.9", + "@smithy/core": "^2.4.7", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/hash-node": "^3.0.7", + "@smithy/invalid-dependency": "^3.0.7", + "@smithy/middleware-content-length": "^3.0.9", + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/middleware-retry": "^3.0.22", + "@smithy/middleware-serde": "^3.0.7", + "@smithy/middleware-stack": "^3.0.7", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/protocol-http": "^4.1.4", + "@smithy/smithy-client": "^3.3.6", + "@smithy/types": "^3.5.0", + "@smithy/url-parser": "^3.0.7", "@smithy/util-base64": "^3.0.0", "@smithy/util-body-length-browser": "^3.0.0", "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.21", - "@smithy/util-defaults-mode-node": "^3.0.21", - "@smithy/util-endpoints": "^2.1.2", - "@smithy/util-middleware": "^3.0.6", - "@smithy/util-retry": "^3.0.6", + "@smithy/util-defaults-mode-browser": "^3.0.22", + "@smithy/util-defaults-mode-node": "^3.0.22", + "@smithy/util-endpoints": "^2.1.3", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-retry": "^3.0.7", "@smithy/util-utf8": "^3.0.0", - "@smithy/util-waiter": "^3.1.5", + "@smithy/util-waiter": "^3.1.6", "tslib": "^2.6.2", "uuid": "^9.0.1" }, @@ -722,46 +722,46 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.658.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.658.1.tgz", - "integrity": "sha512-lOuaBtqPTYGn6xpXlQF4LsNDsQ8Ij2kOdnk+i69Kp6yS76TYvtUuukyLL5kx8zE1c8WbYtxj9y8VNw9/6uKl7Q==", + "version": "3.664.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.664.0.tgz", + "integrity": "sha512-E0MObuGylqY2yf47bZZAFK+4+C13c4Cs3HobXgCV3+myoHaxxQHltQuGrapxWOiJJzNmABKEPjBcMnRWnZHXCQ==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.658.1", - "@aws-sdk/middleware-host-header": "3.654.0", - "@aws-sdk/middleware-logger": "3.654.0", - "@aws-sdk/middleware-recursion-detection": "3.654.0", - "@aws-sdk/middleware-user-agent": "3.654.0", - "@aws-sdk/region-config-resolver": "3.654.0", - "@aws-sdk/types": "3.654.0", - "@aws-sdk/util-endpoints": "3.654.0", - "@aws-sdk/util-user-agent-browser": "3.654.0", - "@aws-sdk/util-user-agent-node": "3.654.0", - "@smithy/config-resolver": "^3.0.8", - "@smithy/core": "^2.4.6", - "@smithy/fetch-http-handler": "^3.2.8", - "@smithy/hash-node": "^3.0.6", - "@smithy/invalid-dependency": "^3.0.6", - "@smithy/middleware-content-length": "^3.0.8", - "@smithy/middleware-endpoint": "^3.1.3", - "@smithy/middleware-retry": "^3.0.21", - "@smithy/middleware-serde": "^3.0.6", - "@smithy/middleware-stack": "^3.0.6", - "@smithy/node-config-provider": "^3.1.7", - "@smithy/node-http-handler": "^3.2.3", - "@smithy/protocol-http": "^4.1.3", - "@smithy/smithy-client": "^3.3.5", - "@smithy/types": "^3.4.2", - "@smithy/url-parser": "^3.0.6", + "@aws-sdk/core": "3.664.0", + "@aws-sdk/middleware-host-header": "3.664.0", + "@aws-sdk/middleware-logger": "3.664.0", + "@aws-sdk/middleware-recursion-detection": "3.664.0", + "@aws-sdk/middleware-user-agent": "3.664.0", + "@aws-sdk/region-config-resolver": "3.664.0", + "@aws-sdk/types": "3.664.0", + "@aws-sdk/util-endpoints": "3.664.0", + "@aws-sdk/util-user-agent-browser": "3.664.0", + "@aws-sdk/util-user-agent-node": "3.664.0", + "@smithy/config-resolver": "^3.0.9", + "@smithy/core": "^2.4.7", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/hash-node": "^3.0.7", + "@smithy/invalid-dependency": "^3.0.7", + "@smithy/middleware-content-length": "^3.0.9", + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/middleware-retry": "^3.0.22", + "@smithy/middleware-serde": "^3.0.7", + "@smithy/middleware-stack": "^3.0.7", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/protocol-http": "^4.1.4", + "@smithy/smithy-client": "^3.3.6", + "@smithy/types": "^3.5.0", + "@smithy/url-parser": "^3.0.7", "@smithy/util-base64": "^3.0.0", "@smithy/util-body-length-browser": "^3.0.0", "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.21", - "@smithy/util-defaults-mode-node": "^3.0.21", - "@smithy/util-endpoints": "^2.1.2", - "@smithy/util-middleware": "^3.0.6", - "@smithy/util-retry": "^3.0.6", + "@smithy/util-defaults-mode-browser": "^3.0.22", + "@smithy/util-defaults-mode-node": "^3.0.22", + "@smithy/util-endpoints": "^2.1.3", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-retry": "^3.0.7", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, @@ -770,47 +770,47 @@ } }, "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.658.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.658.1.tgz", - "integrity": "sha512-RGcZAI3qEA05JszPKwa0cAyp8rnS1nUvs0Sqw4hqLNQ1kD7b7V6CPjRXe7EFQqCOMvM4kGqx0+cEEVTOmBsFLw==", + "version": "3.664.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.664.0.tgz", + "integrity": "sha512-VgnAnQwt88oj6OSnIEouvTKN8JI2PzcC3qWQSL87ZtzBSscfrSwbtBNqBxk6nQWwE7AlZuzvT7IN6loz6c7kGA==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.658.1", - "@aws-sdk/credential-provider-node": "3.658.1", - "@aws-sdk/middleware-host-header": "3.654.0", - "@aws-sdk/middleware-logger": "3.654.0", - "@aws-sdk/middleware-recursion-detection": "3.654.0", - "@aws-sdk/middleware-user-agent": "3.654.0", - "@aws-sdk/region-config-resolver": "3.654.0", - "@aws-sdk/types": "3.654.0", - "@aws-sdk/util-endpoints": "3.654.0", - "@aws-sdk/util-user-agent-browser": "3.654.0", - "@aws-sdk/util-user-agent-node": "3.654.0", - "@smithy/config-resolver": "^3.0.8", - "@smithy/core": "^2.4.6", - "@smithy/fetch-http-handler": "^3.2.8", - "@smithy/hash-node": "^3.0.6", - "@smithy/invalid-dependency": "^3.0.6", - "@smithy/middleware-content-length": "^3.0.8", - "@smithy/middleware-endpoint": "^3.1.3", - "@smithy/middleware-retry": "^3.0.21", - "@smithy/middleware-serde": "^3.0.6", - "@smithy/middleware-stack": "^3.0.6", - "@smithy/node-config-provider": "^3.1.7", - "@smithy/node-http-handler": "^3.2.3", - "@smithy/protocol-http": "^4.1.3", - "@smithy/smithy-client": "^3.3.5", - "@smithy/types": "^3.4.2", - "@smithy/url-parser": "^3.0.6", + "@aws-sdk/core": "3.664.0", + "@aws-sdk/credential-provider-node": "3.664.0", + "@aws-sdk/middleware-host-header": "3.664.0", + "@aws-sdk/middleware-logger": "3.664.0", + "@aws-sdk/middleware-recursion-detection": "3.664.0", + "@aws-sdk/middleware-user-agent": "3.664.0", + "@aws-sdk/region-config-resolver": "3.664.0", + "@aws-sdk/types": "3.664.0", + "@aws-sdk/util-endpoints": "3.664.0", + "@aws-sdk/util-user-agent-browser": "3.664.0", + "@aws-sdk/util-user-agent-node": "3.664.0", + "@smithy/config-resolver": "^3.0.9", + "@smithy/core": "^2.4.7", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/hash-node": "^3.0.7", + "@smithy/invalid-dependency": "^3.0.7", + "@smithy/middleware-content-length": "^3.0.9", + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/middleware-retry": "^3.0.22", + "@smithy/middleware-serde": "^3.0.7", + "@smithy/middleware-stack": "^3.0.7", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/protocol-http": "^4.1.4", + "@smithy/smithy-client": "^3.3.6", + "@smithy/types": "^3.5.0", + "@smithy/url-parser": "^3.0.7", "@smithy/util-base64": "^3.0.0", "@smithy/util-body-length-browser": "^3.0.0", "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.21", - "@smithy/util-defaults-mode-node": "^3.0.21", - "@smithy/util-endpoints": "^2.1.2", - "@smithy/util-middleware": "^3.0.6", - "@smithy/util-retry": "^3.0.6", + "@smithy/util-defaults-mode-browser": "^3.0.22", + "@smithy/util-defaults-mode-node": "^3.0.22", + "@smithy/util-endpoints": "^2.1.3", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-retry": "^3.0.7", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, @@ -818,52 +818,52 @@ "node": ">=16.0.0" }, "peerDependencies": { - "@aws-sdk/client-sts": "^3.658.1" + "@aws-sdk/client-sts": "^3.664.0" } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.658.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.658.1.tgz", - "integrity": "sha512-yw9hc5blTnbT1V6mR7Cx9HGc9KQpcLQ1QXj8rntiJi6tIYu3aFNVEyy81JHL7NsuBSeQulJTvHO3y6r3O0sfRg==", + "version": "3.664.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.664.0.tgz", + "integrity": "sha512-+kFS+B/U/thLi8yxYgKc7QFsababYrgrIkbVgTvSzudkzk5RIlDu753L/DfXqYOtecbc6WUwlTKA+Ltee3OVXg==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.658.1", - "@aws-sdk/core": "3.658.1", - "@aws-sdk/credential-provider-node": "3.658.1", - "@aws-sdk/middleware-host-header": "3.654.0", - "@aws-sdk/middleware-logger": "3.654.0", - "@aws-sdk/middleware-recursion-detection": "3.654.0", - "@aws-sdk/middleware-user-agent": "3.654.0", - "@aws-sdk/region-config-resolver": "3.654.0", - "@aws-sdk/types": "3.654.0", - "@aws-sdk/util-endpoints": "3.654.0", - "@aws-sdk/util-user-agent-browser": "3.654.0", - "@aws-sdk/util-user-agent-node": "3.654.0", - "@smithy/config-resolver": "^3.0.8", - "@smithy/core": "^2.4.6", - "@smithy/fetch-http-handler": "^3.2.8", - "@smithy/hash-node": "^3.0.6", - "@smithy/invalid-dependency": "^3.0.6", - "@smithy/middleware-content-length": "^3.0.8", - "@smithy/middleware-endpoint": "^3.1.3", - "@smithy/middleware-retry": "^3.0.21", - "@smithy/middleware-serde": "^3.0.6", - "@smithy/middleware-stack": "^3.0.6", - "@smithy/node-config-provider": "^3.1.7", - "@smithy/node-http-handler": "^3.2.3", - "@smithy/protocol-http": "^4.1.3", - "@smithy/smithy-client": "^3.3.5", - "@smithy/types": "^3.4.2", - "@smithy/url-parser": "^3.0.6", + "@aws-sdk/client-sso-oidc": "3.664.0", + "@aws-sdk/core": "3.664.0", + "@aws-sdk/credential-provider-node": "3.664.0", + "@aws-sdk/middleware-host-header": "3.664.0", + "@aws-sdk/middleware-logger": "3.664.0", + "@aws-sdk/middleware-recursion-detection": "3.664.0", + "@aws-sdk/middleware-user-agent": "3.664.0", + "@aws-sdk/region-config-resolver": "3.664.0", + "@aws-sdk/types": "3.664.0", + "@aws-sdk/util-endpoints": "3.664.0", + "@aws-sdk/util-user-agent-browser": "3.664.0", + "@aws-sdk/util-user-agent-node": "3.664.0", + "@smithy/config-resolver": "^3.0.9", + "@smithy/core": "^2.4.7", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/hash-node": "^3.0.7", + "@smithy/invalid-dependency": "^3.0.7", + "@smithy/middleware-content-length": "^3.0.9", + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/middleware-retry": "^3.0.22", + "@smithy/middleware-serde": "^3.0.7", + "@smithy/middleware-stack": "^3.0.7", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/protocol-http": "^4.1.4", + "@smithy/smithy-client": "^3.3.6", + "@smithy/types": "^3.5.0", + "@smithy/url-parser": "^3.0.7", "@smithy/util-base64": "^3.0.0", "@smithy/util-body-length-browser": "^3.0.0", "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.21", - "@smithy/util-defaults-mode-node": "^3.0.21", - "@smithy/util-endpoints": "^2.1.2", - "@smithy/util-middleware": "^3.0.6", - "@smithy/util-retry": "^3.0.6", + "@smithy/util-defaults-mode-browser": "^3.0.22", + "@smithy/util-defaults-mode-node": "^3.0.22", + "@smithy/util-endpoints": "^2.1.3", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-retry": "^3.0.7", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, @@ -872,50 +872,50 @@ } }, "node_modules/@aws-sdk/client-xray": { - "version": "3.658.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-xray/-/client-xray-3.658.1.tgz", - "integrity": "sha512-FVm36F4iyrb91vx4nZHBmBGEf9868Zto8OFbtPw2LeolzxMFh33h6OOyHc6zkgKZfmUHlg8AZAlhVqV6bPXMWw==", + "version": "3.664.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-xray/-/client-xray-3.664.0.tgz", + "integrity": "sha512-krEDcJzEofeNQVSXnGgFAr+UsufmC55vrxrkZk+znvZNDmXblAH0YvT4/5vApETDb5+4OgUJCFQ6jvP/OHrzgw==", "dev": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.658.1", - "@aws-sdk/client-sts": "3.658.1", - "@aws-sdk/core": "3.658.1", - "@aws-sdk/credential-provider-node": "3.658.1", - "@aws-sdk/middleware-host-header": "3.654.0", - "@aws-sdk/middleware-logger": "3.654.0", - "@aws-sdk/middleware-recursion-detection": "3.654.0", - "@aws-sdk/middleware-user-agent": "3.654.0", - "@aws-sdk/region-config-resolver": "3.654.0", - "@aws-sdk/types": "3.654.0", - "@aws-sdk/util-endpoints": "3.654.0", - "@aws-sdk/util-user-agent-browser": "3.654.0", - "@aws-sdk/util-user-agent-node": "3.654.0", - "@smithy/config-resolver": "^3.0.8", - "@smithy/core": "^2.4.6", - "@smithy/fetch-http-handler": "^3.2.8", - "@smithy/hash-node": "^3.0.6", - "@smithy/invalid-dependency": "^3.0.6", - "@smithy/middleware-content-length": "^3.0.8", - "@smithy/middleware-endpoint": "^3.1.3", - "@smithy/middleware-retry": "^3.0.21", - "@smithy/middleware-serde": "^3.0.6", - "@smithy/middleware-stack": "^3.0.6", - "@smithy/node-config-provider": "^3.1.7", - "@smithy/node-http-handler": "^3.2.3", - "@smithy/protocol-http": "^4.1.3", - "@smithy/smithy-client": "^3.3.5", - "@smithy/types": "^3.4.2", - "@smithy/url-parser": "^3.0.6", + "@aws-sdk/client-sso-oidc": "3.664.0", + "@aws-sdk/client-sts": "3.664.0", + "@aws-sdk/core": "3.664.0", + "@aws-sdk/credential-provider-node": "3.664.0", + "@aws-sdk/middleware-host-header": "3.664.0", + "@aws-sdk/middleware-logger": "3.664.0", + "@aws-sdk/middleware-recursion-detection": "3.664.0", + "@aws-sdk/middleware-user-agent": "3.664.0", + "@aws-sdk/region-config-resolver": "3.664.0", + "@aws-sdk/types": "3.664.0", + "@aws-sdk/util-endpoints": "3.664.0", + "@aws-sdk/util-user-agent-browser": "3.664.0", + "@aws-sdk/util-user-agent-node": "3.664.0", + "@smithy/config-resolver": "^3.0.9", + "@smithy/core": "^2.4.7", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/hash-node": "^3.0.7", + "@smithy/invalid-dependency": "^3.0.7", + "@smithy/middleware-content-length": "^3.0.9", + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/middleware-retry": "^3.0.22", + "@smithy/middleware-serde": "^3.0.7", + "@smithy/middleware-stack": "^3.0.7", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/protocol-http": "^4.1.4", + "@smithy/smithy-client": "^3.3.6", + "@smithy/types": "^3.5.0", + "@smithy/url-parser": "^3.0.7", "@smithy/util-base64": "^3.0.0", "@smithy/util-body-length-browser": "^3.0.0", "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.21", - "@smithy/util-defaults-mode-node": "^3.0.21", - "@smithy/util-endpoints": "^2.1.2", - "@smithy/util-middleware": "^3.0.6", - "@smithy/util-retry": "^3.0.6", + "@smithy/util-defaults-mode-browser": "^3.0.22", + "@smithy/util-defaults-mode-node": "^3.0.22", + "@smithy/util-endpoints": "^2.1.3", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-retry": "^3.0.7", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, @@ -924,18 +924,19 @@ } }, "node_modules/@aws-sdk/core": { - "version": "3.658.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.658.1.tgz", - "integrity": "sha512-vJVMoMcSKXK2gBRSu9Ywwv6wQ7tXH8VL1fqB1uVxgCqBZ3IHfqNn4zvpMPWrwgO2/3wv7XFyikGQ5ypPTCw4jA==", - "dependencies": { - "@smithy/core": "^2.4.6", - "@smithy/node-config-provider": "^3.1.7", - "@smithy/property-provider": "^3.1.6", - "@smithy/protocol-http": "^4.1.3", - "@smithy/signature-v4": "^4.1.4", - "@smithy/smithy-client": "^3.3.5", - "@smithy/types": "^3.4.2", - "@smithy/util-middleware": "^3.0.6", + "version": "3.664.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.664.0.tgz", + "integrity": "sha512-QdfMpTpJqtpuFIFfUJEgJ+Rq/dO3I5iaViLKr9Zad4Gfi/GiRWTeXd4IvjcyRntB5GkyCak9RKMkxkECQavPJg==", + "dependencies": { + "@aws-sdk/types": "3.664.0", + "@smithy/core": "^2.4.7", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/property-provider": "^3.1.7", + "@smithy/protocol-http": "^4.1.4", + "@smithy/signature-v4": "^4.2.0", + "@smithy/smithy-client": "^3.3.6", + "@smithy/types": "^3.5.0", + "@smithy/util-middleware": "^3.0.7", "fast-xml-parser": "4.4.1", "tslib": "^2.6.2" }, @@ -944,13 +945,13 @@ } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.654.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.654.0.tgz", - "integrity": "sha512-kogsx3Ql81JouHS7DkheCDU9MYAvK0AokxjcshDveGmf7BbgbWCA8Fnb9wjQyNDaOXNvkZu8Z8rgkX91z324/w==", + "version": "3.664.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.664.0.tgz", + "integrity": "sha512-95rE+9Voaco0nmKJrXqfJAxSSkSWqlBy76zomiZrUrv7YuijQtHCW8jte6v6UHAFAaBzgFsY7QqBxs15u9SM7g==", "dependencies": { - "@aws-sdk/types": "3.654.0", - "@smithy/property-provider": "^3.1.6", - "@smithy/types": "^3.4.2", + "@aws-sdk/types": "3.664.0", + "@smithy/property-provider": "^3.1.7", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -958,18 +959,18 @@ } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.658.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.658.1.tgz", - "integrity": "sha512-4ubkJjEVCZflxkZnV1JDQv8P2pburxk1LrEp55telfJRzXrnowzBKwuV2ED0QMNC448g2B3VCaffS+Ct7c4IWQ==", - "dependencies": { - "@aws-sdk/types": "3.654.0", - "@smithy/fetch-http-handler": "^3.2.8", - "@smithy/node-http-handler": "^3.2.3", - "@smithy/property-provider": "^3.1.6", - "@smithy/protocol-http": "^4.1.3", - "@smithy/smithy-client": "^3.3.5", - "@smithy/types": "^3.4.2", - "@smithy/util-stream": "^3.1.8", + "version": "3.664.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.664.0.tgz", + "integrity": "sha512-svaPwVfWV3g/qjd4cYHTUyBtkdOwcVjC+tSj6EjoMrpZwGUXcCbYe04iU0ARZ6tuH/u3vySbTLOGjSa7g8o9Qw==", + "dependencies": { + "@aws-sdk/types": "3.664.0", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/property-provider": "^3.1.7", + "@smithy/protocol-http": "^4.1.4", + "@smithy/smithy-client": "^3.3.6", + "@smithy/types": "^3.5.0", + "@smithy/util-stream": "^3.1.9", "tslib": "^2.6.2" }, "engines": { @@ -977,45 +978,45 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.658.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.658.1.tgz", - "integrity": "sha512-2uwOamQg5ppwfegwen1ddPu5HM3/IBSnaGlaKLFhltkdtZ0jiqTZWUtX2V+4Q+buLnT0hQvLS/frQ+7QUam+0Q==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.654.0", - "@aws-sdk/credential-provider-http": "3.658.1", - "@aws-sdk/credential-provider-process": "3.654.0", - "@aws-sdk/credential-provider-sso": "3.658.1", - "@aws-sdk/credential-provider-web-identity": "3.654.0", - "@aws-sdk/types": "3.654.0", - "@smithy/credential-provider-imds": "^3.2.3", - "@smithy/property-provider": "^3.1.6", - "@smithy/shared-ini-file-loader": "^3.1.7", - "@smithy/types": "^3.4.2", + "version": "3.664.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.664.0.tgz", + "integrity": "sha512-ykRLQi9gqY7xlgC33iEWyPMv19JDMpOqQfqb5zaV46NteT60ouBrS3WsCrDiwygF7HznGLpr0lpt17/C6Mq27g==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.664.0", + "@aws-sdk/credential-provider-http": "3.664.0", + "@aws-sdk/credential-provider-process": "3.664.0", + "@aws-sdk/credential-provider-sso": "3.664.0", + "@aws-sdk/credential-provider-web-identity": "3.664.0", + "@aws-sdk/types": "3.664.0", + "@smithy/credential-provider-imds": "^3.2.4", + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" }, "peerDependencies": { - "@aws-sdk/client-sts": "^3.658.1" + "@aws-sdk/client-sts": "^3.664.0" } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.658.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.658.1.tgz", - "integrity": "sha512-XwxW6N+uPXPYAuyq+GfOEdfL/MZGAlCSfB5gEWtLBFmFbikhmEuqfWtI6CD60OwudCUOh6argd21BsJf8o1SJA==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.654.0", - "@aws-sdk/credential-provider-http": "3.658.1", - "@aws-sdk/credential-provider-ini": "3.658.1", - "@aws-sdk/credential-provider-process": "3.654.0", - "@aws-sdk/credential-provider-sso": "3.658.1", - "@aws-sdk/credential-provider-web-identity": "3.654.0", - "@aws-sdk/types": "3.654.0", - "@smithy/credential-provider-imds": "^3.2.3", - "@smithy/property-provider": "^3.1.6", - "@smithy/shared-ini-file-loader": "^3.1.7", - "@smithy/types": "^3.4.2", + "version": "3.664.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.664.0.tgz", + "integrity": "sha512-JrLtx4tEtEzqYAmk+pz8B7QcBCNRN+lZAh3fbQox7q9YQaIELLM3MA6LM5kEp/uHop920MQvdhHOMtR5jjJqWA==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.664.0", + "@aws-sdk/credential-provider-http": "3.664.0", + "@aws-sdk/credential-provider-ini": "3.664.0", + "@aws-sdk/credential-provider-process": "3.664.0", + "@aws-sdk/credential-provider-sso": "3.664.0", + "@aws-sdk/credential-provider-web-identity": "3.664.0", + "@aws-sdk/types": "3.664.0", + "@smithy/credential-provider-imds": "^3.2.4", + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -1023,14 +1024,14 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.654.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.654.0.tgz", - "integrity": "sha512-PmQoo8sZ9Q2Ow8OMzK++Z9lI7MsRUG7sNq3E72DVA215dhtTICTDQwGlXH2AAmIp7n+G9LLRds+4wo2ehG4mkg==", - "dependencies": { - "@aws-sdk/types": "3.654.0", - "@smithy/property-provider": "^3.1.6", - "@smithy/shared-ini-file-loader": "^3.1.7", - "@smithy/types": "^3.4.2", + "version": "3.664.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.664.0.tgz", + "integrity": "sha512-sQicIw/qWTsmMw8EUQNJXdrWV5SXaZc2zGdCQsQxhR6wwNO2/rZ5JmzdcwUADmleBVyPYk3KGLhcofF/qXT2Ng==", + "dependencies": { + "@aws-sdk/types": "3.664.0", + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -1038,16 +1039,16 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.658.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.658.1.tgz", - "integrity": "sha512-YOagVEsZEk9DmgJEBg+4MBXrPcw/tYas0VQ5OVBqC5XHNbi2OBGJqgmjVPesuu393E7W0VQxtJFDS00O1ewQgA==", - "dependencies": { - "@aws-sdk/client-sso": "3.658.1", - "@aws-sdk/token-providers": "3.654.0", - "@aws-sdk/types": "3.654.0", - "@smithy/property-provider": "^3.1.6", - "@smithy/shared-ini-file-loader": "^3.1.7", - "@smithy/types": "^3.4.2", + "version": "3.664.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.664.0.tgz", + "integrity": "sha512-r7m+XkTAvGT9nW4aHqjWOHcoo3EfUsXx6d9JJjWn/gnvdsvhobCJx8p621aR9WeSBUTKJg5+EXGhZF6awRdZGQ==", + "dependencies": { + "@aws-sdk/client-sso": "3.664.0", + "@aws-sdk/token-providers": "3.664.0", + "@aws-sdk/types": "3.664.0", + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -1055,20 +1056,20 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.654.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.654.0.tgz", - "integrity": "sha512-6a2g9gMtZToqSu+CusjNK5zvbLJahQ9di7buO3iXgbizXpLXU1rnawCpWxwslMpT5fLgMSKDnKDrr6wdEk7jSw==", + "version": "3.664.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.664.0.tgz", + "integrity": "sha512-10ltP1BfSKRJVXd8Yr5oLbo+VSDskWbps0X3szSsxTk0Dju1xvkz7hoIjylWLvtGbvQ+yb2pmsJYKCudW/4DJg==", "dependencies": { - "@aws-sdk/types": "3.654.0", - "@smithy/property-provider": "^3.1.6", - "@smithy/types": "^3.4.2", + "@aws-sdk/types": "3.664.0", + "@smithy/property-provider": "^3.1.7", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" }, "peerDependencies": { - "@aws-sdk/client-sts": "^3.654.0" + "@aws-sdk/client-sts": "^3.664.0" } }, "node_modules/@aws-sdk/endpoint-cache": { @@ -1084,33 +1085,33 @@ } }, "node_modules/@aws-sdk/lib-dynamodb": { - "version": "3.658.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.658.1.tgz", - "integrity": "sha512-IU/PTANYfmTCt/gB5tM6XYvHXtBGTgNDW5kE5iNte5+VLN3OPXAzlg8Tk00b3sgERyOufiJ5nyerSCSsjyM5WQ==", - "dependencies": { - "@aws-sdk/util-dynamodb": "3.658.1", - "@smithy/core": "^2.4.6", - "@smithy/smithy-client": "^3.3.5", - "@smithy/types": "^3.4.2", + "version": "3.664.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.664.0.tgz", + "integrity": "sha512-HCEQKhb6xuEdPdUckjSVLzMG7gZLhAtl7l5gE+ktXTedq0QYeC3zNvAXJLvzLPxYUqXDq69YYbRf5AZSJuA6Cg==", + "dependencies": { + "@aws-sdk/util-dynamodb": "3.664.0", + "@smithy/core": "^2.4.7", + "@smithy/smithy-client": "^3.3.6", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" }, "peerDependencies": { - "@aws-sdk/client-dynamodb": "^3.658.1" + "@aws-sdk/client-dynamodb": "^3.664.0" } }, "node_modules/@aws-sdk/middleware-endpoint-discovery": { - "version": "3.654.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.654.0.tgz", - "integrity": "sha512-oHmSZYWsoGSYTjrohu/EFbtthGZOr9qIU8ewDzzhI2ceCEvCy6w7Vd/Ov1pG6C3faNEGAGNZynOmYJBeF2XIOA==", + "version": "3.664.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.664.0.tgz", + "integrity": "sha512-K7I1eM9zaRNtOUo+jf8M2ZkTsncWhY/gMMuJubNbj7ceym3LzShougrbxTZl/OOug5Vcmn8A3aOn7gIpq9WT1A==", "dependencies": { "@aws-sdk/endpoint-cache": "3.572.0", - "@aws-sdk/types": "3.654.0", - "@smithy/node-config-provider": "^3.1.7", - "@smithy/protocol-http": "^4.1.3", - "@smithy/types": "^3.4.2", + "@aws-sdk/types": "3.664.0", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -1118,13 +1119,13 @@ } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.654.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.654.0.tgz", - "integrity": "sha512-rxGgVHWKp8U2ubMv+t+vlIk7QYUaRCHaVpmUlJv0Wv6Q0KeO9a42T9FxHphjOTlCGQOLcjCreL9CF8Qhtb4mdQ==", + "version": "3.664.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.664.0.tgz", + "integrity": "sha512-4tCXJ+DZWTq38eLmFgnEmO8X4jfWpgPbWoCyVYpRHCPHq6xbrU65gfwS9jGx25L4YdEce641ChI9TKLryuUgRA==", "dependencies": { - "@aws-sdk/types": "3.654.0", - "@smithy/protocol-http": "^4.1.3", - "@smithy/types": "^3.4.2", + "@aws-sdk/types": "3.664.0", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -1132,12 +1133,12 @@ } }, "node_modules/@aws-sdk/middleware-logger": { - "version": "3.654.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.654.0.tgz", - "integrity": "sha512-OQYb+nWlmASyXfRb989pwkJ9EVUMP1CrKn2eyTk3usl20JZmKo2Vjis6I0tLUkMSxMhnBJJlQKyWkRpD/u1FVg==", + "version": "3.664.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.664.0.tgz", + "integrity": "sha512-eNykMqQuv7eg9pAcaLro44fscIe1VkFfhm+gYnlxd+PH6xqapRki1E68VHehnIptnVBdqnWfEqLUSLGm9suqhg==", "dependencies": { - "@aws-sdk/types": "3.654.0", - "@smithy/types": "^3.4.2", + "@aws-sdk/types": "3.664.0", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -1145,13 +1146,13 @@ } }, "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.654.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.654.0.tgz", - "integrity": "sha512-gKSomgltKVmsT8sC6W7CrADZ4GHwX9epk3GcH6QhebVO3LA9LRbkL3TwOPUXakxxOLLUTYdOZLIOtFf7iH00lg==", + "version": "3.664.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.664.0.tgz", + "integrity": "sha512-jq27WMZhm+dY8BWZ9Ipy3eXtZj0lJzpaKQE3A3tH5AOIlUV/gqrmnJ9CdqVVef4EJsq9Yil4ZzQjKKmPsxveQg==", "dependencies": { - "@aws-sdk/types": "3.654.0", - "@smithy/protocol-http": "^4.1.3", - "@smithy/types": "^3.4.2", + "@aws-sdk/types": "3.664.0", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -1159,14 +1160,15 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.654.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.654.0.tgz", - "integrity": "sha512-liCcqPAyRsr53cy2tYu4qeH4MMN0eh9g6k56XzI5xd4SghXH5YWh4qOYAlQ8T66ZV4nPMtD8GLtLXGzsH8moFg==", - "dependencies": { - "@aws-sdk/types": "3.654.0", - "@aws-sdk/util-endpoints": "3.654.0", - "@smithy/protocol-http": "^4.1.3", - "@smithy/types": "^3.4.2", + "version": "3.664.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.664.0.tgz", + "integrity": "sha512-Kp5UwXwayO6d472nntiwgrxqay2KS9ozXNmKjQfDrUWbEzvgKI+jgKNMia8MMnjSxYoBGpQ1B8NGh8a6KMEJJg==", + "dependencies": { + "@aws-sdk/types": "3.664.0", + "@aws-sdk/util-endpoints": "3.664.0", + "@smithy/core": "^2.4.7", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -1174,15 +1176,15 @@ } }, "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.654.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.654.0.tgz", - "integrity": "sha512-ydGOrXJxj3x0sJhsXyTmvJVLAE0xxuTWFJihTl67RtaO7VRNtd82I3P3bwoMMaDn5WpmV5mPo8fEUDRlBm3fPg==", + "version": "3.664.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.664.0.tgz", + "integrity": "sha512-o/B8dg8K+9714RGYPgMxZgAChPe/MTSMkf/eHXTUFHNik5i1HgVKfac22njV2iictGy/6GhpFsKa1OWNYAkcUg==", "dependencies": { - "@aws-sdk/types": "3.654.0", - "@smithy/node-config-provider": "^3.1.7", - "@smithy/types": "^3.4.2", + "@aws-sdk/types": "3.664.0", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/types": "^3.5.0", "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.6", + "@smithy/util-middleware": "^3.0.7", "tslib": "^2.6.2" }, "engines": { @@ -1190,29 +1192,29 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.654.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.654.0.tgz", - "integrity": "sha512-D8GeJYmvbfWkQDtTB4owmIobSMexZel0fOoetwvgCQ/7L8VPph3Q2bn1TRRIXvH7wdt6DcDxA3tKMHPBkT3GlA==", - "dependencies": { - "@aws-sdk/types": "3.654.0", - "@smithy/property-provider": "^3.1.6", - "@smithy/shared-ini-file-loader": "^3.1.7", - "@smithy/types": "^3.4.2", + "version": "3.664.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.664.0.tgz", + "integrity": "sha512-dBAvXW2/6bAxidvKARFxyCY2uCynYBKRFN00NhS1T5ggxm3sUnuTpWw1DTjl02CVPkacBOocZf10h8pQbHSK8w==", + "dependencies": { + "@aws-sdk/types": "3.664.0", + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" }, "peerDependencies": { - "@aws-sdk/client-sso-oidc": "^3.654.0" + "@aws-sdk/client-sso-oidc": "^3.664.0" } }, "node_modules/@aws-sdk/types": { - "version": "3.654.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.654.0.tgz", - "integrity": "sha512-VWvbED3SV+10QJIcmU/PKjsKilsTV16d1I7/on4bvD/jo1qGeMXqLDBSen3ks/tuvXZF/mFc7ZW/W2DiLVtO7A==", + "version": "3.664.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.664.0.tgz", + "integrity": "sha512-+GtXktvVgpreM2b+NJL9OqZGsOzHwlCUrO8jgQUvH/yA6Kd8QO2YFhQCp0C9sSzTteZJVqGBu8E0CQurxJHPbw==", "dependencies": { - "@smithy/types": "^3.4.2", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -1220,9 +1222,9 @@ } }, "node_modules/@aws-sdk/util-dynamodb": { - "version": "3.658.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.658.1.tgz", - "integrity": "sha512-lzlnis+35a2OhGZlVJvM3/30iIVoP2cIv5Bkw1F2nkM6Pr+1NOd3XvYhCY1Ud5zWtV6HUSptzessvUPqJTMfjQ==", + "version": "3.664.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.664.0.tgz", + "integrity": "sha512-ARIlGHX1pLnBq9NaAjwrE7A6z9eSlfTh4mycoyrsVQMgXhDPJ/5rREW5MqmTbGO08jmgVrmOkfAdU7pq1axIeA==", "dependencies": { "tslib": "^2.6.2" }, @@ -1230,17 +1232,17 @@ "node": ">=16.0.0" }, "peerDependencies": { - "@aws-sdk/client-dynamodb": "^3.658.1" + "@aws-sdk/client-dynamodb": "^3.664.0" } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.654.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.654.0.tgz", - "integrity": "sha512-i902fcBknHs0Irgdpi62+QMvzxE+bczvILXigYrlHL4+PiEnlMVpni5L5W1qCkNZXf8AaMrSBuR1NZAGp6UOUw==", + "version": "3.664.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.664.0.tgz", + "integrity": "sha512-KrXoHz6zmAahVHkyWMRT+P6xJaxItgmklxEDrT+npsUB4d5C/lhw16Crcp9TDi828fiZK3GYKRAmmNhvmzvBNg==", "dependencies": { - "@aws-sdk/types": "3.654.0", - "@smithy/types": "^3.4.2", - "@smithy/util-endpoints": "^2.1.2", + "@aws-sdk/types": "3.664.0", + "@smithy/types": "^3.5.0", + "@smithy/util-endpoints": "^2.1.3", "tslib": "^2.6.2" }, "engines": { @@ -1259,24 +1261,25 @@ } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.654.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.654.0.tgz", - "integrity": "sha512-ykYAJqvnxLt7wfrqya28wuH3/7NdrwzfiFd7NqEVQf7dXVxL5RPEpD7DxjcyQo3DsHvvdUvGZVaQhozycn1pzA==", + "version": "3.664.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.664.0.tgz", + "integrity": "sha512-c/PV3+f1ss4PpskHbcOxTZ6fntV2oXy/xcDR9nW+kVaz5cM1G702gF0rvGLKPqoBwkj2rWGe6KZvEBeLzynTUQ==", "dependencies": { - "@aws-sdk/types": "3.654.0", - "@smithy/types": "^3.4.2", + "@aws-sdk/types": "3.664.0", + "@smithy/types": "^3.5.0", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.654.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.654.0.tgz", - "integrity": "sha512-a0ojjdBN6pqv6gB4H/QPPSfhs7mFtlVwnmKCM/QrTaFzN0U810PJ1BST3lBx5sa23I5jWHGaoFY+5q65C3clLQ==", - "dependencies": { - "@aws-sdk/types": "3.654.0", - "@smithy/node-config-provider": "^3.1.7", - "@smithy/types": "^3.4.2", + "version": "3.664.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.664.0.tgz", + "integrity": "sha512-l/m6KkgrTw1p/VTJTk0IoP9I2OnpWp3WbBgzxoNeh9cUcxTufIn++sBxKj5hhDql57LKWsckScG/MhFuH0vZZA==", + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.664.0", + "@aws-sdk/types": "3.664.0", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -4501,11 +4504,11 @@ "dev": true }, "node_modules/@smithy/abort-controller": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.4.tgz", - "integrity": "sha512-VupaALAQlXViW3/enTf/f5l5JZYSAxoJL7f0nanhNNKnww6DGCg1oYIuNP78KDugnkwthBO6iEcym16HhWV8RQ==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.5.tgz", + "integrity": "sha512-DhNPnqTqPoG8aZ5dWkFOgsuY+i0GQ3CI6hMmvCoduNsnU9gUZWZBwGfDQsTTB7NvFPkom1df7jMIJWU90kuXXg==", "dependencies": { - "@smithy/types": "^3.4.2", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -4513,14 +4516,14 @@ } }, "node_modules/@smithy/config-resolver": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.8.tgz", - "integrity": "sha512-Tv1obAC18XOd2OnDAjSWmmthzx6Pdeh63FbLin8MlPiuJ2ATpKkq0NcNOJFr0dO+JmZXnwu8FQxKJ3TKJ3Hulw==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.9.tgz", + "integrity": "sha512-5d9oBf40qC7n2xUoHmntKLdqsyTMMo/r49+eqSIjJ73eDfEtljAxEhzIQ3bkgXJtR3xiv7YzMT/3FF3ORkjWdg==", "dependencies": { - "@smithy/node-config-provider": "^3.1.7", - "@smithy/types": "^3.4.2", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/types": "^3.5.0", "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.6", + "@smithy/util-middleware": "^3.0.7", "tslib": "^2.6.2" }, "engines": { @@ -4528,18 +4531,18 @@ } }, "node_modules/@smithy/core": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.4.6.tgz", - "integrity": "sha512-6lQQp99hnyuNNIzeTYSzCUXJHwvvFLY7hfdFGSJM95tjRDJGfzWYFRBXPaM9766LiiTsQ561KErtbufzUFSYUg==", - "dependencies": { - "@smithy/middleware-endpoint": "^3.1.3", - "@smithy/middleware-retry": "^3.0.21", - "@smithy/middleware-serde": "^3.0.6", - "@smithy/protocol-http": "^4.1.3", - "@smithy/smithy-client": "^3.3.5", - "@smithy/types": "^3.4.2", + "version": "2.4.7", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.4.7.tgz", + "integrity": "sha512-goqMjX+IoVEnHZjYuzu8xwoZjoteMiLXsPHuXPBkWsGwu0o9c3nTjqkUlP1Ez/V8E501aOU7CJ3INk8mQcW2gw==", + "dependencies": { + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/middleware-retry": "^3.0.22", + "@smithy/middleware-serde": "^3.0.7", + "@smithy/protocol-http": "^4.1.4", + "@smithy/smithy-client": "^3.3.6", + "@smithy/types": "^3.5.0", "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-middleware": "^3.0.6", + "@smithy/util-middleware": "^3.0.7", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, @@ -4548,14 +4551,14 @@ } }, "node_modules/@smithy/credential-provider-imds": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.3.tgz", - "integrity": "sha512-VoxMzSzdvkkjMJNE38yQgx4CfnmT+Z+5EUXkg4x7yag93eQkVQgZvN3XBSHC/ylfBbLbAtdu7flTCChX9I+mVg==", - "dependencies": { - "@smithy/node-config-provider": "^3.1.7", - "@smithy/property-provider": "^3.1.6", - "@smithy/types": "^3.4.2", - "@smithy/url-parser": "^3.0.6", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.4.tgz", + "integrity": "sha512-S9bb0EIokfYEuar4kEbLta+ivlKCWOCFsLZuilkNy9i0uEUEHSi47IFLPaxqqCl+0ftKmcOTHayY5nQhAuq7+w==", + "dependencies": { + "@smithy/node-config-provider": "^3.1.8", + "@smithy/property-provider": "^3.1.7", + "@smithy/types": "^3.5.0", + "@smithy/url-parser": "^3.0.7", "tslib": "^2.6.2" }, "engines": { @@ -4563,23 +4566,23 @@ } }, "node_modules/@smithy/eventstream-codec": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-3.1.5.tgz", - "integrity": "sha512-6pu+PT2r+5ZnWEV3vLV1DzyrpJ0TmehQlniIDCSpZg6+Ji2SfOI38EqUyQ+O8lotVElCrfVc9chKtSMe9cmCZQ==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-3.1.6.tgz", + "integrity": "sha512-SBiOYPBH+5wOyPS7lfI150ePfGLhnp/eTu5RnV9xvhGvRiKfnl6HzRK9wehBph+il8FxS9KTeadx7Rcmf1GLPQ==", "dependencies": { "@aws-crypto/crc32": "5.2.0", - "@smithy/types": "^3.4.2", + "@smithy/types": "^3.5.0", "@smithy/util-hex-encoding": "^3.0.0", "tslib": "^2.6.2" } }, "node_modules/@smithy/eventstream-serde-browser": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-3.0.9.tgz", - "integrity": "sha512-PiQLo6OQmZAotJweIcObL1H44gkvuJACKMNqpBBe5Rf2Ax1DOcGi/28+feZI7yTe1ERHlQQaGnm8sSkyDUgsMg==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-3.0.10.tgz", + "integrity": "sha512-1i9aMY6Pl/SmA6NjvidxnfBLHMPzhKu2BP148pEt5VwhMdmXn36PE2kWKGa9Hj8b0XGtCTRucpCncylevCtI7g==", "dependencies": { - "@smithy/eventstream-serde-universal": "^3.0.8", - "@smithy/types": "^3.4.2", + "@smithy/eventstream-serde-universal": "^3.0.9", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -4587,11 +4590,11 @@ } }, "node_modules/@smithy/eventstream-serde-config-resolver": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.0.6.tgz", - "integrity": "sha512-iew15It+c7WfnVowWkt2a7cdPp533LFJnpjDQgfZQcxv2QiOcyEcea31mnrk5PVbgo0nNH3VbYGq7myw2q/F6A==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.0.7.tgz", + "integrity": "sha512-eVzhGQBPEqXXYHvIUku0jMTxd4gDvenRzUQPTmKVWdRvp9JUCKrbAXGQRYiGxUYq9+cqQckRm0wq3kTWnNtDhw==", "dependencies": { - "@smithy/types": "^3.4.2", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -4599,12 +4602,12 @@ } }, "node_modules/@smithy/eventstream-serde-node": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-3.0.8.tgz", - "integrity": "sha512-6m+wI+fT0na+6oao6UqALVA38fsScCpoG5UO/A8ZSyGLnPM2i4MS1cFUhpuALgvLMxfYoTCh7qSeJa0aG4IWpQ==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-3.0.9.tgz", + "integrity": "sha512-JE0Guqvt0xsmfQ5y1EI342/qtJqznBv8cJqkHZV10PwC8GWGU5KNgFbQnsVCcX+xF+qIqwwfRmeWoJCjuOLmng==", "dependencies": { - "@smithy/eventstream-serde-universal": "^3.0.8", - "@smithy/types": "^3.4.2", + "@smithy/eventstream-serde-universal": "^3.0.9", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -4612,12 +4615,12 @@ } }, "node_modules/@smithy/eventstream-serde-universal": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-3.0.8.tgz", - "integrity": "sha512-09tqzIQ6e+7jLqGvRji1yJoDbL/zob0OFhq75edgStWErGLf16+yI5hRc/o9/YAybOhUZs/swpW2SPn892G5Gg==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-3.0.9.tgz", + "integrity": "sha512-bydfgSisfepCufw9kCEnWRxqxJFzX/o8ysXWv+W9F2FIyiaEwZ/D8bBKINbh4ONz3i05QJ1xE7A5OKYvgJsXaw==", "dependencies": { - "@smithy/eventstream-codec": "^3.1.5", - "@smithy/types": "^3.4.2", + "@smithy/eventstream-codec": "^3.1.6", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -4625,23 +4628,23 @@ } }, "node_modules/@smithy/fetch-http-handler": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.8.tgz", - "integrity": "sha512-Lqe0B8F5RM7zkw//6avq1SJ8AfaRd3ubFUS1eVp5WszV7p6Ne5hQ4dSuMHDpNRPhgTvj4va9Kd/pcVigHEHRow==", + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.9.tgz", + "integrity": "sha512-hYNVQOqhFQ6vOpenifFME546f0GfJn2OiQ3M0FDmuUu8V/Uiwy2wej7ZXxFBNqdx0R5DZAqWM1l6VRhGz8oE6A==", "dependencies": { - "@smithy/protocol-http": "^4.1.3", - "@smithy/querystring-builder": "^3.0.6", - "@smithy/types": "^3.4.2", + "@smithy/protocol-http": "^4.1.4", + "@smithy/querystring-builder": "^3.0.7", + "@smithy/types": "^3.5.0", "@smithy/util-base64": "^3.0.0", "tslib": "^2.6.2" } }, "node_modules/@smithy/hash-node": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.6.tgz", - "integrity": "sha512-c/FHEdKK/7DU2z6ZE91L36ahyXWayR3B+FzELjnYq7wH5YqIseM24V+pWCS9kFn1Ln8OFGTf+pyYPiHZuX0s/Q==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.7.tgz", + "integrity": "sha512-SAGHN+QkrwcHFjfWzs/czX94ZEjPJ0CrWJS3M43WswDXVEuP4AVy9gJ3+AF6JQHZD13bojmuf/Ap/ItDeZ+Qfw==", "dependencies": { - "@smithy/types": "^3.4.2", + "@smithy/types": "^3.5.0", "@smithy/util-buffer-from": "^3.0.0", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" @@ -4651,11 +4654,11 @@ } }, "node_modules/@smithy/invalid-dependency": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.6.tgz", - "integrity": "sha512-czM7Ioq3s8pIXht7oD+vmgy4Wfb4XavU/k/irO8NdXFFOx7YAlsCCcKOh/lJD1mJSYQqiR7NmpZ9JviryD/7AQ==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.7.tgz", + "integrity": "sha512-Bq00GsAhHeYSuZX8Kpu4sbI9agH2BNYnqUmmbTGWOhki9NVsWn2jFr896vvoTMH8KAjNX/ErC/8t5QHuEXG+IA==", "dependencies": { - "@smithy/types": "^3.4.2", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" } }, @@ -4671,17 +4674,17 @@ } }, "node_modules/@smithy/middleware-compression": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@smithy/middleware-compression/-/middleware-compression-3.0.10.tgz", - "integrity": "sha512-0dzc3D4GqbuHFYN0bDti+suxAT18s2RFL1EYIvZSTOLz0Vt7E/xqgNLgQ+SDCg/B8kvR0JeClkCqYPcWEqtnQQ==", + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/middleware-compression/-/middleware-compression-3.0.11.tgz", + "integrity": "sha512-OaorRFwGze2JJtMt7k0RD3sPptt5RTiasH29i1WCQX9x2a3jSXZEKnrcTdrG0tEqZKlsmw40OlJWS+ydel/8Mg==", "dev": true, "dependencies": { "@smithy/is-array-buffer": "^3.0.0", - "@smithy/node-config-provider": "^3.1.7", - "@smithy/protocol-http": "^4.1.3", - "@smithy/types": "^3.4.2", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.6", + "@smithy/util-middleware": "^3.0.7", "@smithy/util-utf8": "^3.0.0", "fflate": "0.8.1", "tslib": "^2.6.2" @@ -4691,12 +4694,12 @@ } }, "node_modules/@smithy/middleware-content-length": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.8.tgz", - "integrity": "sha512-VuyszlSO49WKh3H9/kIO2kf07VUwGV80QRiaDxUfP8P8UKlokz381ETJvwLhwuypBYhLymCYyNhB3fLAGBX2og==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.9.tgz", + "integrity": "sha512-t97PidoGElF9hTtLCrof32wfWMqC5g2SEJNxaVH3NjlatuNGsdxXRYO/t+RPnxA15RpYiS0f+zG7FuE2DeGgjA==", "dependencies": { - "@smithy/protocol-http": "^4.1.3", - "@smithy/types": "^3.4.2", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -4704,16 +4707,16 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.1.3.tgz", - "integrity": "sha512-KeM/OrK8MVFUsoJsmCN0MZMVPjKKLudn13xpgwIMpGTYpA8QZB2Xq5tJ+RE6iu3A6NhOI4VajDTwBsm8pwwrhg==", - "dependencies": { - "@smithy/middleware-serde": "^3.0.6", - "@smithy/node-config-provider": "^3.1.7", - "@smithy/shared-ini-file-loader": "^3.1.7", - "@smithy/types": "^3.4.2", - "@smithy/url-parser": "^3.0.6", - "@smithy/util-middleware": "^3.0.6", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.1.4.tgz", + "integrity": "sha512-/ChcVHekAyzUbyPRI8CzPPLj6y8QRAfJngWcLMgsWxKVzw/RzBV69mSOzJYDD3pRwushA1+5tHtPF8fjmzBnrQ==", + "dependencies": { + "@smithy/middleware-serde": "^3.0.7", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", + "@smithy/url-parser": "^3.0.7", + "@smithy/util-middleware": "^3.0.7", "tslib": "^2.6.2" }, "engines": { @@ -4721,17 +4724,17 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "3.0.21", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.21.tgz", - "integrity": "sha512-/h0fElV95LekVVEJuSw+aI11S1Y3zIUwBc6h9ZbUv43Gl2weXsbQwjLoet6j/Qtb0phfrSxS6pNg6FqgJOWZkA==", - "dependencies": { - "@smithy/node-config-provider": "^3.1.7", - "@smithy/protocol-http": "^4.1.3", - "@smithy/service-error-classification": "^3.0.6", - "@smithy/smithy-client": "^3.3.5", - "@smithy/types": "^3.4.2", - "@smithy/util-middleware": "^3.0.6", - "@smithy/util-retry": "^3.0.6", + "version": "3.0.22", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.22.tgz", + "integrity": "sha512-svEN7O2Tf7BoaBkPzX/8AE2Bv7p16d9/ulFAD1Gmn5g19iMqNk1WIkMxAY7SpB9/tVtUwKx0NaIsBRl88gumZA==", + "dependencies": { + "@smithy/node-config-provider": "^3.1.8", + "@smithy/protocol-http": "^4.1.4", + "@smithy/service-error-classification": "^3.0.7", + "@smithy/smithy-client": "^3.3.6", + "@smithy/types": "^3.5.0", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-retry": "^3.0.7", "tslib": "^2.6.2", "uuid": "^9.0.1" }, @@ -4740,11 +4743,11 @@ } }, "node_modules/@smithy/middleware-serde": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.6.tgz", - "integrity": "sha512-KKTUSl1MzOM0MAjGbudeaVNtIDo+PpekTBkCNwvfZlKndodrnvRo+00USatiyLOc0ujjO9UydMRu3O9dYML7ag==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.7.tgz", + "integrity": "sha512-VytaagsQqtH2OugzVTq4qvjkLNbWehHfGcGr0JLJmlDRrNCeZoWkWsSOw1nhS/4hyUUWF/TLGGml4X/OnEep5g==", "dependencies": { - "@smithy/types": "^3.4.2", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -4752,11 +4755,11 @@ } }, "node_modules/@smithy/middleware-stack": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.6.tgz", - "integrity": "sha512-2c0eSYhTQ8xQqHMcRxLMpadFbTXg6Zla5l0mwNftFCZMQmuhI7EbAJMx6R5eqfuV3YbJ3QGyS3d5uSmrHV8Khg==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.7.tgz", + "integrity": "sha512-EyTbMCdqS1DoeQsO4gI7z2Gzq1MoRFAeS8GkFYIwbedB7Lp5zlLHJdg+56tllIIG5Hnf9ZWX48YKSHlsKvugGA==", "dependencies": { - "@smithy/types": "^3.4.2", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -4764,13 +4767,13 @@ } }, "node_modules/@smithy/node-config-provider": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.7.tgz", - "integrity": "sha512-g3mfnC3Oo8pOI0dYuPXLtdW1WGVb3bR2tkV21GNkm0ZvQjLTtamXAwCWt/FCb0HGvKt3gHHmF1XerG0ICfalOg==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.8.tgz", + "integrity": "sha512-E0rU0DglpeJn5ge64mk8wTGEXcQwmpUTY5Zr7IzTpDLmHKiIamINERNZYrPQjg58Ck236sEKSwRSHA4CwshU6Q==", "dependencies": { - "@smithy/property-provider": "^3.1.6", - "@smithy/shared-ini-file-loader": "^3.1.7", - "@smithy/types": "^3.4.2", + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -4778,14 +4781,14 @@ } }, "node_modules/@smithy/node-http-handler": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.2.3.tgz", - "integrity": "sha512-/gcm5DJ3k1b1zEInzBGAZC8ntJ+jwrz1NcSIu+9dSXd1FfG0G6QgkDI40tt8/WYUbHtLyo8fEqtm2v29koWo/w==", - "dependencies": { - "@smithy/abort-controller": "^3.1.4", - "@smithy/protocol-http": "^4.1.3", - "@smithy/querystring-builder": "^3.0.6", - "@smithy/types": "^3.4.2", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.2.4.tgz", + "integrity": "sha512-49reY3+JgLMFNm7uTAKBWiKCA6XSvkNp9FqhVmusm2jpVnHORYFeFZ704LShtqWfjZW/nhX+7Iexyb6zQfXYIQ==", + "dependencies": { + "@smithy/abort-controller": "^3.1.5", + "@smithy/protocol-http": "^4.1.4", + "@smithy/querystring-builder": "^3.0.7", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -4793,11 +4796,11 @@ } }, "node_modules/@smithy/property-provider": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.6.tgz", - "integrity": "sha512-NK3y/T7Q/Bw+Z8vsVs9MYIQ5v7gOX7clyrXcwhhIBQhbPgRl6JDrZbusO9qWDhcEus75Tg+VCxtIRfo3H76fpw==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.7.tgz", + "integrity": "sha512-QfzLi1GPMisY7bAM5hOUqBdGYnY5S2JAlr201pghksrQv139f8iiiMalXtjczIP5f6owxFn3MINLNUNvUkgtPw==", "dependencies": { - "@smithy/types": "^3.4.2", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -4805,11 +4808,11 @@ } }, "node_modules/@smithy/protocol-http": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.3.tgz", - "integrity": "sha512-GcbMmOYpH9iRqtC05RbRnc/0FssxSTHlmaNhYBTgSgNCYpdR3Kt88u5GAZTBmouzv+Zlj/VRv92J9ruuDeJuEw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.4.tgz", + "integrity": "sha512-MlWK8eqj0JlpZBnWmjQLqmFp71Ug00P+m72/1xQB3YByXD4zZ+y9N4hYrR0EDmrUCZIkyATWHOXFgtavwGDTzQ==", "dependencies": { - "@smithy/types": "^3.4.2", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -4817,11 +4820,11 @@ } }, "node_modules/@smithy/querystring-builder": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.6.tgz", - "integrity": "sha512-sQe08RunoObe+Usujn9+R2zrLuQERi3CWvRO3BvnoWSYUaIrLKuAIeY7cMeDax6xGyfIP3x/yFWbEKSXvOnvVg==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.7.tgz", + "integrity": "sha512-65RXGZZ20rzqqxTsChdqSpbhA6tdt5IFNgG6o7e1lnPVLCe6TNWQq4rTl4N87hTDD8mV4IxJJnvyE7brbnRkQw==", "dependencies": { - "@smithy/types": "^3.4.2", + "@smithy/types": "^3.5.0", "@smithy/util-uri-escape": "^3.0.0", "tslib": "^2.6.2" }, @@ -4830,11 +4833,11 @@ } }, "node_modules/@smithy/querystring-parser": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.6.tgz", - "integrity": "sha512-UJKw4LlEkytzz2Wq+uIdHf6qOtFfee/o7ruH0jF5I6UAuU+19r9QV7nU3P/uI0l6+oElRHmG/5cBBcGJrD7Ozg==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.7.tgz", + "integrity": "sha512-Fouw4KJVWqqUVIu1gZW8BH2HakwLz6dvdrAhXeXfeymOBrZw+hcqaWs+cS1AZPVp4nlbeIujYrKA921ZW2WMPA==", "dependencies": { - "@smithy/types": "^3.4.2", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -4842,22 +4845,22 @@ } }, "node_modules/@smithy/service-error-classification": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.6.tgz", - "integrity": "sha512-53SpchU3+DUZrN7J6sBx9tBiCVGzsib2e4sc512Q7K9fpC5zkJKs6Z9s+qbMxSYrkEkle6hnMtrts7XNkMJJMg==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.7.tgz", + "integrity": "sha512-91PRkTfiBf9hxkIchhRKJfl1rsplRDyBnmyFca3y0Z3x/q0JJN480S83LBd8R6sBCkm2bBbqw2FHp0Mbh+ecSA==", "dependencies": { - "@smithy/types": "^3.4.2" + "@smithy/types": "^3.5.0" }, "engines": { "node": ">=16.0.0" } }, "node_modules/@smithy/shared-ini-file-loader": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.7.tgz", - "integrity": "sha512-IA4K2qTJYXkF5OfVN4vsY1hfnUZjaslEE8Fsr/gGFza4TAC2A9NfnZuSY2srQIbt9bwtjHiAayrRVgKse4Q7fA==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.8.tgz", + "integrity": "sha512-0NHdQiSkeGl0ICQKcJQ2lCOKH23Nb0EaAa7RDRId6ZqwXkw4LJyIyZ0t3iusD4bnKYDPLGy2/5e2rfUhrt0Acw==", "dependencies": { - "@smithy/types": "^3.4.2", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -4865,15 +4868,15 @@ } }, "node_modules/@smithy/signature-v4": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.1.4.tgz", - "integrity": "sha512-72MiK7xYukNsnLJI9NqvUHqTu0ziEsfMsYNlWpiJfuGQnCTFKpckThlEatirvcA/LmT1h7rRO+pJD06PYsPu9Q==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.2.0.tgz", + "integrity": "sha512-LafbclHNKnsorMgUkKm7Tk7oJ7xizsZ1VwqhGKqoCIrXh4fqDDp73fK99HOEEgcsQbtemmeY/BPv0vTVYYUNEQ==", "dependencies": { "@smithy/is-array-buffer": "^3.0.0", - "@smithy/protocol-http": "^4.1.3", - "@smithy/types": "^3.4.2", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", "@smithy/util-hex-encoding": "^3.0.0", - "@smithy/util-middleware": "^3.0.6", + "@smithy/util-middleware": "^3.0.7", "@smithy/util-uri-escape": "^3.0.0", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" @@ -4883,15 +4886,15 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.3.5.tgz", - "integrity": "sha512-7IZi8J3Dr9n3tX+lcpmJ/5tCYIqoXdblFBaPuv0SEKZFRpCxE+TqIWL6I3t7jLlk9TWu3JSvEZAhtjB9yvB+zA==", - "dependencies": { - "@smithy/middleware-endpoint": "^3.1.3", - "@smithy/middleware-stack": "^3.0.6", - "@smithy/protocol-http": "^4.1.3", - "@smithy/types": "^3.4.2", - "@smithy/util-stream": "^3.1.8", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.3.6.tgz", + "integrity": "sha512-qdH+mvDHgq1ss6mocyIl2/VjlWXew7pGwZQydwYJczEc22HZyX3k8yVPV9aZsbYbssHPvMDRA5rfBDrjQUbIIw==", + "dependencies": { + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/middleware-stack": "^3.0.7", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", + "@smithy/util-stream": "^3.1.9", "tslib": "^2.6.2" }, "engines": { @@ -4899,9 +4902,9 @@ } }, "node_modules/@smithy/types": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.2.tgz", - "integrity": "sha512-tHiFcfcVedVBHpmHUEUHOCCih8iZbIAYn9NvPsNzaPm/237I3imdDdZoOC8c87H5HBAVEa06tTgb+OcSWV9g5w==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.5.0.tgz", + "integrity": "sha512-QN0twHNfe8mNJdH9unwsCK13GURU7oEAZqkBI+rsvpv1jrmserO+WnLE7jidR9W/1dxwZ0u/CB01mV2Gms/K2Q==", "dependencies": { "tslib": "^2.6.2" }, @@ -4910,12 +4913,12 @@ } }, "node_modules/@smithy/url-parser": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.6.tgz", - "integrity": "sha512-47Op/NU8Opt49KyGpHtVdnmmJMsp2hEwBdyjuFB9M2V5QVOwA7pBhhxKN5z6ztKGrMw76gd8MlbPuzzvaAncuQ==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.7.tgz", + "integrity": "sha512-70UbSSR8J97c1rHZOWhl+VKiZDqHWxs/iW8ZHrHp5fCCPLSBE7GcUlUvKSle3Ca+J9LLbYCj/A79BxztBvAfpA==", "dependencies": { - "@smithy/querystring-parser": "^3.0.6", - "@smithy/types": "^3.4.2", + "@smithy/querystring-parser": "^3.0.7", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" } }, @@ -4975,13 +4978,13 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "3.0.21", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.21.tgz", - "integrity": "sha512-M/FhTBk4c/SsB91dD/M4gMGfJO7z/qJaM9+XQQIqBOf4qzZYMExnP7R4VdGwxxH8IKMGW+8F0I4rNtVRrcfPoA==", + "version": "3.0.22", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.22.tgz", + "integrity": "sha512-WKzUxNsOun5ETwEOrvooXeI1mZ8tjDTOcN4oruELWHhEYDgQYWwxZupURVyovcv+h5DyQT/DzK5nm4ZoR/Tw5Q==", "dependencies": { - "@smithy/property-provider": "^3.1.6", - "@smithy/smithy-client": "^3.3.5", - "@smithy/types": "^3.4.2", + "@smithy/property-provider": "^3.1.7", + "@smithy/smithy-client": "^3.3.6", + "@smithy/types": "^3.5.0", "bowser": "^2.11.0", "tslib": "^2.6.2" }, @@ -4990,16 +4993,16 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "3.0.21", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.21.tgz", - "integrity": "sha512-NiLinPvF86U3S2Pdx/ycqd4bnY5dmFSPNL5KYRwbNjqQFS09M5Wzqk8BNk61/47xCYz1X/6KeiSk9qgYPTtuDw==", - "dependencies": { - "@smithy/config-resolver": "^3.0.8", - "@smithy/credential-provider-imds": "^3.2.3", - "@smithy/node-config-provider": "^3.1.7", - "@smithy/property-provider": "^3.1.6", - "@smithy/smithy-client": "^3.3.5", - "@smithy/types": "^3.4.2", + "version": "3.0.22", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.22.tgz", + "integrity": "sha512-hUsciOmAq8fsGwqg4+pJfNRmrhfqMH4Y9UeGcgeUl88kPAoYANFATJqCND+O4nUvwp5TzsYwGpqpcBKyA8LUUg==", + "dependencies": { + "@smithy/config-resolver": "^3.0.9", + "@smithy/credential-provider-imds": "^3.2.4", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/property-provider": "^3.1.7", + "@smithy/smithy-client": "^3.3.6", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -5007,12 +5010,12 @@ } }, "node_modules/@smithy/util-endpoints": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.1.2.tgz", - "integrity": "sha512-FEISzffb4H8DLzGq1g4MuDpcv6CIG15fXoQzDH9SjpRJv6h7J++1STFWWinilG0tQh9H1v2UKWG19Jjr2B16zQ==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.1.3.tgz", + "integrity": "sha512-34eACeKov6jZdHqS5hxBMJ4KyWKztTMulhuQ2UdOoP6vVxMLrOKUqIXAwJe/wiWMhXhydLW664B02CNpQBQ4Aw==", "dependencies": { - "@smithy/node-config-provider": "^3.1.7", - "@smithy/types": "^3.4.2", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -5031,11 +5034,11 @@ } }, "node_modules/@smithy/util-middleware": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.6.tgz", - "integrity": "sha512-BxbX4aBhI1O9p87/xM+zWy0GzT3CEVcXFPBRDoHAM+pV0eSW156pR+PSYEz0DQHDMYDsYAflC2bQNz2uaDBUZQ==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.7.tgz", + "integrity": "sha512-OVA6fv/3o7TMJTpTgOi1H5OTwnuUa8hzRzhSFDtZyNxi6OZ70L/FHattSmhE212I7b6WSOJAAmbYnvcjTHOJCA==", "dependencies": { - "@smithy/types": "^3.4.2", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -5043,12 +5046,12 @@ } }, "node_modules/@smithy/util-retry": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.6.tgz", - "integrity": "sha512-BRZiuF7IwDntAbevqMco67an0Sr9oLQJqqRCsSPZZHYRnehS0LHDAkJk/pSmI7Z8c/1Vet294H7fY2fWUgB+Rg==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.7.tgz", + "integrity": "sha512-nh1ZO1vTeo2YX1plFPSe/OXaHkLAHza5jpokNiiKX2M5YpNUv6RxGJZhpfmiR4jSvVHCjIDmILjrxKmP+/Ghug==", "dependencies": { - "@smithy/service-error-classification": "^3.0.6", - "@smithy/types": "^3.4.2", + "@smithy/service-error-classification": "^3.0.7", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -5056,13 +5059,13 @@ } }, "node_modules/@smithy/util-stream": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.1.8.tgz", - "integrity": "sha512-hoKOqSmb8FD3WLObuB5hwbM7bNIWgcnvkThokTvVq7J5PKjlLUK5qQQcB9zWLHIoSaIlf3VIv2OxZY2wtQjcRQ==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.1.9.tgz", + "integrity": "sha512-7YAR0Ub3MwTMjDfjnup4qa6W8gygZMxikBhFMPESi6ASsl/rZJhwLpF/0k9TuezScCojsM0FryGdz4LZtjKPPQ==", "dependencies": { - "@smithy/fetch-http-handler": "^3.2.8", - "@smithy/node-http-handler": "^3.2.3", - "@smithy/types": "^3.4.2", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/types": "^3.5.0", "@smithy/util-base64": "^3.0.0", "@smithy/util-buffer-from": "^3.0.0", "@smithy/util-hex-encoding": "^3.0.0", @@ -5097,12 +5100,12 @@ } }, "node_modules/@smithy/util-waiter": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-3.1.5.tgz", - "integrity": "sha512-jYOSvM3H6sZe3CHjzD2VQNCjWBJs+4DbtwBMvUp9y5EnnwNa7NQxTeYeQw0CKCAdGGZ3QvVkyJmvbvs5M/B10A==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-3.1.6.tgz", + "integrity": "sha512-xs/KAwWOeCklq8aMlnpk25LgxEYHKOEodfjfKclDMLcBJEVEKzDLxZxBQyztcuPJ7F54213NJS8PxoiHNMdItQ==", "dependencies": { - "@smithy/abort-controller": "^3.1.4", - "@smithy/types": "^3.4.2", + "@smithy/abort-controller": "^3.1.5", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -17744,8 +17747,8 @@ }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.658.1", - "@aws-sdk/lib-dynamodb": "^3.658.1", + "@aws-sdk/client-dynamodb": "^3.664.0", + "@aws-sdk/lib-dynamodb": "^3.664.0", "aws-sdk-client-mock": "^4.0.2" }, "peerDependencies": { @@ -17803,7 +17806,7 @@ }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-cloudwatch": "^3.658.1", + "@aws-sdk/client-cloudwatch": "^3.664.0", "@types/promise-retry": "^1.1.3", "promise-retry": "^2.0.1" }, @@ -17825,11 +17828,11 @@ }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-appconfigdata": "^3.658.1", - "@aws-sdk/client-dynamodb": "^3.658.1", - "@aws-sdk/client-secrets-manager": "^3.658.1", - "@aws-sdk/client-ssm": "^3.658.1", - "@aws-sdk/util-dynamodb": "^3.658.1", + "@aws-sdk/client-appconfigdata": "^3.664.0", + "@aws-sdk/client-dynamodb": "^3.664.0", + "@aws-sdk/client-secrets-manager": "^3.664.0", + "@aws-sdk/client-ssm": "^3.664.0", + "@aws-sdk/util-dynamodb": "^3.664.0", "@smithy/util-base64": "^3.0.0", "aws-sdk-client-mock": "^4.0.2", "aws-sdk-client-mock-jest": "^4.0.2" @@ -17890,7 +17893,7 @@ "license": "MIT-0", "dependencies": { "@aws-cdk/cli-lib-alpha": "^2.160.0-alpha.0", - "@aws-sdk/client-lambda": "^3.659.0", + "@aws-sdk/client-lambda": "^3.664.0", "@smithy/util-utf8": "^3.0.0", "aws-cdk-lib": "^2.160.0", "esbuild": "^0.24.0", @@ -17919,8 +17922,8 @@ }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.658.1", - "@aws-sdk/client-xray": "^3.658.1" + "@aws-sdk/client-dynamodb": "^3.664.0", + "@aws-sdk/client-xray": "^3.664.0" }, "peerDependencies": { "@middy/core": "4.x || 5.x" diff --git a/packages/idempotency/package.json b/packages/idempotency/package.json index b497763579..4d446b6a7b 100644 --- a/packages/idempotency/package.json +++ b/packages/idempotency/package.json @@ -126,8 +126,8 @@ ], "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.658.1", - "@aws-sdk/lib-dynamodb": "^3.658.1", + "@aws-sdk/client-dynamodb": "^3.664.0", + "@aws-sdk/lib-dynamodb": "^3.664.0", "aws-sdk-client-mock": "^4.0.2" } } diff --git a/packages/metrics/package.json b/packages/metrics/package.json index 9a02c976af..5c655cb194 100644 --- a/packages/metrics/package.json +++ b/packages/metrics/package.json @@ -62,7 +62,7 @@ "main": "./lib/cjs/index.js", "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-cloudwatch": "^3.658.1", + "@aws-sdk/client-cloudwatch": "^3.664.0", "@types/promise-retry": "^1.1.3", "promise-retry": "^2.0.1" }, diff --git a/packages/parameters/package.json b/packages/parameters/package.json index df80045f41..022f2acefb 100644 --- a/packages/parameters/package.json +++ b/packages/parameters/package.json @@ -154,11 +154,11 @@ ], "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-appconfigdata": "^3.658.1", - "@aws-sdk/client-dynamodb": "^3.658.1", - "@aws-sdk/client-secrets-manager": "^3.658.1", - "@aws-sdk/client-ssm": "^3.658.1", - "@aws-sdk/util-dynamodb": "^3.658.1", + "@aws-sdk/client-appconfigdata": "^3.664.0", + "@aws-sdk/client-dynamodb": "^3.664.0", + "@aws-sdk/client-secrets-manager": "^3.664.0", + "@aws-sdk/client-ssm": "^3.664.0", + "@aws-sdk/util-dynamodb": "^3.664.0", "@smithy/util-base64": "^3.0.0", "aws-sdk-client-mock": "^4.0.2", "aws-sdk-client-mock-jest": "^4.0.2" diff --git a/packages/testing/package.json b/packages/testing/package.json index 246ff3840a..4aafe28f23 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -99,7 +99,7 @@ "homepage": "https://github.com/aws-powertools/powertools-lambda-typescript/tree/main/packages/testing#readme", "dependencies": { "@aws-cdk/cli-lib-alpha": "^2.160.0-alpha.0", - "@aws-sdk/client-lambda": "^3.659.0", + "@aws-sdk/client-lambda": "^3.664.0", "@smithy/util-utf8": "^3.0.0", "aws-cdk-lib": "^2.160.0", "esbuild": "^0.24.0", diff --git a/packages/tracer/package.json b/packages/tracer/package.json index 20e276af56..29ce13d1ab 100644 --- a/packages/tracer/package.json +++ b/packages/tracer/package.json @@ -28,8 +28,8 @@ "license": "MIT-0", "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.658.1", - "@aws-sdk/client-xray": "^3.658.1" + "@aws-sdk/client-dynamodb": "^3.664.0", + "@aws-sdk/client-xray": "^3.664.0" }, "peerDependencies": { "@middy/core": "4.x || 5.x" From 613d32ce4f3e1f7136e81f55fda04c5205d987d1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Oct 2024 11:23:49 +0200 Subject: [PATCH 50/52] chore(deps): bump zgosalvez/github-actions-ensure-sha-pinned-actions from 3.0.12 to 3.0.14 (#3162) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Andrea Amorosi --- .github/workflows/secure-workflows.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/secure-workflows.yml b/.github/workflows/secure-workflows.yml index 694cf8b1cb..ad559190b4 100644 --- a/.github/workflows/secure-workflows.yml +++ b/.github/workflows/secure-workflows.yml @@ -32,6 +32,6 @@ jobs: - name: Checkout code uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 - name: Ensure 3rd party workflows have SHA pinned - uses: zgosalvez/github-actions-ensure-sha-pinned-actions@0901cf7b71c7ea6261ec69a3dc2bd3f9264f893e # v3.0.12 + uses: zgosalvez/github-actions-ensure-sha-pinned-actions@40ba2d51b6b6d8695f2b6bd74e785172d4f8d00f # v3.0.14 with: allowlist: slsa-framework/slsa-github-generator \ No newline at end of file From 74c6eddc2a7b456781031e0ec2ed834087f50a55 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Oct 2024 13:39:13 +0200 Subject: [PATCH 51/52] chore(deps): bump the aws-cdk group across 1 directory with 2 updates (#3163) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Andrea Amorosi --- examples/app/package.json | 4 ++-- layers/package.json | 4 ++-- package-lock.json | 16 ++++++++-------- packages/testing/package.json | 2 +- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/examples/app/package.json b/examples/app/package.json index 514ad72018..fffa6648e5 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -30,8 +30,8 @@ "devDependencies": { "@types/aws-lambda": "^8.10.145", "@types/node": "22.7.4", - "aws-cdk": "^2.160.0", - "aws-cdk-lib": "^2.160.0", + "aws-cdk": "^2.161.1", + "aws-cdk-lib": "^2.161.1", "constructs": "^10.3.0", "source-map-support": "^0.5.21", "tsx": "^4.19.1", diff --git a/layers/package.json b/layers/package.json index 6c03270ceb..4f071a7c71 100644 --- a/layers/package.json +++ b/layers/package.json @@ -36,8 +36,8 @@ "source-map-support": "^0.5.21" }, "dependencies": { - "aws-cdk": "^2.160.0", - "aws-cdk-lib": "^2.160.0", + "aws-cdk": "^2.161.1", + "aws-cdk-lib": "^2.161.1", "esbuild": "^0.24.0" } } diff --git a/package-lock.json b/package-lock.json index 68386685ae..c898c46286 100644 --- a/package-lock.json +++ b/package-lock.json @@ -73,8 +73,8 @@ "devDependencies": { "@types/aws-lambda": "^8.10.145", "@types/node": "22.7.4", - "aws-cdk": "^2.160.0", - "aws-cdk-lib": "^2.160.0", + "aws-cdk": "^2.161.1", + "aws-cdk-lib": "^2.161.1", "constructs": "^10.3.0", "source-map-support": "^0.5.21", "tsx": "^4.19.1", @@ -127,8 +127,8 @@ "version": "2.8.0", "license": "MIT-0", "dependencies": { - "aws-cdk": "^2.160.0", - "aws-cdk-lib": "^2.160.0", + "aws-cdk": "^2.161.1", + "aws-cdk-lib": "^2.161.1", "esbuild": "^0.24.0" }, "bin": { @@ -5915,9 +5915,9 @@ } }, "node_modules/aws-cdk-lib": { - "version": "2.160.0", - "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.160.0.tgz", - "integrity": "sha512-HJvn1lKmyZk1i56j4sgOddRfoDto9L/INgXSWmLzDdnMdMQWRvB/dbPQPrF1voVN26UKmrNdH9Irr0soMD5B1A==", + "version": "2.161.1", + "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.161.1.tgz", + "integrity": "sha512-siVuWLRXD9AcQ2vkTPYbp/oH5KeXmx23voOkk/BcFmM9Sw+0kb1wgFWYCF2LMeFWDa+k5TuWMB0QtChN8/uz9A==", "bundleDependencies": [ "@balena/dockerignore", "case", @@ -17895,7 +17895,7 @@ "@aws-cdk/cli-lib-alpha": "^2.160.0-alpha.0", "@aws-sdk/client-lambda": "^3.664.0", "@smithy/util-utf8": "^3.0.0", - "aws-cdk-lib": "^2.160.0", + "aws-cdk-lib": "^2.161.1", "esbuild": "^0.24.0", "promise-retry": "^2.0.1" }, diff --git a/packages/testing/package.json b/packages/testing/package.json index 4aafe28f23..a505d6c415 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -101,7 +101,7 @@ "@aws-cdk/cli-lib-alpha": "^2.160.0-alpha.0", "@aws-sdk/client-lambda": "^3.664.0", "@smithy/util-utf8": "^3.0.0", - "aws-cdk-lib": "^2.160.0", + "aws-cdk-lib": "^2.161.1", "esbuild": "^0.24.0", "promise-retry": "^2.0.1" }, From 71e70f5b42527a78c3ceef7e0533ff7c298605f3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 8 Oct 2024 08:57:13 +0200 Subject: [PATCH 52/52] chore(ci): bump version to 2.9.0 (#3164) Co-authored-by: aws-powertools-bot <151832416+aws-powertools-bot@users.noreply.github.com> --- CHANGELOG.md | 13 ++++++ examples/app/CHANGELOG.md | 8 ++++ examples/app/package.json | 14 +++--- examples/snippets/CHANGELOG.md | 13 ++++++ examples/snippets/package.json | 18 ++++---- layers/CHANGELOG.md | 8 ++++ layers/package.json | 2 +- lerna.json | 2 +- package-lock.json | 72 ++++++++++++++--------------- packages/batch/CHANGELOG.md | 11 +++++ packages/batch/package.json | 2 +- packages/commons/CHANGELOG.md | 8 ++++ packages/commons/package.json | 2 +- packages/commons/src/version.ts | 2 +- packages/event-handler/CHANGELOG.md | 8 ++++ packages/event-handler/package.json | 4 +- packages/idempotency/CHANGELOG.md | 12 +++++ packages/idempotency/package.json | 6 +-- packages/jmespath/CHANGELOG.md | 11 +++++ packages/jmespath/package.json | 4 +- packages/logger/CHANGELOG.md | 8 ++++ packages/logger/package.json | 4 +- packages/metrics/CHANGELOG.md | 8 ++++ packages/metrics/package.json | 4 +- packages/parameters/CHANGELOG.md | 8 ++++ packages/parameters/package.json | 4 +- packages/parser/CHANGELOG.md | 8 ++++ packages/parser/package.json | 2 +- packages/testing/CHANGELOG.md | 8 ++++ packages/testing/package.json | 2 +- packages/tracer/CHANGELOG.md | 8 ++++ packages/tracer/package.json | 4 +- 32 files changed, 214 insertions(+), 74 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 93584ceaf1..3e9db3cec2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,19 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.9.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.8.0...v2.9.0) (2024-10-07) + + +### Features + +* **batch:** sequential async processing of records for `BatchProcessor` ([#3109](https://github.com/aws-powertools/powertools-lambda-typescript/issues/3109)) ([e31279a](https://github.com/aws-powertools/powertools-lambda-typescript/commit/e31279af90446050a7974fbe25c34758f64915f9)) +* **idempotency:** ability to specify JMESPath custom functions ([#3150](https://github.com/aws-powertools/powertools-lambda-typescript/issues/3150)) ([869b6fc](https://github.com/aws-powertools/powertools-lambda-typescript/commit/869b6fced659ad820ffe79a0b905022061570974)) +* **idempotency:** manipulate idempotent response via response hook ([#3071](https://github.com/aws-powertools/powertools-lambda-typescript/issues/3071)) ([f7c1769](https://github.com/aws-powertools/powertools-lambda-typescript/commit/f7c176901a36698f591d897c2abde54cf30c9ea9)) + + + + + # [2.8.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.7.0...v2.8.0) (2024-09-16) diff --git a/examples/app/CHANGELOG.md b/examples/app/CHANGELOG.md index a4e8e8fc8c..19e9d8a70c 100644 --- a/examples/app/CHANGELOG.md +++ b/examples/app/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.9.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.8.0...v2.9.0) (2024-10-07) + +**Note:** Version bump only for package powertools-sample-app + + + + + # [2.8.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.7.0...v2.8.0) (2024-09-16) **Note:** Version bump only for package powertools-sample-app diff --git a/examples/app/package.json b/examples/app/package.json index fffa6648e5..18d1320ef1 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -1,6 +1,6 @@ { "name": "powertools-sample-app", - "version": "2.8.0", + "version": "2.9.0", "author": { "name": "Amazon Web Services", "url": "https://aws.amazon.com" @@ -39,12 +39,12 @@ "vitest": "^2.0.5" }, "dependencies": { - "@aws-lambda-powertools/batch": "^2.8.0", - "@aws-lambda-powertools/idempotency": "^2.8.0", - "@aws-lambda-powertools/logger": "^2.8.0", - "@aws-lambda-powertools/metrics": "^2.8.0", - "@aws-lambda-powertools/parameters": "^2.8.0", - "@aws-lambda-powertools/tracer": "^2.8.0", + "@aws-lambda-powertools/batch": "^2.9.0", + "@aws-lambda-powertools/idempotency": "^2.9.0", + "@aws-lambda-powertools/logger": "^2.9.0", + "@aws-lambda-powertools/metrics": "^2.9.0", + "@aws-lambda-powertools/parameters": "^2.9.0", + "@aws-lambda-powertools/tracer": "^2.9.0", "@aws-sdk/client-ssm": "^3.664.0", "@aws-sdk/lib-dynamodb": "^3.664.0", "@middy/core": "^4.7.0", diff --git a/examples/snippets/CHANGELOG.md b/examples/snippets/CHANGELOG.md index 4c38dec8f6..c84ea97cba 100644 --- a/examples/snippets/CHANGELOG.md +++ b/examples/snippets/CHANGELOG.md @@ -3,6 +3,19 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.9.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.8.0...v2.9.0) (2024-10-07) + + +### Features + +* **batch:** sequential async processing of records for `BatchProcessor` ([#3109](https://github.com/aws-powertools/powertools-lambda-typescript/issues/3109)) ([e31279a](https://github.com/aws-powertools/powertools-lambda-typescript/commit/e31279af90446050a7974fbe25c34758f64915f9)) +* **idempotency:** ability to specify JMESPath custom functions ([#3150](https://github.com/aws-powertools/powertools-lambda-typescript/issues/3150)) ([869b6fc](https://github.com/aws-powertools/powertools-lambda-typescript/commit/869b6fced659ad820ffe79a0b905022061570974)) +* **idempotency:** manipulate idempotent response via response hook ([#3071](https://github.com/aws-powertools/powertools-lambda-typescript/issues/3071)) ([f7c1769](https://github.com/aws-powertools/powertools-lambda-typescript/commit/f7c176901a36698f591d897c2abde54cf30c9ea9)) + + + + + # [2.8.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.7.0...v2.8.0) (2024-09-16) diff --git a/examples/snippets/package.json b/examples/snippets/package.json index cca7a0dc37..cb046d0f59 100644 --- a/examples/snippets/package.json +++ b/examples/snippets/package.json @@ -1,6 +1,6 @@ { "name": "code-snippets", - "version": "2.8.0", + "version": "2.9.0", "description": "A collection code snippets for the Powertools for AWS Lambda (TypeScript) docs", "author": { "name": "Amazon Web Services", @@ -24,14 +24,14 @@ }, "homepage": "https://github.com/aws-powertools/powertools-lambda-typescript#readme", "devDependencies": { - "@aws-lambda-powertools/batch": "^2.8.0", - "@aws-lambda-powertools/idempotency": "^2.8.0", - "@aws-lambda-powertools/jmespath": "^2.8.0", - "@aws-lambda-powertools/logger": "^2.8.0", - "@aws-lambda-powertools/metrics": "^2.8.0", - "@aws-lambda-powertools/parameters": "^2.8.0", - "@aws-lambda-powertools/parser": "^2.8.0", - "@aws-lambda-powertools/tracer": "^2.8.0", + "@aws-lambda-powertools/batch": "^2.9.0", + "@aws-lambda-powertools/idempotency": "^2.9.0", + "@aws-lambda-powertools/jmespath": "^2.9.0", + "@aws-lambda-powertools/logger": "^2.9.0", + "@aws-lambda-powertools/metrics": "^2.9.0", + "@aws-lambda-powertools/parameters": "^2.9.0", + "@aws-lambda-powertools/parser": "^2.9.0", + "@aws-lambda-powertools/tracer": "^2.9.0", "@aws-sdk/client-appconfigdata": "^3.664.0", "@aws-sdk/client-dynamodb": "^3.664.0", "@aws-sdk/client-secrets-manager": "^3.664.0", diff --git a/layers/CHANGELOG.md b/layers/CHANGELOG.md index dcdd104ec8..b3149b88d9 100644 --- a/layers/CHANGELOG.md +++ b/layers/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.9.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.8.0...v2.9.0) (2024-10-07) + +**Note:** Version bump only for package layers + + + + + # [2.8.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.7.0...v2.8.0) (2024-09-16) **Note:** Version bump only for package layers diff --git a/layers/package.json b/layers/package.json index 4f071a7c71..6b4e5e345e 100644 --- a/layers/package.json +++ b/layers/package.json @@ -1,6 +1,6 @@ { "name": "layers", - "version": "2.8.0", + "version": "2.9.0", "bin": { "layer": "bin/layers.js" }, diff --git a/lerna.json b/lerna.json index 93bd299dab..f923b1f34d 100644 --- a/lerna.json +++ b/lerna.json @@ -15,7 +15,7 @@ "layers", "examples/snippets" ], - "version": "2.8.0", + "version": "2.9.0", "npmClient": "npm", "message": "chore(release): %s [skip ci]" } diff --git a/package-lock.json b/package-lock.json index c898c46286..b3675f2d72 100644 --- a/package-lock.json +++ b/package-lock.json @@ -52,15 +52,15 @@ }, "examples/app": { "name": "powertools-sample-app", - "version": "2.8.0", + "version": "2.9.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/batch": "^2.8.0", - "@aws-lambda-powertools/idempotency": "^2.8.0", - "@aws-lambda-powertools/logger": "^2.8.0", - "@aws-lambda-powertools/metrics": "^2.8.0", - "@aws-lambda-powertools/parameters": "^2.8.0", - "@aws-lambda-powertools/tracer": "^2.8.0", + "@aws-lambda-powertools/batch": "^2.9.0", + "@aws-lambda-powertools/idempotency": "^2.9.0", + "@aws-lambda-powertools/logger": "^2.9.0", + "@aws-lambda-powertools/metrics": "^2.9.0", + "@aws-lambda-powertools/parameters": "^2.9.0", + "@aws-lambda-powertools/tracer": "^2.9.0", "@aws-sdk/client-ssm": "^3.664.0", "@aws-sdk/lib-dynamodb": "^3.664.0", "@middy/core": "^4.7.0", @@ -99,17 +99,17 @@ }, "examples/snippets": { "name": "code-snippets", - "version": "2.8.0", + "version": "2.9.0", "license": "MIT-0", "devDependencies": { - "@aws-lambda-powertools/batch": "^2.8.0", - "@aws-lambda-powertools/idempotency": "^2.8.0", - "@aws-lambda-powertools/jmespath": "^2.8.0", - "@aws-lambda-powertools/logger": "^2.8.0", - "@aws-lambda-powertools/metrics": "^2.8.0", - "@aws-lambda-powertools/parameters": "^2.8.0", - "@aws-lambda-powertools/parser": "^2.8.0", - "@aws-lambda-powertools/tracer": "^2.8.0", + "@aws-lambda-powertools/batch": "^2.9.0", + "@aws-lambda-powertools/idempotency": "^2.9.0", + "@aws-lambda-powertools/jmespath": "^2.9.0", + "@aws-lambda-powertools/logger": "^2.9.0", + "@aws-lambda-powertools/metrics": "^2.9.0", + "@aws-lambda-powertools/parameters": "^2.9.0", + "@aws-lambda-powertools/parser": "^2.9.0", + "@aws-lambda-powertools/tracer": "^2.9.0", "@aws-sdk/client-appconfigdata": "^3.664.0", "@aws-sdk/client-dynamodb": "^3.664.0", "@aws-sdk/client-secrets-manager": "^3.664.0", @@ -124,7 +124,7 @@ } }, "layers": { - "version": "2.8.0", + "version": "2.9.0", "license": "MIT-0", "dependencies": { "aws-cdk": "^2.161.1", @@ -17715,7 +17715,7 @@ }, "packages/batch": { "name": "@aws-lambda-powertools/batch", - "version": "2.8.0", + "version": "2.9.0", "license": "MIT-0", "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing" @@ -17723,7 +17723,7 @@ }, "packages/commons": { "name": "@aws-lambda-powertools/commons", - "version": "2.8.0", + "version": "2.9.0", "license": "MIT-0", "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing" @@ -17731,19 +17731,19 @@ }, "packages/event-handler": { "name": "@aws-lambda-powertools/event-handler", - "version": "2.8.0", + "version": "2.9.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "^2.8.0" + "@aws-lambda-powertools/commons": "^2.9.0" } }, "packages/idempotency": { "name": "@aws-lambda-powertools/idempotency", - "version": "2.8.0", + "version": "2.9.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "^2.8.0", - "@aws-lambda-powertools/jmespath": "^2.8.0" + "@aws-lambda-powertools/commons": "^2.9.0", + "@aws-lambda-powertools/jmespath": "^2.9.0" }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", @@ -17770,18 +17770,18 @@ }, "packages/jmespath": { "name": "@aws-lambda-powertools/jmespath", - "version": "2.8.0", + "version": "2.9.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "^2.8.0" + "@aws-lambda-powertools/commons": "^2.9.0" } }, "packages/logger": { "name": "@aws-lambda-powertools/logger", - "version": "2.8.0", + "version": "2.9.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "^2.8.0", + "@aws-lambda-powertools/commons": "^2.9.0", "lodash.merge": "^4.6.2" }, "devDependencies": { @@ -17799,10 +17799,10 @@ }, "packages/metrics": { "name": "@aws-lambda-powertools/metrics", - "version": "2.8.0", + "version": "2.9.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "^2.8.0" + "@aws-lambda-powertools/commons": "^2.9.0" }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", @@ -17821,10 +17821,10 @@ }, "packages/parameters": { "name": "@aws-lambda-powertools/parameters", - "version": "2.8.0", + "version": "2.9.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "^2.8.0" + "@aws-lambda-powertools/commons": "^2.9.0" }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", @@ -17868,7 +17868,7 @@ }, "packages/parser": { "name": "@aws-lambda-powertools/parser", - "version": "2.8.0", + "version": "2.9.0", "license": "MIT-0", "devDependencies": { "@anatine/zod-mock": "^3.13.3", @@ -17889,7 +17889,7 @@ }, "packages/testing": { "name": "@aws-lambda-powertools/testing-utils", - "version": "2.8.0", + "version": "2.9.0", "license": "MIT-0", "dependencies": { "@aws-cdk/cli-lib-alpha": "^2.160.0-alpha.0", @@ -17914,10 +17914,10 @@ }, "packages/tracer": { "name": "@aws-lambda-powertools/tracer", - "version": "2.8.0", + "version": "2.9.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "^2.8.0", + "@aws-lambda-powertools/commons": "^2.9.0", "aws-xray-sdk-core": "^3.10.1" }, "devDependencies": { diff --git a/packages/batch/CHANGELOG.md b/packages/batch/CHANGELOG.md index 65307df5ec..f5542b95d8 100644 --- a/packages/batch/CHANGELOG.md +++ b/packages/batch/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.9.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.8.0...v2.9.0) (2024-10-07) + + +### Features + +* **batch:** sequential async processing of records for `BatchProcessor` ([#3109](https://github.com/aws-powertools/powertools-lambda-typescript/issues/3109)) ([e31279a](https://github.com/aws-powertools/powertools-lambda-typescript/commit/e31279af90446050a7974fbe25c34758f64915f9)) + + + + + # [2.8.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.7.0...v2.8.0) (2024-09-16) **Note:** Version bump only for package @aws-lambda-powertools/batch diff --git a/packages/batch/package.json b/packages/batch/package.json index d99b7c91b2..f48d71f9d4 100644 --- a/packages/batch/package.json +++ b/packages/batch/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/batch", - "version": "2.8.0", + "version": "2.9.0", "description": "The batch processing package for the Powertools for AWS Lambda (TypeScript) library.", "author": { "name": "Amazon Web Services", diff --git a/packages/commons/CHANGELOG.md b/packages/commons/CHANGELOG.md index 950db44f2c..d530b9df04 100644 --- a/packages/commons/CHANGELOG.md +++ b/packages/commons/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.9.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.8.0...v2.9.0) (2024-10-07) + +**Note:** Version bump only for package @aws-lambda-powertools/commons + + + + + # [2.8.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.7.0...v2.8.0) (2024-09-16) **Note:** Version bump only for package @aws-lambda-powertools/commons diff --git a/packages/commons/package.json b/packages/commons/package.json index cbe6cf6b8e..11403f320c 100644 --- a/packages/commons/package.json +++ b/packages/commons/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/commons", - "version": "2.8.0", + "version": "2.9.0", "description": "A shared utility package for Powertools for AWS Lambda (TypeScript) libraries", "author": { "name": "Amazon Web Services", diff --git a/packages/commons/src/version.ts b/packages/commons/src/version.ts index 8993ea88fe..b36fda59ed 100644 --- a/packages/commons/src/version.ts +++ b/packages/commons/src/version.ts @@ -1,2 +1,2 @@ // this file is auto generated, do not modify -export const PT_VERSION = '2.8.0'; +export const PT_VERSION = '2.9.0'; diff --git a/packages/event-handler/CHANGELOG.md b/packages/event-handler/CHANGELOG.md index deb89203fb..b282394cf9 100644 --- a/packages/event-handler/CHANGELOG.md +++ b/packages/event-handler/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.9.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.8.0...v2.9.0) (2024-10-07) + +**Note:** Version bump only for package @aws-lambda-powertools/event-handler + + + + + # [2.8.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.7.0...v2.8.0) (2024-09-16) **Note:** Version bump only for package @aws-lambda-powertools/event-handler diff --git a/packages/event-handler/package.json b/packages/event-handler/package.json index 3696fcac2a..48cc207d02 100644 --- a/packages/event-handler/package.json +++ b/packages/event-handler/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/event-handler", - "version": "2.8.0", + "version": "2.9.0", "description": "Lightweight routing to reduce boilerplate for API Gateway REST/HTTP API, ALB and Lambda Function URLs", "author": { "name": "Amazon Web Services", @@ -50,7 +50,7 @@ "url": "https://github.com/aws-powertools/powertools-lambda-typescript/issues" }, "dependencies": { - "@aws-lambda-powertools/commons": "^2.8.0" + "@aws-lambda-powertools/commons": "^2.9.0" }, "keywords": [ "aws", diff --git a/packages/idempotency/CHANGELOG.md b/packages/idempotency/CHANGELOG.md index 7cdbf33ba9..b11e7d1ebb 100644 --- a/packages/idempotency/CHANGELOG.md +++ b/packages/idempotency/CHANGELOG.md @@ -3,6 +3,18 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.9.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.8.0...v2.9.0) (2024-10-07) + + +### Features + +* **idempotency:** ability to specify JMESPath custom functions ([#3150](https://github.com/aws-powertools/powertools-lambda-typescript/issues/3150)) ([869b6fc](https://github.com/aws-powertools/powertools-lambda-typescript/commit/869b6fced659ad820ffe79a0b905022061570974)) +* **idempotency:** manipulate idempotent response via response hook ([#3071](https://github.com/aws-powertools/powertools-lambda-typescript/issues/3071)) ([f7c1769](https://github.com/aws-powertools/powertools-lambda-typescript/commit/f7c176901a36698f591d897c2abde54cf30c9ea9)) + + + + + # [2.8.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.7.0...v2.8.0) (2024-09-16) diff --git a/packages/idempotency/package.json b/packages/idempotency/package.json index 4d446b6a7b..86df4cc7f5 100644 --- a/packages/idempotency/package.json +++ b/packages/idempotency/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/idempotency", - "version": "2.8.0", + "version": "2.9.0", "description": "The idempotency package for the Powertools for AWS Lambda (TypeScript) library. It provides options to make your Lambda functions idempotent and safe to retry.", "author": { "name": "Amazon Web Services", @@ -97,8 +97,8 @@ "url": "https://github.com/aws-powertools/powertools-lambda-typescript/issues" }, "dependencies": { - "@aws-lambda-powertools/commons": "^2.8.0", - "@aws-lambda-powertools/jmespath": "^2.8.0" + "@aws-lambda-powertools/commons": "^2.9.0", + "@aws-lambda-powertools/jmespath": "^2.9.0" }, "peerDependencies": { "@aws-sdk/client-dynamodb": ">=3.x", diff --git a/packages/jmespath/CHANGELOG.md b/packages/jmespath/CHANGELOG.md index 8041e16c5f..7f38e6fc3a 100644 --- a/packages/jmespath/CHANGELOG.md +++ b/packages/jmespath/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.9.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.8.0...v2.9.0) (2024-10-07) + + +### Features + +* **idempotency:** ability to specify JMESPath custom functions ([#3150](https://github.com/aws-powertools/powertools-lambda-typescript/issues/3150)) ([869b6fc](https://github.com/aws-powertools/powertools-lambda-typescript/commit/869b6fced659ad820ffe79a0b905022061570974)) + + + + + # [2.8.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.7.0...v2.8.0) (2024-09-16) **Note:** Version bump only for package @aws-lambda-powertools/jmespath diff --git a/packages/jmespath/package.json b/packages/jmespath/package.json index 209c7f363c..b6184f1da8 100644 --- a/packages/jmespath/package.json +++ b/packages/jmespath/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/jmespath", - "version": "2.8.0", + "version": "2.9.0", "description": "A type safe and modern jmespath module to parse and extract data from JSON documents using JMESPath", "author": { "name": "Amazon Web Services", @@ -71,7 +71,7 @@ "lib" ], "dependencies": { - "@aws-lambda-powertools/commons": "^2.8.0" + "@aws-lambda-powertools/commons": "^2.9.0" }, "repository": { "type": "git", diff --git a/packages/logger/CHANGELOG.md b/packages/logger/CHANGELOG.md index 7fbbad7fc0..7fa2c56e22 100644 --- a/packages/logger/CHANGELOG.md +++ b/packages/logger/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.9.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.8.0...v2.9.0) (2024-10-07) + +**Note:** Version bump only for package @aws-lambda-powertools/logger + + + + + # [2.8.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.7.0...v2.8.0) (2024-09-16) diff --git a/packages/logger/package.json b/packages/logger/package.json index a5760007ce..53fcf90bd8 100644 --- a/packages/logger/package.json +++ b/packages/logger/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/logger", - "version": "2.8.0", + "version": "2.9.0", "description": "The logging package for the Powertools for AWS Lambda (TypeScript) library", "author": { "name": "Amazon Web Services", @@ -85,7 +85,7 @@ "url": "https://github.com/aws-powertools/powertools-lambda-typescript/issues" }, "dependencies": { - "@aws-lambda-powertools/commons": "^2.8.0", + "@aws-lambda-powertools/commons": "^2.9.0", "lodash.merge": "^4.6.2" }, "keywords": [ diff --git a/packages/metrics/CHANGELOG.md b/packages/metrics/CHANGELOG.md index fdf0cc40bf..5f727d4d1b 100644 --- a/packages/metrics/CHANGELOG.md +++ b/packages/metrics/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.9.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.8.0...v2.9.0) (2024-10-07) + +**Note:** Version bump only for package @aws-lambda-powertools/metrics + + + + + # [2.8.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.7.0...v2.8.0) (2024-09-16) **Note:** Version bump only for package @aws-lambda-powertools/metrics diff --git a/packages/metrics/package.json b/packages/metrics/package.json index 5c655cb194..b964f905db 100644 --- a/packages/metrics/package.json +++ b/packages/metrics/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/metrics", - "version": "2.8.0", + "version": "2.9.0", "description": "The metrics package for the Powertools for AWS Lambda (TypeScript) library", "author": { "name": "Amazon Web Services", @@ -85,7 +85,7 @@ "url": "https://github.com/aws-powertools/powertools-lambda-typescript/issues" }, "dependencies": { - "@aws-lambda-powertools/commons": "^2.8.0" + "@aws-lambda-powertools/commons": "^2.9.0" }, "keywords": [ "aws", diff --git a/packages/parameters/CHANGELOG.md b/packages/parameters/CHANGELOG.md index 5cd3eb184c..df95a190ce 100644 --- a/packages/parameters/CHANGELOG.md +++ b/packages/parameters/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.9.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.8.0...v2.9.0) (2024-10-07) + +**Note:** Version bump only for package @aws-lambda-powertools/parameters + + + + + # [2.8.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.7.0...v2.8.0) (2024-09-16) diff --git a/packages/parameters/package.json b/packages/parameters/package.json index 022f2acefb..49a73d6fb5 100644 --- a/packages/parameters/package.json +++ b/packages/parameters/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/parameters", - "version": "2.8.0", + "version": "2.9.0", "description": "The parameters package for the Powertools for AWS Lambda (TypeScript) library", "author": { "name": "Amazon Web Services", @@ -164,7 +164,7 @@ "aws-sdk-client-mock-jest": "^4.0.2" }, "dependencies": { - "@aws-lambda-powertools/commons": "^2.8.0" + "@aws-lambda-powertools/commons": "^2.9.0" }, "peerDependencies": { "@aws-sdk/client-appconfigdata": ">=3.x", diff --git a/packages/parser/CHANGELOG.md b/packages/parser/CHANGELOG.md index 1d39b8cb92..b8396e705c 100644 --- a/packages/parser/CHANGELOG.md +++ b/packages/parser/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.9.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.8.0...v2.9.0) (2024-10-07) + +**Note:** Version bump only for package @aws-lambda-powertools/parser + + + + + # [2.8.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.7.0...v2.8.0) (2024-09-16) **Note:** Version bump only for package @aws-lambda-powertools/parser diff --git a/packages/parser/package.json b/packages/parser/package.json index 34f3817c77..70dfd6df11 100644 --- a/packages/parser/package.json +++ b/packages/parser/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/parser", - "version": "2.8.0", + "version": "2.9.0", "description": "The parser package for the Powertools for AWS Lambda (TypeScript) library.", "author": { "name": "Amazon Web Services", diff --git a/packages/testing/CHANGELOG.md b/packages/testing/CHANGELOG.md index b602fd8f08..b0eb34472b 100644 --- a/packages/testing/CHANGELOG.md +++ b/packages/testing/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.9.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.8.0...v2.9.0) (2024-10-07) + +**Note:** Version bump only for package @aws-lambda-powertools/testing-utils + + + + + # [2.8.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.7.0...v2.8.0) (2024-09-16) **Note:** Version bump only for package @aws-lambda-powertools/testing-utils diff --git a/packages/testing/package.json b/packages/testing/package.json index a505d6c415..f2942db3e6 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/testing-utils", - "version": "2.8.0", + "version": "2.9.0", "description": "A package containing utilities to test your serverless workloads", "author": { "name": "Amazon Web Services", diff --git a/packages/tracer/CHANGELOG.md b/packages/tracer/CHANGELOG.md index e103694197..45944a63c3 100644 --- a/packages/tracer/CHANGELOG.md +++ b/packages/tracer/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.9.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.8.0...v2.9.0) (2024-10-07) + +**Note:** Version bump only for package @aws-lambda-powertools/tracer + + + + + # [2.8.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.7.0...v2.8.0) (2024-09-16) diff --git a/packages/tracer/package.json b/packages/tracer/package.json index 29ce13d1ab..8421e9a829 100644 --- a/packages/tracer/package.json +++ b/packages/tracer/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/tracer", - "version": "2.8.0", + "version": "2.9.0", "description": "The tracer package for the Powertools for AWS Lambda (TypeScript) library", "author": { "name": "Amazon Web Services", @@ -85,7 +85,7 @@ "url": "https://github.com/aws-powertools/powertools-lambda-typescript/issues" }, "dependencies": { - "@aws-lambda-powertools/commons": "^2.8.0", + "@aws-lambda-powertools/commons": "^2.9.0", "aws-xray-sdk-core": "^3.10.1" }, "keywords": [