From cc23ae7bd0c5304b0a181cbdea3d83ddef78d1ec Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 12 Aug 2025 13:30:47 +0100 Subject: [PATCH 01/15] chore(ci): update layer ARN on documentation (#4311) Co-authored-by: aws-powertools-bot <151832416+aws-powertools-bot@users.noreply.github.com> --- docs/getting-started/lambda-layers.md | 88 +++++++++++++-------------- examples/app/cdk/example-stack.ts | 2 +- examples/app/template.yaml | 2 +- 3 files changed, 46 insertions(+), 46 deletions(-) diff --git a/docs/getting-started/lambda-layers.md b/docs/getting-started/lambda-layers.md index e1924a2305..ee78abc255 100644 --- a/docs/getting-started/lambda-layers.md +++ b/docs/getting-started/lambda-layers.md @@ -19,41 +19,41 @@ We publish the Lambda Layer for Powertools for AWS Lambda in all commercial regi | Region | Layer ARN | | ---------------- | ---------------------------------------------------------------------------------------------------------- | -| `us-east-1` | [arn:aws:lambda:us-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:32](#){: .copyMe} | -| `us-east-2` | [arn:aws:lambda:us-east-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:32](#){: .copyMe} | -| `us-west-1` | [arn:aws:lambda:us-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:32](#){: .copyMe} | -| `us-west-2` | [arn:aws:lambda:us-west-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:32](#){: .copyMe} | -| `ap-south-1` | [arn:aws:lambda:ap-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:32](#){: .copyMe} | -| `ap-south-2` | [arn:aws:lambda:ap-south-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:32](#){: .copyMe} | -| `ap-east-1` | [arn:aws:lambda:ap-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:32](#){: .copyMe} | -| `ap-northeast-1` | [arn:aws:lambda:ap-northeast-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:32](#){: .copyMe} | -| `ap-northeast-2` | [arn:aws:lambda:ap-northeast-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:32](#){: .copyMe} | -| `ap-northeast-3` | [arn:aws:lambda:ap-northeast-3:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:32](#){: .copyMe} | -| `ap-southeast-1` | [arn:aws:lambda:ap-southeast-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:32](#){: .copyMe} | -| `ap-southeast-2` | [arn:aws:lambda:ap-southeast-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:32](#){: .copyMe} | -| `ap-southeast-3` | [arn:aws:lambda:ap-southeast-3:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:32](#){: .copyMe} | -| `ap-southeast-4` | [arn:aws:lambda:ap-southeast-4:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:32](#){: .copyMe} | -| `ap-southeast-5` | [arn:aws:lambda:ap-southeast-5:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:32](#){: .copyMe} | -| `ap-southeast-7` | [arn:aws:lambda:ap-southeast-7:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:32](#){: .copyMe} | -| `eu-central-1` | [arn:aws:lambda:eu-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:32](#){: .copyMe} | -| `eu-central-2` | [arn:aws:lambda:eu-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:32](#){: .copyMe} | -| `eu-west-1` | [arn:aws:lambda:eu-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:32](#){: .copyMe} | -| `eu-west-2` | [arn:aws:lambda:eu-west-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:32](#){: .copyMe} | -| `eu-west-3` | [arn:aws:lambda:eu-west-3:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:32](#){: .copyMe} | -| `eu-north-1` | [arn:aws:lambda:eu-north-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:32](#){: .copyMe} | -| `eu-south-1` | [arn:aws:lambda:eu-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:32](#){: .copyMe} | -| `eu-south-2` | [arn:aws:lambda:eu-south-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:32](#){: .copyMe} | -| `ca-central-1` | [arn:aws:lambda:ca-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:32](#){: .copyMe} | -| `ca-west-1` | [arn:aws:lambda:ca-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:32](#){: .copyMe} | -| `sa-east-1` | [arn:aws:lambda:sa-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:32](#){: .copyMe} | -| `af-south-1` | [arn:aws:lambda:af-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:32](#){: .copyMe} | -| `me-south-1` | [arn:aws:lambda:me-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:32](#){: .copyMe} | -| `me-central-1` | [arn:aws:lambda:me-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:32](#){: .copyMe} | -| `il-central-1` | [arn:aws:lambda:il-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:32](#){: .copyMe} | -| `mx-central-1` | [arn:aws:lambda:mx-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:32](#){: .copyMe} | -| `us-gov-west-1` | [arn:aws-us-gov:lambda:us-gov-west-1:165093116878:layer:AWSLambdaPowertoolsTypeScriptV2:32](#){: .copyMe} | -| `us-gov-east-1` | [arn:aws-us-gov:lambda:us-gov-east-1:165087284144:layer:AWSLambdaPowertoolsTypeScriptV2:32](#){: .copyMe} | -| `cn-north-1` | [arn:aws-aws-cn:lambda:cn-north-1:498634801083:layer:AWSLambdaPowertoolsTypeScriptV2:32](#){: .copyMe} | +| `us-east-1` | [arn:aws:lambda:us-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:33](#){: .copyMe} | +| `us-east-2` | [arn:aws:lambda:us-east-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:33](#){: .copyMe} | +| `us-west-1` | [arn:aws:lambda:us-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:33](#){: .copyMe} | +| `us-west-2` | [arn:aws:lambda:us-west-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:33](#){: .copyMe} | +| `ap-south-1` | [arn:aws:lambda:ap-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:33](#){: .copyMe} | +| `ap-south-2` | [arn:aws:lambda:ap-south-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:33](#){: .copyMe} | +| `ap-east-1` | [arn:aws:lambda:ap-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:33](#){: .copyMe} | +| `ap-northeast-1` | [arn:aws:lambda:ap-northeast-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:33](#){: .copyMe} | +| `ap-northeast-2` | [arn:aws:lambda:ap-northeast-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:33](#){: .copyMe} | +| `ap-northeast-3` | [arn:aws:lambda:ap-northeast-3:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:33](#){: .copyMe} | +| `ap-southeast-1` | [arn:aws:lambda:ap-southeast-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:33](#){: .copyMe} | +| `ap-southeast-2` | [arn:aws:lambda:ap-southeast-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:33](#){: .copyMe} | +| `ap-southeast-3` | [arn:aws:lambda:ap-southeast-3:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:33](#){: .copyMe} | +| `ap-southeast-4` | [arn:aws:lambda:ap-southeast-4:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:33](#){: .copyMe} | +| `ap-southeast-5` | [arn:aws:lambda:ap-southeast-5:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:33](#){: .copyMe} | +| `ap-southeast-7` | [arn:aws:lambda:ap-southeast-7:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:33](#){: .copyMe} | +| `eu-central-1` | [arn:aws:lambda:eu-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:33](#){: .copyMe} | +| `eu-central-2` | [arn:aws:lambda:eu-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:33](#){: .copyMe} | +| `eu-west-1` | [arn:aws:lambda:eu-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:33](#){: .copyMe} | +| `eu-west-2` | [arn:aws:lambda:eu-west-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:33](#){: .copyMe} | +| `eu-west-3` | [arn:aws:lambda:eu-west-3:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:33](#){: .copyMe} | +| `eu-north-1` | [arn:aws:lambda:eu-north-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:33](#){: .copyMe} | +| `eu-south-1` | [arn:aws:lambda:eu-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:33](#){: .copyMe} | +| `eu-south-2` | [arn:aws:lambda:eu-south-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:33](#){: .copyMe} | +| `ca-central-1` | [arn:aws:lambda:ca-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:33](#){: .copyMe} | +| `ca-west-1` | [arn:aws:lambda:ca-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:33](#){: .copyMe} | +| `sa-east-1` | [arn:aws:lambda:sa-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:33](#){: .copyMe} | +| `af-south-1` | [arn:aws:lambda:af-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:33](#){: .copyMe} | +| `me-south-1` | [arn:aws:lambda:me-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:33](#){: .copyMe} | +| `me-central-1` | [arn:aws:lambda:me-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:33](#){: .copyMe} | +| `il-central-1` | [arn:aws:lambda:il-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:33](#){: .copyMe} | +| `mx-central-1` | [arn:aws:lambda:mx-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:33](#){: .copyMe} | +| `us-gov-west-1` | [arn:aws-us-gov:lambda:us-gov-west-1:165093116878:layer:AWSLambdaPowertoolsTypeScriptV2:33](#){: .copyMe} | +| `us-gov-east-1` | [arn:aws-us-gov:lambda:us-gov-east-1:165087284144:layer:AWSLambdaPowertoolsTypeScriptV2:33](#){: .copyMe} | +| `cn-north-1` | [arn:aws-aws-cn:lambda:cn-north-1:498634801083:layer:AWSLambdaPowertoolsTypeScriptV2:33](#){: .copyMe} | ### Lookup Layer ARN via AWS SSM Parameter Store @@ -71,7 +71,7 @@ Parameter: LastModifiedDate: '2025-02-11T11:08:45.070000+01:00' Name: /aws/service/powertools/typescript/generic/all/2.14.0 Type: String - Value: arn:aws:lambda:eu-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:32 + Value: arn:aws:lambda:eu-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:33 Version: 1 ``` @@ -91,7 +91,7 @@ Change `{aws::region}` to your AWS region, e.g. `eu-west-1`, and run the followi === "AWS CLI command to download Lambda Layer content" ```bash - aws lambda get-layer-version-by-arn --arn arn:aws:lambda:{aws::region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:32 --region {aws::region} + aws lambda get-layer-version-by-arn --arn arn:aws:lambda:{aws::region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:33 --region {aws::region} ``` === "AWS CLI output" @@ -104,7 +104,7 @@ Change `{aws::region}` to your AWS region, e.g. `eu-west-1`, and run the followi "CodeSize": 3548324 }, "LayerArn": "arn:aws:lambda:eu-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2", - "LayerVersionArn": "arn:aws:lambda:eu-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:32", + "LayerVersionArn": "arn:aws:lambda:eu-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:33", "Description": "Powertools for AWS Lambda (TypeScript) version 2.18.0", "CreatedDate": "2025-04-08T07:38:30.424+0000", "Version": 24, @@ -138,7 +138,7 @@ Change `{aws::region}` to your AWS region, e.g. `eu-west-1`, and run the followi const powertoolsLayer = LayerVersion.fromLayerVersionArn( this, 'PowertoolsLayer', - `arn:aws:lambda:${Stack.of(this).region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:32` + `arn:aws:lambda:${Stack.of(this).region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:33` ); new NodejsFunction(this, 'Function', { @@ -208,7 +208,7 @@ Change `{aws::region}` to your AWS region, e.g. `eu-west-1`, and run the followi Type: AWS::Serverless::Function Properties: Layers: - - !Sub arn:aws:lambda:${AWS::Region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:32 + - !Sub arn:aws:lambda:${AWS::Region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:33 ``` You can also use AWS SSM Parameter Store to dynamically add Powertools for AWS Lambda and resolve the Layer ARN from SSM Parameter Store in your code, allowing you to pin to `latest` or a specific Powertools for AWS Lambda version. @@ -247,7 +247,7 @@ Change `{aws::region}` to your AWS region, e.g. `eu-west-1`, and run the followi hello: handler: lambda_function.lambda_handler layers: - - arn:aws:lambda:${aws:region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:32 + - arn:aws:lambda:${aws:region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:33 ``` 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: @@ -282,7 +282,7 @@ Change `{aws::region}` to your AWS region, e.g. `eu-west-1`, and run the followi role = ... handler = "index.handler" runtime = "nodejs22.x" - layers = ["arn:aws:lambda:{aws::region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:32"] + layers = ["arn:aws:lambda:{aws::region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:33"] source_code_hash = filebase64sha256("lambda_function_payload.zip") } ``` @@ -317,7 +317,7 @@ Change `{aws::region}` to your AWS region, e.g. `eu-west-1`, and run the followi const lambdaFunction = new aws.lambda.Function('function', { layers: [ - pulumi.interpolate`arn:aws:lambda:${aws.getRegionOutput().name}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:32` + pulumi.interpolate`arn:aws:lambda:${aws.getRegionOutput().name}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:33` ], code: new pulumi.asset.FileArchive('lambda_function_payload.zip'), tracingConfig: { @@ -341,7 +341,7 @@ Change `{aws::region}` to your AWS region, e.g. `eu-west-1`, and run the followi name: "my-function", layers: { "@aws-lambda-powertools/*": - "arn:aws:lambda:${AWS::Region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:32", + "arn:aws:lambda:${AWS::Region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:33", }, }); ``` diff --git a/examples/app/cdk/example-stack.ts b/examples/app/cdk/example-stack.ts index 86b53ff5b6..361711cf4c 100644 --- a/examples/app/cdk/example-stack.ts +++ b/examples/app/cdk/example-stack.ts @@ -39,7 +39,7 @@ export class PowertoolsExampleStack extends Stack { 'powertools-layer', `arn:aws:lambda:${ Stack.of(this).region - }:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:32` + }:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:33` ); // Items table diff --git a/examples/app/template.yaml b/examples/app/template.yaml index b5a6d86169..30a2966928 100644 --- a/examples/app/template.yaml +++ b/examples/app/template.yaml @@ -130,7 +130,7 @@ Resources: - DynamoDBReadPolicy: TableName: !Ref itemsTable Layers: - - !Sub arn:aws:lambda:${AWS::Region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:32 + - !Sub arn:aws:lambda:${AWS::Region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:33 Environment: Variables: TABLE_NAME: !Ref itemsTable From 7bd81aed4d259c909107a1d312bd722bc258f358 Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Tue, 12 Aug 2025 16:55:35 +0200 Subject: [PATCH 02/15] fix(tracer): pass args of decorated method as they are (#4312) --- packages/tracer/src/Tracer.ts | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/packages/tracer/src/Tracer.ts b/packages/tracer/src/Tracer.ts index 77de9f9214..3c3cfb94e1 100644 --- a/packages/tracer/src/Tracer.ts +++ b/packages/tracer/src/Tracer.ts @@ -428,9 +428,12 @@ class Tracer extends Utility implements TracerInterface { const tracerRef = this; // Use a function() {} instead of an () => {} arrow function so that we can // access `myClass` as `this` in a decorated `myClass.myMethod()`. - descriptor.value = function (this: Handler, event, context, callback) { + descriptor.value = function ( + this: Handler, + ...args: Parameters + ) { if (!tracerRef.isTracingEnabled()) { - return originalMethod.apply(this, [event, context, callback]); + return originalMethod.apply(this, args); } return tracerRef.provider.captureAsyncFunc( @@ -440,11 +443,7 @@ class Tracer extends Utility implements TracerInterface { tracerRef.addServiceNameAnnotation(); let result: unknown; try { - result = await originalMethod.apply(this, [ - event, - context, - callback, - ]); + result = await originalMethod.apply(this, args); if (options?.captureResponse ?? true) { tracerRef.addResponseAsMetadata(result, process.env._HANDLER); } From b2e54d63344cfc55bc53ec23b560ae83d1e48392 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Aug 2025 19:51:55 +0100 Subject: [PATCH 03/15] chore(deps): bump tsx from 4.20.3 to 4.20.4 (#4313) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stefano Vozza --- examples/app/package.json | 2 +- layers/package.json | 2 +- package-lock.json | 68 +++++++++++++++++++-------------------- 3 files changed, 36 insertions(+), 36 deletions(-) diff --git a/examples/app/package.json b/examples/app/package.json index c36fe51eab..d279180c59 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -33,7 +33,7 @@ "aws-cdk-lib": "^2.210.0", "constructs": "^10.4.2", "source-map-support": "^0.5.21", - "tsx": "^4.20.3", + "tsx": "^4.20.4", "typescript": "^5.9.2", "vitest": "^3.0.5" }, diff --git a/layers/package.json b/layers/package.json index 1533c7ef08..ce91a4936c 100644 --- a/layers/package.json +++ b/layers/package.json @@ -43,6 +43,6 @@ "aws-cdk": "^2.1024.0", "aws-cdk-lib": "^2.210.0", "esbuild": "^0.25.8", - "tsx": "^4.20.3" + "tsx": "^4.20.4" } } diff --git a/package-lock.json b/package-lock.json index a2d2ee66a2..c7fbc4e4a0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -50,12 +50,12 @@ "version": "2.25.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/batch": "^2.24.1", - "@aws-lambda-powertools/idempotency": "^2.24.1", - "@aws-lambda-powertools/logger": "^2.24.1", - "@aws-lambda-powertools/metrics": "^2.24.1", - "@aws-lambda-powertools/parameters": "^2.24.1", - "@aws-lambda-powertools/tracer": "^2.24.1", + "@aws-lambda-powertools/batch": "^2.25.0", + "@aws-lambda-powertools/idempotency": "^2.25.0", + "@aws-lambda-powertools/logger": "^2.25.0", + "@aws-lambda-powertools/metrics": "^2.25.0", + "@aws-lambda-powertools/parameters": "^2.25.0", + "@aws-lambda-powertools/tracer": "^2.25.0", "@aws-sdk/client-ssm": "^3.864.0", "@aws-sdk/lib-dynamodb": "^3.864.0", "@middy/core": "^4.7.0", @@ -72,7 +72,7 @@ "aws-cdk-lib": "^2.210.0", "constructs": "^10.4.2", "source-map-support": "^0.5.21", - "tsx": "^4.20.3", + "tsx": "^4.20.4", "typescript": "^5.9.2", "vitest": "^3.0.5" } @@ -86,15 +86,15 @@ "valibot": "^1.1.0" }, "devDependencies": { - "@aws-lambda-powertools/batch": "^2.24.1", - "@aws-lambda-powertools/event-handler": "^2.24.1", - "@aws-lambda-powertools/idempotency": "^2.24.1", - "@aws-lambda-powertools/jmespath": "^2.24.1", - "@aws-lambda-powertools/logger": "^2.24.1", - "@aws-lambda-powertools/metrics": "^2.24.1", - "@aws-lambda-powertools/parameters": "^2.24.1", - "@aws-lambda-powertools/parser": "^2.24.1", - "@aws-lambda-powertools/tracer": "^2.24.1", + "@aws-lambda-powertools/batch": "^2.25.0", + "@aws-lambda-powertools/event-handler": "^2.25.0", + "@aws-lambda-powertools/idempotency": "^2.25.0", + "@aws-lambda-powertools/jmespath": "^2.25.0", + "@aws-lambda-powertools/logger": "^2.25.0", + "@aws-lambda-powertools/metrics": "^2.25.0", + "@aws-lambda-powertools/parameters": "^2.25.0", + "@aws-lambda-powertools/parser": "^2.25.0", + "@aws-lambda-powertools/tracer": "^2.25.0", "@aws-sdk/client-appconfigdata": "^3.864.0", "@aws-sdk/client-dynamodb": "^3.864.0", "@aws-sdk/client-secrets-manager": "^3.864.0", @@ -131,13 +131,13 @@ } }, "layers": { - "version": "2.24.1", + "version": "2.25.0", "license": "MIT-0", "dependencies": { "aws-cdk": "^2.1024.0", "aws-cdk-lib": "^2.210.0", "esbuild": "^0.25.8", - "tsx": "^4.20.3" + "tsx": "^4.20.4" }, "bin": { "layer": "bin/layers.js" @@ -10038,9 +10038,9 @@ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, "node_modules/tsx": { - "version": "4.20.3", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.3.tgz", - "integrity": "sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==", + "version": "4.20.4", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.4.tgz", + "integrity": "sha512-yyxBKfORQ7LuRt/BQKBXrpcq59ZvSW0XxwfjAt3w2/8PmdxaFzijtMhTawprSHhpzeM5BgU2hXHG3lklIERZXg==", "license": "MIT", "dependencies": { "esbuild": "~0.25.0", @@ -10750,7 +10750,7 @@ "version": "2.25.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "2.24.1" + "@aws-lambda-powertools/commons": "2.25.0" } }, "packages/idempotency": { @@ -10758,8 +10758,8 @@ "version": "2.25.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "2.24.1", - "@aws-lambda-powertools/jmespath": "2.24.1" + "@aws-lambda-powertools/commons": "2.25.0", + "@aws-lambda-powertools/jmespath": "2.25.0" }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", @@ -10797,7 +10797,7 @@ "version": "2.25.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "2.24.1" + "@aws-lambda-powertools/commons": "2.25.0" } }, "packages/kafka": { @@ -10805,7 +10805,7 @@ "version": "2.25.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "2.24.1", + "@aws-lambda-powertools/commons": "2.25.0", "@standard-schema/spec": "^1.0.0" }, "devDependencies": { @@ -10835,7 +10835,7 @@ "version": "2.25.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "2.24.1", + "@aws-lambda-powertools/commons": "2.25.0", "lodash.merge": "^4.6.2" }, "devDependencies": { @@ -10843,7 +10843,7 @@ "@types/lodash.merge": "^4.6.9" }, "peerDependencies": { - "@aws-lambda-powertools/jmespath": "2.24.1", + "@aws-lambda-powertools/jmespath": "2.25.0", "@middy/core": "4.x || 5.x || 6.x" }, "peerDependenciesMeta": { @@ -10860,7 +10860,7 @@ "version": "2.25.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "2.24.1" + "@aws-lambda-powertools/commons": "2.25.0" }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", @@ -10882,7 +10882,7 @@ "version": "2.25.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "2.24.1" + "@aws-lambda-powertools/commons": "2.25.0" }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", @@ -10928,7 +10928,7 @@ "version": "2.25.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "2.24.1", + "@aws-lambda-powertools/commons": "2.25.0", "@standard-schema/spec": "^1.0.0" }, "devDependencies": { @@ -10969,7 +10969,7 @@ "version": "2.25.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "2.24.1", + "@aws-lambda-powertools/commons": "2.25.0", "aws-xray-sdk-core": "^3.10.3" }, "devDependencies": { @@ -10991,8 +10991,8 @@ "version": "2.25.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "2.24.1", - "@aws-lambda-powertools/jmespath": "2.24.1", + "@aws-lambda-powertools/commons": "2.25.0", + "@aws-lambda-powertools/jmespath": "2.25.0", "ajv": "^8.17.1" } } From 6efb4379c9ef2c7747e20d4f9e1c973c207e99e0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Aug 2025 19:54:44 +0100 Subject: [PATCH 04/15] chore(deps): bump github/codeql-action from 3.29.8 to 3.29.9 (#4315) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stefano Vozza --- .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 c7f2feacf9..8b27e7ef14 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@76621b61decf072c1cee8dd1ce2d2a82d33c17ed # v3.29.5 + uses: github/codeql-action/upload-sarif@df559355d593797519d70b90fc8edd5db049e7a2 # v3.29.5 with: sarif_file: results.sarif From 92c7f360ba255a8289cab7e870b7275f669bf9b6 Mon Sep 17 00:00:00 2001 From: Beckett Frey <83560790+BeckettFrey@users.noreply.github.com> Date: Tue, 12 Aug 2025 14:59:45 -0500 Subject: [PATCH 05/15] refactor: idempotency env service to functions 4246 (#4314) Co-authored-by: Stefano Vozza --- .../src/config/EnvironmentVariablesService.ts | 110 ---------- packages/commons/src/index.ts | 1 - .../unit/EnvironmentVariablesService.test.ts | 193 ------------------ packages/idempotency/src/IdempotencyConfig.ts | 10 +- .../src/config/EnvironmentVariablesService.ts | 47 ----- .../src/persistence/BasePersistenceLayer.ts | 18 +- .../unit/EnvironmentVariableService.test.ts | 39 ---- 7 files changed, 11 insertions(+), 407 deletions(-) delete mode 100644 packages/commons/src/config/EnvironmentVariablesService.ts delete mode 100644 packages/commons/tests/unit/EnvironmentVariablesService.test.ts delete mode 100644 packages/idempotency/src/config/EnvironmentVariablesService.ts delete mode 100644 packages/idempotency/tests/unit/EnvironmentVariableService.test.ts diff --git a/packages/commons/src/config/EnvironmentVariablesService.ts b/packages/commons/src/config/EnvironmentVariablesService.ts deleted file mode 100644 index a4bfaa2bc4..0000000000 --- a/packages/commons/src/config/EnvironmentVariablesService.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { - getServiceName, - getXRayTraceIdFromEnv, - isDevMode, - isRequestXRaySampled, -} from '../envUtils.js'; -import type { ConfigServiceInterface } from '../types/ConfigServiceInterface.js'; - -/** - * This class is used to fetch environment variables that are available in the execution environment. - * - * These variables can be a mix of runtime environment variables set by AWS and - * other environment variables that are set by the developer to configure Powertools for AWS Lambda. - * - * @example - * ```typescript - * import { EnvironmentVariablesService } from '@aws-lambda-powertools/commons/'; - * - * const config = new EnvironmentVariablesService(); - * const serviceName = config.getServiceName(); - * ``` - * - * @see https://docs.powertools.aws.dev/lambda/typescript/latest/#environment-variables - * - * @class - */ -class EnvironmentVariablesService implements ConfigServiceInterface { - /** - * Increase JSON indentation for Logger to ease debugging when running functions locally or in a non-production environment - */ - protected devModeVariable = 'POWERTOOLS_DEV'; - /** - * Set service name used for tracing namespace, metrics dimension and structured logging - */ - protected serviceNameVariable = 'POWERTOOLS_SERVICE_NAME'; - /** - * AWS X-Ray Trace ID environment variable - * @private - */ - private xRayTraceIdVariable = '_X_AMZN_TRACE_ID'; - - /** - * Get the value of an environment variable by name. - * - * @param {string} name The name of the environment variable to fetch. - */ - public get(name: string): string { - return process.env[name]?.trim() || ''; - } - - /** - * Get the value of the `POWERTOOLS_SERVICE_NAME` environment variable. - */ - public getServiceName(): string { - return getServiceName(); - } - - /** - * Get the value of the `_X_AMZN_TRACE_ID` environment variable. - * - * The AWS X-Ray Trace data available in the environment variable has this format: - * `Root=1-5759e988-bd862e3fe1be46a994272793;Parent=557abcec3ee5a047;Sampled=1`, - * - * The actual Trace ID is: `1-5759e988-bd862e3fe1be46a994272793`. - */ - public getXrayTraceId(): string | undefined { - return getXRayTraceIdFromEnv(); - } - - /** - * Determine if the current invocation is part of a sampled X-Ray trace. - * - * The AWS X-Ray Trace data available in the environment variable has this format: - * `Root=1-5759e988-bd862e3fe1be46a994272793;Parent=557abcec3ee5a047;Sampled=1`, - */ - public getXrayTraceSampled(): boolean { - return isRequestXRaySampled(); - } - - /** - * Determine if the current invocation is running in a development environment. - */ - public isDevMode(): boolean { - return isDevMode(); - } - - /** - * Helper function to determine if a value is considered thruthy. - * - * @param value The value to check for truthiness. - */ - public isValueTrue(value: string): boolean { - const truthyValues: string[] = ['1', 'y', 'yes', 't', 'true', 'on']; - - return truthyValues.includes(value.toLowerCase()); - } - - /** - * Helper function to determine if a value is considered falsy. - * - * @param value The value to check for falsiness. - */ - public isValueFalse(value: string): boolean { - const falsyValues: string[] = ['0', 'n', 'no', 'f', 'false', 'off']; - - return falsyValues.includes(value.toLowerCase()); - } -} - -export { EnvironmentVariablesService }; diff --git a/packages/commons/src/index.ts b/packages/commons/src/index.ts index 4c559c40bb..be11255615 100644 --- a/packages/commons/src/index.ts +++ b/packages/commons/src/index.ts @@ -5,7 +5,6 @@ if (!process.env.AWS_SDK_UA_APP_ID) { } export { addUserAgentMiddleware, isSdkClient } from './awsSdkUtils.js'; -export { EnvironmentVariablesService } from './config/EnvironmentVariablesService.js'; export { cleanupMiddlewares } from './middleware/cleanupMiddlewares.js'; export { IDEMPOTENCY_KEY, diff --git a/packages/commons/tests/unit/EnvironmentVariablesService.test.ts b/packages/commons/tests/unit/EnvironmentVariablesService.test.ts deleted file mode 100644 index 6f0c50dca0..0000000000 --- a/packages/commons/tests/unit/EnvironmentVariablesService.test.ts +++ /dev/null @@ -1,193 +0,0 @@ -import { afterAll, beforeEach, describe, expect, it, vi } from 'vitest'; -import { EnvironmentVariablesService } from '../../src/index.js'; - -describe('Class: EnvironmentVariablesService', () => { - const ENVIRONMENT_VARIABLES = process.env; - - beforeEach(() => { - vi.resetModules(); - process.env = { ...ENVIRONMENT_VARIABLES }; - }); - - afterAll(() => { - process.env = ENVIRONMENT_VARIABLES; - }); - - describe('Method: get', () => { - it('returns the value of a runtime variable', () => { - // Prepare - process.env.CUSTOM_VARIABLE = 'my custom value'; - const service = new EnvironmentVariablesService(); - - // Act - const value = service.get('CUSTOM_VARIABLE'); - - // Assess - expect(value).toEqual('my custom value'); - }); - - it('returns an empty string when the env variable is not present', () => { - // Prepare - process.env.CUSTOM_VARIABLE = undefined; - const service = new EnvironmentVariablesService(); - - // Act - const value = service.get('CUSTOM_VARIABLE'); - - // Assess - expect(value).toEqual(''); - }); - }); - - describe('Method: getServiceName', () => { - it('returns the value of the environment variable POWERTOOLS_SERVICE_NAME', () => { - // Prepare - process.env.POWERTOOLS_SERVICE_NAME = 'shopping-cart-api'; - const service = new EnvironmentVariablesService(); - - // Act - const value = service.getServiceName(); - - // Assess - expect(value).toEqual('shopping-cart-api'); - }); - }); - - describe('Method: getXrayTraceId', () => { - it('returns the value of the environment variable _X_AMZN_TRACE_ID', () => { - // Prepare - process.env._X_AMZN_TRACE_ID = 'abcd123456789'; - const service = new EnvironmentVariablesService(); - - // Act - const value = service.getXrayTraceId(); - - // Assess - expect(value).toEqual('abcd123456789'); - }); - }); - - describe('Method: getXrayTraceSampled', () => { - 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'; - const service = new EnvironmentVariablesService(); - - // Act - const value = service.getXrayTraceSampled(); - - // Assess - expect(value).toEqual(true); - }); - }); - - describe('Method: isValueTrue', () => { - const valuesToTest: Array> = [ - ['1', true], - ['y', true], - ['yes', true], - ['t', true], - ['TRUE', true], - ['on', true], - ['', false], - ['false', false], - ['fasle', false], - ['somethingsilly', false], - ['0', false], - ]; - - it.each(valuesToTest)( - 'takes string "%s" and returns %s', - (input, output) => { - // Prepare - const service = new EnvironmentVariablesService(); - // Act - const value = service.isValueTrue(input as string); - // Assess - expect(value).toBe(output); - } - ); - }); - - describe('Method: isValueFalse', () => { - const valuesToTest: Array> = [ - ['0', true], - ['n', true], - ['no', true], - ['f', true], - ['FALSE', true], - ['off', true], - ['1', false], - ['y', false], - ['yes', false], - ['t', false], - ['TRUE', false], - ['on', false], - ['', false], - ['somethingsilly', false], - ]; - - it.each(valuesToTest)( - 'takes string "%s" and returns %s', - (input, output) => { - // Prepare - const service = new EnvironmentVariablesService(); - // Act - const value = service.isValueFalse(input as string); - // Assess - expect(value).toBe(output); - } - ); - }); - - describe('Method: isDevMode', () => { - it('returns true if the environment variable POWERTOOLS_DEV is "true"', () => { - // Prepare - process.env.POWERTOOLS_DEV = 'true'; - const service = new EnvironmentVariablesService(); - - // Act - const value = service.isDevMode(); - - // Assess - expect(value).toEqual(true); - }); - - it('returns false if the environment variable POWERTOOLS_DEV is "false"', () => { - // Prepare - process.env.POWERTOOLS_DEV = 'false'; - const service = new EnvironmentVariablesService(); - - // Act - const value = service.isDevMode(); - - // Assess - expect(value).toEqual(false); - }); - - it('returns false if the environment variable POWERTOOLS_DEV is NOT set', () => { - // Prepare - process.env.POWERTOOLS_DEV = 'somethingsilly'; - const service = new EnvironmentVariablesService(); - - // Act - const value = service.isDevMode(); - - // Assess - expect(value).toEqual(false); - }); - - it('returns false if the environment variable POWERTOOLS_DEV is "somethingsilly"', () => { - // Prepare - process.env.POWERTOOLS_DEV = 'somethingsilly'; - const service = new EnvironmentVariablesService(); - - // Act - const value = service.isDevMode(); - - // Assess - expect(value).toEqual(false); - }); - }); -}); diff --git a/packages/idempotency/src/IdempotencyConfig.ts b/packages/idempotency/src/IdempotencyConfig.ts index b93a14e5be..c26318aa60 100644 --- a/packages/idempotency/src/IdempotencyConfig.ts +++ b/packages/idempotency/src/IdempotencyConfig.ts @@ -1,7 +1,7 @@ +import { getBooleanFromEnv } from '@aws-lambda-powertools/commons/utils/env'; 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, ResponseHook, @@ -64,7 +64,6 @@ class IdempotencyConfig { * Use the local cache to store idempotency keys. */ public useLocalCache: boolean; - readonly #envVarsService: EnvironmentVariablesService; readonly #enabled: boolean = true; public constructor(config: IdempotencyConfigOptions) { @@ -80,8 +79,11 @@ class IdempotencyConfig { this.hashFunction = config.hashFunction ?? 'md5'; this.lambdaContext = config.lambdaContext; this.responseHook = config.responseHook; - this.#envVarsService = new EnvironmentVariablesService(); - this.#enabled = this.#envVarsService.getIdempotencyEnabled(); + this.#enabled = !getBooleanFromEnv({ + key: 'POWERTOOLS_IDEMPOTENCY_DISABLED', + defaultValue: false, + extendedParsing: true, + }); } /** diff --git a/packages/idempotency/src/config/EnvironmentVariablesService.ts b/packages/idempotency/src/config/EnvironmentVariablesService.ts deleted file mode 100644 index 36af2c4b4a..0000000000 --- a/packages/idempotency/src/config/EnvironmentVariablesService.ts +++ /dev/null @@ -1,47 +0,0 @@ -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. - * These variables can be a mix of runtime environment variables set by AWS and - * variables that can be set by the developer additionally. - * - * @class - * @extends {CommonEnvironmentVariablesService} - * @see https://docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html#configuration-envvars-runtime - * @see https://docs.powertools.aws.dev/lambda/typescript/latest/#environment-variables - */ -class EnvironmentVariablesService - extends CommonEnvironmentVariablesService - implements ConfigServiceInterface -{ - // Reserved environment variables - private readonly functionNameVariable = 'AWS_LAMBDA_FUNCTION_NAME'; - private readonly idempotencyDisabledVariable = - 'POWERTOOLS_IDEMPOTENCY_DISABLED'; - - /** - * It returns the value of the AWS_LAMBDA_FUNCTION_NAME environment variable. - * - * @returns {string} - */ - public getFunctionName(): string { - return this.get(this.functionNameVariable); - } - - /** - * It returns whether the idempotency feature is enabled or not. - * - * Reads the value of the POWERTOOLS_IDEMPOTENCY_DISABLED environment variable. - * - * @returns {boolean} - */ - public getIdempotencyEnabled(): boolean { - return !this.isValueTrue(this.get(this.idempotencyDisabledVariable)); - } -} - -export { EnvironmentVariablesService }; diff --git a/packages/idempotency/src/persistence/BasePersistenceLayer.ts b/packages/idempotency/src/persistence/BasePersistenceLayer.ts index 2ca6690336..55c9e34418 100644 --- a/packages/idempotency/src/persistence/BasePersistenceLayer.ts +++ b/packages/idempotency/src/persistence/BasePersistenceLayer.ts @@ -1,9 +1,9 @@ import { createHash, type Hash } from 'node:crypto'; import type { JSONValue } from '@aws-lambda-powertools/commons/types'; import { LRUCache } from '@aws-lambda-powertools/commons/utils/lru-cache'; +import { getStringFromEnv } from '@aws-lambda-powertools/commons/utils/env'; import { search } from '@aws-lambda-powertools/jmespath'; import type { JMESPathParsingOptions } from '@aws-lambda-powertools/jmespath/types'; -import { EnvironmentVariablesService } from '../config/EnvironmentVariablesService.js'; import { IdempotencyRecordStatus } from '../constants.js'; import { deepSort } from '../deepSort.js'; import { @@ -27,8 +27,6 @@ abstract class BasePersistenceLayer implements BasePersistenceLayerInterface { public idempotencyKeyPrefix: string; private cache?: LRUCache; private configured = false; - // envVarsService is always initialized in the constructor - private readonly envVarsService!: EnvironmentVariablesService; private eventKeyJmesPath?: string; protected expiresAfterSeconds: number = 60 * 60; // 1 hour default private hashFunction = 'md5'; @@ -39,8 +37,10 @@ abstract class BasePersistenceLayer implements BasePersistenceLayerInterface { #jmesPathOptions?: JMESPathParsingOptions; public constructor() { - this.envVarsService = new EnvironmentVariablesService(); - this.idempotencyKeyPrefix = this.getEnvVarsService().getFunctionName(); + this.idempotencyKeyPrefix = getStringFromEnv({ + key: 'AWS_LAMBDA_FUNCTION_NAME', + errorMessage: 'AWS_LAMBDA_FUNCTION_NAME environment variable is required', + }); } /** @@ -244,14 +244,6 @@ abstract class BasePersistenceLayer implements BasePersistenceLayerInterface { return hash.digest('base64'); } - /** - * Getter for `envVarsService`. - * Used internally during initialization. - */ - private getEnvVarsService(): EnvironmentVariablesService { - return this.envVarsService; - } - /** * Creates the expiry timestamp for the idempotency record * diff --git a/packages/idempotency/tests/unit/EnvironmentVariableService.test.ts b/packages/idempotency/tests/unit/EnvironmentVariableService.test.ts deleted file mode 100644 index 86ac2cc68a..0000000000 --- a/packages/idempotency/tests/unit/EnvironmentVariableService.test.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { afterEach, beforeEach, describe, expect, it } from 'vitest'; -import { EnvironmentVariablesService } from '../../src/config/EnvironmentVariablesService.js'; - -describe('Class: EnvironmentVariableService', () => { - const ENVIRONMENT_VARIABLES = process.env; - - beforeEach(() => { - process.env = { ...ENVIRONMENT_VARIABLES }; - }); - - afterEach(() => { - process.env = ENVIRONMENT_VARIABLES; - }); - - describe('Method: getFunctionName', () => { - it('gets the Lambda function name from the environment variable', () => { - // Prepare - const expectedName = 'test-function'; - process.env.AWS_LAMBDA_FUNCTION_NAME = expectedName; - - // Act - const lambdaName = new EnvironmentVariablesService().getFunctionName(); - - // Assess - expect(lambdaName).toEqual(expectedName); - }); - - it('it returns an empty string when the Lambda function name is not set', () => { - // Prepare - process.env.AWS_LAMBDA_FUNCTION_NAME = undefined; - - // Act - const lambdaName = new EnvironmentVariablesService().getFunctionName(); - - // Assess - expect(lambdaName).toEqual(''); - }); - }); -}); From 60d92b861ca198f872f4c071f1646936b1cefacb Mon Sep 17 00:00:00 2001 From: Swopnil Dangol Date: Wed, 13 Aug 2025 11:14:48 +0100 Subject: [PATCH 06/15] improv(ci): Skip Layer version checks for the Gamma environment (#4321) --- .github/workflows/layers_partitions.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/layers_partitions.yml b/.github/workflows/layers_partitions.yml index 711593219f..20ebac6724 100644 --- a/.github/workflows/layers_partitions.yml +++ b/.github/workflows/layers_partitions.yml @@ -182,9 +182,11 @@ jobs: REMOTE_DESCRIPTION=$(jq -r '.Description' $layer_output) LOCAL_DESCRIPTION=$(jq -r '.Description' AWSLambdaPowertoolsTypeScriptV2.json) test "$REMOTE_DESCRIPTION" == "$LOCAL_DESCRIPTION" && echo "Version number OK: ${LOCAL_DESCRIPTION}" || exit 1 - REMOTE_LAYER_VERSION=$(jq -r '.LayerVersionArn' $layer_output | sed 's/.*://') - LOCAL_LAYER_VERSION=$(jq -r '.LayerVersionArn' AWSLambdaPowertoolsTypeScriptV2.json | sed 's/.*://') - test "$REMOTE_LAYER_VERSION" == "$LOCAL_LAYER_VERSION" && echo "Layer Version number OK: ${LOCAL_LAYER_VERSION}" || exit 1 + if [ "${{ inputs.environment }}" == "Prod" ]; then + REMOTE_LAYER_VERSION=$(jq -r '.LayerVersionArn' $layer_output | sed 's/.*://') + LOCAL_LAYER_VERSION=$(jq -r '.LayerVersionArn' AWSLambdaPowertoolsTypeScriptV2.json | sed 's/.*://') + test "$REMOTE_LAYER_VERSION" == "$LOCAL_LAYER_VERSION" && echo "Layer Version number OK: ${LOCAL_LAYER_VERSION}" || exit 1 + fi jq -s -r '["Layer Arn", "Runtimes", "Version", "Description", "SHA256"], ([.[0], .[1]] | .[] | [.LayerArn, (.CompatibleRuntimes | join("/")), .Version, .Description, .Content.CodeSha256]) |@tsv' AWSLambdaPowertoolsTypeScriptV2.json $layer_output | column -t -s $'\t' - name: Store Metadata - ${{ matrix.region }} From 5aff3984359a5a4f4408a5d286d3c36976d454fa Mon Sep 17 00:00:00 2001 From: Stefano Vozza Date: Wed, 13 Aug 2025 12:12:59 +0100 Subject: [PATCH 07/15] feat(event-handler): add error handling functionality to BaseRouter (#4316) --- packages/event-handler/src/rest/BaseRouter.ts | 85 ++++ packages/event-handler/src/rest/errors.ts | 4 +- packages/event-handler/src/types/rest.ts | 2 +- .../tests/unit/rest/BaseRouter.test.ts | 396 +++++++++++++++++- 4 files changed, 462 insertions(+), 25 deletions(-) diff --git a/packages/event-handler/src/rest/BaseRouter.ts b/packages/event-handler/src/rest/BaseRouter.ts index 209bdba9e2..85b6aa44ec 100644 --- a/packages/event-handler/src/rest/BaseRouter.ts +++ b/packages/event-handler/src/rest/BaseRouter.ts @@ -16,6 +16,11 @@ import type { } from '../types/rest.js'; import { HttpVerbs } from './constants.js'; import { ErrorHandlerRegistry } from './ErrorHandlerRegistry.js'; +import { + MethodNotAllowedError, + NotFoundError, + ServiceError, +} from './errors.js'; import { Route } from './Route.js'; import { RouteHandlerRegistry } from './RouteHandlerRegistry.js'; @@ -54,6 +59,12 @@ abstract class BaseRouter { this.isDev = isDevMode(); } + /** + * Registers a custom error handler for specific error types. + * + * @param errorType - The error constructor(s) to handle + * @param handler - The error handler function that returns an ErrorResponse + */ public errorHandler( errorType: ErrorConstructor | ErrorConstructor[], handler: ErrorHandler @@ -61,6 +72,24 @@ abstract class BaseRouter { this.errorHandlerRegistry.register(errorType, handler); } + /** + * Registers a custom handler for 404 Not Found errors. + * + * @param handler - The error handler function for NotFoundError + */ + public notFound(handler: ErrorHandler): void { + this.errorHandlerRegistry.register(NotFoundError, handler); + } + + /** + * Registers a custom handler for 405 Method Not Allowed errors. + * + * @param handler - The error handler function for MethodNotAllowedError + */ + public methodNotAllowed(handler: ErrorHandler): void { + this.errorHandlerRegistry.register(MethodNotAllowedError, handler); + } + public abstract resolve( event: unknown, context: Context, @@ -76,6 +105,62 @@ abstract class BaseRouter { } } + /** + * Handles errors by finding a registered error handler or falling + * back to a default handler. + * + * @param error - The error to handle + * @returns A Response object with appropriate status code and error details + */ + protected async handleError(error: Error): Promise { + const handler = this.errorHandlerRegistry.resolve(error); + if (handler !== null) { + try { + const body = await handler(error); + return new Response(JSON.stringify(body), { + status: body.statusCode, + headers: { 'Content-Type': 'application/json' }, + }); + } catch (handlerError) { + return this.#defaultErrorHandler(handlerError as Error); + } + } + + if (error instanceof ServiceError) { + return new Response(JSON.stringify(error.toJSON()), { + status: error.statusCode, + headers: { 'Content-Type': 'application/json' }, + }); + } + + return this.#defaultErrorHandler(error); + } + + /** + * Default error handler that returns a 500 Internal Server Error response. + * In development mode, includes stack trace and error details. + * + * @param error - The error to handle + * @returns A Response object with 500 status and error details + */ + #defaultErrorHandler(error: Error): Response { + return new Response( + JSON.stringify({ + statusCode: 500, + error: 'Internal Server Error', + message: isDevMode() ? error.message : 'Internal Server Error', + ...(isDevMode() && { + stack: error.stack, + details: { errorName: error.name }, + }), + }), + { + status: 500, + headers: { 'Content-Type': 'application/json' }, + } + ); + } + #handleHttpMethod( method: HttpMethod, path: Path, diff --git a/packages/event-handler/src/rest/errors.ts b/packages/event-handler/src/rest/errors.ts index 426566d088..f03421bc9c 100644 --- a/packages/event-handler/src/rest/errors.ts +++ b/packages/event-handler/src/rest/errors.ts @@ -19,12 +19,12 @@ export class ParameterValidationError extends RouteMatchingError { } } -abstract class ServiceError extends Error { +export abstract class ServiceError extends Error { abstract readonly statusCode: HttpStatusCode; abstract readonly errorType: string; public readonly details?: Record; - constructor( + protected constructor( message?: string, options?: ErrorOptions, details?: Record diff --git a/packages/event-handler/src/types/rest.ts b/packages/event-handler/src/types/rest.ts index ffe71f3c89..d2da7239b3 100644 --- a/packages/event-handler/src/types/rest.ts +++ b/packages/event-handler/src/types/rest.ts @@ -20,7 +20,7 @@ interface ErrorContext { type ErrorHandler = ( error: T, context?: ErrorContext -) => ErrorResponse; +) => Promise; interface ErrorConstructor { new (...args: any[]): T; diff --git a/packages/event-handler/tests/unit/rest/BaseRouter.test.ts b/packages/event-handler/tests/unit/rest/BaseRouter.test.ts index ed63c0249b..4326b7da6f 100644 --- a/packages/event-handler/tests/unit/rest/BaseRouter.test.ts +++ b/packages/event-handler/tests/unit/rest/BaseRouter.test.ts @@ -3,7 +3,12 @@ import type { Context } from 'aws-lambda'; import { beforeEach, describe, expect, it, vi } from 'vitest'; import { BaseRouter } from '../../../src/rest/BaseRouter.js'; import { HttpErrorCodes, HttpVerbs } from '../../../src/rest/constants.js'; -import { BadRequestError } from '../../../src/rest/errors.js'; +import { + BadRequestError, + InternalServerError, + MethodNotAllowedError, + NotFoundError, +} from '../../../src/rest/errors.js'; import type { HttpMethod, Path, @@ -35,12 +40,17 @@ describe('Class: BaseRouter', () => { } } - public resolve(event: unknown, context: Context): Promise { + public async resolve(event: unknown, context: Context): Promise { this.#isEvent(event); const { method, path } = event; const route = this.routeRegistry.resolve(method, path); - if (route == null) throw new Error('404'); - return route.handler(event, context); + try { + if (route == null) + throw new NotFoundError(`Route ${method} ${path} not found`); + return route.handler(event, context); + } catch (error) { + return await this.handleError(error as Error); + } } } @@ -215,27 +225,369 @@ describe('Class: BaseRouter', () => { }); }); - it('handles errors through registered error handlers', async () => { - // Prepare - class TestRouterWithErrorAccess extends TestResolver { - get testErrorHandlerRegistry() { - return this.errorHandlerRegistry; - } - } + describe('error handling', () => { + it('calls registered error handler when BadRequestError is thrown', async () => { + // Prepare + const app = new TestResolver(); + + app.errorHandler(BadRequestError, async (error) => ({ + statusCode: HttpErrorCodes.BAD_REQUEST, + error: 'Bad Request', + message: `Handled: ${error.message}`, + })); + + app.get('/test', () => { + throw new BadRequestError('test error'); + }); - const app = new TestRouterWithErrorAccess(); - const errorHandler = (error: BadRequestError) => ({ - statusCode: HttpErrorCodes.BAD_REQUEST, - error: error.name, - message: `Handled: ${error.message}`, + // Act + const result = (await app.resolve( + { path: '/test', method: 'GET' }, + context + )) as Response; + + // Assess + expect(result).toBeInstanceOf(Response); + expect(result.status).toBe(HttpErrorCodes.BAD_REQUEST); + expect(await result.text()).toBe( + JSON.stringify({ + statusCode: HttpErrorCodes.BAD_REQUEST, + error: 'Bad Request', + message: 'Handled: test error', + }) + ); }); - app.errorHandler(BadRequestError, errorHandler); + it('calls notFound handler when route is not found', async () => { + // Prepare + const app = new TestResolver(); - // Act & Assess - const registeredHandler = app.testErrorHandlerRegistry.resolve( - new BadRequestError('test') - ); - expect(registeredHandler).toBe(errorHandler); + app.notFound(async (error) => ({ + statusCode: HttpErrorCodes.NOT_FOUND, + error: 'Not Found', + message: `Custom: ${error.message}`, + })); + + // Act + const result = (await app.resolve( + { path: '/nonexistent', method: 'GET' }, + context + )) as Response; + + // Assess + expect(result).toBeInstanceOf(Response); + expect(result.status).toBe(HttpErrorCodes.NOT_FOUND); + expect(await result.text()).toBe( + JSON.stringify({ + statusCode: HttpErrorCodes.NOT_FOUND, + error: 'Not Found', + message: 'Custom: Route GET /nonexistent not found', + }) + ); + }); + + it('calls methodNotAllowed handler when MethodNotAllowedError is thrown', async () => { + // Prepare + const app = new TestResolver(); + + app.methodNotAllowed(async (error) => ({ + statusCode: HttpErrorCodes.METHOD_NOT_ALLOWED, + error: 'Method Not Allowed', + message: `Custom: ${error.message}`, + })); + + app.get('/test', () => { + throw new MethodNotAllowedError('POST not allowed'); + }); + + // Act + const result = (await app.resolve( + { path: '/test', method: 'GET' }, + context + )) as Response; + + // Assess + expect(result).toBeInstanceOf(Response); + expect(result.status).toBe(HttpErrorCodes.METHOD_NOT_ALLOWED); + expect(await result.text()).toBe( + JSON.stringify({ + statusCode: HttpErrorCodes.METHOD_NOT_ALLOWED, + error: 'Method Not Allowed', + message: 'Custom: POST not allowed', + }) + ); + }); + + it('falls back to default error handler when registered handler throws', async () => { + // Prepare + const app = new TestResolver(); + + app.errorHandler(BadRequestError, async () => { + throw new Error('Handler failed'); + }); + + app.get('/test', () => { + throw new BadRequestError('original error'); + }); + + // Act + const result = (await app.resolve( + { path: '/test', method: 'GET' }, + context + )) as Response; + + // Assess + expect(result).toBeInstanceOf(Response); + expect(result.status).toBe(HttpErrorCodes.INTERNAL_SERVER_ERROR); + const body = await result.json(); + expect(body.statusCode).toBe(HttpErrorCodes.INTERNAL_SERVER_ERROR); + expect(body.error).toBe('Internal Server Error'); + expect(body.message).toBe('Internal Server Error'); + }); + + it('uses default handling when no error handler is registered', async () => { + // Prepare + const app = new TestResolver(); + + app.get('/test', () => { + throw new Error('unhandled error'); + }); + + // Act + const result = (await app.resolve( + { path: '/test', method: 'GET' }, + context + )) as Response; + + // Assess + expect(result).toBeInstanceOf(Response); + expect(result.status).toBe(HttpErrorCodes.INTERNAL_SERVER_ERROR); + const body = await result.json(); + expect(body.statusCode).toBe(HttpErrorCodes.INTERNAL_SERVER_ERROR); + expect(body.error).toBe('Internal Server Error'); + expect(body.message).toBe('Internal Server Error'); + }); + + it('calls most specific error handler when multiple handlers match', async () => { + // Prepare + const app = new TestResolver(); + + app.errorHandler(Error, async () => ({ + statusCode: HttpErrorCodes.INTERNAL_SERVER_ERROR, + error: 'Generic Error', + message: 'Generic handler', + })); + + app.errorHandler(BadRequestError, async () => ({ + statusCode: HttpErrorCodes.BAD_REQUEST, + error: 'Bad Request', + message: 'Specific handler', + })); + + app.get('/test', () => { + throw new BadRequestError('test error'); + }); + + // Act + const result = (await app.resolve( + { path: '/test', method: 'GET' }, + context + )) as Response; + + // Assess + expect(result).toBeInstanceOf(Response); + expect(result.status).toBe(HttpErrorCodes.BAD_REQUEST); + expect(await result.text()).toBe( + JSON.stringify({ + statusCode: HttpErrorCodes.BAD_REQUEST, + error: 'Bad Request', + message: 'Specific handler', + }) + ); + }); + + it('uses ServiceError toJSON method when no custom handler is registered', async () => { + // Prepare + const app = new TestResolver(); + + app.get('/test', () => { + throw new InternalServerError('service error'); + }); + + // Act + const result = (await app.resolve( + { path: '/test', method: 'GET' }, + context + )) as Response; + + // Assess + expect(result).toBeInstanceOf(Response); + expect(result.status).toBe(HttpErrorCodes.INTERNAL_SERVER_ERROR); + expect(await result.text()).toBe( + JSON.stringify({ + statusCode: HttpErrorCodes.INTERNAL_SERVER_ERROR, + error: 'InternalServerError', + message: 'service error', + }) + ); + }); + + it('hides error details when POWERTOOLS_DEV env var is not set', async () => { + // Prepare + const app = new TestResolver(); + + app.get('/test', () => { + throw new Error('sensitive error details'); + }); + + // Act + const result = (await app.resolve( + { path: '/test', method: 'GET' }, + context + )) as Response; + + // Assess + expect(result).toBeInstanceOf(Response); + expect(result.status).toBe(HttpErrorCodes.INTERNAL_SERVER_ERROR); + const body = await result.json(); + expect(body.statusCode).toBe(HttpErrorCodes.INTERNAL_SERVER_ERROR); + expect(body.error).toBe('Internal Server Error'); + expect(body.message).toBe('Internal Server Error'); + expect(body.stack).toBeUndefined(); + expect(body.details).toBeUndefined(); + }); + + it('shows error details in development mode', async () => { + // Prepare + vi.stubEnv('POWERTOOLS_DEV', 'true'); + const app = new TestResolver(); + + app.get('/test', () => { + throw new Error('debug error details'); + }); + + // Act + const result = (await app.resolve( + { path: '/test', method: 'GET' }, + context + )) as Response; + + // Assess + expect(result).toBeInstanceOf(Response); + expect(result.status).toBe(HttpErrorCodes.INTERNAL_SERVER_ERROR); + const body = await result.json(); + expect(body.statusCode).toBe(HttpErrorCodes.INTERNAL_SERVER_ERROR); + expect(body.error).toBe('Internal Server Error'); + expect(body.message).toBe('debug error details'); + expect(body.stack).toBeDefined(); + expect(body.details).toBeDefined(); + expect(body.details.errorName).toBe('Error'); + }); + + it('accepts array of error types for single handler', async () => { + // Prepare + const app = new TestResolver(); + + app.errorHandler( + [BadRequestError, MethodNotAllowedError], + async (error: Error) => ({ + statusCode: HttpErrorCodes.UNPROCESSABLE_ENTITY, + error: 'Validation Error', + message: `Array handler: ${error.message}`, + }) + ); + + app.get('/bad', () => { + throw new BadRequestError('bad request'); + }); + + app.get('/method', () => { + throw new MethodNotAllowedError('method not allowed'); + }); + + // Act + const badResult = (await app.resolve( + { path: '/bad', method: 'GET' }, + context + )) as Response; + const methodResult = (await app.resolve( + { path: '/method', method: 'GET' }, + context + )) as Response; + + // Assess + expect(badResult.status).toBe(HttpErrorCodes.UNPROCESSABLE_ENTITY); + expect(await badResult.json()).toEqual({ + statusCode: HttpErrorCodes.UNPROCESSABLE_ENTITY, + error: 'Validation Error', + message: 'Array handler: bad request', + }); + + expect(methodResult.status).toBe(HttpErrorCodes.UNPROCESSABLE_ENTITY); + expect(await methodResult.json()).toEqual({ + statusCode: HttpErrorCodes.UNPROCESSABLE_ENTITY, + error: 'Validation Error', + message: 'Array handler: method not allowed', + }); + }); + + it('replaces previous handler when registering new handler for same error type', async () => { + // Prepare + const app = new TestResolver(); + + app.errorHandler(BadRequestError, async () => ({ + statusCode: HttpErrorCodes.BAD_REQUEST, + error: 'First Handler', + message: 'first', + })); + + app.errorHandler(BadRequestError, async (error) => ({ + statusCode: HttpErrorCodes.UNPROCESSABLE_ENTITY, + error: 'Second Handler', + message: `second: ${error.message}`, + })); + + app.get('/test', () => { + throw new BadRequestError('test error'); + }); + + // Act + const result = (await app.resolve( + { path: '/test', method: 'GET' }, + context + )) as Response; + + // Assess + expect(result.status).toBe(HttpErrorCodes.UNPROCESSABLE_ENTITY); + expect(await result.json()).toEqual({ + statusCode: HttpErrorCodes.UNPROCESSABLE_ENTITY, + error: 'Second Handler', + message: 'second: test error', + }); + }); + + it('returns response with correct Content-Type header', async () => { + // Prepare + const app = new TestResolver(); + + app.errorHandler(BadRequestError, async (error) => ({ + statusCode: HttpErrorCodes.BAD_REQUEST, + error: 'Bad Request', + message: error.message, + })); + + app.get('/test', () => { + throw new BadRequestError('test error'); + }); + + // Act + const result = (await app.resolve( + { path: '/test', method: 'GET' }, + context + )) as Response; + + // Assess + expect(result.headers.get('Content-Type')).toBe('application/json'); + }); }); }); From b74b3b4d1102e8d33c677d2c73ddc355717c4cef Mon Sep 17 00:00:00 2001 From: Max Opperman <38913283+MaxOpperman@users.noreply.github.com> Date: Wed, 13 Aug 2025 14:35:03 +0200 Subject: [PATCH 08/15] improv(logger): resolve issue when no logger region is set (#4319) --- packages/logger/src/Logger.ts | 1 + .../tests/unit/setPowertoolsLogData.test.ts | 44 +++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 packages/logger/tests/unit/setPowertoolsLogData.test.ts diff --git a/packages/logger/src/Logger.ts b/packages/logger/src/Logger.ts index 265f8ab76a..cc00e6ee8a 100644 --- a/packages/logger/src/Logger.ts +++ b/packages/logger/src/Logger.ts @@ -1362,6 +1362,7 @@ class Logger extends Utility implements LoggerInterface { this.addToPowertoolsLogData({ awsRegion: getStringFromEnv({ key: 'AWS_REGION', + defaultValue: '', }), environment: environment || diff --git a/packages/logger/tests/unit/setPowertoolsLogData.test.ts b/packages/logger/tests/unit/setPowertoolsLogData.test.ts new file mode 100644 index 0000000000..696aec4438 --- /dev/null +++ b/packages/logger/tests/unit/setPowertoolsLogData.test.ts @@ -0,0 +1,44 @@ +import { Logger } from '../../src/Logger.js'; +import { describe, it, expect, vi, afterEach } from 'vitest'; + +describe('Logger PowertoolsLogData environment variables', () => { + afterEach(() => { + vi.unstubAllEnvs(); + }); + + it.each([ + [undefined, ''], + ['us-west-2', 'us-west-2'], + ])('sets awsRegion to %s when AWS_REGION env var is %s', (envValue, expected) => { + // Prepare + vi.stubEnv('AWS_REGION', envValue); + // Act + const logger = new Logger(); + // Assess + expect(logger['powertoolsLogData'].awsRegion).toBe(expected); + }); + + it.each([ + [undefined, ''], + ['prd', 'prd'], + ])('sets environment to %s when ENVIRONMENT env var is %s', (envValue, expected) => { + // Prepare + vi.stubEnv('ENVIRONMENT', envValue); + // Act + const logger = new Logger(); + // Assess + expect(logger['powertoolsLogData'].environment).toBe(expected); + }); + + it.each([ + [undefined, 'service_undefined'], + ['my-service', 'my-service'], + ])('sets serviceName to %s when POWERTOOLS_SERVICE_NAME env var is %s', (envValue, expected) => { + // Prepare + vi.stubEnv('POWERTOOLS_SERVICE_NAME', envValue); + // Act + const logger = new Logger(); + // Assess + expect(logger['powertoolsLogData'].serviceName).toBe(expected); + }); +}); \ No newline at end of file From 01575f133742e877a18b9c511041dc5e44ec816b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 13 Aug 2025 15:07:27 +0100 Subject: [PATCH 09/15] chore(deps-dev): bump @redis/client from 5.8.0 to 5.8.1 (#4324) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- examples/snippets/package.json | 2 +- package-lock.json | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/snippets/package.json b/examples/snippets/package.json index 4c90dce099..4130b3201a 100644 --- a/examples/snippets/package.json +++ b/examples/snippets/package.json @@ -39,7 +39,7 @@ "@aws-sdk/client-ssm": "^3.864.0", "@aws-sdk/util-dynamodb": "^3.864.0", "@middy/core": "^4.7.0", - "@redis/client": "^5.8.0", + "@redis/client": "^5.8.1", "@valkey/valkey-glide": "^2.0.1", "aws-sdk": "^2.1692.0", "aws-sdk-client-mock": "^4.1.0", diff --git a/package-lock.json b/package-lock.json index c7fbc4e4a0..75ea466d24 100644 --- a/package-lock.json +++ b/package-lock.json @@ -101,7 +101,7 @@ "@aws-sdk/client-ssm": "^3.864.0", "@aws-sdk/util-dynamodb": "^3.864.0", "@middy/core": "^4.7.0", - "@redis/client": "^5.8.0", + "@redis/client": "^5.8.1", "@valkey/valkey-glide": "^2.0.1", "aws-sdk": "^2.1692.0", "aws-sdk-client-mock": "^4.1.0", @@ -3847,9 +3847,9 @@ "license": "BSD-3-Clause" }, "node_modules/@redis/client": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@redis/client/-/client-5.8.0.tgz", - "integrity": "sha512-ywZjKGoSSAECGYOd9bJpws6d4867SN686obUWT/sRmo1c/Q8V+jWyInvlqwKa0BOvTHHwYeB2WFUEvd6PADeOQ==", + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-5.8.1.tgz", + "integrity": "sha512-hD5Tvv7G0t8b3w8ao3kQ4jEPUmUUC6pqA18c8ciYF5xZGfUGBg0olQHW46v6qSt4O5bxOuB3uV7pM6H5wEjBwA==", "devOptional": true, "license": "MIT", "dependencies": { From 5bb23ad0e4d545799af3ea465950258e0ba9a8bb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 13 Aug 2025 15:11:01 +0100 Subject: [PATCH 10/15] chore(deps): bump esbuild from 0.25.8 to 0.25.9 (#4325) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stefano Vozza --- examples/app/package.json | 2 +- layers/package.json | 2 +- package-lock.json | 220 +++++++++++++++++----------------- packages/testing/package.json | 2 +- 4 files changed, 113 insertions(+), 113 deletions(-) diff --git a/examples/app/package.json b/examples/app/package.json index d279180c59..0fd9c3a48c 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -51,7 +51,7 @@ "@types/node": "24.2.1", "aws-cdk": "^2.1024.0", "constructs": "^10.4.2", - "esbuild": "^0.25.8", + "esbuild": "^0.25.9", "typescript": "^5.9.2" } } diff --git a/layers/package.json b/layers/package.json index ce91a4936c..e0d10d3812 100644 --- a/layers/package.json +++ b/layers/package.json @@ -42,7 +42,7 @@ "dependencies": { "aws-cdk": "^2.1024.0", "aws-cdk-lib": "^2.210.0", - "esbuild": "^0.25.8", + "esbuild": "^0.25.9", "tsx": "^4.20.4" } } diff --git a/package-lock.json b/package-lock.json index 75ea466d24..8ae01527d4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -63,7 +63,7 @@ "@types/node": "24.2.1", "aws-cdk": "^2.1024.0", "constructs": "^10.4.2", - "esbuild": "^0.25.8", + "esbuild": "^0.25.9", "typescript": "^5.9.2" }, "devDependencies": { @@ -136,7 +136,7 @@ "dependencies": { "aws-cdk": "^2.1024.0", "aws-cdk-lib": "^2.210.0", - "esbuild": "^0.25.8", + "esbuild": "^0.25.9", "tsx": "^4.20.4" }, "bin": { @@ -3119,9 +3119,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.8.tgz", - "integrity": "sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", + "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==", "cpu": [ "ppc64" ], @@ -3135,9 +3135,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.8.tgz", - "integrity": "sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz", + "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==", "cpu": [ "arm" ], @@ -3151,9 +3151,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.8.tgz", - "integrity": "sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz", + "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==", "cpu": [ "arm64" ], @@ -3167,9 +3167,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.8.tgz", - "integrity": "sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz", + "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==", "cpu": [ "x64" ], @@ -3183,9 +3183,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.8.tgz", - "integrity": "sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz", + "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==", "cpu": [ "arm64" ], @@ -3199,9 +3199,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.8.tgz", - "integrity": "sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz", + "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==", "cpu": [ "x64" ], @@ -3215,9 +3215,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.8.tgz", - "integrity": "sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz", + "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==", "cpu": [ "arm64" ], @@ -3231,9 +3231,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.8.tgz", - "integrity": "sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz", + "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==", "cpu": [ "x64" ], @@ -3247,9 +3247,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.8.tgz", - "integrity": "sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz", + "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==", "cpu": [ "arm" ], @@ -3263,9 +3263,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.8.tgz", - "integrity": "sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz", + "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==", "cpu": [ "arm64" ], @@ -3279,9 +3279,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.8.tgz", - "integrity": "sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz", + "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==", "cpu": [ "ia32" ], @@ -3295,9 +3295,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.8.tgz", - "integrity": "sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz", + "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==", "cpu": [ "loong64" ], @@ -3311,9 +3311,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.8.tgz", - "integrity": "sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz", + "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==", "cpu": [ "mips64el" ], @@ -3327,9 +3327,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.8.tgz", - "integrity": "sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz", + "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==", "cpu": [ "ppc64" ], @@ -3343,9 +3343,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.8.tgz", - "integrity": "sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz", + "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==", "cpu": [ "riscv64" ], @@ -3359,9 +3359,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.8.tgz", - "integrity": "sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz", + "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==", "cpu": [ "s390x" ], @@ -3375,9 +3375,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.8.tgz", - "integrity": "sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz", + "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==", "cpu": [ "x64" ], @@ -3391,9 +3391,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.8.tgz", - "integrity": "sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz", + "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==", "cpu": [ "arm64" ], @@ -3407,9 +3407,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.8.tgz", - "integrity": "sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz", + "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==", "cpu": [ "x64" ], @@ -3423,9 +3423,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.8.tgz", - "integrity": "sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz", + "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==", "cpu": [ "arm64" ], @@ -3439,9 +3439,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.8.tgz", - "integrity": "sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz", + "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==", "cpu": [ "x64" ], @@ -3455,9 +3455,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.8.tgz", - "integrity": "sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz", + "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==", "cpu": [ "arm64" ], @@ -3471,9 +3471,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.8.tgz", - "integrity": "sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz", + "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==", "cpu": [ "x64" ], @@ -3487,9 +3487,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.8.tgz", - "integrity": "sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz", + "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==", "cpu": [ "arm64" ], @@ -3503,9 +3503,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.8.tgz", - "integrity": "sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz", + "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==", "cpu": [ "ia32" ], @@ -3519,9 +3519,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.8.tgz", - "integrity": "sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", + "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", "cpu": [ "x64" ], @@ -7235,9 +7235,9 @@ "license": "MIT" }, "node_modules/esbuild": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.8.tgz", - "integrity": "sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", + "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", "hasInstallScript": true, "license": "MIT", "bin": { @@ -7247,32 +7247,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.8", - "@esbuild/android-arm": "0.25.8", - "@esbuild/android-arm64": "0.25.8", - "@esbuild/android-x64": "0.25.8", - "@esbuild/darwin-arm64": "0.25.8", - "@esbuild/darwin-x64": "0.25.8", - "@esbuild/freebsd-arm64": "0.25.8", - "@esbuild/freebsd-x64": "0.25.8", - "@esbuild/linux-arm": "0.25.8", - "@esbuild/linux-arm64": "0.25.8", - "@esbuild/linux-ia32": "0.25.8", - "@esbuild/linux-loong64": "0.25.8", - "@esbuild/linux-mips64el": "0.25.8", - "@esbuild/linux-ppc64": "0.25.8", - "@esbuild/linux-riscv64": "0.25.8", - "@esbuild/linux-s390x": "0.25.8", - "@esbuild/linux-x64": "0.25.8", - "@esbuild/netbsd-arm64": "0.25.8", - "@esbuild/netbsd-x64": "0.25.8", - "@esbuild/openbsd-arm64": "0.25.8", - "@esbuild/openbsd-x64": "0.25.8", - "@esbuild/openharmony-arm64": "0.25.8", - "@esbuild/sunos-x64": "0.25.8", - "@esbuild/win32-arm64": "0.25.8", - "@esbuild/win32-ia32": "0.25.8", - "@esbuild/win32-x64": "0.25.8" + "@esbuild/aix-ppc64": "0.25.9", + "@esbuild/android-arm": "0.25.9", + "@esbuild/android-arm64": "0.25.9", + "@esbuild/android-x64": "0.25.9", + "@esbuild/darwin-arm64": "0.25.9", + "@esbuild/darwin-x64": "0.25.9", + "@esbuild/freebsd-arm64": "0.25.9", + "@esbuild/freebsd-x64": "0.25.9", + "@esbuild/linux-arm": "0.25.9", + "@esbuild/linux-arm64": "0.25.9", + "@esbuild/linux-ia32": "0.25.9", + "@esbuild/linux-loong64": "0.25.9", + "@esbuild/linux-mips64el": "0.25.9", + "@esbuild/linux-ppc64": "0.25.9", + "@esbuild/linux-riscv64": "0.25.9", + "@esbuild/linux-s390x": "0.25.9", + "@esbuild/linux-x64": "0.25.9", + "@esbuild/netbsd-arm64": "0.25.9", + "@esbuild/netbsd-x64": "0.25.9", + "@esbuild/openbsd-arm64": "0.25.9", + "@esbuild/openbsd-x64": "0.25.9", + "@esbuild/openharmony-arm64": "0.25.9", + "@esbuild/sunos-x64": "0.25.9", + "@esbuild/win32-arm64": "0.25.9", + "@esbuild/win32-ia32": "0.25.9", + "@esbuild/win32-x64": "0.25.9" } }, "node_modules/estree-walker": { @@ -10956,7 +10956,7 @@ "@aws-sdk/client-lambda": "^3.865.0", "@smithy/util-utf8": "^4.0.0", "aws-cdk-lib": "^2.210.0", - "esbuild": "^0.25.8", + "esbuild": "^0.25.9", "promise-retry": "^2.0.1" }, "devDependencies": { diff --git a/packages/testing/package.json b/packages/testing/package.json index 5720986879..6dc94a5b10 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -101,7 +101,7 @@ "@aws-sdk/client-lambda": "^3.865.0", "@smithy/util-utf8": "^4.0.0", "aws-cdk-lib": "^2.210.0", - "esbuild": "^0.25.8", + "esbuild": "^0.25.9", "promise-retry": "^2.0.1" }, "devDependencies": { From 562747a4c415ea2225529e5e276269e87c7b08b9 Mon Sep 17 00:00:00 2001 From: Stefano Vozza Date: Wed, 13 Aug 2025 18:01:39 +0100 Subject: [PATCH 11/15] feat(event-handler): add decorator functionality for error handlers (#4323) --- packages/event-handler/src/rest/BaseRouter.ts | 62 +++++- .../tests/unit/rest/BaseRouter.test.ts | 186 +++++++++++++++++- 2 files changed, 237 insertions(+), 11 deletions(-) diff --git a/packages/event-handler/src/rest/BaseRouter.ts b/packages/event-handler/src/rest/BaseRouter.ts index 85b6aa44ec..76a1dc45f6 100644 --- a/packages/event-handler/src/rest/BaseRouter.ts +++ b/packages/event-handler/src/rest/BaseRouter.ts @@ -68,8 +68,23 @@ abstract class BaseRouter { public errorHandler( errorType: ErrorConstructor | ErrorConstructor[], handler: ErrorHandler - ): void { - this.errorHandlerRegistry.register(errorType, handler); + ): void; + public errorHandler( + errorType: ErrorConstructor | ErrorConstructor[] + ): MethodDecorator; + public errorHandler( + errorType: ErrorConstructor | ErrorConstructor[], + handler?: ErrorHandler + ): MethodDecorator | undefined { + if (handler && typeof handler === 'function') { + this.errorHandlerRegistry.register(errorType, handler); + return; + } + + return (_target, _propertyKey, descriptor: PropertyDescriptor) => { + this.errorHandlerRegistry.register(errorType, descriptor?.value); + return descriptor; + }; } /** @@ -77,8 +92,20 @@ abstract class BaseRouter { * * @param handler - The error handler function for NotFoundError */ - public notFound(handler: ErrorHandler): void { - this.errorHandlerRegistry.register(NotFoundError, handler); + public notFound(handler: ErrorHandler): void; + public notFound(): MethodDecorator; + public notFound( + handler?: ErrorHandler + ): MethodDecorator | undefined { + if (handler && typeof handler === 'function') { + this.errorHandlerRegistry.register(NotFoundError, handler); + return; + } + + return (_target, _propertyKey, descriptor: PropertyDescriptor) => { + this.errorHandlerRegistry.register(NotFoundError, descriptor?.value); + return descriptor; + }; } /** @@ -86,8 +113,23 @@ abstract class BaseRouter { * * @param handler - The error handler function for MethodNotAllowedError */ - public methodNotAllowed(handler: ErrorHandler): void { - this.errorHandlerRegistry.register(MethodNotAllowedError, handler); + public methodNotAllowed(handler: ErrorHandler): void; + public methodNotAllowed(): MethodDecorator; + public methodNotAllowed( + handler?: ErrorHandler + ): MethodDecorator | undefined { + if (handler && typeof handler === 'function') { + this.errorHandlerRegistry.register(MethodNotAllowedError, handler); + return; + } + + return (_target, _propertyKey, descriptor: PropertyDescriptor) => { + this.errorHandlerRegistry.register( + MethodNotAllowedError, + descriptor?.value + ); + return descriptor; + }; } public abstract resolve( @@ -110,13 +152,17 @@ abstract class BaseRouter { * back to a default handler. * * @param error - The error to handle + * @param options - Optional resolve options for scope binding * @returns A Response object with appropriate status code and error details */ - protected async handleError(error: Error): Promise { + protected async handleError( + error: Error, + options?: ResolveOptions + ): Promise { const handler = this.errorHandlerRegistry.resolve(error); if (handler !== null) { try { - const body = await handler(error); + const body = await handler.apply(options?.scope ?? this, [error]); return new Response(JSON.stringify(body), { status: body.statusCode, headers: { 'Content-Type': 'application/json' }, diff --git a/packages/event-handler/tests/unit/rest/BaseRouter.test.ts b/packages/event-handler/tests/unit/rest/BaseRouter.test.ts index 4326b7da6f..8033b50d22 100644 --- a/packages/event-handler/tests/unit/rest/BaseRouter.test.ts +++ b/packages/event-handler/tests/unit/rest/BaseRouter.test.ts @@ -40,16 +40,20 @@ describe('Class: BaseRouter', () => { } } - public async resolve(event: unknown, context: Context): Promise { + public async resolve( + event: unknown, + context: Context, + options?: any + ): Promise { this.#isEvent(event); const { method, path } = event; const route = this.routeRegistry.resolve(method, path); try { if (route == null) throw new NotFoundError(`Route ${method} ${path} not found`); - return route.handler(event, context); + return await route.handler(event, context); } catch (error) { - return await this.handleError(error as Error); + return await this.handleError(error as Error, options); } } } @@ -590,4 +594,180 @@ describe('Class: BaseRouter', () => { expect(result.headers.get('Content-Type')).toBe('application/json'); }); }); + + describe('decorators error handling', () => { + it('works with errorHandler decorator', async () => { + // Prepare + const app = new TestResolver(); + + class Lambda { + @app.errorHandler(BadRequestError) + public async handleBadRequest(error: BadRequestError) { + return { + statusCode: HttpErrorCodes.BAD_REQUEST, + error: 'Bad Request', + message: `Decorated: ${error.message}`, + }; + } + + @app.get('/test') + public async getTest() { + throw new BadRequestError('test error'); + } + + public async handler(event: unknown, context: Context) { + return app.resolve(event, context); + } + } + + const lambda = new Lambda(); + + // Act + const result = (await lambda.handler( + { path: '/test', method: 'GET' }, + context + )) as Response; + + // Assess + expect(result).toBeInstanceOf(Response); + expect(result.status).toBe(HttpErrorCodes.BAD_REQUEST); + expect(await result.text()).toBe( + JSON.stringify({ + statusCode: HttpErrorCodes.BAD_REQUEST, + error: 'Bad Request', + message: 'Decorated: test error', + }) + ); + }); + + it('works with notFound decorator', async () => { + // Prepare + const app = new TestResolver(); + + class Lambda { + @app.notFound() + public async handleNotFound(error: NotFoundError) { + return { + statusCode: HttpErrorCodes.NOT_FOUND, + error: 'Not Found', + message: `Decorated: ${error.message}`, + }; + } + + public async handler(event: unknown, context: Context) { + return app.resolve(event, context); + } + } + + const lambda = new Lambda(); + + // Act + const result = (await lambda.handler( + { path: '/nonexistent', method: 'GET' }, + context + )) as Response; + + // Assess + expect(result).toBeInstanceOf(Response); + expect(result.status).toBe(HttpErrorCodes.NOT_FOUND); + expect(await result.text()).toBe( + JSON.stringify({ + statusCode: HttpErrorCodes.NOT_FOUND, + error: 'Not Found', + message: 'Decorated: Route GET /nonexistent not found', + }) + ); + }); + + it('works with methodNotAllowed decorator', async () => { + // Prepare + const app = new TestResolver(); + + class Lambda { + @app.methodNotAllowed() + public async handleMethodNotAllowed(error: MethodNotAllowedError) { + return { + statusCode: HttpErrorCodes.METHOD_NOT_ALLOWED, + error: 'Method Not Allowed', + message: `Decorated: ${error.message}`, + }; + } + + @app.get('/test') + public async getTest() { + throw new MethodNotAllowedError('POST not allowed'); + } + + public async handler(event: unknown, context: Context) { + return app.resolve(event, context); + } + } + + const lambda = new Lambda(); + + // Act + const result = (await lambda.handler( + { path: '/test', method: 'GET' }, + context + )) as Response; + + // Assess + expect(result).toBeInstanceOf(Response); + expect(result.status).toBe(HttpErrorCodes.METHOD_NOT_ALLOWED); + expect(await result.text()).toBe( + JSON.stringify({ + statusCode: HttpErrorCodes.METHOD_NOT_ALLOWED, + error: 'Method Not Allowed', + message: 'Decorated: POST not allowed', + }) + ); + }); + + it('preserves scope when using error handler decorators', async () => { + // Prepare + const app = new TestResolver(); + + class Lambda { + public scope = 'scoped'; + + @app.errorHandler(BadRequestError) + public async handleBadRequest(error: BadRequestError) { + return { + statusCode: HttpErrorCodes.BAD_REQUEST, + error: 'Bad Request', + message: `${this.scope}: ${error.message}`, + }; + } + + @app.get('/test') + public async getTest() { + throw new BadRequestError('test error'); + } + + public async handler(event: unknown, context: Context) { + return app.resolve(event, context, { scope: this }); + } + } + + const lambda = new Lambda(); + const handler = lambda.handler.bind(lambda); + + // Act + const result = (await handler( + { path: '/test', method: 'GET' }, + context + )) as Response; + + // Assess + expect(result).toBeInstanceOf(Response); + expect(result.status).toBe(HttpErrorCodes.BAD_REQUEST); + expect(await result.text()).toBe( + JSON.stringify({ + statusCode: HttpErrorCodes.BAD_REQUEST, + error: 'Bad Request', + message: 'scoped: test error', + }) + ); + }); + }); }); From 17845d0de45508388100aefdbe42d1e0d9a02522 Mon Sep 17 00:00:00 2001 From: Swopnil Dangol Date: Wed, 13 Aug 2025 20:33:45 +0100 Subject: [PATCH 12/15] improv(idempotency): Prevent error when AWS_LAMBDA_FUNCTION_NAME is not passed in the Idempotency Persistence Layer (#4327) Co-authored-by: Andrea Amorosi --- .../src/persistence/BasePersistenceLayer.ts | 4 ++-- .../persistence/BasePersistenceLayer.test.ts | 21 +++++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/packages/idempotency/src/persistence/BasePersistenceLayer.ts b/packages/idempotency/src/persistence/BasePersistenceLayer.ts index 55c9e34418..e55e38feae 100644 --- a/packages/idempotency/src/persistence/BasePersistenceLayer.ts +++ b/packages/idempotency/src/persistence/BasePersistenceLayer.ts @@ -1,7 +1,7 @@ import { createHash, type Hash } from 'node:crypto'; import type { JSONValue } from '@aws-lambda-powertools/commons/types'; -import { LRUCache } from '@aws-lambda-powertools/commons/utils/lru-cache'; import { getStringFromEnv } from '@aws-lambda-powertools/commons/utils/env'; +import { LRUCache } from '@aws-lambda-powertools/commons/utils/lru-cache'; import { search } from '@aws-lambda-powertools/jmespath'; import type { JMESPathParsingOptions } from '@aws-lambda-powertools/jmespath/types'; import { IdempotencyRecordStatus } from '../constants.js'; @@ -39,7 +39,7 @@ abstract class BasePersistenceLayer implements BasePersistenceLayerInterface { public constructor() { this.idempotencyKeyPrefix = getStringFromEnv({ key: 'AWS_LAMBDA_FUNCTION_NAME', - errorMessage: 'AWS_LAMBDA_FUNCTION_NAME environment variable is required', + defaultValue: '', }); } diff --git a/packages/idempotency/tests/unit/persistence/BasePersistenceLayer.test.ts b/packages/idempotency/tests/unit/persistence/BasePersistenceLayer.test.ts index acd40bcb99..6344a9246a 100644 --- a/packages/idempotency/tests/unit/persistence/BasePersistenceLayer.test.ts +++ b/packages/idempotency/tests/unit/persistence/BasePersistenceLayer.test.ts @@ -63,6 +63,27 @@ describe('Class: BasePersistenceLayer', () => { }) ); }); + + it('initializes with empty key prefix if AWS_LAMBDA_FUNCTION_NAME is not in the environment variable', () => { + // Prepare + vi.stubEnv('AWS_LAMBDA_FUNCTION_NAME', undefined); + + // Act + const persistenceLayer = new PersistenceLayerTestClass(); + + // Assess + expect(persistenceLayer.idempotencyKeyPrefix).toBe(''); + expect(persistenceLayer).toEqual( + expect.objectContaining({ + configured: false, + expiresAfterSeconds: 3600, + hashFunction: 'md5', + payloadValidationEnabled: false, + throwOnNoIdempotencyKey: false, + useLocalCache: false, + }) + ); + }); }); describe('Method: configure', () => { From 65e7b0fb0a7b8e94f8e68a9f18e0ab9b704662c3 Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Thu, 14 Aug 2025 10:10:59 +0200 Subject: [PATCH 13/15] ci: bump version-n-release GitHub Action and modify input values (#4330) --- .github/workflows/make-version.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/make-version.yml b/.github/workflows/make-version.yml index 0e36cda8ab..314c345af9 100644 --- a/.github/workflows/make-version.yml +++ b/.github/workflows/make-version.yml @@ -4,10 +4,11 @@ on: workflow_dispatch: inputs: release-type: - description: 'Release type (major, minor, patch)' + description: 'Release type, if auto it will be determined by the changes since the last tag' required: false type: choice options: + - auto - major - minor - patch @@ -39,13 +40,13 @@ jobs: node-version: ${{ env.NODE_VERSION }} cache: "npm" - name: Setup dependencies - uses: aws-powertools/actions/.github/actions/cached-node-modules@743fa57a003787b157991ea5c6e3cf0d40468676 # v1.4.0 + uses: aws-powertools/actions/.github/actions/cached-node-modules@3b5b8e2e58b7af07994be982e83584a94e8c76c5 # v1.5.0 with: node-version: ${{ env.NODE_VERSION }} build: "false" - name: Version and changelog id: version-n-changelog - uses: aws-powertools/actions/.github/actions/version-n-changelog@743fa57a003787b157991ea5c6e3cf0d40468676 # v1.4.0 + uses: aws-powertools/actions/.github/actions/version-n-changelog@3b5b8e2e58b7af07994be982e83584a94e8c76c5 # v1.5.0 with: release-type: ${{ github.event.inputs.release-type }} - name: Update user agent version @@ -55,7 +56,7 @@ jobs: run: git add . - name: Create PR id: create-pr - uses: aws-powertools/actions/.github/actions/create-pr@743fa57a003787b157991ea5c6e3cf0d40468676 # v1.4.0 + uses: aws-powertools/actions/.github/actions/create-pr@3b5b8e2e58b7af07994be982e83584a94e8c76c5 # v1.5.0 with: temp_branch_prefix: "ci-bump" pull_request_title: "chore(ci): bump version to ${{ steps.version-n-changelog.outputs.new-version }}" From bc436b01c2d535b1c98a3f3a04b5009a38adcb9c Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Thu, 14 Aug 2025 10:35:00 +0200 Subject: [PATCH 14/15] docs: add FraudFalcon customer reference (#4332) --- 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/kafka/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 + packages/validation/README.md | 1 + 14 files changed, 16 insertions(+) diff --git a/README.md b/README.md index 81e8822dc7..a21b68b2b7 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,7 @@ The following companies, among others, use Powertools: - [Certible](https://www.certible.com/) - [Elva](https://elva-group.com) - [Flyweight](https://flyweight.io/) +- [FraudFalcon](https://fraudfalcon.app) - [globaldatanet](https://globaldatanet.com/) - [Guild](https://guild.com) - [Hashnode](https://hashnode.com/) diff --git a/docs/index.md b/docs/index.md index 5ce7348fc6..afd9b5c142 100644 --- a/docs/index.md +++ b/docs/index.md @@ -124,6 +124,9 @@ Knowing which companies are using this library is important to help prioritize t [**Flyweight**](https://flyweight.io/){target="_blank" rel="nofollow"} { .card } +[**FraudFalcon**](https://fraudfalcon.app){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 c517d9db8f..d52de8c4b9 100644 --- a/packages/batch/README.md +++ b/packages/batch/README.md @@ -175,6 +175,7 @@ The following companies, among others, use Powertools: - [Certible](https://www.certible.com/) - [Elva](https://elva-group.com) - [Flyweight](https://flyweight.io/) +- [FraudFalcon](https://fraudfalcon.app) - [globaldatanet](https://globaldatanet.com/) - [Guild](https://guild.com) - [Hashnode](https://hashnode.com/) diff --git a/packages/commons/README.md b/packages/commons/README.md index 4cd336988c..cb969b8d6e 100644 --- a/packages/commons/README.md +++ b/packages/commons/README.md @@ -125,6 +125,7 @@ The following companies, among others, use Powertools: - [Certible](https://www.certible.com/) - [Elva](https://elva-group.com) - [Flyweight](https://flyweight.io/) +- [FraudFalcon](https://fraudfalcon.app) - [globaldatanet](https://globaldatanet.com/) - [Guild](https://guild.com) - [Hashnode](https://hashnode.com/) diff --git a/packages/event-handler/README.md b/packages/event-handler/README.md index 27fa191778..27bd79b460 100644 --- a/packages/event-handler/README.md +++ b/packages/event-handler/README.md @@ -327,6 +327,7 @@ The following companies, among others, use Powertools: * [Certible](https://www.certible.com/) * [Elva](https://elva-group.com) * [Flyweight](https://flyweight.io/) +* [FraudFalcon](https://fraudfalcon.app) * [globaldatanet](https://globaldatanet.com/) * [Guild](https://guild.com) * [Hashnode](https://hashnode.com/) diff --git a/packages/idempotency/README.md b/packages/idempotency/README.md index ae4a20bc68..7d5bd610f3 100644 --- a/packages/idempotency/README.md +++ b/packages/idempotency/README.md @@ -342,6 +342,7 @@ The following companies, among others, use Powertools: - [Certible](https://www.certible.com/) - [Elva](https://elva-group.com) - [Flyweight](https://flyweight.io/) +- [FraudFalcon](https://fraudfalcon.app) - [globaldatanet](https://globaldatanet.com/) - [Guild](https://guild.com) - [Hashnode](https://hashnode.com/) diff --git a/packages/jmespath/README.md b/packages/jmespath/README.md index 2e894884e0..a3f1805715 100644 --- a/packages/jmespath/README.md +++ b/packages/jmespath/README.md @@ -201,6 +201,7 @@ The following companies, among others, use Powertools: - [Certible](https://www.certible.com/) - [Elva](https://elva-group.com) - [Flyweight](https://flyweight.io/) +- [FraudFalcon](https://fraudfalcon.app) - [globaldatanet](https://globaldatanet.com/) - [Guild](https://guild.com) - [Hashnode](https://hashnode.com/) diff --git a/packages/kafka/README.md b/packages/kafka/README.md index e60682ec3a..1143d130bb 100644 --- a/packages/kafka/README.md +++ b/packages/kafka/README.md @@ -280,6 +280,7 @@ The following companies, among others, use Powertools: * [Certible](https://www.certible.com/) * [Elva](https://elva-group.com) * [Flyweight](https://flyweight.io/) +* [FraudFalcon](https://fraudfalcon.app) * [globaldatanet](https://globaldatanet.com/) * [Guild](https://guild.com) * [Hashnode](https://hashnode.com/) diff --git a/packages/logger/README.md b/packages/logger/README.md index 1b845c2457..a40ff7733f 100644 --- a/packages/logger/README.md +++ b/packages/logger/README.md @@ -238,6 +238,7 @@ The following companies, among others, use Powertools: - [Certible](https://www.certible.com/) - [Elva](https://elva-group.com) - [Flyweight](https://flyweight.io/) +- [FraudFalcon](https://fraudfalcon.app) - [globaldatanet](https://globaldatanet.com/) - [Guild](https://guild.com) - [Hashnode](https://hashnode.com/) diff --git a/packages/metrics/README.md b/packages/metrics/README.md index be934279d8..9d6dc17afc 100644 --- a/packages/metrics/README.md +++ b/packages/metrics/README.md @@ -163,6 +163,7 @@ The following companies, among others, use Powertools: - [Certible](https://www.certible.com/) - [Elva](https://elva-group.com) - [Flyweight](https://flyweight.io/) +- [FraudFalcon](https://fraudfalcon.app) - [globaldatanet](https://globaldatanet.com/) - [Guild](https://guild.com) - [Hashnode](https://hashnode.com/) diff --git a/packages/parameters/README.md b/packages/parameters/README.md index a3756b7ee9..539fd33dd7 100644 --- a/packages/parameters/README.md +++ b/packages/parameters/README.md @@ -228,6 +228,7 @@ The following companies, among others, use Powertools: - [Certible](https://www.certible.com/) - [Elva](https://elva-group.com) - [Flyweight](https://flyweight.io/) +- [FraudFalcon](https://fraudfalcon.app) - [globaldatanet](https://globaldatanet.com/) - [Guild](https://guild.com) - [Hashnode](https://hashnode.com/) diff --git a/packages/parser/README.md b/packages/parser/README.md index 091e48fabd..8c976cdc2b 100644 --- a/packages/parser/README.md +++ b/packages/parser/README.md @@ -333,6 +333,7 @@ The following companies, among others, use Powertools: - [Certible](https://www.certible.com/) - [Elva](https://elva-group.com) - [Flyweight](https://flyweight.io/) +- [FraudFalcon](https://fraudfalcon.app) - [globaldatanet](https://globaldatanet.com/) - [Guild](https://guild.com) - [Hashnode](https://hashnode.com/) diff --git a/packages/tracer/README.md b/packages/tracer/README.md index a2f7d66816..faf68ac001 100644 --- a/packages/tracer/README.md +++ b/packages/tracer/README.md @@ -149,6 +149,7 @@ The following companies, among others, use Powertools: - [Certible](https://www.certible.com/) - [Elva](https://elva-group.com) - [Flyweight](https://flyweight.io/) +- [FraudFalcon](https://fraudfalcon.app) - [globaldatanet](https://globaldatanet.com/) - [Guild](https://guild.com) - [Hashnode](https://hashnode.com/) diff --git a/packages/validation/README.md b/packages/validation/README.md index 7b73606d1a..17302f3f67 100644 --- a/packages/validation/README.md +++ b/packages/validation/README.md @@ -257,6 +257,7 @@ The following companies, among others, use Powertools: - [Certible](https://www.certible.com/) - [Elva](https://elva-group.com) - [Flyweight](https://flyweight.io/) +- [FraudFalcon](https://fraudfalcon.app) - [globaldatanet](https://globaldatanet.com/) - [Guild](https://guild.com) - [Hashnode](https://hashnode.com/) From 1e609f1140bbd381deff5aecd31f7e4cafd51d4c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 14 Aug 2025 10:06:57 +0100 Subject: [PATCH 15/15] chore(ci): bump version to 2.25.1 (#4336) Co-authored-by: aws-powertools-bot <151832416+aws-powertools-bot@users.noreply.github.com> --- CHANGELOG.md | 17 ++++++++++++++++ examples/app/CHANGELOG.md | 4 ++++ examples/app/package.json | 14 +++++++------- examples/snippets/CHANGELOG.md | 4 ++++ examples/snippets/package.json | 20 +++++++++---------- layers/CHANGELOG.md | 4 ++++ layers/package.json | 2 +- package-lock.json | 30 ++++++++++++++--------------- packages/batch/CHANGELOG.md | 4 ++++ packages/batch/package.json | 2 +- packages/commons/CHANGELOG.md | 4 ++++ packages/commons/package.json | 2 +- packages/commons/src/version.ts | 2 +- packages/event-handler/CHANGELOG.md | 6 ++++++ packages/event-handler/package.json | 4 ++-- packages/idempotency/CHANGELOG.md | 5 +++++ packages/idempotency/package.json | 6 +++--- packages/jmespath/CHANGELOG.md | 4 ++++ packages/jmespath/package.json | 4 ++-- packages/kafka/CHANGELOG.md | 4 ++++ packages/kafka/package.json | 4 ++-- packages/logger/CHANGELOG.md | 5 +++++ packages/logger/package.json | 6 +++--- packages/metrics/CHANGELOG.md | 4 ++++ packages/metrics/package.json | 4 ++-- packages/parameters/CHANGELOG.md | 4 ++++ packages/parameters/package.json | 4 ++-- packages/parser/CHANGELOG.md | 4 ++++ packages/parser/package.json | 4 ++-- packages/testing/CHANGELOG.md | 4 ++++ packages/testing/package.json | 2 +- packages/tracer/CHANGELOG.md | 5 +++++ packages/tracer/package.json | 4 ++-- packages/validation/CHANGELOG.md | 4 ++++ packages/validation/package.json | 6 +++--- 35 files changed, 146 insertions(+), 60 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a6a45e4b8c..2bb15359f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,22 @@ # Change Log +## [2.25.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.0...v2.25.1) (2025-08-14) + +### Improvements + +- **logger** resolve issue when no logger region is set ([#4319](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4319)) ([b74b3b4](https://github.com/aws-powertools/powertools-lambda-typescript/commit/b74b3b4d1102e8d33c677d2c73ddc355717c4cef)) +- **idempotency** Prevent error when AWS_LAMBDA_FUNCTION_NAME is not passed in the Idempotency Persistence Layer ([#4327](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4327)) ([17845d0](https://github.com/aws-powertools/powertools-lambda-typescript/commit/17845d0de45508388100aefdbe42d1e0d9a02522)) + +### Bug Fixes + +- **tracer** pass args of decorated method as they are ([#4312](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4312)) ([7bd81ae](https://github.com/aws-powertools/powertools-lambda-typescript/commit/7bd81aed4d259c909107a1d312bd722bc258f358)) + +### Features + +- **event-handler** add decorator functionality for error handlers ([#4323](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4323)) ([562747a](https://github.com/aws-powertools/powertools-lambda-typescript/commit/562747a4c415ea2225529e5e276269e87c7b08b9)) +- **event-handler** add error handling functionality to BaseRouter ([#4316](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4316)) ([5aff398](https://github.com/aws-powertools/powertools-lambda-typescript/commit/5aff3984359a5a4f4408a5d286d3c36976d454fa)) + + ## [2.25.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.24.1...v2.25.0) (2025-08-12) ### Improvements diff --git a/examples/app/CHANGELOG.md b/examples/app/CHANGELOG.md index d3cfa645b4..cb3a90e61b 100644 --- a/examples/app/CHANGELOG.md +++ b/examples/app/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.25.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.0...v2.25.1) (2025-08-14) + +**Note:** Version bump only for this package + ## [2.25.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.24.1...v2.25.0) (2025-08-12) **Note:** Version bump only for this package diff --git a/examples/app/package.json b/examples/app/package.json index 0fd9c3a48c..76f4aa2866 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -1,6 +1,6 @@ { "name": "powertools-sample-app", - "version": "2.25.0", + "version": "2.25.1", "author": { "name": "Amazon Web Services", "url": "https://aws.amazon.com" @@ -38,12 +38,12 @@ "vitest": "^3.0.5" }, "dependencies": { - "@aws-lambda-powertools/batch": "^2.25.0", - "@aws-lambda-powertools/idempotency": "^2.25.0", - "@aws-lambda-powertools/logger": "^2.25.0", - "@aws-lambda-powertools/metrics": "^2.25.0", - "@aws-lambda-powertools/parameters": "^2.25.0", - "@aws-lambda-powertools/tracer": "^2.25.0", + "@aws-lambda-powertools/batch": "^2.25.1", + "@aws-lambda-powertools/idempotency": "^2.25.1", + "@aws-lambda-powertools/logger": "^2.25.1", + "@aws-lambda-powertools/metrics": "^2.25.1", + "@aws-lambda-powertools/parameters": "^2.25.1", + "@aws-lambda-powertools/tracer": "^2.25.1", "@aws-sdk/client-ssm": "^3.864.0", "@aws-sdk/lib-dynamodb": "^3.864.0", "@middy/core": "^4.7.0", diff --git a/examples/snippets/CHANGELOG.md b/examples/snippets/CHANGELOG.md index c91be534c1..24bf062a08 100644 --- a/examples/snippets/CHANGELOG.md +++ b/examples/snippets/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.25.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.0...v2.25.1) (2025-08-14) + +**Note:** Version bump only for this package + ## [2.25.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.24.1...v2.25.0) (2025-08-12) **Note:** Version bump only for this package diff --git a/examples/snippets/package.json b/examples/snippets/package.json index 4130b3201a..88e5bace08 100644 --- a/examples/snippets/package.json +++ b/examples/snippets/package.json @@ -1,6 +1,6 @@ { "name": "code-snippets", - "version": "2.25.0", + "version": "2.25.1", "description": "A collection code snippets for the Powertools for AWS Lambda (TypeScript) docs", "author": { "name": "Amazon Web Services", @@ -24,15 +24,15 @@ }, "homepage": "https://github.com/aws-powertools/powertools-lambda-typescript#readme", "devDependencies": { - "@aws-lambda-powertools/batch": "^2.25.0", - "@aws-lambda-powertools/event-handler": "^2.25.0", - "@aws-lambda-powertools/idempotency": "^2.25.0", - "@aws-lambda-powertools/jmespath": "^2.25.0", - "@aws-lambda-powertools/logger": "^2.25.0", - "@aws-lambda-powertools/metrics": "^2.25.0", - "@aws-lambda-powertools/parameters": "^2.25.0", - "@aws-lambda-powertools/parser": "^2.25.0", - "@aws-lambda-powertools/tracer": "^2.25.0", + "@aws-lambda-powertools/batch": "^2.25.1", + "@aws-lambda-powertools/event-handler": "^2.25.1", + "@aws-lambda-powertools/idempotency": "^2.25.1", + "@aws-lambda-powertools/jmespath": "^2.25.1", + "@aws-lambda-powertools/logger": "^2.25.1", + "@aws-lambda-powertools/metrics": "^2.25.1", + "@aws-lambda-powertools/parameters": "^2.25.1", + "@aws-lambda-powertools/parser": "^2.25.1", + "@aws-lambda-powertools/tracer": "^2.25.1", "@aws-sdk/client-appconfigdata": "^3.864.0", "@aws-sdk/client-dynamodb": "^3.864.0", "@aws-sdk/client-secrets-manager": "^3.864.0", diff --git a/layers/CHANGELOG.md b/layers/CHANGELOG.md index 01863e0001..d4b189f137 100644 --- a/layers/CHANGELOG.md +++ b/layers/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.25.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.0...v2.25.1) (2025-08-14) + +**Note:** Version bump only for this package + ## [2.25.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.24.1...v2.25.0) (2025-08-12) **Note:** Version bump only for this package diff --git a/layers/package.json b/layers/package.json index e0d10d3812..f0b4ac4e5e 100644 --- a/layers/package.json +++ b/layers/package.json @@ -1,6 +1,6 @@ { "name": "layers", - "version": "2.25.0", + "version": "2.25.1", "bin": { "layer": "bin/layers.js" }, diff --git a/package-lock.json b/package-lock.json index 8ae01527d4..08e88bf6fa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47,7 +47,7 @@ }, "examples/app": { "name": "powertools-sample-app", - "version": "2.25.0", + "version": "2.25.1", "license": "MIT-0", "dependencies": { "@aws-lambda-powertools/batch": "^2.25.0", @@ -79,7 +79,7 @@ }, "examples/snippets": { "name": "code-snippets", - "version": "2.25.0", + "version": "2.25.1", "license": "MIT-0", "dependencies": { "arktype": "^2.1.20", @@ -10731,7 +10731,7 @@ }, "packages/batch": { "name": "@aws-lambda-powertools/batch", - "version": "2.25.0", + "version": "2.25.1", "license": "MIT-0", "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing" @@ -10739,7 +10739,7 @@ }, "packages/commons": { "name": "@aws-lambda-powertools/commons", - "version": "2.25.0", + "version": "2.25.1", "license": "MIT-0", "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing" @@ -10747,7 +10747,7 @@ }, "packages/event-handler": { "name": "@aws-lambda-powertools/event-handler", - "version": "2.25.0", + "version": "2.25.1", "license": "MIT-0", "dependencies": { "@aws-lambda-powertools/commons": "2.25.0" @@ -10755,7 +10755,7 @@ }, "packages/idempotency": { "name": "@aws-lambda-powertools/idempotency", - "version": "2.25.0", + "version": "2.25.1", "license": "MIT-0", "dependencies": { "@aws-lambda-powertools/commons": "2.25.0", @@ -10794,7 +10794,7 @@ }, "packages/jmespath": { "name": "@aws-lambda-powertools/jmespath", - "version": "2.25.0", + "version": "2.25.1", "license": "MIT-0", "dependencies": { "@aws-lambda-powertools/commons": "2.25.0" @@ -10802,7 +10802,7 @@ }, "packages/kafka": { "name": "@aws-lambda-powertools/kafka", - "version": "2.25.0", + "version": "2.25.1", "license": "MIT-0", "dependencies": { "@aws-lambda-powertools/commons": "2.25.0", @@ -10832,7 +10832,7 @@ }, "packages/logger": { "name": "@aws-lambda-powertools/logger", - "version": "2.25.0", + "version": "2.25.1", "license": "MIT-0", "dependencies": { "@aws-lambda-powertools/commons": "2.25.0", @@ -10857,7 +10857,7 @@ }, "packages/metrics": { "name": "@aws-lambda-powertools/metrics", - "version": "2.25.0", + "version": "2.25.1", "license": "MIT-0", "dependencies": { "@aws-lambda-powertools/commons": "2.25.0" @@ -10879,7 +10879,7 @@ }, "packages/parameters": { "name": "@aws-lambda-powertools/parameters", - "version": "2.25.0", + "version": "2.25.1", "license": "MIT-0", "dependencies": { "@aws-lambda-powertools/commons": "2.25.0" @@ -10925,7 +10925,7 @@ }, "packages/parser": { "name": "@aws-lambda-powertools/parser", - "version": "2.25.0", + "version": "2.25.1", "license": "MIT-0", "dependencies": { "@aws-lambda-powertools/commons": "2.25.0", @@ -10949,7 +10949,7 @@ }, "packages/testing": { "name": "@aws-lambda-powertools/testing-utils", - "version": "2.25.0", + "version": "2.25.1", "license": "MIT-0", "dependencies": { "@aws-cdk/toolkit-lib": "^1.4.1", @@ -10966,7 +10966,7 @@ }, "packages/tracer": { "name": "@aws-lambda-powertools/tracer", - "version": "2.25.0", + "version": "2.25.1", "license": "MIT-0", "dependencies": { "@aws-lambda-powertools/commons": "2.25.0", @@ -10988,7 +10988,7 @@ }, "packages/validation": { "name": "@aws-lambda-powertools/validation", - "version": "2.25.0", + "version": "2.25.1", "license": "MIT-0", "dependencies": { "@aws-lambda-powertools/commons": "2.25.0", diff --git a/packages/batch/CHANGELOG.md b/packages/batch/CHANGELOG.md index bfd69e0688..66258bdf3b 100644 --- a/packages/batch/CHANGELOG.md +++ b/packages/batch/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.25.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.0...v2.25.1) (2025-08-14) + +**Note:** Version bump only for this package + ## [2.25.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.24.1...v2.25.0) (2025-08-12) ### Improvements diff --git a/packages/batch/package.json b/packages/batch/package.json index 2d003942cf..b2872fbec1 100644 --- a/packages/batch/package.json +++ b/packages/batch/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/batch", - "version": "2.25.0", + "version": "2.25.1", "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 ef2c628357..017468918c 100644 --- a/packages/commons/CHANGELOG.md +++ b/packages/commons/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.25.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.0...v2.25.1) (2025-08-14) + +**Note:** Version bump only for this package + ## [2.25.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.24.1...v2.25.0) (2025-08-12) ### Improvements diff --git a/packages/commons/package.json b/packages/commons/package.json index b6f344c9f5..976d488205 100644 --- a/packages/commons/package.json +++ b/packages/commons/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/commons", - "version": "2.25.0", + "version": "2.25.1", "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 79b5647372..fdca0e8e74 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.24.0'; +export const PT_VERSION = '2.25.1'; diff --git a/packages/event-handler/CHANGELOG.md b/packages/event-handler/CHANGELOG.md index 6746af0f70..cfba729a19 100644 --- a/packages/event-handler/CHANGELOG.md +++ b/packages/event-handler/CHANGELOG.md @@ -1,5 +1,11 @@ # Change Log +## [2.25.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.0...v2.25.1) (2025-08-14) + +### Features + +- add decorator functionality for error handlers ([#4323](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4323)) ([562747a](https://github.com/aws-powertools/powertools-lambda-typescript/commit/562747a4c415ea2225529e5e276269e87c7b08b9)) +- add error handling functionality to BaseRouter ([#4316](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4316)) ([5aff398](https://github.com/aws-powertools/powertools-lambda-typescript/commit/5aff3984359a5a4f4408a5d286d3c36976d454fa)) ## [2.25.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.24.1...v2.25.0) (2025-08-12) ### Features diff --git a/packages/event-handler/package.json b/packages/event-handler/package.json index fcfeecdc7d..43ef35e5c3 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.25.0", + "version": "2.25.1", "description": "Lightweight routing to reduce boilerplate for API Gateway REST/HTTP API, ALB, Lambda Function URLs, and AppSync.", "author": { "name": "Amazon Web Services", @@ -100,7 +100,7 @@ "url": "https://github.com/aws-powertools/powertools-lambda-typescript/issues" }, "dependencies": { - "@aws-lambda-powertools/commons": "2.25.0" + "@aws-lambda-powertools/commons": "2.25.1" }, "keywords": [ "aws", diff --git a/packages/idempotency/CHANGELOG.md b/packages/idempotency/CHANGELOG.md index 75f740f68d..a11bcf1a64 100644 --- a/packages/idempotency/CHANGELOG.md +++ b/packages/idempotency/CHANGELOG.md @@ -1,5 +1,10 @@ # Change Log +## [2.25.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.0...v2.25.1) (2025-08-14) + +### Improvements + +- Prevent error when AWS_LAMBDA_FUNCTION_NAME is not passed in the Idempotency Persistence Layer ([#4327](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4327)) ([17845d0](https://github.com/aws-powertools/powertools-lambda-typescript/commit/17845d0de45508388100aefdbe42d1e0d9a02522)) ## [2.25.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.24.1...v2.25.0) (2025-08-12) ### Improvements diff --git a/packages/idempotency/package.json b/packages/idempotency/package.json index f2879a7c95..4033a810ad 100644 --- a/packages/idempotency/package.json +++ b/packages/idempotency/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/idempotency", - "version": "2.25.0", + "version": "2.25.1", "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", @@ -113,8 +113,8 @@ "url": "https://github.com/aws-powertools/powertools-lambda-typescript/issues" }, "dependencies": { - "@aws-lambda-powertools/commons": "2.25.0", - "@aws-lambda-powertools/jmespath": "2.25.0" + "@aws-lambda-powertools/commons": "2.25.1", + "@aws-lambda-powertools/jmespath": "2.25.1" }, "peerDependencies": { "@aws-sdk/client-dynamodb": ">=3.x", diff --git a/packages/jmespath/CHANGELOG.md b/packages/jmespath/CHANGELOG.md index da61090ed5..4355c53087 100644 --- a/packages/jmespath/CHANGELOG.md +++ b/packages/jmespath/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.25.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.0...v2.25.1) (2025-08-14) + +**Note:** Version bump only for this package + ## [2.25.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.24.1...v2.25.0) (2025-08-12) ### Improvements diff --git a/packages/jmespath/package.json b/packages/jmespath/package.json index b4799629b5..a17e241fc6 100644 --- a/packages/jmespath/package.json +++ b/packages/jmespath/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/jmespath", - "version": "2.25.0", + "version": "2.25.1", "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.25.0" + "@aws-lambda-powertools/commons": "2.25.1" }, "repository": { "type": "git", diff --git a/packages/kafka/CHANGELOG.md b/packages/kafka/CHANGELOG.md index a3ffa51b07..a171e1d97a 100644 --- a/packages/kafka/CHANGELOG.md +++ b/packages/kafka/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.25.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.0...v2.25.1) (2025-08-14) + +**Note:** Version bump only for this package + ## [2.25.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.24.1...v2.25.0) (2025-08-12) ### Improvements diff --git a/packages/kafka/package.json b/packages/kafka/package.json index 2813192417..8698722107 100644 --- a/packages/kafka/package.json +++ b/packages/kafka/package.json @@ -1,7 +1,7 @@ { "name": "@aws-lambda-powertools/kafka", "description": "Utility to easily handle message deserialization and parsing of Kafka events in AWS Lambda functions", - "version": "2.25.0", + "version": "2.25.1", "author": { "name": "Amazon Web Services", "url": "https://aws.amazon.com" @@ -46,7 +46,7 @@ "nodejs" ], "dependencies": { - "@aws-lambda-powertools/commons": "2.25.0", + "@aws-lambda-powertools/commons": "2.25.1", "@standard-schema/spec": "^1.0.0" }, "peerDependencies": { diff --git a/packages/logger/CHANGELOG.md b/packages/logger/CHANGELOG.md index 5b1eb268b1..731481a614 100644 --- a/packages/logger/CHANGELOG.md +++ b/packages/logger/CHANGELOG.md @@ -1,5 +1,10 @@ # Change Log +## [2.25.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.0...v2.25.1) (2025-08-14) + +### Improvements + +- resolve issue when no logger region is set ([#4319](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4319)) ([b74b3b4](https://github.com/aws-powertools/powertools-lambda-typescript/commit/b74b3b4d1102e8d33c677d2c73ddc355717c4cef)) ## [2.25.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.24.1...v2.25.0) (2025-08-12) ### Improvements diff --git a/packages/logger/package.json b/packages/logger/package.json index ffdc683000..982552634d 100644 --- a/packages/logger/package.json +++ b/packages/logger/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/logger", - "version": "2.25.0", + "version": "2.25.1", "description": "The logging package for the Powertools for AWS Lambda (TypeScript) library", "author": { "name": "Amazon Web Services", @@ -75,7 +75,7 @@ "@types/lodash.merge": "^4.6.9" }, "peerDependencies": { - "@aws-lambda-powertools/jmespath": "2.25.0", + "@aws-lambda-powertools/jmespath": "2.25.1", "@middy/core": "4.x || 5.x || 6.x" }, "peerDependenciesMeta": { @@ -97,7 +97,7 @@ "url": "https://github.com/aws-powertools/powertools-lambda-typescript/issues" }, "dependencies": { - "@aws-lambda-powertools/commons": "2.25.0", + "@aws-lambda-powertools/commons": "2.25.1", "lodash.merge": "^4.6.2" }, "keywords": [ diff --git a/packages/metrics/CHANGELOG.md b/packages/metrics/CHANGELOG.md index 727d0b7faa..ee9d23052a 100644 --- a/packages/metrics/CHANGELOG.md +++ b/packages/metrics/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.25.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.0...v2.25.1) (2025-08-14) + +**Note:** Version bump only for this package + ## [2.25.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.24.1...v2.25.0) (2025-08-12) **Note:** Version bump only for this package diff --git a/packages/metrics/package.json b/packages/metrics/package.json index 32dfbcc1f5..782905981b 100644 --- a/packages/metrics/package.json +++ b/packages/metrics/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/metrics", - "version": "2.25.0", + "version": "2.25.1", "description": "The metrics package for the Powertools for AWS Lambda (TypeScript) library", "author": { "name": "Amazon Web Services", @@ -87,7 +87,7 @@ "url": "https://github.com/aws-powertools/powertools-lambda-typescript/issues" }, "dependencies": { - "@aws-lambda-powertools/commons": "2.25.0" + "@aws-lambda-powertools/commons": "2.25.1" }, "keywords": [ "aws", diff --git a/packages/parameters/CHANGELOG.md b/packages/parameters/CHANGELOG.md index f3e2ed445a..88056d2aba 100644 --- a/packages/parameters/CHANGELOG.md +++ b/packages/parameters/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.25.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.0...v2.25.1) (2025-08-14) + +**Note:** Version bump only for this package + ## [2.25.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.24.1...v2.25.0) (2025-08-12) **Note:** Version bump only for this package diff --git a/packages/parameters/package.json b/packages/parameters/package.json index c49da84a40..9038d13a38 100644 --- a/packages/parameters/package.json +++ b/packages/parameters/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/parameters", - "version": "2.25.0", + "version": "2.25.1", "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": "^4.1.0" }, "dependencies": { - "@aws-lambda-powertools/commons": "2.25.0" + "@aws-lambda-powertools/commons": "2.25.1" }, "peerDependencies": { "@aws-sdk/client-appconfigdata": ">=3.x", diff --git a/packages/parser/CHANGELOG.md b/packages/parser/CHANGELOG.md index c25298e851..b3ca5037d4 100644 --- a/packages/parser/CHANGELOG.md +++ b/packages/parser/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.25.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.0...v2.25.1) (2025-08-14) + +**Note:** Version bump only for this package + ## [2.25.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.24.1...v2.25.0) (2025-08-12) ### Features diff --git a/packages/parser/package.json b/packages/parser/package.json index 23ab3a8f5c..dbe24da2fa 100644 --- a/packages/parser/package.json +++ b/packages/parser/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/parser", - "version": "2.25.0", + "version": "2.25.1", "description": "The parser package for the Powertools for AWS Lambda (TypeScript) library.", "author": { "name": "Amazon Web Services", @@ -199,7 +199,7 @@ "nodejs" ], "dependencies": { - "@aws-lambda-powertools/commons": "2.25.0", + "@aws-lambda-powertools/commons": "2.25.1", "@standard-schema/spec": "^1.0.0" }, "peerDependencies": { diff --git a/packages/testing/CHANGELOG.md b/packages/testing/CHANGELOG.md index 175d536fca..510899eb39 100644 --- a/packages/testing/CHANGELOG.md +++ b/packages/testing/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.25.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.0...v2.25.1) (2025-08-14) + +**Note:** Version bump only for this package + ## [2.25.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.24.1...v2.25.0) (2025-08-12) **Note:** Version bump only for this package diff --git a/packages/testing/package.json b/packages/testing/package.json index 6dc94a5b10..6ec1ae49c0 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/testing-utils", - "version": "2.25.0", + "version": "2.25.1", "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 b36f89a23f..5e935e63c1 100644 --- a/packages/tracer/CHANGELOG.md +++ b/packages/tracer/CHANGELOG.md @@ -1,5 +1,10 @@ # Change Log +## [2.25.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.0...v2.25.1) (2025-08-14) + +### Bug Fixes + +- pass args of decorated method as they are ([#4312](https://github.com/aws-powertools/powertools-lambda-typescript/issues/4312)) ([7bd81ae](https://github.com/aws-powertools/powertools-lambda-typescript/commit/7bd81aed4d259c909107a1d312bd722bc258f358)) ## [2.25.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.24.1...v2.25.0) (2025-08-12) ### Improvements diff --git a/packages/tracer/package.json b/packages/tracer/package.json index 958a160910..7c5b9cc94e 100644 --- a/packages/tracer/package.json +++ b/packages/tracer/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/tracer", - "version": "2.25.0", + "version": "2.25.1", "description": "The tracer package for the Powertools for AWS Lambda (TypeScript) library", "author": { "name": "Amazon Web Services", @@ -86,7 +86,7 @@ "url": "https://github.com/aws-powertools/powertools-lambda-typescript/issues" }, "dependencies": { - "@aws-lambda-powertools/commons": "2.25.0", + "@aws-lambda-powertools/commons": "2.25.1", "aws-xray-sdk-core": "^3.10.3" }, "keywords": [ diff --git a/packages/validation/CHANGELOG.md b/packages/validation/CHANGELOG.md index 6b2f1a85bb..9f2a9cdf96 100644 --- a/packages/validation/CHANGELOG.md +++ b/packages/validation/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [2.25.1](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.25.0...v2.25.1) (2025-08-14) + +**Note:** Version bump only for this package + ## [2.25.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.24.1...v2.25.0) (2025-08-12) **Note:** Version bump only for this package diff --git a/packages/validation/package.json b/packages/validation/package.json index 4ec0deaf64..7325779ed1 100644 --- a/packages/validation/package.json +++ b/packages/validation/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/validation", - "version": "2.25.0", + "version": "2.25.1", "description": "An utility to validate events and responses using JSON Schemas", "author": { "name": "Amazon Web Services", @@ -95,8 +95,8 @@ "url": "https://github.com/aws-powertools/powertools-lambda-typescript/issues" }, "dependencies": { - "@aws-lambda-powertools/commons": "2.25.0", - "@aws-lambda-powertools/jmespath": "2.25.0", + "@aws-lambda-powertools/commons": "2.25.1", + "@aws-lambda-powertools/jmespath": "2.25.1", "ajv": "^8.17.1" }, "keywords": [