From bfba00dd0b9d45417986258582e2246018fd1303 Mon Sep 17 00:00:00 2001
From: Andrea Amorosi <dreamorosi@gmail.com>
Date: Tue, 9 Jul 2024 12:47:14 +0200
Subject: [PATCH 1/4] feat(internal): support Middy.js 5.x

---
 package-lock.json                             | 144 +++++++++++++++++-
 package.json                                  |   3 +-
 packages/idempotency/package.json             |   2 +-
 packages/logger/package.json                  |   2 +-
 .../basicFeatures.middy.test.FunctionCode.ts  |   2 +-
 ...ntEnvVarSetting.middy.test.FunctionCode.ts |   2 +-
 packages/metrics/package.json                 |   2 +-
 packages/parameters/package.json              |   2 +-
 packages/tracer/package.json                  |   2 +-
 .../allFeatures.middy.test.functionCode.ts    |   2 +-
 10 files changed, 148 insertions(+), 15 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index a61a56472a..c20405c5d8 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -24,7 +24,6 @@
         "examples/app"
       ],
       "devDependencies": {
-        "@middy/core": "^4.7.0",
         "@types/aws-lambda": "^8.10.140",
         "@types/jest": "^29.5.12",
         "@types/node": "^20.14.9",
@@ -42,6 +41,8 @@
         "lerna": "8.1.2",
         "lint-staged": "^15.2.7",
         "markdownlint-cli2": "^0.13.0",
+        "middy4": "npm:@middy/core@^4.7.0",
+        "middy5": "npm:@middy/core@^5.4.3",
         "prettier": "^3.3.2",
         "ts-jest": "^29.1.5",
         "ts-node": "^10.9.2",
@@ -1867,6 +1868,18 @@
         "@jridgewell/sourcemap-codec": "^1.4.10"
       }
     },
+    "node_modules/@datastream/core": {
+      "version": "0.0.36",
+      "resolved": "https://registry.npmjs.org/@datastream/core/-/core-0.0.36.tgz",
+      "integrity": "sha512-qec5ckpnhrLL04sFkN4lOZVyYCLSUYjxmODEaEmO7qNzDwXF9laX6brgD2bd2+vXostv63yQ29yhsBNZQU6QsQ==",
+      "dev": true,
+      "dependencies": {
+        "cloneable-readable": "3.0.0"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
     "node_modules/@esbuild/aix-ppc64": {
       "version": "0.23.0",
       "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.0.tgz",
@@ -5361,6 +5374,18 @@
         "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
       }
     },
+    "node_modules/abort-controller": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
+      "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
+      "dev": true,
+      "dependencies": {
+        "event-target-shim": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=6.5"
+      }
+    },
     "node_modules/acorn": {
       "version": "8.11.3",
       "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
@@ -6906,6 +6931,64 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/cloneable-readable": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-3.0.0.tgz",
+      "integrity": "sha512-Lkfd9IRx1nfiBr7UHNxJSl/x7DOeUfYmxzCkxYJC2tyc/9vKgV75msgLGurGQsak/NvJDHMWcshzEXRlxfvhqg==",
+      "dev": true,
+      "dependencies": {
+        "readable-stream": "^4.0.0"
+      }
+    },
+    "node_modules/cloneable-readable/node_modules/buffer": {
+      "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
+      "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "dependencies": {
+        "base64-js": "^1.3.1",
+        "ieee754": "^1.2.1"
+      }
+    },
+    "node_modules/cloneable-readable/node_modules/events": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+      "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.8.x"
+      }
+    },
+    "node_modules/cloneable-readable/node_modules/readable-stream": {
+      "version": "4.5.2",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz",
+      "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==",
+      "dev": true,
+      "dependencies": {
+        "abort-controller": "^3.0.0",
+        "buffer": "^6.0.3",
+        "events": "^3.3.0",
+        "process": "^0.11.10",
+        "string_decoder": "^1.3.0"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      }
+    },
     "node_modules/cls-hooked": {
       "version": "4.2.2",
       "resolved": "https://registry.npmjs.org/cls-hooked/-/cls-hooked-4.2.2.tgz",
@@ -8317,6 +8400,15 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/event-target-shim": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
+      "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
     "node_modules/eventemitter3": {
       "version": "5.0.1",
       "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz",
@@ -12450,6 +12542,37 @@
         "node": ">=8.6"
       }
     },
