Просмотр исходного кода

fix(core): Relax some express typings to prevent v4/v5 types conflicts

Because a lot of the express ecosystem still depends on v4 typings, this can lead to
type conflicts on types like Request where slight differences make them incompatible.
To work around this, we loosen the types in certain public-facing APIs.
Michael Bromley 9 месяцев назад
Родитель
Сommit
97e53d59bf

+ 294 - 13
package-lock.json

@@ -27094,9 +27094,9 @@
       }
     },
     "node_modules/i18next": {
-      "version": "23.16.8",
-      "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.16.8.tgz",
-      "integrity": "sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg==",
+      "version": "24.2.3",
+      "resolved": "https://registry.npmjs.org/i18next/-/i18next-24.2.3.tgz",
+      "integrity": "sha512-lfbf80OzkocvX7nmZtu7nSTNbrTYR52sLWxPtlXX1zAhVw8WEnFk4puUkCR4B1dNQwbSpEHHHemcZu//7EcB7A==",
       "funding": [
         {
           "type": "individual",
@@ -27113,7 +27113,15 @@
       ],
       "license": "MIT",
       "dependencies": {
-        "@babel/runtime": "^7.23.2"
+        "@babel/runtime": "^7.26.10"
+      },
+      "peerDependencies": {
+        "typescript": "^5"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
       }
     },
     "node_modules/i18next-fs-backend": {
@@ -27123,9 +27131,9 @@
       "license": "MIT"
     },
     "node_modules/i18next-http-middleware": {
-      "version": "3.7.1",
-      "resolved": "https://registry.npmjs.org/i18next-http-middleware/-/i18next-http-middleware-3.7.1.tgz",
-      "integrity": "sha512-nVTSGB1P4Gad5PFQYf3xVUOzJ4tVSQYD8Rs0luyWkjEMwqdqAcZ9CqIzqYwVLgB5/BKr1COI0oAei5dlYzmGbg==",
+      "version": "3.7.2",
+      "resolved": "https://registry.npmjs.org/i18next-http-middleware/-/i18next-http-middleware-3.7.2.tgz",
+      "integrity": "sha512-t7Ayd+dAF07c+aN2eF16ESsDa9TaF1g8uXRTYpWWUrK4TCJmfiT1rJTjjB4+K87ZdQ+sfXdF8/uLXph+hVHfdw==",
       "license": "MIT"
     },
     "node_modules/i18next-icu": {
@@ -46375,7 +46383,7 @@
       "version": "3.2.2",
       "license": "GPL-3.0-or-later",
       "dependencies": {
-        "@apollo/server": "^4.11.3",
+        "@apollo/server": "4.11.3",
         "@graphql-tools/stitch": "^9.4.5",
         "@nestjs/apollo": "~13.0.4",
         "@nestjs/common": "~11.0.12",
@@ -46396,10 +46404,10 @@
         "graphql-scalars": "^1.24.0",
         "graphql-tag": "^2.12.6",
         "graphql-upload": "^17.0.0",
-        "http-proxy-middleware": "^2.0.7",
-        "i18next": "^23.12.1",
-        "i18next-fs-backend": "^2.3.1",
-        "i18next-http-middleware": "^3.5.0",
+        "http-proxy-middleware": "^3.0.3",
+        "i18next": "^24.2.3",
+        "i18next-fs-backend": "^2.6.0",
+        "i18next-http-middleware": "^3.7.2",
         "i18next-icu": "^2.3.0",
         "image-size": "^1.1.1",
         "intl-messageformat": "^10.5.11",
@@ -46416,7 +46424,7 @@
       "devDependencies": {
         "@nestjs/testing": "~11.0.12",
         "@types/bcrypt": "^5.0.2",
-        "@types/cookie-session": "^2.0.48",
+        "@types/cookie-session": "^2.0.49",
         "@types/express": "^5.0.1",
         "@types/fs-extra": "^11.0.4",
         "@types/graphql-upload": "^16.0.7",
@@ -46442,6 +46450,253 @@
         "url": "https://github.com/sponsors/michaelbromley"
       }
     },
+    "packages/core/node_modules/@apollo/server/node_modules/@types/express": {
+      "version": "4.17.21",
+      "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz",
+      "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==",
+      "extraneous": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/body-parser": "*",
+        "@types/express-serve-static-core": "^4.17.33",
+        "@types/qs": "*",
+        "@types/serve-static": "*"
+      }
+    },
+    "packages/core/node_modules/@apollo/server/node_modules/@types/express-serve-static-core": {
+      "version": "4.19.6",
+      "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz",
+      "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==",
+      "extraneous": true,
+      "license": "MIT",
+      "dependencies": {
+        "@types/node": "*",
+        "@types/qs": "*",
+        "@types/range-parser": "*",
+        "@types/send": "*"
+      }
+    },
+    "packages/core/node_modules/@apollo/server/node_modules/accepts": {
+      "version": "1.3.8",
+      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
+      "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+      "extraneous": true,
+      "license": "MIT",
+      "dependencies": {
+        "mime-types": "~2.1.34",
+        "negotiator": "0.6.3"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "packages/core/node_modules/@apollo/server/node_modules/content-disposition": {
+      "version": "0.5.4",
+      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
+      "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
+      "extraneous": true,
+      "license": "MIT",
+      "dependencies": {
+        "safe-buffer": "5.2.1"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "packages/core/node_modules/@apollo/server/node_modules/cookie-signature": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+      "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
+      "extraneous": true,
+      "license": "MIT"
+    },
+    "packages/core/node_modules/@apollo/server/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "extraneous": true,
+      "license": "MIT",
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "packages/core/node_modules/@apollo/server/node_modules/express": {
+      "version": "4.21.2",
+      "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz",
+      "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==",
+      "extraneous": true,
+      "license": "MIT",
+      "dependencies": {
+        "accepts": "~1.3.8",
+        "array-flatten": "1.1.1",
+        "body-parser": "1.20.3",
+        "content-disposition": "0.5.4",
+        "content-type": "~1.0.4",
+        "cookie": "0.7.1",
+        "cookie-signature": "1.0.6",
+        "debug": "2.6.9",
+        "depd": "2.0.0",
+        "encodeurl": "~2.0.0",
+        "escape-html": "~1.0.3",
+        "etag": "~1.8.1",
+        "finalhandler": "1.3.1",
+        "fresh": "0.5.2",
+        "http-errors": "2.0.0",
+        "merge-descriptors": "1.0.3",
+        "methods": "~1.1.2",
+        "on-finished": "2.4.1",
+        "parseurl": "~1.3.3",
+        "path-to-regexp": "0.1.12",
+        "proxy-addr": "~2.0.7",
+        "qs": "6.13.0",
+        "range-parser": "~1.2.1",
+        "safe-buffer": "5.2.1",
+        "send": "0.19.0",
+        "serve-static": "1.16.2",
+        "setprototypeof": "1.2.0",
+        "statuses": "2.0.1",
+        "type-is": "~1.6.18",
+        "utils-merge": "1.0.1",
+        "vary": "~1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.10.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/express"
+      }
+    },
+    "packages/core/node_modules/@apollo/server/node_modules/finalhandler": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz",
+      "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
+      "extraneous": true,
+      "license": "MIT",
+      "dependencies": {
+        "debug": "2.6.9",
+        "encodeurl": "~2.0.0",
+        "escape-html": "~1.0.3",
+        "on-finished": "2.4.1",
+        "parseurl": "~1.3.3",
+        "statuses": "2.0.1",
+        "unpipe": "~1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "packages/core/node_modules/@apollo/server/node_modules/fresh": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+      "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
+      "extraneous": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "packages/core/node_modules/@apollo/server/node_modules/media-typer": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+      "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
+      "extraneous": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "packages/core/node_modules/@apollo/server/node_modules/merge-descriptors": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
+      "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
+      "extraneous": true,
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "packages/core/node_modules/@apollo/server/node_modules/negotiator": {
+      "version": "0.6.4",
+      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz",
+      "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==",
+      "extraneous": true,
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "packages/core/node_modules/@apollo/server/node_modules/qs": {
+      "version": "6.13.0",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
+      "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
+      "extraneous": true,
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "side-channel": "^1.0.6"
+      },
+      "engines": {
+        "node": ">=0.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "packages/core/node_modules/@apollo/server/node_modules/send": {
+      "version": "0.19.0",
+      "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
+      "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
+      "extraneous": true,
+      "license": "MIT",
+      "dependencies": {
+        "debug": "2.6.9",
+        "depd": "2.0.0",
+        "destroy": "1.2.0",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "etag": "~1.8.1",
+        "fresh": "0.5.2",
+        "http-errors": "2.0.0",
+        "mime": "1.6.0",
+        "ms": "2.1.3",
+        "on-finished": "2.4.1",
+        "range-parser": "~1.2.1",
+        "statuses": "2.0.1"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "packages/core/node_modules/@apollo/server/node_modules/serve-static": {
+      "version": "1.16.2",
+      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
+      "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
+      "extraneous": true,
+      "license": "MIT",
+      "dependencies": {
+        "encodeurl": "~2.0.0",
+        "escape-html": "~1.0.3",
+        "parseurl": "~1.3.3",
+        "send": "0.19.0"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "packages/core/node_modules/@apollo/server/node_modules/type-is": {
+      "version": "1.6.18",
+      "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+      "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+      "extraneous": true,
+      "license": "MIT",
+      "dependencies": {
+        "media-typer": "0.3.0",
+        "mime-types": "~2.1.24"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
     "packages/core/node_modules/@types/express": {
       "version": "5.0.1",
       "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.1.tgz",
@@ -46621,6 +46876,23 @@
         "node": ">= 0.8"
       }
     },
+    "packages/core/node_modules/http-proxy-middleware": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-3.0.3.tgz",
+      "integrity": "sha512-usY0HG5nyDUwtqpiZdETNbmKtw3QQ1jwYFZ9wi5iHzX2BcILwQKtYDJPo7XHTsu5Z0B2Hj3W9NNnbd+AjFWjqg==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/http-proxy": "^1.17.15",
+        "debug": "^4.3.6",
+        "http-proxy": "^1.18.1",
+        "is-glob": "^4.0.3",
+        "is-plain-object": "^5.0.0",
+        "micromatch": "^4.0.8"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+      }
+    },
     "packages/core/node_modules/iconv-lite": {
       "version": "0.6.3",
       "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
@@ -46633,6 +46905,15 @@
         "node": ">=0.10.0"
       }
     },
+    "packages/core/node_modules/is-plain-object": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
+      "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
     "packages/core/node_modules/media-typer": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz",

+ 4 - 1
packages/admin-ui-plugin/src/plugin.ts

@@ -253,7 +253,10 @@ export class AdminUiPlugin implements NestModule {
         });
 
         const adminUiServer = express.Router();
-        adminUiServer.use(limiter);
+        // This is a workaround for a type mismatch between express v5 (Vendure core)
+        // and express v4 (several transitive dependencies). Can be removed once the
+        // ecosystem has more significantly shifted to v5.
+        adminUiServer.use(limiter as any);
         adminUiServer.use(express.static(adminUiAppPath));
         adminUiServer.use((req, res) => {
             res.sendFile(path.join(adminUiAppPath, 'index.html'));

+ 6 - 6
packages/core/package.json

@@ -40,7 +40,7 @@
         "cli/**/*"
     ],
     "dependencies": {
-        "@apollo/server": "^4.11.3",
+        "@apollo/server": "4.11.3",
         "@graphql-tools/stitch": "^9.4.5",
         "@nestjs/apollo": "~13.0.4",
         "@nestjs/common": "~11.0.12",
@@ -61,10 +61,10 @@
         "graphql-scalars": "^1.24.0",
         "graphql-tag": "^2.12.6",
         "graphql-upload": "^17.0.0",
-        "http-proxy-middleware": "^2.0.7",
-        "i18next": "^23.12.1",
-        "i18next-fs-backend": "^2.3.1",
-        "i18next-http-middleware": "^3.5.0",
+        "http-proxy-middleware": "^3.0.3",
+        "i18next": "^24.2.3",
+        "i18next-fs-backend": "^2.6.0",
+        "i18next-http-middleware": "^3.7.2",
         "i18next-icu": "^2.3.0",
         "image-size": "^1.1.1",
         "intl-messageformat": "^10.5.11",
@@ -81,7 +81,7 @@
     "devDependencies": {
         "@nestjs/testing": "~11.0.12",
         "@types/bcrypt": "^5.0.2",
-        "@types/cookie-session": "^2.0.48",
+        "@types/cookie-session": "^2.0.49",
         "@types/express": "^5.0.1",
         "@types/fs-extra": "^11.0.4",
         "@types/graphql-upload": "^16.0.7",

+ 13 - 1
packages/core/src/config/asset-storage-strategy/asset-storage-strategy.ts

@@ -1,8 +1,20 @@
-import { Request } from 'express';
 import { Stream } from 'stream';
 
 import { InjectableStrategy } from '../../common/types/injectable-strategy';
 
+// This is a workaround for a type mismatch between express v5 (Vendure core)
+// and express v4 (several transitive dependencies). Can be replaced with the
+// actual Request type once the ecosystem has more significantly shifted to v5.
+type Request = {
+    headers: Record<string, string>;
+    url: string;
+    method: string;
+    body: any;
+    query: any;
+    params: any;
+    ip: string;
+} & any;
+
 /**
  * @description
  * The AssetPersistenceStrategy determines how Asset files are physically stored

+ 3 - 1
packages/core/src/i18n/i18n.service.ts

@@ -75,7 +75,9 @@ export class I18nService implements OnModuleInit {
      * @internal
      */
     handle(): Handler {
-        return i18nextMiddleware.handle(i18next);
+        // Explicit cast due to type mismatch between express v5 (Vendure core)
+        // and express v4 (several transitive dependencies)
+        return i18nextMiddleware.handle(i18next) as unknown as Handler;
     }
 
     /**

+ 17 - 19
packages/core/src/plugin/plugin-utils.ts

@@ -1,7 +1,7 @@
 import { RequestHandler } from 'express';
 import { createProxyMiddleware } from 'http-proxy-middleware';
 
-import { Logger, RuntimeVendureConfig, VendureConfig } from '../config';
+import { Logger } from '../config';
 
 /**
  * @description
@@ -43,24 +43,22 @@ export function createProxyHandler(options: ProxyOptions): RequestHandler {
         pathRewrite: {
             [`^${route}`]: '/' + (options.basePath || ''),
         },
-        logProvider(provider) {
-            return {
-                log(message: string) {
-                    Logger.debug(message, options.label);
-                },
-                debug(message: string) {
-                    Logger.debug(message, options.label);
-                },
-                info(message: string) {
-                    Logger.debug(message, options.label);
-                },
-                warn(message: string) {
-                    Logger.warn(message, options.label);
-                },
-                error(message: string) {
-                    Logger.error(message, options.label);
-                },
-            };
+        logger: {
+            log(message: string) {
+                Logger.debug(message, options.label);
+            },
+            debug(message: string) {
+                Logger.debug(message, options.label);
+            },
+            info(message: string) {
+                Logger.debug(message, options.label);
+            },
+            warn(message: string) {
+                Logger.warn(message, options.label);
+            },
+            error(message: string) {
+                Logger.error(message, options.label);
+            },
         },
     });
     return middleware;

+ 5 - 2
packages/payments-plugin/src/mollie/mollie.controller.ts

@@ -1,5 +1,5 @@
 import { Body, Controller, Param, Post, Req } from '@nestjs/common';
-import { Ctx, Logger, RequestContext, Transaction, ChannelService, LanguageCode } from '@vendure/core';
+import { Logger, RequestContext, Transaction, ChannelService, LanguageCode } from '@vendure/core';
 import { Request } from 'express';
 
 import { loggerCtx } from './constants';
@@ -48,7 +48,10 @@ export class MollieController {
             isAuthorized: true,
             authorizedAsOwnerOnly: false,
             channel,
-            req,
+            // This is a workaround for a type mismatch between express v5 (Vendure core)
+            // and express v4 (several transitive dependencies). Can be removed once the
+            // ecosystem has more significantly shifted to v5.
+            req: req as any,
             languageCode: LanguageCode.en,
         });
     }

+ 14 - 3
packages/payments-plugin/src/stripe/stripe.controller.ts

@@ -112,7 +112,11 @@ export class StripeController {
                 // channel to fail. Using a default channel avoids "entity-with-id-not-found" errors.
                 // See https://github.com/vendure-ecommerce/vendure/issues/3072
                 const defaultChannel = await this.channelService.getDefaultChannel(ctx);
-                const ctxWithDefaultChannel = await this.createContext(defaultChannel.token, languageCode, request);
+                const ctxWithDefaultChannel = await this.createContext(
+                    defaultChannel.token,
+                    languageCode,
+                    request,
+                );
                 const transitionToStateResult = await this.orderService.transitionToState(
                     ctxWithDefaultChannel,
                     orderId,
@@ -159,11 +163,18 @@ export class StripeController {
         }
     }
 
-    private async createContext(channelToken: string, languageCode: LanguageCode, req: RequestWithRawBody): Promise<RequestContext> {
+    private async createContext(
+        channelToken: string,
+        languageCode: LanguageCode,
+        req: RequestWithRawBody,
+    ): Promise<RequestContext> {
         return this.requestContextService.create({
             apiType: 'admin',
             channelOrToken: channelToken,
-            req,
+            // This is a workaround for a type mismatch between express v5 (Vendure core)
+            // and express v4 (several transitive dependencies). Can be removed once the
+            // ecosystem has more significantly shifted to v5.
+            req: req as any,
             languageCode,
         });
     }

+ 1 - 6
packages/sentry-plugin/src/sentry-apollo-plugin.ts

@@ -1,10 +1,5 @@
 /* eslint-disable @typescript-eslint/require-await */
-import {
-    ApolloServerPlugin,
-    GraphQLRequestListener,
-    GraphQLRequestContext,
-    GraphQLRequestContextDidEncounterErrors,
-} from '@apollo/server';
+import { ApolloServerPlugin, GraphQLRequestListener, GraphQLRequestContext } from '@apollo/server';
 import { Transaction, setContext } from '@sentry/node';
 
 import { SENTRY_TRANSACTION_KEY } from './constants';