+    "node_modules/middy4": {
+      "name": "@middy/core",
+      "version": "4.7.0",
+      "resolved": "https://registry.npmjs.org/@middy/core/-/core-4.7.0.tgz",
+      "integrity": "sha512-yI++DmhDQ8+ugvY7+GrEnb2PF0M/6Wzbgu4Tf7QhOlhwKGDd4j6or+Ab7qYPWx+jnKf8F0tqlmh0gV4JLi0yHw==",
+      "dev": true,
+      "engines": {
+        "node": ">=16"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/willfarrell"
+      }
+    },
+    "node_modules/middy5": {
+      "name": "@middy/core",
+      "version": "5.4.3",
+      "resolved": "https://registry.npmjs.org/@middy/core/-/core-5.4.3.tgz",
+      "integrity": "sha512-EmNwy6UWzVh/JFLb5CDoU0DWBc59YBCgUu8/JuUT9TYQwVuUry6xm47XNJAvHEhBJ/LU0eI3Z75fY49Oer6zrw==",
+      "dev": true,
+      "dependencies": {
+        "@datastream/core": "0.0.36"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/willfarrell"
+      }
+    },
     "node_modules/mime-db": {
       "version": "1.52.0",
       "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
@@ -14606,6 +14729,15 @@
         "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
       }
     },
+    "node_modules/process": {
+      "version": "0.11.10",
+      "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+      "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.6.0"
+      }
+    },
     "node_modules/process-nextick-args": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
@@ -18095,7 +18227,7 @@
       "peerDependencies": {
         "@aws-sdk/client-dynamodb": ">=3.x",
         "@aws-sdk/lib-dynamodb": ">=3.x",
-        "@middy/core": ">=3.x"
+        "@middy/core": "4.x || 5.x"
       },
       "peerDependenciesMeta": {
         "@aws-sdk/client-dynamodb": {
@@ -18130,7 +18262,7 @@
         "@types/lodash.merge": "^4.6.9"
       },
       "peerDependencies": {
-        "@middy/core": ">=3.x"
+        "@middy/core": "4.x || 5.x"
       },
       "peerDependenciesMeta": {
         "@middy/core": {
@@ -18152,7 +18284,7 @@
         "promise-retry": "^2.0.1"
       },
       "peerDependencies": {
-        "@middy/core": ">=3.x"
+        "@middy/core": "4.x || 5.x"
       },
       "peerDependenciesMeta": {
         "@middy/core": {
@@ -18184,7 +18316,7 @@
         "@aws-sdk/client-secrets-manager": ">=3.x",
         "@aws-sdk/client-ssm": ">=3.x",
         "@aws-sdk/util-dynamodb": ">=3.x",
-        "@middy/core": ">=3.x"
+        "@middy/core": "4.x || 5.x"
       },
       "peerDependenciesMeta": {
         "@aws-sdk/client-appconfigdata": {
@@ -18248,7 +18380,7 @@
         "promise-retry": "^2.0.1"
       },
       "peerDependencies": {
-        "@middy/core": ">=3.x"
+        "@middy/core": "4.x || 5.x"
       },
       "peerDependenciesMeta": {
         "@middy/core": {
diff --git a/package.json b/package.json
index a1297ce903..08211ed8bc 100644
--- a/package.json
+++ b/package.json
@@ -49,7 +49,6 @@
   },
   "homepage": "https://github.com/aws-powertools/powertools-lambda-typescript#readme",
   "devDependencies": {
-    "@middy/core": "^4.7.0",
     "@types/aws-lambda": "^8.10.140",
     "@types/jest": "^29.5.12",
     "@types/node": "^20.14.9",
@@ -67,6 +66,8 @@
     "lerna": "8.1.2",
     "lint-staged": "^15.2.7",
     "markdownlint-cli2": "^0.13.0",
+    "middy4": "npm:@middy/core@^4.7.0",
+    "middy5": "npm:@middy/core@^5.4.3",
     "prettier": "^3.3.2",
     "ts-jest": "^29.1.5",
     "ts-node": "^10.9.2",
diff --git a/packages/idempotency/package.json b/packages/idempotency/package.json
index 0761d99175..5ba0b0e198 100644
--- a/packages/idempotency/package.json
+++ b/packages/idempotency/package.json
@@ -102,7 +102,7 @@
   "peerDependencies": {
     "@aws-sdk/client-dynamodb": ">=3.x",
     "@aws-sdk/lib-dynamodb": ">=3.x",
-    "@middy/core": ">=3.x"
+    "@middy/core": "4.x || 5.x"
   },
   "peerDependenciesMeta": {
     "@aws-sdk/client-dynamodb": {
diff --git a/packages/logger/package.json b/packages/logger/package.json
index b70bc92b9c..8793f5ddd8 100644
--- a/packages/logger/package.json
+++ b/packages/logger/package.json
@@ -66,7 +66,7 @@
     "@types/lodash.merge": "^4.6.9"
   },
   "peerDependencies": {
-    "@middy/core": ">=3.x"
+    "@middy/core": "4.x || 5.x"
   },
   "peerDependenciesMeta": {
     "@middy/core": {
diff --git a/packages/logger/tests/e2e/basicFeatures.middy.test.FunctionCode.ts b/packages/logger/tests/e2e/basicFeatures.middy.test.FunctionCode.ts
index 01c3b11804..cbe5e259f2 100644
--- a/packages/logger/tests/e2e/basicFeatures.middy.test.FunctionCode.ts
+++ b/packages/logger/tests/e2e/basicFeatures.middy.test.FunctionCode.ts
@@ -2,7 +2,7 @@ import { Logger } from '../../src/index.js';
 import { injectLambdaContext } from '../../src/middleware/middy.js';
 import type { Context, APIGatewayAuthorizerResult } from 'aws-lambda';
 import type { TestEvent, TestOutput } from '../helpers/types.js';
-import middy from '@middy/core';
+import middy from 'middy5';
 
 const PERSISTENT_KEY = process.env.PERSISTENT_KEY || 'persistentKey';
 const PERSISTENT_VALUE = process.env.PERSISTENT_VALUE || 'persistentValue';
diff --git a/packages/logger/tests/e2e/logEventEnvVarSetting.middy.test.FunctionCode.ts b/packages/logger/tests/e2e/logEventEnvVarSetting.middy.test.FunctionCode.ts
index 2d10943d61..140b20f6f8 100644
--- a/packages/logger/tests/e2e/logEventEnvVarSetting.middy.test.FunctionCode.ts
+++ b/packages/logger/tests/e2e/logEventEnvVarSetting.middy.test.FunctionCode.ts
@@ -2,7 +2,7 @@ import { Logger } from '../../src/index.js';
 import { injectLambdaContext } from '../../src/middleware/middy.js';
 import type { TestEvent, TestOutput } from '../helpers/types.js';
 import type { Context } from 'aws-lambda';
-import middy from '@middy/core';
+import middy from 'middy4';
 
 const logger = new Logger();
 
diff --git a/packages/metrics/package.json b/packages/metrics/package.json
index 8db8751915..f0e8bed27d 100644
--- a/packages/metrics/package.json
+++ b/packages/metrics/package.json
@@ -67,7 +67,7 @@
     "promise-retry": "^2.0.1"
   },
   "peerDependencies": {
-    "@middy/core": ">=3.x"
+    "@middy/core": "4.x || 5.x"
   },
   "peerDependenciesMeta": {
     "@middy/core": {
diff --git a/packages/parameters/package.json b/packages/parameters/package.json
index aa40bf60aa..d9f7f50be9 100644
--- a/packages/parameters/package.json
+++ b/packages/parameters/package.json
@@ -172,7 +172,7 @@
     "@aws-sdk/client-secrets-manager": ">=3.x",
     "@aws-sdk/client-ssm": ">=3.x",
     "@aws-sdk/util-dynamodb": ">=3.x",
-    "@middy/core": ">=3.x"
+    "@middy/core": "4.x || 5.x"
   },
   "peerDependenciesMeta": {
     "@middy/core": {
diff --git a/packages/tracer/package.json b/packages/tracer/package.json
index 94aa3cf1dc..560624260d 100644
--- a/packages/tracer/package.json
+++ b/packages/tracer/package.json
@@ -35,7 +35,7 @@
     "promise-retry": "^2.0.1"
   },
   "peerDependencies": {
-    "@middy/core": ">=3.x"
+    "@middy/core": "4.x || 5.x"
   },
   "peerDependenciesMeta": {
     "@middy/core": {
diff --git a/packages/tracer/tests/e2e/allFeatures.middy.test.functionCode.ts b/packages/tracer/tests/e2e/allFeatures.middy.test.functionCode.ts
index 61e5a9198c..069831e8c8 100644
--- a/packages/tracer/tests/e2e/allFeatures.middy.test.functionCode.ts
+++ b/packages/tracer/tests/e2e/allFeatures.middy.test.functionCode.ts
@@ -1,4 +1,4 @@
-import middy from '@middy/core';
+import middy from 'middy5';
 import { Tracer } from '../../src/index.js';
 import { captureLambdaHandler } from '../../src/middleware/middy.js';
 import type { Context } from 'aws-lambda';

From 8e6cb10661f1364b31f1f79e4b707644f0297665 Mon Sep 17 00:00:00 2001
From: Andrea Amorosi <dreamorosi@gmail.com>
Date: Tue, 9 Jul 2024 12:51:30 +0200
Subject: [PATCH 2/4] docs: update docs to include v5

---
 docs/core/logger.md           | 2 +-
 docs/core/metrics.md          | 2 +-
 docs/core/tracer.md           | 2 +-
 docs/utilities/idempotency.md | 2 +-
 4 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/docs/core/logger.md b/docs/core/logger.md
index dae36c9a37..6dbdf7370a 100644
--- a/docs/core/logger.md
+++ b/docs/core/logger.md
@@ -111,7 +111,7 @@ This functionality will include the following keys in your structured logs:
 === "Middy Middleware"
 
     !!! tip "A note about Middy"
-        We guarantee support only for Middy.js `v4.x`, that you can install it by running `npm i @middy/core@~4`.
+        We guarantee support for both Middy.js `v4.x` & `v5.x` with the latter being available only if you are using ES modules.
         Check their docs to learn more about [Middy and its middleware stack](https://middy.js.org/docs/intro/getting-started){target="_blank"} as well as [best practices when working with Powertools](https://middy.js.org/docs/integrations/lambda-powertools#best-practices){target="_blank"}.
 
     ```typescript hl_lines="2 14"
diff --git a/docs/core/metrics.md b/docs/core/metrics.md
index 5ac28ea501..2e9b63b3bc 100644
--- a/docs/core/metrics.md
+++ b/docs/core/metrics.md
@@ -199,7 +199,7 @@ You can add default dimensions to your metrics by passing them as parameters in
 === "Middy middleware"
 
     !!! tip "A note about Middy"
-        Currently we support up to Middy `v4.x` that you can install it by running `npm i @middy/core@~4`.
+        We guarantee support for both Middy.js `v4.x` & `v5.x` with the latter being available only if you are using ES modules.
         Check their docs to learn more about [Middy and its middleware stack](https://middy.js.org/docs/intro/getting-started){target="_blank"} as well as [best practices when working with Powertools](https://middy.js.org/docs/integrations/lambda-powertools#best-practices){target="_blank"}.
 
     ```typescript hl_lines="24-26"
diff --git a/docs/core/tracer.md b/docs/core/tracer.md
index a03030bc90..9b28f10b71 100644
--- a/docs/core/tracer.md
+++ b/docs/core/tracer.md
@@ -154,7 +154,7 @@ You can quickly start by importing the `Tracer` class, initialize it outside the
 === "Middy Middleware"
 
     !!! tip "A note about Middy"
-        We guarantee support only for Middy.js `v4.x`, that you can install it by running `npm i @middy/core@~4`.
+        We guarantee support for both Middy.js `v4.x` & `v5.x` with the latter being available only if you are using ES modules.
         Check their docs to learn more about [Middy and its middleware stack](https://middy.js.org/docs/intro/getting-started){target="_blank"} as well as [best practices when working with Powertools](https://middy.js.org/docs/integrations/lambda-powertools#best-practices){target="_blank"}.
 
     ```typescript hl_lines="2 15 17"
diff --git a/docs/utilities/idempotency.md b/docs/utilities/idempotency.md
index 9053c0424d..e28d5370fc 100644
--- a/docs/utilities/idempotency.md
+++ b/docs/utilities/idempotency.md
@@ -189,7 +189,7 @@ The configuration options for the `@idempotent` decorator are the same as the on
 ### MakeHandlerIdempotent Middy middleware
 
 !!! tip "A note about Middy"
-    Currently we support Middy up to `v4.x` that you can install it by running `npm i @middy/core@~4`.
+    We guarantee support for both Middy.js `v4.x` & `v5.x` with the latter being available only if you are using ES modules.
     Check their docs to learn more about [Middy and its middleware stack](https://middy.js.org/docs/intro/getting-started){target="_blank"} as well as [best practices when working with Powertools](https://middy.js.org/docs/integrations/lambda-powertools#best-practices){target="_blank"}.
 
 If you are using [Middy.js](https://middy.js.org){target="_blank"} as your middleware engine, you can use the `makeHandlerIdempotent` middleware to make your Lambda handler idempotent.

From 8dd790704d7eef53367caf082d9a53ce5f3abf10 Mon Sep 17 00:00:00 2001
From: Andrea Amorosi <dreamorosi@gmail.com>
Date: Tue, 9 Jul 2024 12:59:49 +0200
Subject: [PATCH 3/4] docs: update docs to include v5

---
 docs/index.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/docs/index.md b/docs/index.md
index 64a9537f1d..4d9ca33bfb 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -299,7 +299,7 @@ aws lambda get-layer-version-by-arn --arn arn:aws:lambda:{aws::region}:094274105
 
 Many of the utilities provided by Powertools for AWS Lambda (TypeScript) can be used with different programming paradigms:
 
-- **Middy** middleware. It is the best choice if your existing code base relies on the [Middy 4.x](https://middy.js.org/docs/) middleware engine. Powertools for AWS Lambda (TypeScript) offers compatible Middy middleware to make this integration seamless.
+- **Middy** middleware. It is the best choice if your existing code base relies on the [Middy.js](https://middy.js.org/docs/) middleware engine. Powertools for AWS Lambda (TypeScript) offers compatible Middy middleware to make this integration seamless.
 - **Method decorator**. Use [TypeScript method decorators](https://www.typescriptlang.org/docs/handbook/decorators.html#method-decorators) if you prefer writing your business logic using [TypeScript Classes](https://www.typescriptlang.org/docs/handbook/classes.html). If you aren’t using Classes, this requires the most significant refactoring.
 - **Manually**. It provides the most granular control. It’s the most verbose approach, with the added benefit of no additional dependency and no refactoring to TypeScript Classes.
 

From 2a11e8c73fcfe6ed6addc24ac240711b0281d71b Mon Sep 17 00:00:00 2001
From: Andrea Amorosi <dreamorosi@gmail.com>
Date: Wed, 10 Jul 2024 11:08:10 +0200
Subject: [PATCH 4/4] chore: add peerDependencies to parser

---
 packages/parser/package.json | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/packages/parser/package.json b/packages/parser/package.json
index fba2e1e130..98ba2ded46 100644
--- a/packages/parser/package.json
+++ b/packages/parser/package.json
@@ -117,7 +117,16 @@
     "nodejs"
   ],
   "peerDependencies": {
-    "zod": ">=3.x"
+    "zod": ">=3.x",
+    "@middy/core": "4.x || 5.x"
+  },
+  "peerDependenciesMeta": {
+    "zod": {
+      "optional": true
+    },
+    "@middy/core": {
+      "optional": true
+    }
   },
   "devDependencies": {
     "@anatine/zod-mock": "^3.13.3",