From ba4da3e35c2b25bff1f9bafd181ca8c33ac58751 Mon Sep 17 00:00:00 2001 From: Dave Richer Date: Tue, 1 Apr 2025 12:04:14 -0400 Subject: [PATCH 1/8] feature/IO-2885-IntelliPay-App-Postback-Support - Packages --- client/package-lock.json | 553 +++++++++---- client/package.json | 28 +- package-lock.json | 1636 +++++++++++++++++++------------------- package.json | 22 +- 4 files changed, 1227 insertions(+), 1012 deletions(-) diff --git a/client/package-lock.json b/client/package-lock.json index af00cf920..dbfeed6ca 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -9,23 +9,23 @@ "version": "0.2.1", "hasInstallScript": true, "dependencies": { - "@ant-design/pro-layout": "^7.22.3", + "@ant-design/pro-layout": "^7.22.4", "@apollo/client": "^3.13.5", "@emotion/is-prop-valid": "^1.3.1", "@fingerprintjs/fingerprintjs": "^4.6.1", "@firebase/analytics": "^0.10.12", - "@firebase/app": "^0.11.3", - "@firebase/auth": "^1.9.1", + "@firebase/app": "^0.11.4", + "@firebase/auth": "^1.10.0", "@firebase/firestore": "^4.7.10", "@firebase/messaging": "^0.12.17", "@jsreport/browser-client": "^3.1.0", "@reduxjs/toolkit": "^2.6.1", - "@sentry/cli": "^2.42.4", - "@sentry/react": "^9.9.0", - "@sentry/vite-plugin": "^3.2.2", - "@splitsoftware/splitio-react": "^2.0.1", + "@sentry/cli": "^2.43.0", + "@sentry/react": "^9.10.1", + "@sentry/vite-plugin": "^3.2.4", + "@splitsoftware/splitio-react": "^2.1.0", "@tanem/react-nprogress": "^5.0.53", - "antd": "^5.24.5", + "antd": "^5.24.6", "apollo-link-logger": "^2.0.1", "apollo-link-sentry": "^4.2.0", "autosize": "^6.0.1", @@ -70,7 +70,7 @@ "react-resizable": "^3.0.5", "react-router-dom": "^6.30.0", "react-sticky": "^6.0.3", - "react-virtuoso": "^4.12.5", + "react-virtuoso": "^4.12.6", "recharts": "^2.15.0", "redux": "^5.0.1", "redux-actions": "^3.0.3", @@ -78,7 +78,7 @@ "redux-saga": "^1.3.0", "redux-state-sync": "^3.1.4", "reselect": "^5.1.1", - "sass": "^1.86.0", + "sass": "^1.86.1", "socket.io-client": "^4.8.1", "styled-components": "^6.1.16", "subscriptions-transport-ws": "^0.11.0", @@ -95,7 +95,7 @@ "@emotion/react": "^11.14.0", "@eslint/js": "^9.23.0", "@playwright/test": "^1.51.1", - "@sentry/webpack-plugin": "^3.2.2", + "@sentry/webpack-plugin": "^3.2.4", "@testing-library/dom": "^10.4.0", "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.2.0", @@ -114,13 +114,13 @@ "react-error-overlay": "^6.1.0", "redux-logger": "^3.0.6", "source-map-explorer": "^2.5.3", - "vite": "^6.2.3", + "vite": "^6.2.4", "vite-plugin-babel": "^1.3.0", "vite-plugin-eslint": "^1.8.1", "vite-plugin-node-polyfills": "^0.23.0", - "vite-plugin-pwa": "^0.21.2", + "vite-plugin-pwa": "^1.0.0", "vite-plugin-style-import": "^2.0.0", - "vitest": "^3.0.9", + "vitest": "^3.1.1", "workbox-window": "^7.3.0" }, "engines": { @@ -252,15 +252,15 @@ } }, "node_modules/@ant-design/pro-layout": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@ant-design/pro-layout/-/pro-layout-7.22.3.tgz", - "integrity": "sha512-di/EOMDuoMDRjBweqesYyCxEYr2LCmO82y6A4bSwmmJ6ehxN7HGC73Wx4RuBkzDR7kHLTOXt7WxI6875ENT8mg==", + "version": "7.22.4", + "resolved": "https://registry.npmjs.org/@ant-design/pro-layout/-/pro-layout-7.22.4.tgz", + "integrity": "sha512-X2WO4L2itXemX4zhS+0NG+8kXQD5SX9sG+zjx/15BmIO3FvsUGqOHgoCg0vhd424EiyPj7WtdMZJ39G1xdgDwA==", "license": "MIT", "dependencies": { "@ant-design/cssinjs": "^1.21.1", "@ant-design/icons": "^5.0.0", - "@ant-design/pro-provider": "2.15.3", - "@ant-design/pro-utils": "2.16.4", + "@ant-design/pro-provider": "2.15.4", + "@ant-design/pro-utils": "2.17.0", "@babel/runtime": "^7.18.0", "@umijs/route-utils": "^4.0.0", "@umijs/use-params": "^1.0.9", @@ -300,9 +300,9 @@ } }, "node_modules/@ant-design/pro-provider": { - "version": "2.15.3", - "resolved": "https://registry.npmjs.org/@ant-design/pro-provider/-/pro-provider-2.15.3.tgz", - "integrity": "sha512-jUBCuRrhAXNMumSZ++704/zEg/7U1k2N3jMVBgtirvVaCAk5O9iZQKK4W3O3LRFc+D8yO16sXjsxhawvdGL4cA==", + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/@ant-design/pro-provider/-/pro-provider-2.15.4.tgz", + "integrity": "sha512-DBX0JNUNOYXAucVqd/zTdqtXckCDqr2Lo85KIku2YzWdhptDPDZRTNqL04JShjGejDl8fzwQ8yREHgVUfzn6Gg==", "license": "MIT", "dependencies": { "@ant-design/cssinjs": "^1.21.1", @@ -319,13 +319,13 @@ } }, "node_modules/@ant-design/pro-utils": { - "version": "2.16.4", - "resolved": "https://registry.npmjs.org/@ant-design/pro-utils/-/pro-utils-2.16.4.tgz", - "integrity": "sha512-PFxqF0fsUsLj8ORvJSuMgVv9NDHwAxZaglzPN/u3jZX7rWYcrHD04EMJEXooZaSyT6Q4+j7SqXDx6oBsdb9zNw==", + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/@ant-design/pro-utils/-/pro-utils-2.17.0.tgz", + "integrity": "sha512-hHKUISjMEoS+E5ltJWyvNTrlEA3IimZNxtDrEhorRIbgVYAlmEN5Mj/ESSofzDM3+UlxiI5+A/Y6IHkByTfDEA==", "license": "MIT", "dependencies": { "@ant-design/icons": "^5.0.0", - "@ant-design/pro-provider": "2.15.3", + "@ant-design/pro-provider": "2.15.4", "@babel/runtime": "^7.18.0", "classnames": "^2.3.2", "dayjs": "^1.11.10", @@ -2926,9 +2926,9 @@ } }, "node_modules/@firebase/app": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.11.3.tgz", - "integrity": "sha512-QlTZl/RcqPSonYxB87n8KgAUW2L6ZZz0W4D91PVmQ1tJPsKsKPrWAFHL0ii2cQW6FxTxfNjbZ7kucuIcKXk3tw==", + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.11.4.tgz", + "integrity": "sha512-GPREsZjfSaHzwyC6cI/Cqvzf6zxqMzya+25tSpUstdqC2w0IdfxEfOMjfdW7bDfVEf4Rb4Nb6gfoOAgVSp4c4g==", "license": "Apache-2.0", "dependencies": { "@firebase/component": "0.6.13", @@ -2942,9 +2942,9 @@ } }, "node_modules/@firebase/auth": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.9.1.tgz", - "integrity": "sha512-9KKo5SNVkyJzftsW+daS+PGDbeJ+MFJWXQFHDqqPPH3acWHtiNnGHH5HGpIJErEELrsm9xMPie5zfZ0XpGU8+w==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.10.0.tgz", + "integrity": "sha512-S7SqBsN7sIQsftNE3bitLlK+4bWrTHY+Rx2JFlNitgVYu2nK8W8ZQrkG8GCEwiFPq0B2vZ9pO5kVTFfq2sP96A==", "license": "Apache-2.0", "dependencies": { "@firebase/component": "0.6.13", @@ -4178,88 +4178,88 @@ "license": "MIT" }, "node_modules/@sentry-internal/browser-utils": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-9.9.0.tgz", - "integrity": "sha512-V/YhKLis98JFkqBGZaEBlDNFpJHJjoCvNb05raAYXdITfDIl37Kxqj0zX+IzyRhqnswkQ+DBTyoEoci09IR2bQ==", + "version": "9.10.1", + "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-9.10.1.tgz", + "integrity": "sha512-O/ibpHbKfpG+xtZuEzbLNtLcbanRcDYGxT+QbslVItmcS9GjMSwvMpp1jnD9Y7/LIFtv7O1gJZ9Hrz///lLprw==", "license": "MIT", "dependencies": { - "@sentry/core": "9.9.0" + "@sentry/core": "9.10.1" }, "engines": { "node": ">=18" } }, "node_modules/@sentry-internal/feedback": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-9.9.0.tgz", - "integrity": "sha512-hrxuOLm0Xsnx75hTNt3eLgNNjER3egrHZShdRzlMiakfKpA9f2X10z75vlZmT5ZUygDQnp9UVUnu28cDuVb9Zw==", + "version": "9.10.1", + "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-9.10.1.tgz", + "integrity": "sha512-DM32eAzRvXk36iGBWtlLZA88QzOFBODd+kbz55X4Py+1bDNdRc3Vl6214uuAr7iweHcOQy1rIvmAeO8Xusp7tQ==", "license": "MIT", "dependencies": { - "@sentry/core": "9.9.0" + "@sentry/core": "9.10.1" }, "engines": { "node": ">=18" } }, "node_modules/@sentry-internal/replay": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-9.9.0.tgz", - "integrity": "sha512-EWczKMu3qiZ0SUUWU3zkGod+AWD/VQCLiQw+tw+PEpdHbRZIdYKsEptengZCFKthrwe2QmYpVCTSRxGvujJ/6g==", + "version": "9.10.1", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-9.10.1.tgz", + "integrity": "sha512-nqG33NwojtteL8e3Qg/SOu0BsTJ9R7AjpmQIlOpFGL007nzKgcJHOngewd7FEHyB+F3iOI0MoI9iEWhRFEGRLw==", "license": "MIT", "dependencies": { - "@sentry-internal/browser-utils": "9.9.0", - "@sentry/core": "9.9.0" + "@sentry-internal/browser-utils": "9.10.1", + "@sentry/core": "9.10.1" }, "engines": { "node": ">=18" } }, "node_modules/@sentry-internal/replay-canvas": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-9.9.0.tgz", - "integrity": "sha512-YK0ixGjquahGpNsQskCEVwycdHlwNBLCx9XJr1BmGnlOw6fUCmpyVetaGg/ZyhkzKGNXAGoTa4s7FUFnAG4bKg==", + "version": "9.10.1", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-9.10.1.tgz", + "integrity": "sha512-fxrpqElqdsAQrzVly0V/XaljhAlwwMk+iGyf+wZeK6RwEPVxtoxXVfx7fEEtPn+gortqQR09N/zH179hefjuaw==", "license": "MIT", "dependencies": { - "@sentry-internal/replay": "9.9.0", - "@sentry/core": "9.9.0" + "@sentry-internal/replay": "9.10.1", + "@sentry/core": "9.10.1" }, "engines": { "node": ">=18" } }, "node_modules/@sentry/babel-plugin-component-annotate": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-3.2.2.tgz", - "integrity": "sha512-D+SKQ266ra/wo87s9+UI/rKQi3qhGPCR8eSCDe0VJudhjHsqyNU+JJ5lnIGCgmZaWFTXgdBP/gdr1Iz1zqGs4Q==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-3.2.4.tgz", + "integrity": "sha512-yBzRn3GEUSv1RPtE4xB4LnuH74ZxtdoRJ5cmQ9i6mzlmGDxlrnKuvem5++AolZTE9oJqAD3Tx2rd1PqmpWnLoA==", "license": "MIT", "engines": { "node": ">= 14" } }, "node_modules/@sentry/browser": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-9.9.0.tgz", - "integrity": "sha512-pIMdkOC+iggZefBs6ck5fL1mBhbLzjdw/8K99iqSeDh+lLvmlHVZajAhPlmw50xfH8CyQ1s22dhcL+zXbg3NKw==", + "version": "9.10.1", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-9.10.1.tgz", + "integrity": "sha512-9RWjcyskhnDK2Q6LntFR90EqZD5+DXcXNqeTlE+mpVf65y7wz+9SIuVjAMP7qiDBwfxNbmTxiVCXeCuQnnATsQ==", "license": "MIT", "dependencies": { - "@sentry-internal/browser-utils": "9.9.0", - "@sentry-internal/feedback": "9.9.0", - "@sentry-internal/replay": "9.9.0", - "@sentry-internal/replay-canvas": "9.9.0", - "@sentry/core": "9.9.0" + "@sentry-internal/browser-utils": "9.10.1", + "@sentry-internal/feedback": "9.10.1", + "@sentry-internal/replay": "9.10.1", + "@sentry-internal/replay-canvas": "9.10.1", + "@sentry/core": "9.10.1" }, "engines": { "node": ">=18" } }, "node_modules/@sentry/bundler-plugin-core": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@sentry/bundler-plugin-core/-/bundler-plugin-core-3.2.2.tgz", - "integrity": "sha512-YGrtmqQ2jMixccX2slVG/Lw7pCGJL3DGB3clmY9mO8QBEBIN3/gEANiHJVWwRidpUOS/0b7yVVGAdwZ87oPwTg==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@sentry/bundler-plugin-core/-/bundler-plugin-core-3.2.4.tgz", + "integrity": "sha512-YMj9XW5W2JA89EeweE7CPKLDz245LBsI1JhCmqpt/bjSvmsSIAAPsLYnvIJBS3LQFm0OhtG8NB54PTi96dAcMA==", "license": "MIT", "dependencies": { "@babel/core": "^7.18.5", - "@sentry/babel-plugin-component-annotate": "3.2.2", + "@sentry/babel-plugin-component-annotate": "3.2.4", "@sentry/cli": "2.42.2", "dotenv": "^16.3.1", "find-up": "^5.0.0", @@ -4300,6 +4300,105 @@ "@sentry/cli-win32-x64": "2.42.2" } }, + "node_modules/@sentry/bundler-plugin-core/node_modules/@sentry/cli-darwin": { + "version": "2.42.2", + "resolved": "https://registry.npmjs.org/@sentry/cli-darwin/-/cli-darwin-2.42.2.tgz", + "integrity": "sha512-GtJSuxER7Vrp1IpxdUyRZzcckzMnb4N5KTW7sbTwUiwqARRo+wxS+gczYrS8tdgtmXs5XYhzhs+t4d52ITHMIg==", + "license": "BSD-3-Clause", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/bundler-plugin-core/node_modules/@sentry/cli-linux-arm": { + "version": "2.42.2", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm/-/cli-linux-arm-2.42.2.tgz", + "integrity": "sha512-7udCw+YL9lwq+9eL3WLspvnuG+k5Icg92YE7zsteTzWLwgPVzaxeZD2f8hwhsu+wmL+jNqbpCRmktPteh3i2mg==", + "cpu": [ + "arm" + ], + "license": "BSD-3-Clause", + "optional": true, + "os": [ + "linux", + "freebsd" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/bundler-plugin-core/node_modules/@sentry/cli-linux-arm64": { + "version": "2.42.2", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.42.2.tgz", + "integrity": "sha512-BOxzI7sgEU5Dhq3o4SblFXdE9zScpz6EXc5Zwr1UDZvzgXZGosUtKVc7d1LmkrHP8Q2o18HcDWtF3WvJRb5Zpw==", + "cpu": [ + "arm64" + ], + "license": "BSD-3-Clause", + "optional": true, + "os": [ + "linux", + "freebsd" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/bundler-plugin-core/node_modules/@sentry/cli-linux-i686": { + "version": "2.42.2", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-i686/-/cli-linux-i686-2.42.2.tgz", + "integrity": "sha512-Sw/dQp5ZPvKnq3/y7wIJyxTUJYPGoTX/YeMbDs8BzDlu9to2LWV3K3r7hE7W1Lpbaw4tSquUHiQjP5QHCOS7aQ==", + "cpu": [ + "x86", + "ia32" + ], + "license": "BSD-3-Clause", + "optional": true, + "os": [ + "linux", + "freebsd" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/bundler-plugin-core/node_modules/@sentry/cli-linux-x64": { + "version": "2.42.2", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-x64/-/cli-linux-x64-2.42.2.tgz", + "integrity": "sha512-mU4zUspAal6TIwlNLBV5oq6yYqiENnCWSxtSQVzWs0Jyq97wtqGNG9U+QrnwjJZ+ta/hvye9fvL2X25D/RxHQw==", + "cpu": [ + "x64" + ], + "license": "BSD-3-Clause", + "optional": true, + "os": [ + "linux", + "freebsd" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/bundler-plugin-core/node_modules/@sentry/cli-win32-i686": { + "version": "2.42.2", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-i686/-/cli-win32-i686-2.42.2.tgz", + "integrity": "sha512-iHvFHPGqgJMNqXJoQpqttfsv2GI3cGodeTq4aoVLU/BT3+hXzbV0x1VpvvEhncJkDgDicJpFLM8sEPHb3b8abw==", + "cpu": [ + "x86", + "ia32" + ], + "license": "BSD-3-Clause", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, "node_modules/@sentry/bundler-plugin-core/node_modules/@sentry/cli-win32-x64": { "version": "2.42.2", "resolved": "https://registry.npmjs.org/@sentry/cli-win32-x64/-/cli-win32-x64-2.42.2.tgz", @@ -4338,9 +4437,9 @@ } }, "node_modules/@sentry/cli": { - "version": "2.42.4", - "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-2.42.4.tgz", - "integrity": "sha512-BoSZDAWJiz/40tu6LuMDkSgwk4xTsq6zwqYoUqLU3vKBR/VsaaQGvu6EWxZXORthfZU2/5Agz0+t220cge6VQw==", + "version": "2.43.0", + "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-2.43.0.tgz", + "integrity": "sha512-gBE3bkx+PBJxopTrzIJLX4xHe5S0w87q5frIveWKDZ5ulVIU6YWnVumay0y07RIEweUEj3IYva1qH6HG2abfiA==", "hasInstallScript": true, "license": "BSD-3-Clause", "dependencies": { @@ -4357,19 +4456,135 @@ "node": ">= 10" }, "optionalDependencies": { - "@sentry/cli-darwin": "2.42.4", - "@sentry/cli-linux-arm": "2.42.4", - "@sentry/cli-linux-arm64": "2.42.4", - "@sentry/cli-linux-i686": "2.42.4", - "@sentry/cli-linux-x64": "2.42.4", - "@sentry/cli-win32-i686": "2.42.4", - "@sentry/cli-win32-x64": "2.42.4" + "@sentry/cli-darwin": "2.43.0", + "@sentry/cli-linux-arm": "2.43.0", + "@sentry/cli-linux-arm64": "2.43.0", + "@sentry/cli-linux-i686": "2.43.0", + "@sentry/cli-linux-x64": "2.43.0", + "@sentry/cli-win32-arm64": "2.43.0", + "@sentry/cli-win32-i686": "2.43.0", + "@sentry/cli-win32-x64": "2.43.0" + } + }, + "node_modules/@sentry/cli-darwin": { + "version": "2.43.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-darwin/-/cli-darwin-2.43.0.tgz", + "integrity": "sha512-0MYvRHJowXOMNY5W6XF4p9GQNH3LuQ+IHAQwVbZOsfwnEv8e20rf9BiPPzmJ9sIjZSWYR4yIqm6dBp6ABJFbGQ==", + "license": "BSD-3-Clause", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-linux-arm": { + "version": "2.43.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm/-/cli-linux-arm-2.43.0.tgz", + "integrity": "sha512-c2Fwb6HrFL1nbaGV4uRhHC1wEJPR+wfpKN5y06PgSNNbd10YrECAB3tqBHXC8CEmhuDyFR+ORGZ7VbswfCWEEQ==", + "cpu": [ + "arm" + ], + "license": "BSD-3-Clause", + "optional": true, + "os": [ + "linux", + "freebsd" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-linux-arm64": { + "version": "2.43.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.43.0.tgz", + "integrity": "sha512-7URSaNjbEJQZyYJ33XK3pVKl6PU2oO9ETF6R/4Cz2FmU3fecACLKVldv7+OuNl9aspLZ62mnPMDvT732/Fp2Ug==", + "cpu": [ + "arm64" + ], + "license": "BSD-3-Clause", + "optional": true, + "os": [ + "linux", + "freebsd" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-linux-i686": { + "version": "2.43.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-i686/-/cli-linux-i686-2.43.0.tgz", + "integrity": "sha512-bFo/tpMZeMJ275HPGmAENREchnBxhALOOpZAphSyalUu3pGZ+EETEtlSLrKyVNJo26Dye5W7GlrYUV9+rkyCtg==", + "cpu": [ + "x86", + "ia32" + ], + "license": "BSD-3-Clause", + "optional": true, + "os": [ + "linux", + "freebsd" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-linux-x64": { + "version": "2.43.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-x64/-/cli-linux-x64-2.43.0.tgz", + "integrity": "sha512-EbAmKXUNU/Ii4pNGVRCepU6ks1M43wStMKx3pibrUTllrrCwqYKyPxRRdoFYySHkduwCxnoKZcLEg9vWZ3qS6A==", + "cpu": [ + "x64" + ], + "license": "BSD-3-Clause", + "optional": true, + "os": [ + "linux", + "freebsd" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-win32-arm64": { + "version": "2.43.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-arm64/-/cli-win32-arm64-2.43.0.tgz", + "integrity": "sha512-KmJRCdQQGLSErJvrcGcN+yWo68m+5OdluhyJHsVYMOQknwu8YMOWLm12EIa+4t4GclDvwg5xcxLccCuiWMJUZw==", + "cpu": [ + "arm64" + ], + "license": "BSD-3-Clause", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-win32-i686": { + "version": "2.43.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-i686/-/cli-win32-i686-2.43.0.tgz", + "integrity": "sha512-ZWxZdOyZX7NJ/CTskzg+dJ2xTpobFLXVNMOMq0HiwdhqXP2zYYJzKnIt3mHNJYA40zYFODGSgxIamodjpB8BuA==", + "cpu": [ + "x86", + "ia32" + ], + "license": "BSD-3-Clause", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" } }, "node_modules/@sentry/cli-win32-x64": { - "version": "2.42.4", - "resolved": "https://registry.npmjs.org/@sentry/cli-win32-x64/-/cli-win32-x64-2.42.4.tgz", - "integrity": "sha512-OIBj3uaQ6nAERSm5Dcf8UIhyElEEwMNsZEEppQpN4IKl0mrwb/57AznM23Dvpu6GR8WGbVQUSolt879YZR5E9g==", + "version": "2.43.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-x64/-/cli-win32-x64-2.43.0.tgz", + "integrity": "sha512-S/IRQYAziEnjpyROhnqzTqShDq3m8jcevXx+q5f49uQnFbfYcTgS1sdrEPqqao/K2boOWbffxYtTkvBiB/piQQ==", "cpu": [ "x64" ], @@ -4404,22 +4619,22 @@ } }, "node_modules/@sentry/core": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-9.9.0.tgz", - "integrity": "sha512-GxKvx8PSgoWhLLS+/WBGIXy7rsFcnJBPDqFXIfcAGy89k2j06d9IP0kiIc63qBGStSUkh5FFJLPTakZ5RXiFXA==", + "version": "9.10.1", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-9.10.1.tgz", + "integrity": "sha512-TE2zZV3Od4131mZNgFo2Mv4aKU8FXxL0s96yqRvmV+8AU57mJoycMXBnmNSYfWuDICbPJTVAp+3bYMXwX7N5YA==", "license": "MIT", "engines": { "node": ">=18" } }, "node_modules/@sentry/react": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/@sentry/react/-/react-9.9.0.tgz", - "integrity": "sha512-7BE2Lx5CNtHtlNSS7Z9HxKquohC0xhdFceO3NlMXlx+dZuVCMoQmLISB8SQEcHw+2VO24MvtP3LPEzdeNbkIfg==", + "version": "9.10.1", + "resolved": "https://registry.npmjs.org/@sentry/react/-/react-9.10.1.tgz", + "integrity": "sha512-DYBs3F+F2elWEhWvp3HmBmORhAlTBbY0KsRj+Lt2mOSEfiz8WWrS3Ibe+9QmErVdjQZy68ic9Yt84MHL/rlmkQ==", "license": "MIT", "dependencies": { - "@sentry/browser": "9.9.0", - "@sentry/core": "9.9.0", + "@sentry/browser": "9.10.1", + "@sentry/core": "9.10.1", "hoist-non-react-statics": "^3.3.2" }, "engines": { @@ -4430,12 +4645,12 @@ } }, "node_modules/@sentry/vite-plugin": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@sentry/vite-plugin/-/vite-plugin-3.2.2.tgz", - "integrity": "sha512-WSkHOhZszMrIE9zmx2l4JhMnMlZmN/yAoHyf59pwFLIMctuZak6lNPbTbIFkFHDzIJ9Nut5RAVsw1qjmWc1PTA==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@sentry/vite-plugin/-/vite-plugin-3.2.4.tgz", + "integrity": "sha512-ZRn5TLlq5xtwKOqaWP+XqS1PYVfbBCgsbMk7wW2Ly6EgF9wYePvtLqKgYnE3hwPg2LpBnRPR2ti1ohlUkR+wXA==", "license": "MIT", "dependencies": { - "@sentry/bundler-plugin-core": "3.2.2", + "@sentry/bundler-plugin-core": "3.2.4", "unplugin": "1.0.1" }, "engines": { @@ -4443,13 +4658,13 @@ } }, "node_modules/@sentry/webpack-plugin": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@sentry/webpack-plugin/-/webpack-plugin-3.2.2.tgz", - "integrity": "sha512-6OkVKNOjKk8P9j7oh6svZ+kEP1i9YIHBC2aGWL2XsgeZTIrMBxJAXtOf+qSrfMAxEtibSroGVOMQc/y3WJTQtg==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@sentry/webpack-plugin/-/webpack-plugin-3.2.4.tgz", + "integrity": "sha512-LCuNu5LXPSCq2BNke1zvEW8CXL4SPBsCjYexAx51PZ6Lp87VxWcCxGqXhr37MGpYwY10A1r31/XOe69iXHJjGA==", "dev": true, "license": "MIT", "dependencies": { - "@sentry/bundler-plugin-core": "3.2.2", + "@sentry/bundler-plugin-core": "3.2.4", "unplugin": "1.0.1", "uuid": "^9.0.0" }, @@ -4467,12 +4682,12 @@ "license": "MIT" }, "node_modules/@splitsoftware/splitio": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@splitsoftware/splitio/-/splitio-11.0.3.tgz", - "integrity": "sha512-UtoixGfICCj52FfaVdI186Czw0qCvvEyCw/OtJVTsgM4Zq0k2mY8yKzQ7tSB/HJtzbUVnuPoxkwEcj0479stmg==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@splitsoftware/splitio/-/splitio-11.2.0.tgz", + "integrity": "sha512-M0TK8jlhLBv4+PchzBvn5R33MZzvRTInauGKGeaTpbxI+zq/g58meaNEiLRJxNw1lAWOjPhPRLIVg+V3Mf+uaA==", "license": "Apache-2.0", "dependencies": { - "@splitsoftware/splitio-commons": "2.0.2", + "@splitsoftware/splitio-commons": "2.2.0", "bloom-filters": "^3.0.4", "ioredis": "^4.28.0", "js-yaml": "^3.13.1", @@ -4485,9 +4700,9 @@ } }, "node_modules/@splitsoftware/splitio-commons": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@splitsoftware/splitio-commons/-/splitio-commons-2.0.2.tgz", - "integrity": "sha512-r2m3kwWnSuROT+7zTzhWBrM0DMRBGJNQcTyvXw8zLPPmBs/PnmAnxCy7uRpfMHOGbP9Q3Iju0bU/H5dG8svyiw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@splitsoftware/splitio-commons/-/splitio-commons-2.2.0.tgz", + "integrity": "sha512-ywWDh2fM4/EqJ1AByjXM13gAal+z/WSGiBQ5OZmjpL/iqFLENy3yo/GwsxR/ataOi27XbRQTeQbE/eD7HVnWiA==", "license": "Apache-2.0", "dependencies": { "@types/ioredis": "^4.28.0", @@ -4503,12 +4718,12 @@ } }, "node_modules/@splitsoftware/splitio-react": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@splitsoftware/splitio-react/-/splitio-react-2.0.1.tgz", - "integrity": "sha512-Jky3o46w+CO2+x6TN3kzQ4CoASKX4PqtDqSTHY6n5JXBC2CqhlXuvODoMYXKzolOsndku+aL7+Mlavbn7b+2lw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@splitsoftware/splitio-react/-/splitio-react-2.1.0.tgz", + "integrity": "sha512-iAGXl/qadHVFUQA/+asX8UGwDPpNi6WCKhNIzLZ6NSvt38+M8Bpc3CMnkYNEXsNsz1J+C26ICsMZ067YQ96k6g==", "license": "Apache-2.0", "dependencies": { - "@splitsoftware/splitio": "11.0.3", + "@splitsoftware/splitio": "11.2.0", "memoize-one": "^5.1.1", "shallowequal": "^1.1.0", "tslib": "^2.3.1" @@ -5281,14 +5496,14 @@ } }, "node_modules/@vitest/expect": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.0.9.tgz", - "integrity": "sha512-5eCqRItYgIML7NNVgJj6TVCmdzE7ZVgJhruW0ziSQV4V7PvLkDL1bBkBdcTs/VuIz0IxPb5da1IDSqc1TR9eig==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.1.1.tgz", + "integrity": "sha512-q/zjrW9lgynctNbwvFtQkGK9+vvHA5UzVi2V8APrp1C6fG6/MuYYkmlx4FubuqLycCeSdHD5aadWfua/Vr0EUA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "3.0.9", - "@vitest/utils": "3.0.9", + "@vitest/spy": "3.1.1", + "@vitest/utils": "3.1.1", "chai": "^5.2.0", "tinyrainbow": "^2.0.0" }, @@ -5297,13 +5512,13 @@ } }, "node_modules/@vitest/mocker": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.0.9.tgz", - "integrity": "sha512-ryERPIBOnvevAkTq+L1lD+DTFBRcjueL9lOUfXsLfwP92h4e+Heb+PjiqS3/OURWPtywfafK0kj++yDFjWUmrA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.1.1.tgz", + "integrity": "sha512-bmpJJm7Y7i9BBELlLuuM1J1Q6EQ6K5Ye4wcyOpOMXMcePYKSIYlpcrCm4l/O6ja4VJA5G2aMJiuZkZdnxlC3SA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "3.0.9", + "@vitest/spy": "3.1.1", "estree-walker": "^3.0.3", "magic-string": "^0.30.17" }, @@ -5344,9 +5559,9 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.9.tgz", - "integrity": "sha512-OW9F8t2J3AwFEwENg3yMyKWweF7oRJlMyHOMIhO5F3n0+cgQAJZBjNgrF8dLwFTEXl5jUqBLXd9QyyKv8zEcmA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.1.1.tgz", + "integrity": "sha512-dg0CIzNx+hMMYfNmSqJlLSXEmnNhMswcn3sXO7Tpldr0LiGmg3eXdLLhwkv2ZqgHb/d5xg5F7ezNFRA1fA13yA==", "dev": true, "license": "MIT", "dependencies": { @@ -5357,13 +5572,13 @@ } }, "node_modules/@vitest/runner": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.0.9.tgz", - "integrity": "sha512-NX9oUXgF9HPfJSwl8tUZCMP1oGx2+Sf+ru6d05QjzQz4OwWg0psEzwY6VexP2tTHWdOkhKHUIZH+fS6nA7jfOw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.1.1.tgz", + "integrity": "sha512-X/d46qzJuEDO8ueyjtKfxffiXraPRfmYasoC4i5+mlLEJ10UvPb0XH5M9C3gWuxd7BAQhpK42cJgJtq53YnWVA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "3.0.9", + "@vitest/utils": "3.1.1", "pathe": "^2.0.3" }, "funding": { @@ -5378,13 +5593,13 @@ "license": "MIT" }, "node_modules/@vitest/snapshot": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.0.9.tgz", - "integrity": "sha512-AiLUiuZ0FuA+/8i19mTYd+re5jqjEc2jZbgJ2up0VY0Ddyyxg/uUtBDpIFAy4uzKaQxOW8gMgBdAJJ2ydhu39A==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.1.1.tgz", + "integrity": "sha512-bByMwaVWe/+1WDf9exFxWWgAixelSdiwo2p33tpqIlM14vW7PRV5ppayVXtfycqze4Qhtwag5sVhX400MLBOOw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.0.9", + "@vitest/pretty-format": "3.1.1", "magic-string": "^0.30.17", "pathe": "^2.0.3" }, @@ -5410,9 +5625,9 @@ "license": "MIT" }, "node_modules/@vitest/spy": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.0.9.tgz", - "integrity": "sha512-/CcK2UDl0aQ2wtkp3YVWldrpLRNCfVcIOFGlVGKO4R5eajsH393Z1yiXLVQ7vWsj26JOEjeZI0x5sm5P4OGUNQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.1.1.tgz", + "integrity": "sha512-+EmrUOOXbKzLkTDwlsc/xrwOlPDXyVk3Z6P6K4oiCndxz7YLpp/0R0UsWVOKT0IXWjjBJuSMk6D27qipaupcvQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5423,13 +5638,13 @@ } }, "node_modules/@vitest/utils": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.0.9.tgz", - "integrity": "sha512-ilHM5fHhZ89MCp5aAaM9uhfl1c2JdxVxl3McqsdVyVNN6JffnEen8UMCdRTzOhGXNQGo5GNL9QugHrz727Wnng==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.1.1.tgz", + "integrity": "sha512-1XIjflyaU2k3HMArJ50bwSh3wKWPD6Q47wz/NUSmRV0zNywPc4w79ARjg/i/aNINHwA+mIALhUVqD9/aUvZNgg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.0.9", + "@vitest/pretty-format": "3.1.1", "loupe": "^3.1.3", "tinyrainbow": "^2.0.0" }, @@ -5561,9 +5776,9 @@ } }, "node_modules/antd": { - "version": "5.24.5", - "resolved": "https://registry.npmjs.org/antd/-/antd-5.24.5.tgz", - "integrity": "sha512-1lAv/G+9ewQanyoAo3JumQmIlVxwo5QwWGb6QCHYc40Cq0NxC/EzITcjsgq1PSaTUpLkKq8A2l7Fjtu47vqQBg==", + "version": "5.24.6", + "resolved": "https://registry.npmjs.org/antd/-/antd-5.24.6.tgz", + "integrity": "sha512-xIlTa/1CTbgkZsdU/dOXkYvJXb9VoiMwsaCzpKFH2zAEY3xqOfwQ57/DdG7lAdrWP7QORtSld4UA6suxzuTHXw==", "license": "MIT", "dependencies": { "@ant-design/colors": "^7.2.0", @@ -14159,9 +14374,9 @@ } }, "node_modules/react-virtuoso": { - "version": "4.12.5", - "resolved": "https://registry.npmjs.org/react-virtuoso/-/react-virtuoso-4.12.5.tgz", - "integrity": "sha512-YeCbRRsC9CLf0buD0Rct7WsDbzf+yBU1wGbo05/XjbcN2nJuhgh040m3y3+6HVogTZxEqVm45ac9Fpae4/MxRQ==", + "version": "4.12.6", + "resolved": "https://registry.npmjs.org/react-virtuoso/-/react-virtuoso-4.12.6.tgz", + "integrity": "sha512-bfvS6aCL1ehXmq39KRiz/vxznGUbtA27I5I24TYCe1DhMf84O3aVNCIwrSjYQjkJGJGzY46ihdN8WkYlemuhMQ==", "license": "MIT", "peerDependencies": { "react": ">=16 || >=17 || >= 18 || >= 19", @@ -14855,9 +15070,9 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.86.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.86.0.tgz", - "integrity": "sha512-zV8vGUld/+mP4KbMLJMX7TyGCuUp7hnkOScgCMsWuHtns8CWBoz+vmEhoGMXsaJrbUP8gj+F1dLvVe79sK8UdA==", + "version": "1.86.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.86.1.tgz", + "integrity": "sha512-Yaok4XELL1L9Im/ZUClKu//D2OP1rOljKj0Gf34a+GzLbMveOzL7CfqYo+JUa5Xt1nhTCW+OcKp/FtR7/iqj1w==", "license": "MIT", "dependencies": { "chokidar": "^4.0.0", @@ -15875,9 +16090,9 @@ } }, "node_modules/swr": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/swr/-/swr-2.3.2.tgz", - "integrity": "sha512-RosxFpiabojs75IwQ316DGoDRmOqtiAj0tg8wCcbEu4CiLZBs/a9QNtHV7TUfDXmmlgqij/NqzKq/eLelyv9xA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/swr/-/swr-2.3.3.tgz", + "integrity": "sha512-dshNvs3ExOqtZ6kJBaAsabhPdHyeY4P2cKwRCniDVifBMoG/SVI7tfLWqPXriVspf2Rg4tPzXJTnwaihIeFw2A==", "license": "MIT", "dependencies": { "dequal": "^2.0.3", @@ -16903,9 +17118,9 @@ } }, "node_modules/vite": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.3.tgz", - "integrity": "sha512-IzwM54g4y9JA/xAeBPNaDXiBF8Jsgl3VBQ2YQ/wOY6fyW3xMdSoltIV3Bo59DErdqdE6RxUfv8W69DvUorE4Eg==", + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.4.tgz", + "integrity": "sha512-veHMSew8CcRzhL5o8ONjy8gkfmFJAd5Ac16oxBUjlwgX3Gq2Wqr+qNC3TjPIpy7TPV/KporLga5GT9HqdrCizw==", "dev": true, "license": "MIT", "dependencies": { @@ -16975,9 +17190,9 @@ } }, "node_modules/vite-node": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.9.tgz", - "integrity": "sha512-w3Gdx7jDcuT9cNn9jExXgOyKmf5UOTb6WMHz8LGAm54eS1Elf5OuBhCxl6zJxGhEeIkgsE1WbHuoL0mj/UXqXg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.1.1.tgz", + "integrity": "sha512-V+IxPAE2FvXpTCHXyNem0M+gWm6J7eRyWPR6vYoG/Gl+IscNOjXzztUhimQgTxaAoUoj40Qqimaa0NLIOOAH4w==", "dev": true, "license": "MIT", "dependencies": { @@ -17084,9 +17299,9 @@ } }, "node_modules/vite-plugin-pwa": { - "version": "0.21.2", - "resolved": "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-0.21.2.tgz", - "integrity": "sha512-vFhH6Waw8itNu37hWUJxL50q+CBbNcMVzsKaYHQVrfxTt3ihk3PeLO22SbiP1UNWzcEPaTQv+YVxe4G0KOjAkg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-1.0.0.tgz", + "integrity": "sha512-X77jo0AOd5OcxmWj3WnVti8n7Kw2tBgV1c8MCXFclrSlDV23ePzv2eTDIALXI2Qo6nJ5pZJeZAuX0AawvRfoeA==", "dev": true, "license": "MIT", "dependencies": { @@ -17103,7 +17318,7 @@ "url": "https://github.com/sponsors/antfu" }, "peerDependencies": { - "@vite-pwa/assets-generator": "^0.2.6", + "@vite-pwa/assets-generator": "^1.0.0", "vite": "^3.1.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", "workbox-build": "^7.3.0", "workbox-window": "^7.3.0" @@ -17216,31 +17431,31 @@ } }, "node_modules/vitest": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.0.9.tgz", - "integrity": "sha512-BbcFDqNyBlfSpATmTtXOAOj71RNKDDvjBM/uPfnxxVGrG+FSH2RQIwgeEngTaTkuU/h0ScFvf+tRcKfYXzBybQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.1.1.tgz", + "integrity": "sha512-kiZc/IYmKICeBAZr9DQ5rT7/6bD9G7uqQEki4fxazi1jdVl2mWGzedtBs5s6llz59yQhVb7FFY2MbHzHCnT79Q==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/expect": "3.0.9", - "@vitest/mocker": "3.0.9", - "@vitest/pretty-format": "^3.0.9", - "@vitest/runner": "3.0.9", - "@vitest/snapshot": "3.0.9", - "@vitest/spy": "3.0.9", - "@vitest/utils": "3.0.9", + "@vitest/expect": "3.1.1", + "@vitest/mocker": "3.1.1", + "@vitest/pretty-format": "^3.1.1", + "@vitest/runner": "3.1.1", + "@vitest/snapshot": "3.1.1", + "@vitest/spy": "3.1.1", + "@vitest/utils": "3.1.1", "chai": "^5.2.0", "debug": "^4.4.0", - "expect-type": "^1.1.0", + "expect-type": "^1.2.0", "magic-string": "^0.30.17", "pathe": "^2.0.3", - "std-env": "^3.8.0", + "std-env": "^3.8.1", "tinybench": "^2.9.0", "tinyexec": "^0.3.2", "tinypool": "^1.0.2", "tinyrainbow": "^2.0.0", "vite": "^5.0.0 || ^6.0.0", - "vite-node": "3.0.9", + "vite-node": "3.1.1", "why-is-node-running": "^2.3.0" }, "bin": { @@ -17256,8 +17471,8 @@ "@edge-runtime/vm": "*", "@types/debug": "^4.1.12", "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "@vitest/browser": "3.0.9", - "@vitest/ui": "3.0.9", + "@vitest/browser": "3.1.1", + "@vitest/ui": "3.1.1", "happy-dom": "*", "jsdom": "*" }, diff --git a/client/package.json b/client/package.json index db79ba1eb..391c90759 100644 --- a/client/package.json +++ b/client/package.json @@ -8,23 +8,23 @@ "private": true, "proxy": "http://localhost:4000", "dependencies": { - "@ant-design/pro-layout": "^7.22.3", + "@ant-design/pro-layout": "^7.22.4", "@apollo/client": "^3.13.5", "@emotion/is-prop-valid": "^1.3.1", "@fingerprintjs/fingerprintjs": "^4.6.1", "@firebase/analytics": "^0.10.12", - "@firebase/app": "^0.11.3", - "@firebase/auth": "^1.9.1", + "@firebase/app": "^0.11.4", + "@firebase/auth": "^1.10.0", "@firebase/firestore": "^4.7.10", "@firebase/messaging": "^0.12.17", "@jsreport/browser-client": "^3.1.0", "@reduxjs/toolkit": "^2.6.1", - "@sentry/cli": "^2.42.4", - "@sentry/react": "^9.9.0", - "@sentry/vite-plugin": "^3.2.2", - "@splitsoftware/splitio-react": "^2.0.1", + "@sentry/cli": "^2.43.0", + "@sentry/react": "^9.10.1", + "@sentry/vite-plugin": "^3.2.4", + "@splitsoftware/splitio-react": "^2.1.0", "@tanem/react-nprogress": "^5.0.53", - "antd": "^5.24.5", + "antd": "^5.24.6", "apollo-link-logger": "^2.0.1", "apollo-link-sentry": "^4.2.0", "autosize": "^6.0.1", @@ -69,7 +69,7 @@ "react-resizable": "^3.0.5", "react-router-dom": "^6.30.0", "react-sticky": "^6.0.3", - "react-virtuoso": "^4.12.5", + "react-virtuoso": "^4.12.6", "recharts": "^2.15.0", "redux": "^5.0.1", "redux-actions": "^3.0.3", @@ -77,7 +77,7 @@ "redux-saga": "^1.3.0", "redux-state-sync": "^3.1.4", "reselect": "^5.1.1", - "sass": "^1.86.0", + "sass": "^1.86.1", "socket.io-client": "^4.8.1", "styled-components": "^6.1.16", "subscriptions-transport-ws": "^0.11.0", @@ -135,7 +135,7 @@ "@emotion/react": "^11.14.0", "@eslint/js": "^9.23.0", "@playwright/test": "^1.51.1", - "@sentry/webpack-plugin": "^3.2.2", + "@sentry/webpack-plugin": "^3.2.4", "@testing-library/dom": "^10.4.0", "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.2.0", @@ -154,13 +154,13 @@ "react-error-overlay": "^6.1.0", "redux-logger": "^3.0.6", "source-map-explorer": "^2.5.3", - "vite": "^6.2.3", + "vite": "^6.2.4", "vite-plugin-babel": "^1.3.0", "vite-plugin-eslint": "^1.8.1", "vite-plugin-node-polyfills": "^0.23.0", - "vite-plugin-pwa": "^0.21.2", + "vite-plugin-pwa": "^1.0.0", "vite-plugin-style-import": "^2.0.0", - "vitest": "^3.0.9", + "vitest": "^3.1.1", "workbox-window": "^7.3.0" } } diff --git a/package-lock.json b/package-lock.json index 7c4c6bfe9..79f584f36 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,14 +9,14 @@ "version": "0.2.0", "license": "UNLICENSED", "dependencies": { - "@aws-sdk/client-cloudwatch-logs": "^3.772.0", - "@aws-sdk/client-elasticache": "^3.772.0", - "@aws-sdk/client-s3": "^3.772.0", - "@aws-sdk/client-secrets-manager": "^3.772.0", - "@aws-sdk/client-ses": "^3.772.0", - "@aws-sdk/credential-provider-node": "^3.772.0", - "@aws-sdk/lib-storage": "^3.774.0", - "@aws-sdk/s3-request-presigner": "^3.774.0", + "@aws-sdk/client-cloudwatch-logs": "^3.777.0", + "@aws-sdk/client-elasticache": "^3.777.0", + "@aws-sdk/client-s3": "^3.779.0", + "@aws-sdk/client-secrets-manager": "^3.777.0", + "@aws-sdk/client-ses": "^3.777.0", + "@aws-sdk/credential-provider-node": "^3.777.0", + "@aws-sdk/lib-storage": "^3.779.0", + "@aws-sdk/s3-request-presigner": "^3.779.0", "@opensearch-project/opensearch": "^2.13.0", "@socket.io/admin-ui": "^0.5.1", "@socket.io/redis-adapter": "^8.3.0", @@ -27,7 +27,7 @@ "better-queue": "^3.8.12", "bluebird": "^3.7.2", "body-parser": "^1.20.3", - "bullmq": "^5.44.4", + "bullmq": "^5.45.2", "chart.js": "^4.4.8", "cloudinary": "^2.6.0", "compression": "^1.8.0", @@ -35,7 +35,7 @@ "cors": "2.8.5", "crisp-status-reporter": "^1.2.2", "csrf": "^3.1.0", - "dd-trace": "^5.43.0", + "dd-trace": "^5.45.0", "dinero.js": "^1.9.1", "dotenv": "^16.4.5", "express": "^4.21.1", @@ -80,7 +80,7 @@ "prettier": "^3.5.3", "source-map-explorer": "^2.5.2", "supertest": "^7.1.0", - "vitest": "^3.0.9" + "vitest": "^3.1.1" }, "engines": { "node": ">=18.0.0", @@ -290,51 +290,51 @@ } }, "node_modules/@aws-sdk/client-cloudwatch-logs": { - "version": "3.774.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch-logs/-/client-cloudwatch-logs-3.774.0.tgz", - "integrity": "sha512-P+qEZJMd4kZVbTs2YRvBHOYlRd0U7bgpbEhRoYRS6vOWymRinQaxj/KCaw1cmdBILj502CUieFGj6DEYAbiNzQ==", + "version": "3.777.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch-logs/-/client-cloudwatch-logs-3.777.0.tgz", + "integrity": "sha512-ebrO1ZlgSKEYERegcKnyjC0VkvLnxDm2HES78N54MiMQCfFCUJ3W6xx2aoKVSVWaUrGUaY13Cd67h/X0RhuU6g==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.774.0", - "@aws-sdk/credential-provider-node": "3.774.0", - "@aws-sdk/middleware-host-header": "3.774.0", - "@aws-sdk/middleware-logger": "3.734.0", - "@aws-sdk/middleware-recursion-detection": "3.772.0", - "@aws-sdk/middleware-user-agent": "3.774.0", - "@aws-sdk/region-config-resolver": "3.734.0", - "@aws-sdk/types": "3.734.0", - "@aws-sdk/util-endpoints": "3.743.0", - "@aws-sdk/util-user-agent-browser": "3.734.0", - "@aws-sdk/util-user-agent-node": "3.774.0", - "@smithy/config-resolver": "^4.0.1", - "@smithy/core": "^3.1.5", - "@smithy/eventstream-serde-browser": "^4.0.1", - "@smithy/eventstream-serde-config-resolver": "^4.0.1", - "@smithy/eventstream-serde-node": "^4.0.1", - "@smithy/fetch-http-handler": "^5.0.1", - "@smithy/hash-node": "^4.0.1", - "@smithy/invalid-dependency": "^4.0.1", - "@smithy/middleware-content-length": "^4.0.1", - "@smithy/middleware-endpoint": "^4.0.6", - "@smithy/middleware-retry": "^4.0.7", - "@smithy/middleware-serde": "^4.0.2", - "@smithy/middleware-stack": "^4.0.1", - "@smithy/node-config-provider": "^4.0.1", - "@smithy/node-http-handler": "^4.0.3", - "@smithy/protocol-http": "^5.0.1", - "@smithy/smithy-client": "^4.1.6", - "@smithy/types": "^4.1.0", - "@smithy/url-parser": "^4.0.1", + "@aws-sdk/core": "3.775.0", + "@aws-sdk/credential-provider-node": "3.777.0", + "@aws-sdk/middleware-host-header": "3.775.0", + "@aws-sdk/middleware-logger": "3.775.0", + "@aws-sdk/middleware-recursion-detection": "3.775.0", + "@aws-sdk/middleware-user-agent": "3.775.0", + "@aws-sdk/region-config-resolver": "3.775.0", + "@aws-sdk/types": "3.775.0", + "@aws-sdk/util-endpoints": "3.775.0", + "@aws-sdk/util-user-agent-browser": "3.775.0", + "@aws-sdk/util-user-agent-node": "3.775.0", + "@smithy/config-resolver": "^4.1.0", + "@smithy/core": "^3.2.0", + "@smithy/eventstream-serde-browser": "^4.0.2", + "@smithy/eventstream-serde-config-resolver": "^4.1.0", + "@smithy/eventstream-serde-node": "^4.0.2", + "@smithy/fetch-http-handler": "^5.0.2", + "@smithy/hash-node": "^4.0.2", + "@smithy/invalid-dependency": "^4.0.2", + "@smithy/middleware-content-length": "^4.0.2", + "@smithy/middleware-endpoint": "^4.1.0", + "@smithy/middleware-retry": "^4.1.0", + "@smithy/middleware-serde": "^4.0.3", + "@smithy/middleware-stack": "^4.0.2", + "@smithy/node-config-provider": "^4.0.2", + "@smithy/node-http-handler": "^4.0.4", + "@smithy/protocol-http": "^5.1.0", + "@smithy/smithy-client": "^4.2.0", + "@smithy/types": "^4.2.0", + "@smithy/url-parser": "^4.0.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.7", - "@smithy/util-defaults-mode-node": "^4.0.7", - "@smithy/util-endpoints": "^3.0.1", - "@smithy/util-middleware": "^4.0.1", - "@smithy/util-retry": "^4.0.1", + "@smithy/util-defaults-mode-browser": "^4.0.8", + "@smithy/util-defaults-mode-node": "^4.0.8", + "@smithy/util-endpoints": "^3.0.2", + "@smithy/util-middleware": "^4.0.2", + "@smithy/util-retry": "^4.0.2", "@smithy/util-utf8": "^4.0.0", "@types/uuid": "^9.0.1", "tslib": "^2.6.2", @@ -358,50 +358,50 @@ } }, "node_modules/@aws-sdk/client-elasticache": { - "version": "3.774.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-elasticache/-/client-elasticache-3.774.0.tgz", - "integrity": "sha512-uBWSLt6p5tSZCdoizuNyytGiZBFgtUAnXH7GnYH1tVzPeQoQb5GI5of5cDw9lFIIR6DWpYjA7JZ7EEmNvvD7rw==", + "version": "3.777.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-elasticache/-/client-elasticache-3.777.0.tgz", + "integrity": "sha512-6MzXEyUwVIxJqNQh4rvSE32OweJtG9PYdp3UxXfoiuslJnuHgPxWMRpvJIkF/hLeAjfQf4cPii5pBYrfHDbz+g==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.774.0", - "@aws-sdk/credential-provider-node": "3.774.0", - "@aws-sdk/middleware-host-header": "3.774.0", - "@aws-sdk/middleware-logger": "3.734.0", - "@aws-sdk/middleware-recursion-detection": "3.772.0", - "@aws-sdk/middleware-user-agent": "3.774.0", - "@aws-sdk/region-config-resolver": "3.734.0", - "@aws-sdk/types": "3.734.0", - "@aws-sdk/util-endpoints": "3.743.0", - "@aws-sdk/util-user-agent-browser": "3.734.0", - "@aws-sdk/util-user-agent-node": "3.774.0", - "@smithy/config-resolver": "^4.0.1", - "@smithy/core": "^3.1.5", - "@smithy/fetch-http-handler": "^5.0.1", - "@smithy/hash-node": "^4.0.1", - "@smithy/invalid-dependency": "^4.0.1", - "@smithy/middleware-content-length": "^4.0.1", - "@smithy/middleware-endpoint": "^4.0.6", - "@smithy/middleware-retry": "^4.0.7", - "@smithy/middleware-serde": "^4.0.2", - "@smithy/middleware-stack": "^4.0.1", - "@smithy/node-config-provider": "^4.0.1", - "@smithy/node-http-handler": "^4.0.3", - "@smithy/protocol-http": "^5.0.1", - "@smithy/smithy-client": "^4.1.6", - "@smithy/types": "^4.1.0", - "@smithy/url-parser": "^4.0.1", + "@aws-sdk/core": "3.775.0", + "@aws-sdk/credential-provider-node": "3.777.0", + "@aws-sdk/middleware-host-header": "3.775.0", + "@aws-sdk/middleware-logger": "3.775.0", + "@aws-sdk/middleware-recursion-detection": "3.775.0", + "@aws-sdk/middleware-user-agent": "3.775.0", + "@aws-sdk/region-config-resolver": "3.775.0", + "@aws-sdk/types": "3.775.0", + "@aws-sdk/util-endpoints": "3.775.0", + "@aws-sdk/util-user-agent-browser": "3.775.0", + "@aws-sdk/util-user-agent-node": "3.775.0", + "@smithy/config-resolver": "^4.1.0", + "@smithy/core": "^3.2.0", + "@smithy/fetch-http-handler": "^5.0.2", + "@smithy/hash-node": "^4.0.2", + "@smithy/invalid-dependency": "^4.0.2", + "@smithy/middleware-content-length": "^4.0.2", + "@smithy/middleware-endpoint": "^4.1.0", + "@smithy/middleware-retry": "^4.1.0", + "@smithy/middleware-serde": "^4.0.3", + "@smithy/middleware-stack": "^4.0.2", + "@smithy/node-config-provider": "^4.0.2", + "@smithy/node-http-handler": "^4.0.4", + "@smithy/protocol-http": "^5.1.0", + "@smithy/smithy-client": "^4.2.0", + "@smithy/types": "^4.2.0", + "@smithy/url-parser": "^4.0.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.7", - "@smithy/util-defaults-mode-node": "^4.0.7", - "@smithy/util-endpoints": "^3.0.1", - "@smithy/util-middleware": "^4.0.1", - "@smithy/util-retry": "^4.0.1", + "@smithy/util-defaults-mode-browser": "^4.0.8", + "@smithy/util-defaults-mode-node": "^4.0.8", + "@smithy/util-endpoints": "^3.0.2", + "@smithy/util-middleware": "^4.0.2", + "@smithy/util-retry": "^4.0.2", "@smithy/util-utf8": "^4.0.0", - "@smithy/util-waiter": "^4.0.2", + "@smithy/util-waiter": "^4.0.3", "tslib": "^2.6.2" }, "engines": { @@ -409,66 +409,66 @@ } }, "node_modules/@aws-sdk/client-s3": { - "version": "3.774.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.774.0.tgz", - "integrity": "sha512-HQ5Xi01r/Pv2IpzPTf5acrN0g/yJQalheDCYbBSA8VU31zoYiT/w5kLFWYJHQDB2hRozh2DB/VC/VDmntkWXxA==", + "version": "3.779.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.779.0.tgz", + "integrity": "sha512-Lagz+ersQaLNYkpOU9V12PYspT//lGvhPXlKU3OXDj3whDchdqUdtRKY8rmV+jli4KXe+udx/hj2yqrFRfKGvQ==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.774.0", - "@aws-sdk/credential-provider-node": "3.774.0", - "@aws-sdk/middleware-bucket-endpoint": "3.734.0", - "@aws-sdk/middleware-expect-continue": "3.734.0", - "@aws-sdk/middleware-flexible-checksums": "3.774.0", - "@aws-sdk/middleware-host-header": "3.774.0", - "@aws-sdk/middleware-location-constraint": "3.734.0", - "@aws-sdk/middleware-logger": "3.734.0", - "@aws-sdk/middleware-recursion-detection": "3.772.0", - "@aws-sdk/middleware-sdk-s3": "3.774.0", - "@aws-sdk/middleware-ssec": "3.734.0", - "@aws-sdk/middleware-user-agent": "3.774.0", - "@aws-sdk/region-config-resolver": "3.734.0", - "@aws-sdk/signature-v4-multi-region": "3.774.0", - "@aws-sdk/types": "3.734.0", - "@aws-sdk/util-endpoints": "3.743.0", - "@aws-sdk/util-user-agent-browser": "3.734.0", - "@aws-sdk/util-user-agent-node": "3.774.0", - "@aws-sdk/xml-builder": "3.734.0", - "@smithy/config-resolver": "^4.0.1", - "@smithy/core": "^3.1.5", - "@smithy/eventstream-serde-browser": "^4.0.1", - "@smithy/eventstream-serde-config-resolver": "^4.0.1", - "@smithy/eventstream-serde-node": "^4.0.1", - "@smithy/fetch-http-handler": "^5.0.1", - "@smithy/hash-blob-browser": "^4.0.1", - "@smithy/hash-node": "^4.0.1", - "@smithy/hash-stream-node": "^4.0.1", - "@smithy/invalid-dependency": "^4.0.1", - "@smithy/md5-js": "^4.0.1", - "@smithy/middleware-content-length": "^4.0.1", - "@smithy/middleware-endpoint": "^4.0.6", - "@smithy/middleware-retry": "^4.0.7", - "@smithy/middleware-serde": "^4.0.2", - "@smithy/middleware-stack": "^4.0.1", - "@smithy/node-config-provider": "^4.0.1", - "@smithy/node-http-handler": "^4.0.3", - "@smithy/protocol-http": "^5.0.1", - "@smithy/smithy-client": "^4.1.6", - "@smithy/types": "^4.1.0", - "@smithy/url-parser": "^4.0.1", + "@aws-sdk/core": "3.775.0", + "@aws-sdk/credential-provider-node": "3.777.0", + "@aws-sdk/middleware-bucket-endpoint": "3.775.0", + "@aws-sdk/middleware-expect-continue": "3.775.0", + "@aws-sdk/middleware-flexible-checksums": "3.775.0", + "@aws-sdk/middleware-host-header": "3.775.0", + "@aws-sdk/middleware-location-constraint": "3.775.0", + "@aws-sdk/middleware-logger": "3.775.0", + "@aws-sdk/middleware-recursion-detection": "3.775.0", + "@aws-sdk/middleware-sdk-s3": "3.775.0", + "@aws-sdk/middleware-ssec": "3.775.0", + "@aws-sdk/middleware-user-agent": "3.775.0", + "@aws-sdk/region-config-resolver": "3.775.0", + "@aws-sdk/signature-v4-multi-region": "3.775.0", + "@aws-sdk/types": "3.775.0", + "@aws-sdk/util-endpoints": "3.775.0", + "@aws-sdk/util-user-agent-browser": "3.775.0", + "@aws-sdk/util-user-agent-node": "3.775.0", + "@aws-sdk/xml-builder": "3.775.0", + "@smithy/config-resolver": "^4.1.0", + "@smithy/core": "^3.2.0", + "@smithy/eventstream-serde-browser": "^4.0.2", + "@smithy/eventstream-serde-config-resolver": "^4.1.0", + "@smithy/eventstream-serde-node": "^4.0.2", + "@smithy/fetch-http-handler": "^5.0.2", + "@smithy/hash-blob-browser": "^4.0.2", + "@smithy/hash-node": "^4.0.2", + "@smithy/hash-stream-node": "^4.0.2", + "@smithy/invalid-dependency": "^4.0.2", + "@smithy/md5-js": "^4.0.2", + "@smithy/middleware-content-length": "^4.0.2", + "@smithy/middleware-endpoint": "^4.1.0", + "@smithy/middleware-retry": "^4.1.0", + "@smithy/middleware-serde": "^4.0.3", + "@smithy/middleware-stack": "^4.0.2", + "@smithy/node-config-provider": "^4.0.2", + "@smithy/node-http-handler": "^4.0.4", + "@smithy/protocol-http": "^5.1.0", + "@smithy/smithy-client": "^4.2.0", + "@smithy/types": "^4.2.0", + "@smithy/url-parser": "^4.0.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.7", - "@smithy/util-defaults-mode-node": "^4.0.7", - "@smithy/util-endpoints": "^3.0.1", - "@smithy/util-middleware": "^4.0.1", - "@smithy/util-retry": "^4.0.1", - "@smithy/util-stream": "^4.1.2", + "@smithy/util-defaults-mode-browser": "^4.0.8", + "@smithy/util-defaults-mode-node": "^4.0.8", + "@smithy/util-endpoints": "^3.0.2", + "@smithy/util-middleware": "^4.0.2", + "@smithy/util-retry": "^4.0.2", + "@smithy/util-stream": "^4.2.0", "@smithy/util-utf8": "^4.0.0", - "@smithy/util-waiter": "^4.0.2", + "@smithy/util-waiter": "^4.0.3", "tslib": "^2.6.2" }, "engines": { @@ -476,48 +476,48 @@ } }, "node_modules/@aws-sdk/client-secrets-manager": { - "version": "3.774.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.774.0.tgz", - "integrity": "sha512-AoVpmzLY/PW/0H6hcc/Rn/uisDTFE7WX/oWZ8qU2gYMuH3z2VUAIhHQZq3mNpXH4ZlWPH+sDA8cG1tCc8dgVqA==", + "version": "3.777.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.777.0.tgz", + "integrity": "sha512-HqBGQPFUZMTOkQJB6JLv7Jopfz+cBP4spzjpBlZ/JeJShMAXw9To2mxi22jU5qGGWPGH5y4tVXnw4aVf2TOPhQ==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.774.0", - "@aws-sdk/credential-provider-node": "3.774.0", - "@aws-sdk/middleware-host-header": "3.774.0", - "@aws-sdk/middleware-logger": "3.734.0", - "@aws-sdk/middleware-recursion-detection": "3.772.0", - "@aws-sdk/middleware-user-agent": "3.774.0", - "@aws-sdk/region-config-resolver": "3.734.0", - "@aws-sdk/types": "3.734.0", - "@aws-sdk/util-endpoints": "3.743.0", - "@aws-sdk/util-user-agent-browser": "3.734.0", - "@aws-sdk/util-user-agent-node": "3.774.0", - "@smithy/config-resolver": "^4.0.1", - "@smithy/core": "^3.1.5", - "@smithy/fetch-http-handler": "^5.0.1", - "@smithy/hash-node": "^4.0.1", - "@smithy/invalid-dependency": "^4.0.1", - "@smithy/middleware-content-length": "^4.0.1", - "@smithy/middleware-endpoint": "^4.0.6", - "@smithy/middleware-retry": "^4.0.7", - "@smithy/middleware-serde": "^4.0.2", - "@smithy/middleware-stack": "^4.0.1", - "@smithy/node-config-provider": "^4.0.1", - "@smithy/node-http-handler": "^4.0.3", - "@smithy/protocol-http": "^5.0.1", - "@smithy/smithy-client": "^4.1.6", - "@smithy/types": "^4.1.0", - "@smithy/url-parser": "^4.0.1", + "@aws-sdk/core": "3.775.0", + "@aws-sdk/credential-provider-node": "3.777.0", + "@aws-sdk/middleware-host-header": "3.775.0", + "@aws-sdk/middleware-logger": "3.775.0", + "@aws-sdk/middleware-recursion-detection": "3.775.0", + "@aws-sdk/middleware-user-agent": "3.775.0", + "@aws-sdk/region-config-resolver": "3.775.0", + "@aws-sdk/types": "3.775.0", + "@aws-sdk/util-endpoints": "3.775.0", + "@aws-sdk/util-user-agent-browser": "3.775.0", + "@aws-sdk/util-user-agent-node": "3.775.0", + "@smithy/config-resolver": "^4.1.0", + "@smithy/core": "^3.2.0", + "@smithy/fetch-http-handler": "^5.0.2", + "@smithy/hash-node": "^4.0.2", + "@smithy/invalid-dependency": "^4.0.2", + "@smithy/middleware-content-length": "^4.0.2", + "@smithy/middleware-endpoint": "^4.1.0", + "@smithy/middleware-retry": "^4.1.0", + "@smithy/middleware-serde": "^4.0.3", + "@smithy/middleware-stack": "^4.0.2", + "@smithy/node-config-provider": "^4.0.2", + "@smithy/node-http-handler": "^4.0.4", + "@smithy/protocol-http": "^5.1.0", + "@smithy/smithy-client": "^4.2.0", + "@smithy/types": "^4.2.0", + "@smithy/url-parser": "^4.0.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.7", - "@smithy/util-defaults-mode-node": "^4.0.7", - "@smithy/util-endpoints": "^3.0.1", - "@smithy/util-middleware": "^4.0.1", - "@smithy/util-retry": "^4.0.1", + "@smithy/util-defaults-mode-browser": "^4.0.8", + "@smithy/util-defaults-mode-node": "^4.0.8", + "@smithy/util-endpoints": "^3.0.2", + "@smithy/util-middleware": "^4.0.2", + "@smithy/util-retry": "^4.0.2", "@smithy/util-utf8": "^4.0.0", "@types/uuid": "^9.0.1", "tslib": "^2.6.2", @@ -541,50 +541,50 @@ } }, "node_modules/@aws-sdk/client-ses": { - "version": "3.774.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-ses/-/client-ses-3.774.0.tgz", - "integrity": "sha512-EWZRm9nV7xFQYjFmk259gf1Mp40MuJ1KWHbY5y6EYt3dkuYFJnqAdBETB3tzbC0EmIkVSR1Uzxc72jRS8klvHg==", + "version": "3.777.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ses/-/client-ses-3.777.0.tgz", + "integrity": "sha512-COZ6Yb5qt/JLmWtJG1rGXhvTFnaWHt0X8r9j0uGFuSRhLcguItxYlOnIskYePz/NJ0u/OXYbad0uG1M4V5IJ/w==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.774.0", - "@aws-sdk/credential-provider-node": "3.774.0", - "@aws-sdk/middleware-host-header": "3.774.0", - "@aws-sdk/middleware-logger": "3.734.0", - "@aws-sdk/middleware-recursion-detection": "3.772.0", - "@aws-sdk/middleware-user-agent": "3.774.0", - "@aws-sdk/region-config-resolver": "3.734.0", - "@aws-sdk/types": "3.734.0", - "@aws-sdk/util-endpoints": "3.743.0", - "@aws-sdk/util-user-agent-browser": "3.734.0", - "@aws-sdk/util-user-agent-node": "3.774.0", - "@smithy/config-resolver": "^4.0.1", - "@smithy/core": "^3.1.5", - "@smithy/fetch-http-handler": "^5.0.1", - "@smithy/hash-node": "^4.0.1", - "@smithy/invalid-dependency": "^4.0.1", - "@smithy/middleware-content-length": "^4.0.1", - "@smithy/middleware-endpoint": "^4.0.6", - "@smithy/middleware-retry": "^4.0.7", - "@smithy/middleware-serde": "^4.0.2", - "@smithy/middleware-stack": "^4.0.1", - "@smithy/node-config-provider": "^4.0.1", - "@smithy/node-http-handler": "^4.0.3", - "@smithy/protocol-http": "^5.0.1", - "@smithy/smithy-client": "^4.1.6", - "@smithy/types": "^4.1.0", - "@smithy/url-parser": "^4.0.1", + "@aws-sdk/core": "3.775.0", + "@aws-sdk/credential-provider-node": "3.777.0", + "@aws-sdk/middleware-host-header": "3.775.0", + "@aws-sdk/middleware-logger": "3.775.0", + "@aws-sdk/middleware-recursion-detection": "3.775.0", + "@aws-sdk/middleware-user-agent": "3.775.0", + "@aws-sdk/region-config-resolver": "3.775.0", + "@aws-sdk/types": "3.775.0", + "@aws-sdk/util-endpoints": "3.775.0", + "@aws-sdk/util-user-agent-browser": "3.775.0", + "@aws-sdk/util-user-agent-node": "3.775.0", + "@smithy/config-resolver": "^4.1.0", + "@smithy/core": "^3.2.0", + "@smithy/fetch-http-handler": "^5.0.2", + "@smithy/hash-node": "^4.0.2", + "@smithy/invalid-dependency": "^4.0.2", + "@smithy/middleware-content-length": "^4.0.2", + "@smithy/middleware-endpoint": "^4.1.0", + "@smithy/middleware-retry": "^4.1.0", + "@smithy/middleware-serde": "^4.0.3", + "@smithy/middleware-stack": "^4.0.2", + "@smithy/node-config-provider": "^4.0.2", + "@smithy/node-http-handler": "^4.0.4", + "@smithy/protocol-http": "^5.1.0", + "@smithy/smithy-client": "^4.2.0", + "@smithy/types": "^4.2.0", + "@smithy/url-parser": "^4.0.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.7", - "@smithy/util-defaults-mode-node": "^4.0.7", - "@smithy/util-endpoints": "^3.0.1", - "@smithy/util-middleware": "^4.0.1", - "@smithy/util-retry": "^4.0.1", + "@smithy/util-defaults-mode-browser": "^4.0.8", + "@smithy/util-defaults-mode-node": "^4.0.8", + "@smithy/util-endpoints": "^3.0.2", + "@smithy/util-middleware": "^4.0.2", + "@smithy/util-retry": "^4.0.2", "@smithy/util-utf8": "^4.0.0", - "@smithy/util-waiter": "^4.0.2", + "@smithy/util-waiter": "^4.0.3", "tslib": "^2.6.2" }, "engines": { @@ -592,47 +592,47 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.774.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.774.0.tgz", - "integrity": "sha512-bN+wd2gpTq+DNJ/fZdam/mX6K3TcVdZBIvxaVtg+imep6xAuRukdFhsoG0cDzk96+WHPCOhkyi+6lFljCof43Q==", + "version": "3.777.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.777.0.tgz", + "integrity": "sha512-0+z6CiAYIQa7s6FJ+dpBYPi9zr9yY5jBg/4/FGcwYbmqWPXwL9Thdtr0FearYRZgKl7bhL3m3dILCCfWqr3teQ==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.774.0", - "@aws-sdk/middleware-host-header": "3.774.0", - "@aws-sdk/middleware-logger": "3.734.0", - "@aws-sdk/middleware-recursion-detection": "3.772.0", - "@aws-sdk/middleware-user-agent": "3.774.0", - "@aws-sdk/region-config-resolver": "3.734.0", - "@aws-sdk/types": "3.734.0", - "@aws-sdk/util-endpoints": "3.743.0", - "@aws-sdk/util-user-agent-browser": "3.734.0", - "@aws-sdk/util-user-agent-node": "3.774.0", - "@smithy/config-resolver": "^4.0.1", - "@smithy/core": "^3.1.5", - "@smithy/fetch-http-handler": "^5.0.1", - "@smithy/hash-node": "^4.0.1", - "@smithy/invalid-dependency": "^4.0.1", - "@smithy/middleware-content-length": "^4.0.1", - "@smithy/middleware-endpoint": "^4.0.6", - "@smithy/middleware-retry": "^4.0.7", - "@smithy/middleware-serde": "^4.0.2", - "@smithy/middleware-stack": "^4.0.1", - "@smithy/node-config-provider": "^4.0.1", - "@smithy/node-http-handler": "^4.0.3", - "@smithy/protocol-http": "^5.0.1", - "@smithy/smithy-client": "^4.1.6", - "@smithy/types": "^4.1.0", - "@smithy/url-parser": "^4.0.1", + "@aws-sdk/core": "3.775.0", + "@aws-sdk/middleware-host-header": "3.775.0", + "@aws-sdk/middleware-logger": "3.775.0", + "@aws-sdk/middleware-recursion-detection": "3.775.0", + "@aws-sdk/middleware-user-agent": "3.775.0", + "@aws-sdk/region-config-resolver": "3.775.0", + "@aws-sdk/types": "3.775.0", + "@aws-sdk/util-endpoints": "3.775.0", + "@aws-sdk/util-user-agent-browser": "3.775.0", + "@aws-sdk/util-user-agent-node": "3.775.0", + "@smithy/config-resolver": "^4.1.0", + "@smithy/core": "^3.2.0", + "@smithy/fetch-http-handler": "^5.0.2", + "@smithy/hash-node": "^4.0.2", + "@smithy/invalid-dependency": "^4.0.2", + "@smithy/middleware-content-length": "^4.0.2", + "@smithy/middleware-endpoint": "^4.1.0", + "@smithy/middleware-retry": "^4.1.0", + "@smithy/middleware-serde": "^4.0.3", + "@smithy/middleware-stack": "^4.0.2", + "@smithy/node-config-provider": "^4.0.2", + "@smithy/node-http-handler": "^4.0.4", + "@smithy/protocol-http": "^5.1.0", + "@smithy/smithy-client": "^4.2.0", + "@smithy/types": "^4.2.0", + "@smithy/url-parser": "^4.0.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.7", - "@smithy/util-defaults-mode-node": "^4.0.7", - "@smithy/util-endpoints": "^3.0.1", - "@smithy/util-middleware": "^4.0.1", - "@smithy/util-retry": "^4.0.1", + "@smithy/util-defaults-mode-browser": "^4.0.8", + "@smithy/util-defaults-mode-node": "^4.0.8", + "@smithy/util-endpoints": "^3.0.2", + "@smithy/util-middleware": "^4.0.2", + "@smithy/util-retry": "^4.0.2", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, @@ -641,20 +641,20 @@ } }, "node_modules/@aws-sdk/core": { - "version": "3.774.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.774.0.tgz", - "integrity": "sha512-JDkAAlPyGWMX42L4Cv8mxybwHTOoFweNbNrOc5oQJhFxZAe1zkW4uLTEfr79vYhnXCFbThCyPpBotmo3U2vULA==", + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.775.0.tgz", + "integrity": "sha512-8vpW4WihVfz0DX+7WnnLGm3GuQER++b0IwQG35JlQMlgqnc44M//KbJPsIHA0aJUJVwJAEShgfr5dUbY8WUzaA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.734.0", - "@smithy/core": "^3.1.5", - "@smithy/node-config-provider": "^4.0.1", - "@smithy/property-provider": "^4.0.1", - "@smithy/protocol-http": "^5.0.1", - "@smithy/signature-v4": "^5.0.1", - "@smithy/smithy-client": "^4.1.6", - "@smithy/types": "^4.1.0", - "@smithy/util-middleware": "^4.0.1", + "@aws-sdk/types": "3.775.0", + "@smithy/core": "^3.2.0", + "@smithy/node-config-provider": "^4.0.2", + "@smithy/property-provider": "^4.0.2", + "@smithy/protocol-http": "^5.1.0", + "@smithy/signature-v4": "^5.0.2", + "@smithy/smithy-client": "^4.2.0", + "@smithy/types": "^4.2.0", + "@smithy/util-middleware": "^4.0.2", "fast-xml-parser": "4.4.1", "tslib": "^2.6.2" }, @@ -663,15 +663,15 @@ } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.774.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.774.0.tgz", - "integrity": "sha512-FkSDBi9Ly0bmzyrMDeqQq1lGsFMrrd/bIB3c9VD4Llh0sPLxB/DU31+VTPTuQ0pBPz4sX5Vay6tLy43DStzcFQ==", + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.775.0.tgz", + "integrity": "sha512-6ESVxwCbGm7WZ17kY1fjmxQud43vzJFoLd4bmlR+idQSWdqlzGDYdcfzpjDKTcivdtNrVYmFvcH1JBUwCRAZhw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.774.0", - "@aws-sdk/types": "3.734.0", - "@smithy/property-provider": "^4.0.1", - "@smithy/types": "^4.1.0", + "@aws-sdk/core": "3.775.0", + "@aws-sdk/types": "3.775.0", + "@smithy/property-provider": "^4.0.2", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -679,20 +679,20 @@ } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.774.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.774.0.tgz", - "integrity": "sha512-iurWGQColf52HpHeHCQs/LnSjZ0Ufq3VtSQx/6QdZwIhmgbbqvGMAaBJg41SQjWhpqdufE96HzcaCJw/lnCefQ==", + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.775.0.tgz", + "integrity": "sha512-PjDQeDH/J1S0yWV32wCj2k5liRo0ssXMseCBEkCsD3SqsU8o5cU82b0hMX4sAib/RkglCSZqGO0xMiN0/7ndww==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.774.0", - "@aws-sdk/types": "3.734.0", - "@smithy/fetch-http-handler": "^5.0.1", - "@smithy/node-http-handler": "^4.0.3", - "@smithy/property-provider": "^4.0.1", - "@smithy/protocol-http": "^5.0.1", - "@smithy/smithy-client": "^4.1.6", - "@smithy/types": "^4.1.0", - "@smithy/util-stream": "^4.1.2", + "@aws-sdk/core": "3.775.0", + "@aws-sdk/types": "3.775.0", + "@smithy/fetch-http-handler": "^5.0.2", + "@smithy/node-http-handler": "^4.0.4", + "@smithy/property-provider": "^4.0.2", + "@smithy/protocol-http": "^5.1.0", + "@smithy/smithy-client": "^4.2.0", + "@smithy/types": "^4.2.0", + "@smithy/util-stream": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -700,23 +700,23 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.774.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.774.0.tgz", - "integrity": "sha512-+AsJOX9pGsnGPAC8wQw7LAO8ZfXzjXTjJxSP1fvg04PX7OBk4zwhVaryH6pu5raan+9cVbfEO1Z7EEMdkweGQA==", + "version": "3.777.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.777.0.tgz", + "integrity": "sha512-1X9mCuM9JSQPmQ+D2TODt4THy6aJWCNiURkmKmTIPRdno7EIKgAqrr/LLN++K5mBf54DZVKpqcJutXU2jwo01A==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.774.0", - "@aws-sdk/credential-provider-env": "3.774.0", - "@aws-sdk/credential-provider-http": "3.774.0", - "@aws-sdk/credential-provider-process": "3.774.0", - "@aws-sdk/credential-provider-sso": "3.774.0", - "@aws-sdk/credential-provider-web-identity": "3.774.0", - "@aws-sdk/nested-clients": "3.774.0", - "@aws-sdk/types": "3.734.0", - "@smithy/credential-provider-imds": "^4.0.1", - "@smithy/property-provider": "^4.0.1", - "@smithy/shared-ini-file-loader": "^4.0.1", - "@smithy/types": "^4.1.0", + "@aws-sdk/core": "3.775.0", + "@aws-sdk/credential-provider-env": "3.775.0", + "@aws-sdk/credential-provider-http": "3.775.0", + "@aws-sdk/credential-provider-process": "3.775.0", + "@aws-sdk/credential-provider-sso": "3.777.0", + "@aws-sdk/credential-provider-web-identity": "3.777.0", + "@aws-sdk/nested-clients": "3.777.0", + "@aws-sdk/types": "3.775.0", + "@smithy/credential-provider-imds": "^4.0.2", + "@smithy/property-provider": "^4.0.2", + "@smithy/shared-ini-file-loader": "^4.0.2", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -724,22 +724,22 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.774.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.774.0.tgz", - "integrity": "sha512-/t+TNhHNW6BNyf7Lgv6I0NUfFk6/dz4+6dUjopRxpDVJtp1YvNza0Zhl25ffRkqX4CKmuXyJYusDbbObcsncUA==", + "version": "3.777.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.777.0.tgz", + "integrity": "sha512-ZD66ywx1Q0KyUSuBXZIQzBe3Q7MzX8lNwsrCU43H3Fww+Y+HB3Ncws9grhSdNhKQNeGmZ+MgKybuZYaaeLwJEQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "3.774.0", - "@aws-sdk/credential-provider-http": "3.774.0", - "@aws-sdk/credential-provider-ini": "3.774.0", - "@aws-sdk/credential-provider-process": "3.774.0", - "@aws-sdk/credential-provider-sso": "3.774.0", - "@aws-sdk/credential-provider-web-identity": "3.774.0", - "@aws-sdk/types": "3.734.0", - "@smithy/credential-provider-imds": "^4.0.1", - "@smithy/property-provider": "^4.0.1", - "@smithy/shared-ini-file-loader": "^4.0.1", - "@smithy/types": "^4.1.0", + "@aws-sdk/credential-provider-env": "3.775.0", + "@aws-sdk/credential-provider-http": "3.775.0", + "@aws-sdk/credential-provider-ini": "3.777.0", + "@aws-sdk/credential-provider-process": "3.775.0", + "@aws-sdk/credential-provider-sso": "3.777.0", + "@aws-sdk/credential-provider-web-identity": "3.777.0", + "@aws-sdk/types": "3.775.0", + "@smithy/credential-provider-imds": "^4.0.2", + "@smithy/property-provider": "^4.0.2", + "@smithy/shared-ini-file-loader": "^4.0.2", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -747,16 +747,16 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.774.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.774.0.tgz", - "integrity": "sha512-lycBRY1NeWa46LefN258m1MRVUPQgvf6TPA6ZYajyq6/dCr6BPeuUoUAyrzePTPlxV/M25YXNiyORHjjwlK0ug==", + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.775.0.tgz", + "integrity": "sha512-A6k68H9rQp+2+7P7SGO90Csw6nrUEm0Qfjpn9Etc4EboZhhCLs9b66umUsTsSBHus4FDIe5JQxfCUyt1wgNogg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.774.0", - "@aws-sdk/types": "3.734.0", - "@smithy/property-provider": "^4.0.1", - "@smithy/shared-ini-file-loader": "^4.0.1", - "@smithy/types": "^4.1.0", + "@aws-sdk/core": "3.775.0", + "@aws-sdk/types": "3.775.0", + "@smithy/property-provider": "^4.0.2", + "@smithy/shared-ini-file-loader": "^4.0.2", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -764,18 +764,18 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.774.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.774.0.tgz", - "integrity": "sha512-j7vbGCWF6dVpd9qiT0PQGzY4NKf8KUa86sSoosGGbtu0dV9T/Y0s/fvPZ0F8ZyuPIKUMJaBpIJYZ/ECZRfT2mg==", + "version": "3.777.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.777.0.tgz", + "integrity": "sha512-9mPz7vk9uE4PBVprfINv4tlTkyq1OonNevx2DiXC1LY4mCUCNN3RdBwAY0BTLzj0uyc3k5KxFFNbn3/8ZDQP7w==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.774.0", - "@aws-sdk/core": "3.774.0", - "@aws-sdk/token-providers": "3.774.0", - "@aws-sdk/types": "3.734.0", - "@smithy/property-provider": "^4.0.1", - "@smithy/shared-ini-file-loader": "^4.0.1", - "@smithy/types": "^4.1.0", + "@aws-sdk/client-sso": "3.777.0", + "@aws-sdk/core": "3.775.0", + "@aws-sdk/token-providers": "3.777.0", + "@aws-sdk/types": "3.775.0", + "@smithy/property-provider": "^4.0.2", + "@smithy/shared-ini-file-loader": "^4.0.2", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -783,16 +783,16 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.774.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.774.0.tgz", - "integrity": "sha512-kuE5Hdqm9xXdrYBWCU6l2aM3W3HBtZrIBgyf0y41LulJHwld1nvIySus/lILdzbipmUAv9FI07B8TF5y7p/aFA==", + "version": "3.777.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.777.0.tgz", + "integrity": "sha512-uGCqr47fnthkqwq5luNl2dksgcpHHjSXz2jUra7TXtFOpqvnhOW8qXjoa1ivlkq8qhqlaZwCzPdbcN0lXpmLzQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.774.0", - "@aws-sdk/nested-clients": "3.774.0", - "@aws-sdk/types": "3.734.0", - "@smithy/property-provider": "^4.0.1", - "@smithy/types": "^4.1.0", + "@aws-sdk/core": "3.775.0", + "@aws-sdk/nested-clients": "3.777.0", + "@aws-sdk/types": "3.775.0", + "@smithy/property-provider": "^4.0.2", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -800,14 +800,14 @@ } }, "node_modules/@aws-sdk/lib-storage": { - "version": "3.774.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.774.0.tgz", - "integrity": "sha512-xB3rD+F5pt+JLJaUt5eakCJ3+CUa8PXk9nxgN2VozfpuvuR6A/l3lnxmP5wYLhw1I9hxJLV9AD1/QYcibdBjtQ==", + "version": "3.779.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.779.0.tgz", + "integrity": "sha512-AZfykrCgfnhlb5d5uyThHsqIwt41PYgnUTMyDuk4hbuKbiY8pfOiPdg8BYsC59iD2T4Iw9NujYhWUD+l8zNKcw==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.0.1", - "@smithy/middleware-endpoint": "^4.0.6", - "@smithy/smithy-client": "^4.1.6", + "@smithy/abort-controller": "^4.0.2", + "@smithy/middleware-endpoint": "^4.1.0", + "@smithy/smithy-client": "^4.2.0", "buffer": "5.6.0", "events": "3.3.0", "stream-browserify": "3.0.0", @@ -817,7 +817,7 @@ "node": ">=18.0.0" }, "peerDependencies": { - "@aws-sdk/client-s3": "^3.774.0" + "@aws-sdk/client-s3": "^3.779.0" } }, "node_modules/@aws-sdk/lib-storage/node_modules/buffer": { @@ -831,16 +831,16 @@ } }, "node_modules/@aws-sdk/middleware-bucket-endpoint": { - "version": "3.734.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.734.0.tgz", - "integrity": "sha512-etC7G18aF7KdZguW27GE/wpbrNmYLVT755EsFc8kXpZj8D6AFKxc7OuveinJmiy0bYXAMspJUWsF6CrGpOw6CQ==", + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.775.0.tgz", + "integrity": "sha512-qogMIpVChDYr4xiUNC19/RDSw/sKoHkAhouS6Skxiy6s27HBhow1L3Z1qVYXuBmOZGSWPU0xiyZCvOyWrv9s+Q==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.734.0", + "@aws-sdk/types": "3.775.0", "@aws-sdk/util-arn-parser": "3.723.0", - "@smithy/node-config-provider": "^4.0.1", - "@smithy/protocol-http": "^5.0.1", - "@smithy/types": "^4.1.0", + "@smithy/node-config-provider": "^4.0.2", + "@smithy/protocol-http": "^5.1.0", + "@smithy/types": "^4.2.0", "@smithy/util-config-provider": "^4.0.0", "tslib": "^2.6.2" }, @@ -849,14 +849,14 @@ } }, "node_modules/@aws-sdk/middleware-expect-continue": { - "version": "3.734.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.734.0.tgz", - "integrity": "sha512-P38/v1l6HjuB2aFUewt7ueAW5IvKkFcv5dalPtbMGRhLeyivBOHwbCyuRKgVs7z7ClTpu9EaViEGki2jEQqEsQ==", + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.775.0.tgz", + "integrity": "sha512-Apd3owkIeUW5dnk3au9np2IdW2N0zc9NjTjHiH+Mx3zqwSrc+m+ANgJVgk9mnQjMzU/vb7VuxJ0eqdEbp5gYsg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.734.0", - "@smithy/protocol-http": "^5.0.1", - "@smithy/types": "^4.1.0", + "@aws-sdk/types": "3.775.0", + "@smithy/protocol-http": "^5.1.0", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -864,22 +864,22 @@ } }, "node_modules/@aws-sdk/middleware-flexible-checksums": { - "version": "3.774.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.774.0.tgz", - "integrity": "sha512-S0vs+U7sEZkRRnjf05KCbEHDduyxGgNPq+ZeaiyWbs5yTZ8wzSYrSzMAKcbCqAseNVYQbpGMXDh8tnzx6H/ihw==", + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.775.0.tgz", + "integrity": "sha512-OmHLfRIb7IIXsf9/X/pMOlcSV3gzW/MmtPSZTkrz5jCTKzWXd7eRoyOJqewjsaC6KMAxIpNU77FoAd16jOZ21A==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/crc32": "5.2.0", "@aws-crypto/crc32c": "5.2.0", "@aws-crypto/util": "5.2.0", - "@aws-sdk/core": "3.774.0", - "@aws-sdk/types": "3.734.0", + "@aws-sdk/core": "3.775.0", + "@aws-sdk/types": "3.775.0", "@smithy/is-array-buffer": "^4.0.0", - "@smithy/node-config-provider": "^4.0.1", - "@smithy/protocol-http": "^5.0.1", - "@smithy/types": "^4.1.0", - "@smithy/util-middleware": "^4.0.1", - "@smithy/util-stream": "^4.1.2", + "@smithy/node-config-provider": "^4.0.2", + "@smithy/protocol-http": "^5.1.0", + "@smithy/types": "^4.2.0", + "@smithy/util-middleware": "^4.0.2", + "@smithy/util-stream": "^4.2.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, @@ -888,14 +888,14 @@ } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.774.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.774.0.tgz", - "integrity": "sha512-7QHA0ZyEBVfyJqmIc0FW4MUtPdrWhDsHQudsvBCHFS+mqP5fhpU/o4e5RQ+0M7tQqDE65+8MrZRniRa+Txz3xA==", + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.775.0.tgz", + "integrity": "sha512-tkSegM0Z6WMXpLB8oPys/d+umYIocvO298mGvcMCncpRl77L9XkvSLJIFzaHes+o7djAgIduYw8wKIMStFss2w==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.734.0", - "@smithy/protocol-http": "^5.0.1", - "@smithy/types": "^4.1.0", + "@aws-sdk/types": "3.775.0", + "@smithy/protocol-http": "^5.1.0", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -903,13 +903,13 @@ } }, "node_modules/@aws-sdk/middleware-location-constraint": { - "version": "3.734.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.734.0.tgz", - "integrity": "sha512-EJEIXwCQhto/cBfHdm3ZOeLxd2NlJD+X2F+ZTOxzokuhBtY0IONfC/91hOo5tWQweerojwshSMHRCKzRv1tlwg==", + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.775.0.tgz", + "integrity": "sha512-8TMXEHZXZTFTckQLyBT5aEI8fX11HZcwZseRifvBKKpj0RZDk4F0EEYGxeNSPpUQ7n+PRWyfAEnnZNRdAj/1NQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.734.0", - "@smithy/types": "^4.1.0", + "@aws-sdk/types": "3.775.0", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -917,13 +917,13 @@ } }, "node_modules/@aws-sdk/middleware-logger": { - "version": "3.734.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.734.0.tgz", - "integrity": "sha512-mUMFITpJUW3LcKvFok176eI5zXAUomVtahb9IQBwLzkqFYOrMJvWAvoV4yuxrJ8TlQBG8gyEnkb9SnhZvjg67w==", + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.775.0.tgz", + "integrity": "sha512-FaxO1xom4MAoUJsldmR92nT1G6uZxTdNYOFYtdHfd6N2wcNaTuxgjIvqzg5y7QIH9kn58XX/dzf1iTjgqUStZw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.734.0", - "@smithy/types": "^4.1.0", + "@aws-sdk/types": "3.775.0", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -931,14 +931,14 @@ } }, "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.772.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.772.0.tgz", - "integrity": "sha512-zg0LjJa4v7fcLzn5QzZvtVS+qyvmsnu7oQnb86l6ckduZpWDCDC9+A0ZzcXTrxblPCJd3JqkoG1+Gzi4S4Ny/Q==", + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.775.0.tgz", + "integrity": "sha512-GLCzC8D0A0YDG5u3F5U03Vb9j5tcOEFhr8oc6PDk0k0vm5VwtZOE6LvK7hcCSoAB4HXyOUM0sQuXrbaAh9OwXA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.734.0", - "@smithy/protocol-http": "^5.0.1", - "@smithy/types": "^4.1.0", + "@aws-sdk/types": "3.775.0", + "@smithy/protocol-http": "^5.1.0", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -946,23 +946,23 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.774.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.774.0.tgz", - "integrity": "sha512-iMEaOj+S8LZfg7fZaSfXQ8YDtEfOSBiQUllyxzaVhSYlM7IeNDbpBdCWnRi34VrI1J1AuryMdX/foU9JNSTLXg==", + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.775.0.tgz", + "integrity": "sha512-zsvcu7cWB28JJ60gVvjxPCI7ZU7jWGcpNACPiZGyVtjYXwcxyhXbYEVDSWKsSA6ERpz9XrpLYod8INQWfW3ECg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.774.0", - "@aws-sdk/types": "3.734.0", + "@aws-sdk/core": "3.775.0", + "@aws-sdk/types": "3.775.0", "@aws-sdk/util-arn-parser": "3.723.0", - "@smithy/core": "^3.1.5", - "@smithy/node-config-provider": "^4.0.1", - "@smithy/protocol-http": "^5.0.1", - "@smithy/signature-v4": "^5.0.1", - "@smithy/smithy-client": "^4.1.6", - "@smithy/types": "^4.1.0", + "@smithy/core": "^3.2.0", + "@smithy/node-config-provider": "^4.0.2", + "@smithy/protocol-http": "^5.1.0", + "@smithy/signature-v4": "^5.0.2", + "@smithy/smithy-client": "^4.2.0", + "@smithy/types": "^4.2.0", "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.1", - "@smithy/util-stream": "^4.1.2", + "@smithy/util-middleware": "^4.0.2", + "@smithy/util-stream": "^4.2.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, @@ -971,13 +971,13 @@ } }, "node_modules/@aws-sdk/middleware-ssec": { - "version": "3.734.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.734.0.tgz", - "integrity": "sha512-d4yd1RrPW/sspEXizq2NSOUivnheac6LPeLSLnaeTbBG9g1KqIqvCzP1TfXEqv2CrWfHEsWtJpX7oyjySSPvDQ==", + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.775.0.tgz", + "integrity": "sha512-Iw1RHD8vfAWWPzBBIKaojO4GAvQkHOYIpKdAfis/EUSUmSa79QsnXnRqsdcE0mCB0Ylj23yi+ah4/0wh9FsekA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.734.0", - "@smithy/types": "^4.1.0", + "@aws-sdk/types": "3.775.0", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -985,17 +985,17 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.774.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.774.0.tgz", - "integrity": "sha512-SVDeBV6DESgc9zex1Wk5XYbUqRI1tmJYQor47uKqD18r6UaCpvzVOBP4x8l/6hteAYxsWER6ZZmsjBQkenEuFQ==", + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.775.0.tgz", + "integrity": "sha512-7Lffpr1ptOEDE1ZYH1T78pheEY1YmeXWBfFt/amZ6AGsKSLG+JPXvof3ltporTGR2bhH/eJPo7UHCglIuXfzYg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.774.0", - "@aws-sdk/types": "3.734.0", - "@aws-sdk/util-endpoints": "3.743.0", - "@smithy/core": "^3.1.5", - "@smithy/protocol-http": "^5.0.1", - "@smithy/types": "^4.1.0", + "@aws-sdk/core": "3.775.0", + "@aws-sdk/types": "3.775.0", + "@aws-sdk/util-endpoints": "3.775.0", + "@smithy/core": "^3.2.0", + "@smithy/protocol-http": "^5.1.0", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -1003,47 +1003,47 @@ } }, "node_modules/@aws-sdk/nested-clients": { - "version": "3.774.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.774.0.tgz", - "integrity": "sha512-00+UiYvxiZaDFVzn87kPpiZ/GiEWNaTNzC82C+bIyXt1M9AnAR6PAnnvMErTFwyG+Un6n2ai/I81wvJ1ftFmeQ==", + "version": "3.777.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.777.0.tgz", + "integrity": "sha512-bmmVRsCjuYlStYPt06hr+f8iEyWg7+AklKCA8ZLDEJujXhXIowgUIqXmqpTkXwkVvDQ9tzU7hxaONjyaQCGybA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.774.0", - "@aws-sdk/middleware-host-header": "3.774.0", - "@aws-sdk/middleware-logger": "3.734.0", - "@aws-sdk/middleware-recursion-detection": "3.772.0", - "@aws-sdk/middleware-user-agent": "3.774.0", - "@aws-sdk/region-config-resolver": "3.734.0", - "@aws-sdk/types": "3.734.0", - "@aws-sdk/util-endpoints": "3.743.0", - "@aws-sdk/util-user-agent-browser": "3.734.0", - "@aws-sdk/util-user-agent-node": "3.774.0", - "@smithy/config-resolver": "^4.0.1", - "@smithy/core": "^3.1.5", - "@smithy/fetch-http-handler": "^5.0.1", - "@smithy/hash-node": "^4.0.1", - "@smithy/invalid-dependency": "^4.0.1", - "@smithy/middleware-content-length": "^4.0.1", - "@smithy/middleware-endpoint": "^4.0.6", - "@smithy/middleware-retry": "^4.0.7", - "@smithy/middleware-serde": "^4.0.2", - "@smithy/middleware-stack": "^4.0.1", - "@smithy/node-config-provider": "^4.0.1", - "@smithy/node-http-handler": "^4.0.3", - "@smithy/protocol-http": "^5.0.1", - "@smithy/smithy-client": "^4.1.6", - "@smithy/types": "^4.1.0", - "@smithy/url-parser": "^4.0.1", + "@aws-sdk/core": "3.775.0", + "@aws-sdk/middleware-host-header": "3.775.0", + "@aws-sdk/middleware-logger": "3.775.0", + "@aws-sdk/middleware-recursion-detection": "3.775.0", + "@aws-sdk/middleware-user-agent": "3.775.0", + "@aws-sdk/region-config-resolver": "3.775.0", + "@aws-sdk/types": "3.775.0", + "@aws-sdk/util-endpoints": "3.775.0", + "@aws-sdk/util-user-agent-browser": "3.775.0", + "@aws-sdk/util-user-agent-node": "3.775.0", + "@smithy/config-resolver": "^4.1.0", + "@smithy/core": "^3.2.0", + "@smithy/fetch-http-handler": "^5.0.2", + "@smithy/hash-node": "^4.0.2", + "@smithy/invalid-dependency": "^4.0.2", + "@smithy/middleware-content-length": "^4.0.2", + "@smithy/middleware-endpoint": "^4.1.0", + "@smithy/middleware-retry": "^4.1.0", + "@smithy/middleware-serde": "^4.0.3", + "@smithy/middleware-stack": "^4.0.2", + "@smithy/node-config-provider": "^4.0.2", + "@smithy/node-http-handler": "^4.0.4", + "@smithy/protocol-http": "^5.1.0", + "@smithy/smithy-client": "^4.2.0", + "@smithy/types": "^4.2.0", + "@smithy/url-parser": "^4.0.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.7", - "@smithy/util-defaults-mode-node": "^4.0.7", - "@smithy/util-endpoints": "^3.0.1", - "@smithy/util-middleware": "^4.0.1", - "@smithy/util-retry": "^4.0.1", + "@smithy/util-defaults-mode-browser": "^4.0.8", + "@smithy/util-defaults-mode-node": "^4.0.8", + "@smithy/util-endpoints": "^3.0.2", + "@smithy/util-middleware": "^4.0.2", + "@smithy/util-retry": "^4.0.2", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, @@ -1052,16 +1052,16 @@ } }, "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.734.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.734.0.tgz", - "integrity": "sha512-Lvj1kPRC5IuJBr9DyJ9T9/plkh+EfKLy+12s/mykOy1JaKHDpvj+XGy2YO6YgYVOb8JFtaqloid+5COtje4JTQ==", + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.775.0.tgz", + "integrity": "sha512-40iH3LJjrQS3LKUJAl7Wj0bln7RFPEvUYKFxtP8a+oKFDO0F65F52xZxIJbPn6sHkxWDAnZlGgdjZXM3p2g5wQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.734.0", - "@smithy/node-config-provider": "^4.0.1", - "@smithy/types": "^4.1.0", + "@aws-sdk/types": "3.775.0", + "@smithy/node-config-provider": "^4.0.2", + "@smithy/types": "^4.2.0", "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.1", + "@smithy/util-middleware": "^4.0.2", "tslib": "^2.6.2" }, "engines": { @@ -1069,18 +1069,18 @@ } }, "node_modules/@aws-sdk/s3-request-presigner": { - "version": "3.774.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.774.0.tgz", - "integrity": "sha512-vD37Nq7+ChUkXSoDqkNMXu37R8kRDUo13pOfYgesSI4HA970fjXP1T4Mf2131Ms/NuYbBHNn330+3MAkbbYKxg==", + "version": "3.779.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.779.0.tgz", + "integrity": "sha512-L3mGSh6/9gf3FBVrQziCkuLbaRJMeNbLr6tg9ZSymJcDRzRqAiCWnHrenAavTnAAnm+Lu62Fg/A4g3T+YT+gEg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/signature-v4-multi-region": "3.774.0", - "@aws-sdk/types": "3.734.0", - "@aws-sdk/util-format-url": "3.734.0", - "@smithy/middleware-endpoint": "^4.0.6", - "@smithy/protocol-http": "^5.0.1", - "@smithy/smithy-client": "^4.1.6", - "@smithy/types": "^4.1.0", + "@aws-sdk/signature-v4-multi-region": "3.775.0", + "@aws-sdk/types": "3.775.0", + "@aws-sdk/util-format-url": "3.775.0", + "@smithy/middleware-endpoint": "^4.1.0", + "@smithy/protocol-http": "^5.1.0", + "@smithy/smithy-client": "^4.2.0", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -1088,16 +1088,16 @@ } }, "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.774.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.774.0.tgz", - "integrity": "sha512-vQwATjZfl5vxfO+BDUH7nUnhfKoIJMnBmOxmUh4N10PWlz3WWwkT/YtH79nVpr+y1eM6GQUSGuNa4Reda6SaFA==", + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.775.0.tgz", + "integrity": "sha512-cnGk8GDfTMJ8p7+qSk92QlIk2bmTmFJqhYxcXZ9PysjZtx0xmfCMxnG3Hjy1oU2mt5boPCVSOptqtWixayM17g==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-sdk-s3": "3.774.0", - "@aws-sdk/types": "3.734.0", - "@smithy/protocol-http": "^5.0.1", - "@smithy/signature-v4": "^5.0.1", - "@smithy/types": "^4.1.0", + "@aws-sdk/middleware-sdk-s3": "3.775.0", + "@aws-sdk/types": "3.775.0", + "@smithy/protocol-http": "^5.1.0", + "@smithy/signature-v4": "^5.0.2", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -1105,16 +1105,16 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.774.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.774.0.tgz", - "integrity": "sha512-DDERwCduWFFXj7gx3qvnaB8GlnCUpQ8ZA03qI4QFokWu3EyHNK+hjp3nN5Dg81fI0Z82LRe30Q2uDsLBwNCZDg==", + "version": "3.777.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.777.0.tgz", + "integrity": "sha512-Yc2cDONsHOa4dTSGOev6Ng2QgTKQUEjaUnsyKd13pc/nLLz/WLqHiQ/o7PcnKERJxXGs1g1C6l3sNXiX+kbnFQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/nested-clients": "3.774.0", - "@aws-sdk/types": "3.734.0", - "@smithy/property-provider": "^4.0.1", - "@smithy/shared-ini-file-loader": "^4.0.1", - "@smithy/types": "^4.1.0", + "@aws-sdk/nested-clients": "3.777.0", + "@aws-sdk/types": "3.775.0", + "@smithy/property-provider": "^4.0.2", + "@smithy/shared-ini-file-loader": "^4.0.2", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -1122,12 +1122,12 @@ } }, "node_modules/@aws-sdk/types": { - "version": "3.734.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.734.0.tgz", - "integrity": "sha512-o11tSPTT70nAkGV1fN9wm/hAIiLPyWX6SuGf+9JyTp7S/rC2cFWhR26MvA69nplcjNaXVzB0f+QFrLXXjOqCrg==", + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.775.0.tgz", + "integrity": "sha512-ZoGKwa4C9fC9Av6bdfqcW6Ix5ot05F/S4VxWR2nHuMv7hzfmAjTOcUiWT7UR4hM/U0whf84VhDtXN/DWAk52KA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.1.0", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -1147,14 +1147,14 @@ } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.743.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.743.0.tgz", - "integrity": "sha512-sN1l559zrixeh5x+pttrnd0A3+r34r0tmPkJ/eaaMaAzXqsmKU/xYre9K3FNnsSS1J1k4PEfk/nHDTVUgFYjnw==", + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.775.0.tgz", + "integrity": "sha512-yjWmUgZC9tUxAo8Uaplqmq0eUh0zrbZJdwxGRKdYxfm4RG6fMw1tj52+KkatH7o+mNZvg1GDcVp/INktxonJLw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.734.0", - "@smithy/types": "^4.1.0", - "@smithy/util-endpoints": "^3.0.1", + "@aws-sdk/types": "3.775.0", + "@smithy/types": "^4.2.0", + "@smithy/util-endpoints": "^3.0.2", "tslib": "^2.6.2" }, "engines": { @@ -1162,14 +1162,14 @@ } }, "node_modules/@aws-sdk/util-format-url": { - "version": "3.734.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.734.0.tgz", - "integrity": "sha512-TxZMVm8V4aR/QkW9/NhujvYpPZjUYqzLwSge5imKZbWFR806NP7RMwc5ilVuHF/bMOln/cVHkl42kATElWBvNw==", + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.775.0.tgz", + "integrity": "sha512-Nw4nBeyCbWixoGh8NcVpa/i8McMA6RXJIjQFyloJLaPr7CPquz7ZbSl0MUWMFVwP/VHaJ7B+lNN3Qz1iFCEP/Q==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.734.0", - "@smithy/querystring-builder": "^4.0.1", - "@smithy/types": "^4.1.0", + "@aws-sdk/types": "3.775.0", + "@smithy/querystring-builder": "^4.0.2", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -1189,27 +1189,27 @@ } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.734.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.734.0.tgz", - "integrity": "sha512-xQTCus6Q9LwUuALW+S76OL0jcWtMOVu14q+GoLnWPUM7QeUw963oQcLhF7oq0CtaLLKyl4GOUfcwc773Zmwwng==", + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.775.0.tgz", + "integrity": "sha512-txw2wkiJmZKVdDbscK7VBK+u+TJnRtlUjRTLei+elZg2ADhpQxfVAQl436FUeIv6AhB/oRHW6/K/EAGXUSWi0A==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.734.0", - "@smithy/types": "^4.1.0", + "@aws-sdk/types": "3.775.0", + "@smithy/types": "^4.2.0", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.774.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.774.0.tgz", - "integrity": "sha512-kFmnK4sf5Wco8mkzO2PszqDXEwtQ5H896tUxqWDQhk67NtOLsHYfg98ymOBWWudth2POaldiIx6KFXtg0DvLLQ==", + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.775.0.tgz", + "integrity": "sha512-N9yhTevbizTOMo3drH7Eoy6OkJ3iVPxhV7dwb6CMAObbLneS36CSfA6xQXupmHWcRvZPTz8rd1JGG3HzFOau+g==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-user-agent": "3.774.0", - "@aws-sdk/types": "3.734.0", - "@smithy/node-config-provider": "^4.0.1", - "@smithy/types": "^4.1.0", + "@aws-sdk/middleware-user-agent": "3.775.0", + "@aws-sdk/types": "3.775.0", + "@smithy/node-config-provider": "^4.0.2", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -1225,12 +1225,12 @@ } }, "node_modules/@aws-sdk/xml-builder": { - "version": "3.734.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.734.0.tgz", - "integrity": "sha512-Zrjxi5qwGEcUsJ0ru7fRtW74WcTS0rbLcehoFB+rN1GRi2hbLcFaYs4PwVA5diLeAJH0gszv3x4Hr/S87MfbKQ==", + "version": "3.775.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.775.0.tgz", + "integrity": "sha512-b9NGO6FKJeLGYnV7Z1yvcP1TNU4dkD5jNsLWOF1/sygZoASaQhNOlaiJ/1OH331YQ1R1oWk38nBb0frsYkDsOQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.1.0", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -1402,9 +1402,9 @@ "license": "Apache-2.0" }, "node_modules/@datadog/native-appsec": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@datadog/native-appsec/-/native-appsec-8.5.0.tgz", - "integrity": "sha512-95y+fm7jd+3iknzuu57pWEPw9fcK9uSBCPiB4kSPHszHu3bESlZM553tc4ANsz+X3gMkYGVg2pgSydG77nSDJw==", + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/@datadog/native-appsec/-/native-appsec-8.5.1.tgz", + "integrity": "sha512-g6cjIafeObxVV+zJ2U1TDWVBio+MC8/4QR0EmgZ9afvhgtXRXyth3/DUOBSLUoMvCbduHwl6CV9sBf+tbSksVg==", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { @@ -1486,9 +1486,9 @@ "license": "Apache-2.0" }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.1.tgz", - "integrity": "sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz", + "integrity": "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==", "cpu": [ "ppc64" ], @@ -1503,9 +1503,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.1.tgz", - "integrity": "sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.2.tgz", + "integrity": "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==", "cpu": [ "arm" ], @@ -1520,9 +1520,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.1.tgz", - "integrity": "sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.2.tgz", + "integrity": "sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==", "cpu": [ "arm64" ], @@ -1537,9 +1537,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.1.tgz", - "integrity": "sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.2.tgz", + "integrity": "sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==", "cpu": [ "x64" ], @@ -1554,9 +1554,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.1.tgz", - "integrity": "sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.2.tgz", + "integrity": "sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==", "cpu": [ "arm64" ], @@ -1571,9 +1571,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.1.tgz", - "integrity": "sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.2.tgz", + "integrity": "sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==", "cpu": [ "x64" ], @@ -1588,9 +1588,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.1.tgz", - "integrity": "sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.2.tgz", + "integrity": "sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==", "cpu": [ "arm64" ], @@ -1605,9 +1605,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.1.tgz", - "integrity": "sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.2.tgz", + "integrity": "sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==", "cpu": [ "x64" ], @@ -1622,9 +1622,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.1.tgz", - "integrity": "sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.2.tgz", + "integrity": "sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==", "cpu": [ "arm" ], @@ -1639,9 +1639,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.1.tgz", - "integrity": "sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.2.tgz", + "integrity": "sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==", "cpu": [ "arm64" ], @@ -1656,9 +1656,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.1.tgz", - "integrity": "sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.2.tgz", + "integrity": "sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==", "cpu": [ "ia32" ], @@ -1673,9 +1673,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.1.tgz", - "integrity": "sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.2.tgz", + "integrity": "sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==", "cpu": [ "loong64" ], @@ -1690,9 +1690,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.1.tgz", - "integrity": "sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.2.tgz", + "integrity": "sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==", "cpu": [ "mips64el" ], @@ -1707,9 +1707,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.1.tgz", - "integrity": "sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.2.tgz", + "integrity": "sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==", "cpu": [ "ppc64" ], @@ -1724,9 +1724,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.1.tgz", - "integrity": "sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.2.tgz", + "integrity": "sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==", "cpu": [ "riscv64" ], @@ -1741,9 +1741,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.1.tgz", - "integrity": "sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.2.tgz", + "integrity": "sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==", "cpu": [ "s390x" ], @@ -1758,9 +1758,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.1.tgz", - "integrity": "sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.2.tgz", + "integrity": "sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==", "cpu": [ "x64" ], @@ -1775,9 +1775,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.1.tgz", - "integrity": "sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.2.tgz", + "integrity": "sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==", "cpu": [ "arm64" ], @@ -1792,9 +1792,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.1.tgz", - "integrity": "sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.2.tgz", + "integrity": "sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==", "cpu": [ "x64" ], @@ -1809,9 +1809,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.1.tgz", - "integrity": "sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.2.tgz", + "integrity": "sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==", "cpu": [ "arm64" ], @@ -1826,9 +1826,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.1.tgz", - "integrity": "sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.2.tgz", + "integrity": "sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==", "cpu": [ "x64" ], @@ -1843,9 +1843,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.1.tgz", - "integrity": "sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.2.tgz", + "integrity": "sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==", "cpu": [ "x64" ], @@ -1860,9 +1860,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.1.tgz", - "integrity": "sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.2.tgz", + "integrity": "sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==", "cpu": [ "arm64" ], @@ -1877,9 +1877,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.1.tgz", - "integrity": "sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.2.tgz", + "integrity": "sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==", "cpu": [ "ia32" ], @@ -1894,9 +1894,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.1.tgz", - "integrity": "sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.2.tgz", + "integrity": "sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==", "cpu": [ "x64" ], @@ -2824,9 +2824,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.37.0.tgz", - "integrity": "sha512-l7StVw6WAa8l3vA1ov80jyetOAEo1FtHvZDbzXDO/02Sq/QVvqlHkYoFwDJPIMj0GKiistsBudfx5tGFnwYWDQ==", + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.38.0.tgz", + "integrity": "sha512-ldomqc4/jDZu/xpYU+aRxo3V4mGCV9HeTgUBANI3oIQMOL+SsxB+S2lxMpkFp5UamSS3XuTMQVbsS24R4J4Qjg==", "cpu": [ "arm" ], @@ -2838,9 +2838,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.37.0.tgz", - "integrity": "sha512-6U3SlVyMxezt8Y+/iEBcbp945uZjJwjZimu76xoG7tO1av9VO691z8PkhzQ85ith2I8R2RddEPeSfcbyPfD4hA==", + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.38.0.tgz", + "integrity": "sha512-VUsgcy4GhhT7rokwzYQP+aV9XnSLkkhlEJ0St8pbasuWO/vwphhZQxYEKUP3ayeCYLhk6gEtacRpYP/cj3GjyQ==", "cpu": [ "arm64" ], @@ -2852,9 +2852,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.37.0.tgz", - "integrity": "sha512-+iTQ5YHuGmPt10NTzEyMPbayiNTcOZDWsbxZYR1ZnmLnZxG17ivrPSWFO9j6GalY0+gV3Jtwrrs12DBscxnlYA==", + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.38.0.tgz", + "integrity": "sha512-buA17AYXlW9Rn091sWMq1xGUvWQFOH4N1rqUxGJtEQzhChxWjldGCCup7r/wUnaI6Au8sKXpoh0xg58a7cgcpg==", "cpu": [ "arm64" ], @@ -2866,9 +2866,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.37.0.tgz", - "integrity": "sha512-m8W2UbxLDcmRKVjgl5J/k4B8d7qX2EcJve3Sut7YGrQoPtCIQGPH5AMzuFvYRWZi0FVS0zEY4c8uttPfX6bwYQ==", + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.38.0.tgz", + "integrity": "sha512-Mgcmc78AjunP1SKXl624vVBOF2bzwNWFPMP4fpOu05vS0amnLcX8gHIge7q/lDAHy3T2HeR0TqrriZDQS2Woeg==", "cpu": [ "x64" ], @@ -2880,9 +2880,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.37.0.tgz", - "integrity": "sha512-FOMXGmH15OmtQWEt174v9P1JqqhlgYge/bUjIbiVD1nI1NeJ30HYT9SJlZMqdo1uQFyt9cz748F1BHghWaDnVA==", + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.38.0.tgz", + "integrity": "sha512-zzJACgjLbQTsscxWqvrEQAEh28hqhebpRz5q/uUd1T7VTwUNZ4VIXQt5hE7ncs0GrF+s7d3S4on4TiXUY8KoQA==", "cpu": [ "arm64" ], @@ -2894,9 +2894,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.37.0.tgz", - "integrity": "sha512-SZMxNttjPKvV14Hjck5t70xS3l63sbVwl98g3FlVVx2YIDmfUIy29jQrsw06ewEYQ8lQSuY9mpAPlmgRD2iSsA==", + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.38.0.tgz", + "integrity": "sha512-hCY/KAeYMCyDpEE4pTETam0XZS4/5GXzlLgpi5f0IaPExw9kuB+PDTOTLuPtM10TlRG0U9OSmXJ+Wq9J39LvAg==", "cpu": [ "x64" ], @@ -2908,9 +2908,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.37.0.tgz", - "integrity": "sha512-hhAALKJPidCwZcj+g+iN+38SIOkhK2a9bqtJR+EtyxrKKSt1ynCBeqrQy31z0oWU6thRZzdx53hVgEbRkuI19w==", + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.38.0.tgz", + "integrity": "sha512-mimPH43mHl4JdOTD7bUMFhBdrg6f9HzMTOEnzRmXbOZqjijCw8LA5z8uL6LCjxSa67H2xiLFvvO67PT05PRKGg==", "cpu": [ "arm" ], @@ -2922,9 +2922,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.37.0.tgz", - "integrity": "sha512-jUb/kmn/Gd8epbHKEqkRAxq5c2EwRt0DqhSGWjPFxLeFvldFdHQs/n8lQ9x85oAeVb6bHcS8irhTJX2FCOd8Ag==", + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.38.0.tgz", + "integrity": "sha512-tPiJtiOoNuIH8XGG8sWoMMkAMm98PUwlriOFCCbZGc9WCax+GLeVRhmaxjJtz6WxrPKACgrwoZ5ia/uapq3ZVg==", "cpu": [ "arm" ], @@ -2936,9 +2936,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.37.0.tgz", - "integrity": "sha512-oNrJxcQT9IcbcmKlkF+Yz2tmOxZgG9D9GRq+1OE6XCQwCVwxixYAa38Z8qqPzQvzt1FCfmrHX03E0pWoXm1DqA==", + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.38.0.tgz", + "integrity": "sha512-wZco59rIVuB0tjQS0CSHTTUcEde+pXQWugZVxWaQFdQQ1VYub/sTrNdY76D1MKdN2NB48JDuGABP6o6fqos8mA==", "cpu": [ "arm64" ], @@ -2950,9 +2950,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.37.0.tgz", - "integrity": "sha512-pfxLBMls+28Ey2enpX3JvjEjaJMBX5XlPCZNGxj4kdJyHduPBXtxYeb8alo0a7bqOoWZW2uKynhHxF/MWoHaGQ==", + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.38.0.tgz", + "integrity": "sha512-fQgqwKmW0REM4LomQ+87PP8w8xvU9LZfeLBKybeli+0yHT7VKILINzFEuggvnV9M3x1Ed4gUBmGUzCo/ikmFbQ==", "cpu": [ "arm64" ], @@ -2964,9 +2964,9 @@ ] }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.37.0.tgz", - "integrity": "sha512-yCE0NnutTC/7IGUq/PUHmoeZbIwq3KRh02e9SfFh7Vmc1Z7atuJRYWhRME5fKgT8aS20mwi1RyChA23qSyRGpA==", + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.38.0.tgz", + "integrity": "sha512-hz5oqQLXTB3SbXpfkKHKXLdIp02/w3M+ajp8p4yWOWwQRtHWiEOCKtc9U+YXahrwdk+3qHdFMDWR5k+4dIlddg==", "cpu": [ "loong64" ], @@ -2978,9 +2978,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.37.0.tgz", - "integrity": "sha512-NxcICptHk06E2Lh3a4Pu+2PEdZ6ahNHuK7o6Np9zcWkrBMuv21j10SQDJW3C9Yf/A/P7cutWoC/DptNLVsZ0VQ==", + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.38.0.tgz", + "integrity": "sha512-NXqygK/dTSibQ+0pzxsL3r4Xl8oPqVoWbZV9niqOnIHV/J92fe65pOir0xjkUZDRSPyFRvu+4YOpJF9BZHQImw==", "cpu": [ "ppc64" ], @@ -2992,9 +2992,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.37.0.tgz", - "integrity": "sha512-PpWwHMPCVpFZLTfLq7EWJWvrmEuLdGn1GMYcm5MV7PaRgwCEYJAwiN94uBuZev0/J/hFIIJCsYw4nLmXA9J7Pw==", + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.38.0.tgz", + "integrity": "sha512-GEAIabR1uFyvf/jW/5jfu8gjM06/4kZ1W+j1nWTSSB3w6moZEBm7iBtzwQ3a1Pxos2F7Gz+58aVEnZHU295QTg==", "cpu": [ "riscv64" ], @@ -3006,9 +3006,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.37.0.tgz", - "integrity": "sha512-DTNwl6a3CfhGTAOYZ4KtYbdS8b+275LSLqJVJIrPa5/JuIufWWZ/QFvkxp52gpmguN95eujrM68ZG+zVxa8zHA==", + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.38.0.tgz", + "integrity": "sha512-9EYTX+Gus2EGPbfs+fh7l95wVADtSQyYw4DfSBcYdUEAmP2lqSZY0Y17yX/3m5VKGGJ4UmIH5LHLkMJft3bYoA==", "cpu": [ "riscv64" ], @@ -3020,9 +3020,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.37.0.tgz", - "integrity": "sha512-hZDDU5fgWvDdHFuExN1gBOhCuzo/8TMpidfOR+1cPZJflcEzXdCy1LjnklQdW8/Et9sryOPJAKAQRw8Jq7Tg+A==", + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.38.0.tgz", + "integrity": "sha512-Mpp6+Z5VhB9VDk7RwZXoG2qMdERm3Jw07RNlXHE0bOnEeX+l7Fy4bg+NxfyN15ruuY3/7Vrbpm75J9QHFqj5+Q==", "cpu": [ "s390x" ], @@ -3034,9 +3034,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.37.0.tgz", - "integrity": "sha512-pKivGpgJM5g8dwj0ywBwe/HeVAUSuVVJhUTa/URXjxvoyTT/AxsLTAbkHkDHG7qQxLoW2s3apEIl26uUe08LVQ==", + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.38.0.tgz", + "integrity": "sha512-vPvNgFlZRAgO7rwncMeE0+8c4Hmc+qixnp00/Uv3ht2x7KYrJ6ERVd3/R0nUtlE6/hu7/HiiNHJ/rP6knRFt1w==", "cpu": [ "x64" ], @@ -3048,9 +3048,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.37.0.tgz", - "integrity": "sha512-E2lPrLKE8sQbY/2bEkVTGDEk4/49UYRVWgj90MY8yPjpnGBQ+Xi1Qnr7b7UIWw1NOggdFQFOLZ8+5CzCiz143w==", + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.38.0.tgz", + "integrity": "sha512-q5Zv+goWvQUGCaL7fU8NuTw8aydIL/C9abAVGCzRReuj5h30TPx4LumBtAidrVOtXnlB+RZkBtExMsfqkMfb8g==", "cpu": [ "x64" ], @@ -3062,9 +3062,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.37.0.tgz", - "integrity": "sha512-Jm7biMazjNzTU4PrQtr7VS8ibeys9Pn29/1bm4ph7CP2kf21950LgN+BaE2mJ1QujnvOc6p54eWWiVvn05SOBg==", + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.38.0.tgz", + "integrity": "sha512-u/Jbm1BU89Vftqyqbmxdq14nBaQjQX1HhmsdBWqSdGClNaKwhjsg5TpW+5Ibs1mb8Es9wJiMdl86BcmtUVXNZg==", "cpu": [ "arm64" ], @@ -3076,9 +3076,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.37.0.tgz", - "integrity": "sha512-e3/1SFm1OjefWICB2Ucstg2dxYDkDTZGDYgwufcbsxTHyqQps1UQf33dFEChBNmeSsTOyrjw2JJq0zbG5GF6RA==", + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.38.0.tgz", + "integrity": "sha512-mqu4PzTrlpNHHbu5qleGvXJoGgHpChBlrBx/mEhTPpnAL1ZAYFlvHD7rLK839LLKQzqEQMFJfGrrOHItN4ZQqA==", "cpu": [ "ia32" ], @@ -3090,9 +3090,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.37.0.tgz", - "integrity": "sha512-LWbXUBwn/bcLx2sSsqy7pK5o+Nr+VCoRoAohfJ5C/aBio9nfJmGQqHAhU6pwxV/RmyTk5AqdySma7uwWGlmeuA==", + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.38.0.tgz", + "integrity": "sha512-jjqy3uWlecfB98Psxb5cD6Fny9Fupv9LrDSPTQZUROqjvZmcCqNu4UMl7qqhlUUGpwiAkotj6GYu4SZdcr/nLw==", "cpu": [ "x64" ], @@ -3193,13 +3193,13 @@ } }, "node_modules/@smithy/eventstream-codec": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.0.1.tgz", - "integrity": "sha512-Q2bCAAR6zXNVtJgifsU16ZjKGqdw/DyecKNgIgi7dlqw04fqDu0mnq+JmGphqheypVc64CYq3azSuCpAdFk2+A==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.0.2.tgz", + "integrity": "sha512-p+f2kLSK7ZrXVfskU/f5dzksKTewZk8pJLPvER3aFHPt76C2MxD9vNatSfLzzQSQB4FNO96RK4PSXfhD1TTeMQ==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/crc32": "5.2.0", - "@smithy/types": "^4.1.0", + "@smithy/types": "^4.2.0", "@smithy/util-hex-encoding": "^4.0.0", "tslib": "^2.6.2" }, @@ -3208,13 +3208,13 @@ } }, "node_modules/@smithy/eventstream-serde-browser": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.0.1.tgz", - "integrity": "sha512-HbIybmz5rhNg+zxKiyVAnvdM3vkzjE6ccrJ620iPL8IXcJEntd3hnBl+ktMwIy12Te/kyrSbUb8UCdnUT4QEdA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.0.2.tgz", + "integrity": "sha512-CepZCDs2xgVUtH7ZZ7oDdZFH8e6Y2zOv8iiX6RhndH69nlojCALSKK+OXwZUgOtUZEUaZ5e1hULVCHYbCn7pug==", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-serde-universal": "^4.0.1", - "@smithy/types": "^4.1.0", + "@smithy/eventstream-serde-universal": "^4.0.2", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -3222,12 +3222,12 @@ } }, "node_modules/@smithy/eventstream-serde-config-resolver": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.0.1.tgz", - "integrity": "sha512-lSipaiq3rmHguHa3QFF4YcCM3VJOrY9oq2sow3qlhFY+nBSTF/nrO82MUQRPrxHQXA58J5G1UnU2WuJfi465BA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.1.0.tgz", + "integrity": "sha512-1PI+WPZ5TWXrfj3CIoKyUycYynYJgZjuQo8U+sphneOtjsgrttYybdqESFReQrdWJ+LKt6NEdbYzmmfDBmjX2A==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.1.0", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -3235,13 +3235,13 @@ } }, "node_modules/@smithy/eventstream-serde-node": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.0.1.tgz", - "integrity": "sha512-o4CoOI6oYGYJ4zXo34U8X9szDe3oGjmHgsMGiZM0j4vtNoT+h80TLnkUcrLZR3+E6HIxqW+G+9WHAVfl0GXK0Q==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.0.2.tgz", + "integrity": "sha512-C5bJ/C6x9ENPMx2cFOirspnF9ZsBVnBMtP6BdPl/qYSuUawdGQ34Lq0dMcf42QTjUZgWGbUIZnz6+zLxJlb9aw==", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-serde-universal": "^4.0.1", - "@smithy/types": "^4.1.0", + "@smithy/eventstream-serde-universal": "^4.0.2", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -3249,13 +3249,13 @@ } }, "node_modules/@smithy/eventstream-serde-universal": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.0.1.tgz", - "integrity": "sha512-Z94uZp0tGJuxds3iEAZBqGU2QiaBHP4YytLUjwZWx+oUeohCsLyUm33yp4MMBmhkuPqSbQCXq5hDet6JGUgHWA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.0.2.tgz", + "integrity": "sha512-St8h9JqzvnbB52FtckiHPN4U/cnXcarMniXRXTKn0r4b4XesZOGiAyUdj1aXbqqn1icSqBlzzUsCl6nPB018ng==", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-codec": "^4.0.1", - "@smithy/types": "^4.1.0", + "@smithy/eventstream-codec": "^4.0.2", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -3279,14 +3279,14 @@ } }, "node_modules/@smithy/hash-blob-browser": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.0.1.tgz", - "integrity": "sha512-rkFIrQOKZGS6i1D3gKJ8skJ0RlXqDvb1IyAphksaFOMzkn3v3I1eJ8m7OkLj0jf1McP63rcCEoLlkAn/HjcTRw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.0.2.tgz", + "integrity": "sha512-3g188Z3DyhtzfBRxpZjU8R9PpOQuYsbNnyStc/ZVS+9nVX1f6XeNOa9IrAh35HwwIZg+XWk8bFVtNINVscBP+g==", "license": "Apache-2.0", "dependencies": { "@smithy/chunked-blob-reader": "^5.0.0", "@smithy/chunked-blob-reader-native": "^4.0.0", - "@smithy/types": "^4.1.0", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -3294,12 +3294,12 @@ } }, "node_modules/@smithy/hash-node": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.1.tgz", - "integrity": "sha512-TJ6oZS+3r2Xu4emVse1YPB3Dq3d8RkZDKcPr71Nj/lJsdAP1c7oFzYqEn1IBc915TsgLl2xIJNuxCz+gLbLE0w==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.2.tgz", + "integrity": "sha512-VnTpYPnRUE7yVhWozFdlxcYknv9UN7CeOqSrMH+V877v4oqtVYuoqhIhtSjmGPvYrYnAkaM61sLMKHvxL138yg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.1.0", + "@smithy/types": "^4.2.0", "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" @@ -3309,12 +3309,12 @@ } }, "node_modules/@smithy/hash-stream-node": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.0.1.tgz", - "integrity": "sha512-U1rAE1fxmReCIr6D2o/4ROqAQX+GffZpyMt3d7njtGDr2pUNmAKRWa49gsNVhCh2vVAuf3wXzWwNr2YN8PAXIw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.0.2.tgz", + "integrity": "sha512-POWDuTznzbIwlEXEvvXoPMS10y0WKXK790soe57tFRfvf4zBHyzE529HpZMqmDdwG9MfFflnyzndUQ8j78ZdSg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.1.0", + "@smithy/types": "^4.2.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, @@ -3323,12 +3323,12 @@ } }, "node_modules/@smithy/invalid-dependency": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.1.tgz", - "integrity": "sha512-gdudFPf4QRQ5pzj7HEnu6FhKRi61BfH/Gk5Yf6O0KiSbr1LlVhgjThcvjdu658VE6Nve8vaIWB8/fodmS1rBPQ==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.2.tgz", + "integrity": "sha512-GatB4+2DTpgWPday+mnUkoumP54u/MDM/5u44KF9hIu8jF0uafZtQLcdfIKkIcUNuF/fBojpLEHZS/56JqPeXQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.1.0", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -3348,12 +3348,12 @@ } }, "node_modules/@smithy/md5-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.0.1.tgz", - "integrity": "sha512-HLZ647L27APi6zXkZlzSFZIjpo8po45YiyjMGJZM3gyDY8n7dPGdmxIIljLm4gPt/7rRvutLTTkYJpZVfG5r+A==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.0.2.tgz", + "integrity": "sha512-Hc0R8EiuVunUewCse2syVgA2AfSRco3LyAv07B/zCOMa+jpXI9ll+Q21Nc6FAlYPcpNcAXqBzMhNs1CD/pP2bA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.1.0", + "@smithy/types": "^4.2.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, @@ -3362,13 +3362,13 @@ } }, "node_modules/@smithy/middleware-content-length": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.1.tgz", - "integrity": "sha512-OGXo7w5EkB5pPiac7KNzVtfCW2vKBTZNuCctn++TTSOMpe6RZO/n6WEC1AxJINn3+vWLKW49uad3lo/u0WJ9oQ==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.2.tgz", + "integrity": "sha512-hAfEXm1zU+ELvucxqQ7I8SszwQ4znWMbNv6PLMndN83JJN41EPuS93AIyh2N+gJ6x8QFhzSO6b7q2e6oClDI8A==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.0.1", - "@smithy/types": "^4.1.0", + "@smithy/protocol-http": "^5.1.0", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -3563,16 +3563,16 @@ } }, "node_modules/@smithy/signature-v4": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.0.1.tgz", - "integrity": "sha512-nCe6fQ+ppm1bQuw5iKoeJ0MJfz2os7Ic3GBjOkLOPtavbD1ONoyE3ygjBfz2ythFWm4YnRm6OxW+8p/m9uCoIA==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.0.2.tgz", + "integrity": "sha512-Mz+mc7okA73Lyz8zQKJNyr7lIcHLiPYp0+oiqiMNc/t7/Kf2BENs5d63pEj7oPqdjaum6g0Fc8wC78dY1TgtXw==", "license": "Apache-2.0", "dependencies": { "@smithy/is-array-buffer": "^4.0.0", - "@smithy/protocol-http": "^5.0.1", - "@smithy/types": "^4.1.0", + "@smithy/protocol-http": "^5.1.0", + "@smithy/types": "^4.2.0", "@smithy/util-hex-encoding": "^4.0.0", - "@smithy/util-middleware": "^4.0.1", + "@smithy/util-middleware": "^4.0.2", "@smithy/util-uri-escape": "^4.0.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" @@ -3723,13 +3723,13 @@ } }, "node_modules/@smithy/util-endpoints": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.1.tgz", - "integrity": "sha512-zVdUENQpdtn9jbpD9SCFK4+aSiavRb9BxEtw9ZGUR1TYo6bBHbIoi7VkrFQ0/RwZlzx0wRBaRmPclj8iAoJCLA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.2.tgz", + "integrity": "sha512-6QSutU5ZyrpNbnd51zRTL7goojlcnuOB55+F9VBD+j8JpRY50IGamsjlycrmpn8PQkmJucFW8A0LSfXj7jjtLQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.0.1", - "@smithy/types": "^4.1.0", + "@smithy/node-config-provider": "^4.0.2", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -3820,13 +3820,13 @@ } }, "node_modules/@smithy/util-waiter": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.0.2.tgz", - "integrity": "sha512-piUTHyp2Axx3p/kc2CIJkYSv0BAaheBQmbACZgQSSfWUumWNW+R1lL+H9PDBxKJkvOeEX+hKYEFiwO8xagL8AQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.0.3.tgz", + "integrity": "sha512-JtaY3FxmD+te+KSI2FJuEcfNC9T/DGGVf551babM7fAaXhjJUt7oSYurH1Devxd2+BOSUACCgt3buinx4UnmEA==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.0.1", - "@smithy/types": "^4.1.0", + "@smithy/abort-controller": "^4.0.2", + "@smithy/types": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -3997,9 +3997,9 @@ } }, "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", "dev": true, "license": "MIT" }, @@ -4153,14 +4153,14 @@ "license": "MIT" }, "node_modules/@vitest/expect": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.0.9.tgz", - "integrity": "sha512-5eCqRItYgIML7NNVgJj6TVCmdzE7ZVgJhruW0ziSQV4V7PvLkDL1bBkBdcTs/VuIz0IxPb5da1IDSqc1TR9eig==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.1.1.tgz", + "integrity": "sha512-q/zjrW9lgynctNbwvFtQkGK9+vvHA5UzVi2V8APrp1C6fG6/MuYYkmlx4FubuqLycCeSdHD5aadWfua/Vr0EUA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "3.0.9", - "@vitest/utils": "3.0.9", + "@vitest/spy": "3.1.1", + "@vitest/utils": "3.1.1", "chai": "^5.2.0", "tinyrainbow": "^2.0.0" }, @@ -4169,13 +4169,13 @@ } }, "node_modules/@vitest/mocker": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.0.9.tgz", - "integrity": "sha512-ryERPIBOnvevAkTq+L1lD+DTFBRcjueL9lOUfXsLfwP92h4e+Heb+PjiqS3/OURWPtywfafK0kj++yDFjWUmrA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.1.1.tgz", + "integrity": "sha512-bmpJJm7Y7i9BBELlLuuM1J1Q6EQ6K5Ye4wcyOpOMXMcePYKSIYlpcrCm4l/O6ja4VJA5G2aMJiuZkZdnxlC3SA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "3.0.9", + "@vitest/spy": "3.1.1", "estree-walker": "^3.0.3", "magic-string": "^0.30.17" }, @@ -4196,9 +4196,9 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.9.tgz", - "integrity": "sha512-OW9F8t2J3AwFEwENg3yMyKWweF7oRJlMyHOMIhO5F3n0+cgQAJZBjNgrF8dLwFTEXl5jUqBLXd9QyyKv8zEcmA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.1.1.tgz", + "integrity": "sha512-dg0CIzNx+hMMYfNmSqJlLSXEmnNhMswcn3sXO7Tpldr0LiGmg3eXdLLhwkv2ZqgHb/d5xg5F7ezNFRA1fA13yA==", "dev": true, "license": "MIT", "dependencies": { @@ -4209,13 +4209,13 @@ } }, "node_modules/@vitest/runner": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.0.9.tgz", - "integrity": "sha512-NX9oUXgF9HPfJSwl8tUZCMP1oGx2+Sf+ru6d05QjzQz4OwWg0psEzwY6VexP2tTHWdOkhKHUIZH+fS6nA7jfOw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.1.1.tgz", + "integrity": "sha512-X/d46qzJuEDO8ueyjtKfxffiXraPRfmYasoC4i5+mlLEJ10UvPb0XH5M9C3gWuxd7BAQhpK42cJgJtq53YnWVA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "3.0.9", + "@vitest/utils": "3.1.1", "pathe": "^2.0.3" }, "funding": { @@ -4223,13 +4223,13 @@ } }, "node_modules/@vitest/snapshot": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.0.9.tgz", - "integrity": "sha512-AiLUiuZ0FuA+/8i19mTYd+re5jqjEc2jZbgJ2up0VY0Ddyyxg/uUtBDpIFAy4uzKaQxOW8gMgBdAJJ2ydhu39A==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.1.1.tgz", + "integrity": "sha512-bByMwaVWe/+1WDf9exFxWWgAixelSdiwo2p33tpqIlM14vW7PRV5ppayVXtfycqze4Qhtwag5sVhX400MLBOOw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.0.9", + "@vitest/pretty-format": "3.1.1", "magic-string": "^0.30.17", "pathe": "^2.0.3" }, @@ -4238,9 +4238,9 @@ } }, "node_modules/@vitest/spy": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.0.9.tgz", - "integrity": "sha512-/CcK2UDl0aQ2wtkp3YVWldrpLRNCfVcIOFGlVGKO4R5eajsH393Z1yiXLVQ7vWsj26JOEjeZI0x5sm5P4OGUNQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.1.1.tgz", + "integrity": "sha512-+EmrUOOXbKzLkTDwlsc/xrwOlPDXyVk3Z6P6K4oiCndxz7YLpp/0R0UsWVOKT0IXWjjBJuSMk6D27qipaupcvQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4251,13 +4251,13 @@ } }, "node_modules/@vitest/utils": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.0.9.tgz", - "integrity": "sha512-ilHM5fHhZ89MCp5aAaM9uhfl1c2JdxVxl3McqsdVyVNN6JffnEen8UMCdRTzOhGXNQGo5GNL9QugHrz727Wnng==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.1.1.tgz", + "integrity": "sha512-1XIjflyaU2k3HMArJ50bwSh3wKWPD6Q47wz/NUSmRV0zNywPc4w79ARjg/i/aNINHwA+mIALhUVqD9/aUvZNgg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.0.9", + "@vitest/pretty-format": "3.1.1", "loupe": "^3.1.3", "tinyrainbow": "^2.0.0" }, @@ -5139,9 +5139,9 @@ } }, "node_modules/bullmq": { - "version": "5.44.4", - "resolved": "https://registry.npmjs.org/bullmq/-/bullmq-5.44.4.tgz", - "integrity": "sha512-0BjgABM/7U85Fxatj586ftsoWiGdjmg7fR7PwRYNOOGfvGpiUX9nQoUmx+9VZW/OtHO/4um/BVh2Y2S9BEhKFg==", + "version": "5.45.2", + "resolved": "https://registry.npmjs.org/bullmq/-/bullmq-5.45.2.tgz", + "integrity": "sha512-wHZfcD4z4aLolxREmwNNDSbfh7USeq2e3yu5W2VGkzHMUcrH0fzZuRuCMsjD0XKS9ViK1U854oM9yWR6ftPeDA==", "license": "MIT", "dependencies": { "cron-parser": "^4.9.0", @@ -5989,14 +5989,14 @@ } }, "node_modules/dd-trace": { - "version": "5.43.0", - "resolved": "https://registry.npmjs.org/dd-trace/-/dd-trace-5.43.0.tgz", - "integrity": "sha512-WtPUSZfEosSHYVBFR48FqfYBFor8QchKwAKo+LYtbgTPtFzYKyBV/FJUqYE6sDF15Raf4sJVt/LOscywgj2zEw==", + "version": "5.45.0", + "resolved": "https://registry.npmjs.org/dd-trace/-/dd-trace-5.45.0.tgz", + "integrity": "sha512-LrojHQa/5b7vY+v222aAuLC9LgaTEos6byrzhZQ8frFi5b+WlyfBtdjo7lA050dvvxMAU7c+vl5jKHa3D8swbg==", "hasInstallScript": true, "license": "(Apache-2.0 OR BSD-3-Clause)", "dependencies": { "@datadog/libdatadog": "^0.5.0", - "@datadog/native-appsec": "8.5.0", + "@datadog/native-appsec": "8.5.1", "@datadog/native-iast-rewriter": "2.8.0", "@datadog/native-iast-taint-tracking": "3.3.0", "@datadog/native-metrics": "^3.1.0", @@ -6006,7 +6006,7 @@ "@opentelemetry/api": ">=1.0.0 <1.9.0", "@opentelemetry/core": "^1.14.0", "crypto-randomuuid": "^1.0.0", - "dc-polyfill": "^0.1.4", + "dc-polyfill": "0.1.6", "ignore": "^5.2.4", "import-in-the-middle": "1.13.1", "istanbul-lib-coverage": "3.2.0", @@ -6680,9 +6680,9 @@ } }, "node_modules/esbuild": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.1.tgz", - "integrity": "sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.2.tgz", + "integrity": "sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -6693,31 +6693,31 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.1", - "@esbuild/android-arm": "0.25.1", - "@esbuild/android-arm64": "0.25.1", - "@esbuild/android-x64": "0.25.1", - "@esbuild/darwin-arm64": "0.25.1", - "@esbuild/darwin-x64": "0.25.1", - "@esbuild/freebsd-arm64": "0.25.1", - "@esbuild/freebsd-x64": "0.25.1", - "@esbuild/linux-arm": "0.25.1", - "@esbuild/linux-arm64": "0.25.1", - "@esbuild/linux-ia32": "0.25.1", - "@esbuild/linux-loong64": "0.25.1", - "@esbuild/linux-mips64el": "0.25.1", - "@esbuild/linux-ppc64": "0.25.1", - "@esbuild/linux-riscv64": "0.25.1", - "@esbuild/linux-s390x": "0.25.1", - "@esbuild/linux-x64": "0.25.1", - "@esbuild/netbsd-arm64": "0.25.1", - "@esbuild/netbsd-x64": "0.25.1", - "@esbuild/openbsd-arm64": "0.25.1", - "@esbuild/openbsd-x64": "0.25.1", - "@esbuild/sunos-x64": "0.25.1", - "@esbuild/win32-arm64": "0.25.1", - "@esbuild/win32-ia32": "0.25.1", - "@esbuild/win32-x64": "0.25.1" + "@esbuild/aix-ppc64": "0.25.2", + "@esbuild/android-arm": "0.25.2", + "@esbuild/android-arm64": "0.25.2", + "@esbuild/android-x64": "0.25.2", + "@esbuild/darwin-arm64": "0.25.2", + "@esbuild/darwin-x64": "0.25.2", + "@esbuild/freebsd-arm64": "0.25.2", + "@esbuild/freebsd-x64": "0.25.2", + "@esbuild/linux-arm": "0.25.2", + "@esbuild/linux-arm64": "0.25.2", + "@esbuild/linux-ia32": "0.25.2", + "@esbuild/linux-loong64": "0.25.2", + "@esbuild/linux-mips64el": "0.25.2", + "@esbuild/linux-ppc64": "0.25.2", + "@esbuild/linux-riscv64": "0.25.2", + "@esbuild/linux-s390x": "0.25.2", + "@esbuild/linux-x64": "0.25.2", + "@esbuild/netbsd-arm64": "0.25.2", + "@esbuild/netbsd-x64": "0.25.2", + "@esbuild/openbsd-arm64": "0.25.2", + "@esbuild/openbsd-x64": "0.25.2", + "@esbuild/sunos-x64": "0.25.2", + "@esbuild/win32-arm64": "0.25.2", + "@esbuild/win32-ia32": "0.25.2", + "@esbuild/win32-x64": "0.25.2" } }, "node_modules/escalade": { @@ -10804,13 +10804,13 @@ "license": "MIT" }, "node_modules/rollup": { - "version": "4.37.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.37.0.tgz", - "integrity": "sha512-iAtQy/L4QFU+rTJ1YUjXqJOJzuwEghqWzCEYD2FEghT7Gsy1VdABntrO4CLopA5IkflTyqNiLNwPcOJ3S7UKLg==", + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.38.0.tgz", + "integrity": "sha512-5SsIRtJy9bf1ErAOiFMFzl64Ex9X5V7bnJ+WlFMb+zmP459OSWCEG7b0ERZ+PEU7xPt4OG3RHbrp1LJlXxYTrw==", "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "1.0.6" + "@types/estree": "1.0.7" }, "bin": { "rollup": "dist/bin/rollup" @@ -10820,26 +10820,26 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.37.0", - "@rollup/rollup-android-arm64": "4.37.0", - "@rollup/rollup-darwin-arm64": "4.37.0", - "@rollup/rollup-darwin-x64": "4.37.0", - "@rollup/rollup-freebsd-arm64": "4.37.0", - "@rollup/rollup-freebsd-x64": "4.37.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.37.0", - "@rollup/rollup-linux-arm-musleabihf": "4.37.0", - "@rollup/rollup-linux-arm64-gnu": "4.37.0", - "@rollup/rollup-linux-arm64-musl": "4.37.0", - "@rollup/rollup-linux-loongarch64-gnu": "4.37.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.37.0", - "@rollup/rollup-linux-riscv64-gnu": "4.37.0", - "@rollup/rollup-linux-riscv64-musl": "4.37.0", - "@rollup/rollup-linux-s390x-gnu": "4.37.0", - "@rollup/rollup-linux-x64-gnu": "4.37.0", - "@rollup/rollup-linux-x64-musl": "4.37.0", - "@rollup/rollup-win32-arm64-msvc": "4.37.0", - "@rollup/rollup-win32-ia32-msvc": "4.37.0", - "@rollup/rollup-win32-x64-msvc": "4.37.0", + "@rollup/rollup-android-arm-eabi": "4.38.0", + "@rollup/rollup-android-arm64": "4.38.0", + "@rollup/rollup-darwin-arm64": "4.38.0", + "@rollup/rollup-darwin-x64": "4.38.0", + "@rollup/rollup-freebsd-arm64": "4.38.0", + "@rollup/rollup-freebsd-x64": "4.38.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.38.0", + "@rollup/rollup-linux-arm-musleabihf": "4.38.0", + "@rollup/rollup-linux-arm64-gnu": "4.38.0", + "@rollup/rollup-linux-arm64-musl": "4.38.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.38.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.38.0", + "@rollup/rollup-linux-riscv64-gnu": "4.38.0", + "@rollup/rollup-linux-riscv64-musl": "4.38.0", + "@rollup/rollup-linux-s390x-gnu": "4.38.0", + "@rollup/rollup-linux-x64-gnu": "4.38.0", + "@rollup/rollup-linux-x64-musl": "4.38.0", + "@rollup/rollup-win32-arm64-msvc": "4.38.0", + "@rollup/rollup-win32-ia32-msvc": "4.38.0", + "@rollup/rollup-win32-x64-msvc": "4.38.0", "fsevents": "~2.3.2" } }, @@ -12523,9 +12523,9 @@ } }, "node_modules/vite": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.3.tgz", - "integrity": "sha512-IzwM54g4y9JA/xAeBPNaDXiBF8Jsgl3VBQ2YQ/wOY6fyW3xMdSoltIV3Bo59DErdqdE6RxUfv8W69DvUorE4Eg==", + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.4.tgz", + "integrity": "sha512-veHMSew8CcRzhL5o8ONjy8gkfmFJAd5Ac16oxBUjlwgX3Gq2Wqr+qNC3TjPIpy7TPV/KporLga5GT9HqdrCizw==", "dev": true, "license": "MIT", "dependencies": { @@ -12595,9 +12595,9 @@ } }, "node_modules/vite-node": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.9.tgz", - "integrity": "sha512-w3Gdx7jDcuT9cNn9jExXgOyKmf5UOTb6WMHz8LGAm54eS1Elf5OuBhCxl6zJxGhEeIkgsE1WbHuoL0mj/UXqXg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.1.1.tgz", + "integrity": "sha512-V+IxPAE2FvXpTCHXyNem0M+gWm6J7eRyWPR6vYoG/Gl+IscNOjXzztUhimQgTxaAoUoj40Qqimaa0NLIOOAH4w==", "dev": true, "license": "MIT", "dependencies": { @@ -12618,31 +12618,31 @@ } }, "node_modules/vitest": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.0.9.tgz", - "integrity": "sha512-BbcFDqNyBlfSpATmTtXOAOj71RNKDDvjBM/uPfnxxVGrG+FSH2RQIwgeEngTaTkuU/h0ScFvf+tRcKfYXzBybQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.1.1.tgz", + "integrity": "sha512-kiZc/IYmKICeBAZr9DQ5rT7/6bD9G7uqQEki4fxazi1jdVl2mWGzedtBs5s6llz59yQhVb7FFY2MbHzHCnT79Q==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/expect": "3.0.9", - "@vitest/mocker": "3.0.9", - "@vitest/pretty-format": "^3.0.9", - "@vitest/runner": "3.0.9", - "@vitest/snapshot": "3.0.9", - "@vitest/spy": "3.0.9", - "@vitest/utils": "3.0.9", + "@vitest/expect": "3.1.1", + "@vitest/mocker": "3.1.1", + "@vitest/pretty-format": "^3.1.1", + "@vitest/runner": "3.1.1", + "@vitest/snapshot": "3.1.1", + "@vitest/spy": "3.1.1", + "@vitest/utils": "3.1.1", "chai": "^5.2.0", "debug": "^4.4.0", - "expect-type": "^1.1.0", + "expect-type": "^1.2.0", "magic-string": "^0.30.17", "pathe": "^2.0.3", - "std-env": "^3.8.0", + "std-env": "^3.8.1", "tinybench": "^2.9.0", "tinyexec": "^0.3.2", "tinypool": "^1.0.2", "tinyrainbow": "^2.0.0", "vite": "^5.0.0 || ^6.0.0", - "vite-node": "3.0.9", + "vite-node": "3.1.1", "why-is-node-running": "^2.3.0" }, "bin": { @@ -12658,8 +12658,8 @@ "@edge-runtime/vm": "*", "@types/debug": "^4.1.12", "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "@vitest/browser": "3.0.9", - "@vitest/ui": "3.0.9", + "@vitest/browser": "3.1.1", + "@vitest/ui": "3.1.1", "happy-dom": "*", "jsdom": "*" }, diff --git a/package.json b/package.json index d95e7a731..409d1ce60 100644 --- a/package.json +++ b/package.json @@ -15,14 +15,14 @@ "test:watch": "vitest" }, "dependencies": { - "@aws-sdk/client-cloudwatch-logs": "^3.772.0", - "@aws-sdk/client-elasticache": "^3.772.0", - "@aws-sdk/client-s3": "^3.772.0", - "@aws-sdk/client-secrets-manager": "^3.772.0", - "@aws-sdk/client-ses": "^3.772.0", - "@aws-sdk/credential-provider-node": "^3.772.0", - "@aws-sdk/lib-storage": "^3.774.0", - "@aws-sdk/s3-request-presigner": "^3.774.0", + "@aws-sdk/client-cloudwatch-logs": "^3.777.0", + "@aws-sdk/client-elasticache": "^3.777.0", + "@aws-sdk/client-s3": "^3.779.0", + "@aws-sdk/client-secrets-manager": "^3.777.0", + "@aws-sdk/client-ses": "^3.777.0", + "@aws-sdk/credential-provider-node": "^3.777.0", + "@aws-sdk/lib-storage": "^3.779.0", + "@aws-sdk/s3-request-presigner": "^3.779.0", "@opensearch-project/opensearch": "^2.13.0", "@socket.io/admin-ui": "^0.5.1", "@socket.io/redis-adapter": "^8.3.0", @@ -33,7 +33,7 @@ "better-queue": "^3.8.12", "bluebird": "^3.7.2", "body-parser": "^1.20.3", - "bullmq": "^5.44.4", + "bullmq": "^5.45.2", "chart.js": "^4.4.8", "cloudinary": "^2.6.0", "compression": "^1.8.0", @@ -41,7 +41,7 @@ "cors": "2.8.5", "crisp-status-reporter": "^1.2.2", "csrf": "^3.1.0", - "dd-trace": "^5.43.0", + "dd-trace": "^5.45.0", "dinero.js": "^1.9.1", "dotenv": "^16.4.5", "express": "^4.21.1", @@ -86,6 +86,6 @@ "prettier": "^3.5.3", "source-map-explorer": "^2.5.2", "supertest": "^7.1.0", - "vitest": "^3.0.9" + "vitest": "^3.1.1" } } From 8e105f0b36a58b42dcdf1cb6a40935ca121ac891 Mon Sep 17 00:00:00 2001 From: Dave Richer Date: Tue, 1 Apr 2025 12:20:50 -0400 Subject: [PATCH 2/8] feature/IO-2885-IntelliPay-App-Postback-Support - Replace/Remove body-parser with Expresses built in body parsing middleware --- package-lock.json | 1 - package.json | 1 - server.js | 4 ++-- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 79f584f36..ffe02c7ec 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,7 +26,6 @@ "bee-queue": "^1.7.1", "better-queue": "^3.8.12", "bluebird": "^3.7.2", - "body-parser": "^1.20.3", "bullmq": "^5.45.2", "chart.js": "^4.4.8", "cloudinary": "^2.6.0", diff --git a/package.json b/package.json index 409d1ce60..aa3c57951 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,6 @@ "bee-queue": "^1.7.1", "better-queue": "^3.8.12", "bluebird": "^3.7.2", - "body-parser": "^1.20.3", "bullmq": "^5.45.2", "chart.js": "^4.4.8", "cloudinary": "^2.6.0", diff --git a/server.js b/server.js index 52f5c6e9e..117c38145 100644 --- a/server.js +++ b/server.js @@ -84,8 +84,8 @@ const SOCKETIO_CORS_ORIGIN_DEV = ["http://localhost:3333", "https://localhost:33 const applyMiddleware = ({ app }) => { app.use(compression()); app.use(cookieParser()); - app.use(bodyParser.json({ limit: "50mb" })); - app.use(bodyParser.urlencoded({ limit: "50mb", extended: true })); + app.use(express.json({ limit: "50mb" })); + app.use(express.urlencoded({ limit: "50mb", extended: true })); app.use(cors({ credentials: true, exposedHeaders: ["set-cookie"] })); // Helper middleware From 0ef2814de309b0f414a6fc20c5195ef25750f86c Mon Sep 17 00:00:00 2001 From: Dave Richer Date: Tue, 1 Apr 2025 12:33:41 -0400 Subject: [PATCH 3/8] feature/IO-2885-IntelliPay-App-Postback-Support - Clean intellipay.js, add new route scaffolding --- server/intellipay/intellipay.js | 75 +++++++++++++++++++++++++------ server/routes/intellipayRoutes.js | 20 ++++++--- 2 files changed, 75 insertions(+), 20 deletions(-) diff --git a/server/intellipay/intellipay.js b/server/intellipay/intellipay.js index 4af4a50cc..a58d45240 100644 --- a/server/intellipay/intellipay.js +++ b/server/intellipay/intellipay.js @@ -1,7 +1,3 @@ -const path = require("path"); -require("dotenv").config({ - path: path.resolve(process.cwd(), `.env.${process.env.NODE_ENV || "development"}`) -}); const queries = require("../graphql-client/queries"); const Dinero = require("dinero.js"); const qs = require("query-string"); @@ -10,18 +6,22 @@ const moment = require("moment"); const logger = require("../utils/logger"); const { sendTaskEmail } = require("../email/sendemail"); const generateEmailTemplate = require("../email/generateTemplate"); - -const domain = process.env.NODE_ENV ? "secure" : "test"; - const { SecretsManagerClient, GetSecretValueCommand } = require("@aws-sdk/client-secrets-manager"); const { InstanceRegion, InstanceEndpoints } = require("../utils/instanceMgr"); +const domain = process.env.NODE_ENV ? "secure" : "test"; + const client = new SecretsManagerClient({ region: InstanceRegion() }); const gqlClient = require("../graphql-client/graphql-client").client; +/** + * @description Get shop credentials from AWS Secrets Manager + * @param bodyshop + * @returns {Promise<{error}|{merchantkey: *, apikey: *}|any>} + */ const getShopCredentials = async (bodyshop) => { // Development only if (process.env.NODE_ENV === undefined) { @@ -49,16 +49,27 @@ const getShopCredentials = async (bodyshop) => { } }; +/** + * @description Decode the comment from base64 + * @param comment + * @returns {any|null} + */ const decodeComment = (comment) => { try { return comment ? JSON.parse(Buffer.from(comment, "base64").toString()) : null; - // eslint-disable-next-line no-unused-vars + // eslint-disable-next-line no-unused-vars } catch (error) { return null; // Handle malformed base64 string gracefully } }; -exports.lightbox_credentials = async (req, res) => { +/** + * @description Get lightbox credentials for the shop + * @param req + * @param res + * @returns {Promise} + */ +const lightboxCredentials = async (req, res) => { const decodedComment = decodeComment(req.body?.comment); const logMeta = { iPayData: req.body?.iPayData, @@ -119,7 +130,13 @@ exports.lightbox_credentials = async (req, res) => { } }; -exports.payment_refund = async (req, res) => { +/** + * @description Process payment refund + * @param req + * @param res + * @returns {Promise} + */ +const paymentRefund = async (req, res) => { const decodedComment = decodeComment(req.body.iPayData?.comment); const logResponseMeta = { iPayData: req.body?.iPayData, @@ -190,7 +207,13 @@ exports.payment_refund = async (req, res) => { } }; -exports.generate_payment_url = async (req, res) => { +/** + * @description Generate payment URL for the shop + * @param req + * @param res + * @returns {Promise} + */ +const generatePaymentUrl = async (req, res) => { const decodedComment = decodeComment(req.body.comment); const logResponseMeta = { iPayData: req.body?.iPayData, @@ -261,8 +284,14 @@ exports.generate_payment_url = async (req, res) => { } }; -//Reference: https://intellipay.com/dist/webapi26.html#operation/fee -exports.checkfee = async (req, res) => { +/** + * @description Check the fee for a given amount + * Reference: https://intellipay.com/dist/webapi26.html#operation/fee + * @param req + * @param res + * @returns {Promise} + */ +const checkFee = async (req, res) => { const logResponseMeta = { bodyshop: { id: req.body?.bodyshop?.id, @@ -359,7 +388,13 @@ exports.checkfee = async (req, res) => { } }; -exports.postback = async (req, res) => { +/** + * @description Handle the postback from Intellipay + * @param req + * @param res + * @returns {Promise} + */ +const postBack = async (req, res) => { const { body: values } = req; const decodedComment = decodeComment(values?.comment); @@ -474,6 +509,7 @@ exports.postback = async (req, res) => { const bodyshop = await gqlClient.request(queries.GET_BODYSHOP_BY_ID, { id: job.jobs_by_pk.shopid }); + const ipMapping = bodyshop.bodyshops_by_pk.intellipay_config?.payment_map; logger.log("intellipay-postback-invoice-job-fetched", "DEBUG", "api", null, { @@ -525,3 +561,14 @@ exports.postback = async (req, res) => { res.status(400).json({ successful: false, error: error.message, ...logResponseMeta }); } }; + +const postBackCallBack = async (req, res) => {}; + +module.exports = { + lightboxCredentials, + paymentRefund, + generatePaymentUrl, + checkFee, + postBack, + postBackCallBack +}; diff --git a/server/routes/intellipayRoutes.js b/server/routes/intellipayRoutes.js index ad0b87323..7c3a2ecec 100644 --- a/server/routes/intellipayRoutes.js +++ b/server/routes/intellipayRoutes.js @@ -1,12 +1,20 @@ const express = require("express"); const router = express.Router(); const validateFirebaseIdTokenMiddleware = require("../middleware/validateFirebaseIdTokenMiddleware"); -const { lightbox_credentials, payment_refund, generate_payment_url, postback, checkfee } = require("../intellipay/intellipay"); +const { + lightboxCredentials, + paymentRefund, + generatePaymentUrl, + postBack, + checkFee, + postBackCallBack +} = require("../intellipay/intellipay"); -router.post("/lightbox_credentials", validateFirebaseIdTokenMiddleware, lightbox_credentials); -router.post("/payment_refund", validateFirebaseIdTokenMiddleware, payment_refund); -router.post("/generate_payment_url", validateFirebaseIdTokenMiddleware, generate_payment_url); -router.post("/checkfee", validateFirebaseIdTokenMiddleware, checkfee); -router.post("/postback", postback); +router.post("/lightbox_credentials", validateFirebaseIdTokenMiddleware, lightboxCredentials); +router.post("/payment_refund", validateFirebaseIdTokenMiddleware, paymentRefund); +router.post("/generate_payment_url", validateFirebaseIdTokenMiddleware, generatePaymentUrl); +router.post("/checkfee", validateFirebaseIdTokenMiddleware, checkFee); +router.post("/postback", postBack); +router.post("/postback-callback", postBackCallBack); module.exports = router; From 09c1a8ae35c233e1cb7f0202a3ce3789a5b1ce41 Mon Sep 17 00:00:00 2001 From: Dave Richer Date: Tue, 1 Apr 2025 12:57:32 -0400 Subject: [PATCH 4/8] feature/IO-2885-IntelliPay-App-Postback-Support - Clean intellipay.js --- server/intellipay/intellipay.js | 110 ++++++++++++++++++-------------- 1 file changed, 62 insertions(+), 48 deletions(-) diff --git a/server/intellipay/intellipay.js b/server/intellipay/intellipay.js index a58d45240..169e27fd2 100644 --- a/server/intellipay/intellipay.js +++ b/server/intellipay/intellipay.js @@ -8,6 +8,7 @@ const { sendTaskEmail } = require("../email/sendemail"); const generateEmailTemplate = require("../email/generateTemplate"); const { SecretsManagerClient, GetSecretValueCommand } = require("@aws-sdk/client-secrets-manager"); const { InstanceRegion, InstanceEndpoints } = require("../utils/instanceMgr"); +const { isEmpty, isNumber } = require("lodash"); const domain = process.env.NODE_ENV ? "secure" : "test"; @@ -57,7 +58,6 @@ const getShopCredentials = async (bodyshop) => { const decodeComment = (comment) => { try { return comment ? JSON.parse(Buffer.from(comment, "base64").toString()) : null; - // eslint-disable-next-line no-unused-vars } catch (error) { return null; // Handle malformed base64 string gracefully } @@ -85,17 +85,17 @@ const lightboxCredentials = async (req, res) => { const shopCredentials = await getShopCredentials(req.body.bodyshop); - if (shopCredentials.error) { + if (shopCredentials?.error) { logger.log("intellipay-credentials-error", "ERROR", req.user?.email, null, { message: shopCredentials.error?.message, ...logMeta }); - res.json({ + + return res.json({ message: shopCredentials.error?.message, type: "intellipay-credentials-error", ...logMeta }); - return; } try { @@ -116,13 +116,14 @@ const lightboxCredentials = async (req, res) => { ...logMeta }); - res.send(response.data); + return res.send(response.data); } catch (error) { logger.log("intellipay-lightbox-error", "ERROR", req.user?.email, null, { message: error?.message, ...logMeta }); - res.json({ + + return res.json({ message: error?.message, type: "intellipay-lightbox-error", ...logMeta @@ -154,18 +155,17 @@ const paymentRefund = async (req, res) => { const shopCredentials = await getShopCredentials(req.body.bodyshop); - if (shopCredentials.error) { + if (shopCredentials?.error) { logger.log("intellipay-refund-credentials-error", "ERROR", req.user?.email, null, { credentialsError: shopCredentials.error, ...logResponseMeta }); - res.status(400).json({ + return res.status(400).json({ credentialsError: shopCredentials.error, type: "intellipay-refund-credentials-error", ...logResponseMeta }); - return; } try { @@ -193,13 +193,14 @@ const paymentRefund = async (req, res) => { ...logResponseMeta }); - res.send(response.data); + return res.send(response.data); } catch (error) { logger.log("intellipay-refund-error", "ERROR", req.user?.email, null, { message: error?.message, ...logResponseMeta }); - res.status(500).json({ + + return res.status(500).json({ message: error?.message, type: "intellipay-refund-error", ...logResponseMeta @@ -233,17 +234,17 @@ const generatePaymentUrl = async (req, res) => { const shopCredentials = await getShopCredentials(req.body.bodyshop); - if (shopCredentials.error) { + if (shopCredentials?.error) { logger.log("intellipay-generate-payment-url-credentials-error", "ERROR", req.user?.email, null, { message: shopCredentials.error?.message, ...logResponseMeta }); - res.status(400).json({ + + return res.status(400).json({ message: shopCredentials.error?.message, type: "intellipay-generate-payment-url-credentials-error", ...logResponseMeta }); - return; } try { @@ -274,13 +275,14 @@ const generatePaymentUrl = async (req, res) => { ...logResponseMeta }); - res.send(response.data); + return res.send(response.data); } catch (error) { logger.log("intellipay-generate-payment-url-error", "ERROR", req.user?.email, null, { message: error?.message, ...logResponseMeta }); - res.status(500).json({ message: error?.message, ...logResponseMeta }); + + return res.status(500).json({ message: error?.message, ...logResponseMeta }); } }; @@ -304,24 +306,24 @@ const checkFee = async (req, res) => { logger.log("intellipay-checkfee-request-received", "DEBUG", req.user?.email, null, logResponseMeta); - if (!req.body.amount || req.body.amount <= 0) { + if (!isNumber(req.body?.amount) || req.body?.amount <= 0) { logger.log("intellipay-checkfee-skip", "DEBUG", req.user?.email, null, { message: "Amount is zero or undefined, skipping fee check.", ...logResponseMeta }); - res.json({ fee: 0 }); - return; + + return res.json({ fee: 0 }); } const shopCredentials = await getShopCredentials(req.body.bodyshop); - if (shopCredentials.error) { + if (shopCredentials?.error) { logger.log("intellipay-checkfee-credentials-error", "ERROR", req.user?.email, null, { message: shopCredentials.error?.message, ...logResponseMeta }); - res.status(400).json({ error: shopCredentials.error?.message, ...logResponseMeta }); - return; + + return res.status(400).json({ error: shopCredentials.error?.message, ...logResponseMeta }); } try { @@ -357,34 +359,40 @@ const checkFee = async (req, res) => { message: response.data?.error, ...logResponseMeta }); - res.status(400).json({ + + return res.status(400).json({ error: response.data?.error, type: "intellipay-checkfee-api-error", ...logResponseMeta }); - } else if (response.data < 0) { + } + + if (response.data < 0) { logger.log("intellipay-checkfee-negative-fee", "ERROR", req.user?.email, null, { message: "Fee amount returned is negative.", ...logResponseMeta }); - res.json({ + + return res.json({ error: "Fee amount negative. Check API credentials & account configuration.", ...logResponseMeta, type: "intellipay-checkfee-negative-fee" }); - } else { - logger.log("intellipay-checkfee-success", "DEBUG", req.user?.email, null, { - fee: response.data, - ...logResponseMeta - }); - res.json({ fee: response.data, ...logResponseMeta }); } + + logger.log("intellipay-checkfee-success", "DEBUG", req.user?.email, null, { + fee: response.data, + ...logResponseMeta + }); + + return res.json({ fee: response.data, ...logResponseMeta }); } catch (error) { logger.log("intellipay-checkfee-error", "ERROR", req.user?.email, null, { message: error?.message, ...logResponseMeta }); - res.status(500).json({ error: error?.message, logResponseMeta }); + + return res.status(500).json({ error: error?.message, logResponseMeta }); } }; @@ -406,19 +414,15 @@ const postBack = async (req, res) => { logger.log("intellipay-postback-received", "DEBUG", "api", null, logResponseMeta); try { - if ((!values.invoice || values.invoice === "") && !decodedComment) { - //invoice is specified through the pay link. Comment by IO. + if (isEmpty(values?.invoice) && !decodedComment) { logger.log("intellipay-postback-ignored", "DEBUG", "api", null, { message: "No invoice or comment provided", ...logResponseMeta }); - res.sendStatus(200); - return; + return res.sendStatus(200); } if (decodedComment) { - //Shifted the order to have this first to retain backwards compatibility for the old style of short link. - //This has been triggered by IO and may have multiple jobs. const parsedComment = decodedComment; logger.log("intellipay-postback-parsed-comment", "DEBUG", "api", null, { @@ -426,18 +430,16 @@ const postBack = async (req, res) => { ...logResponseMeta }); - //Adding in the user email to the short pay email. - //Need to check this to ensure backwards compatibility for clients that don't update. - const partialPayments = Array.isArray(parsedComment) ? parsedComment : parsedComment.payments; - // Fetch jobs by job IDs const jobs = await gqlClient.request(queries.GET_JOBS_BY_PKS, { ids: partialPayments.map((p) => p.jobid) }); + const bodyshop = await gqlClient.request(queries.GET_BODYSHOP_BY_ID, { id: jobs.jobs[0].shopid }); + const ipMapping = bodyshop.bodyshops_by_pk.intellipay_config?.payment_map; logger.log("intellipay-postback-jobs-fetched", "DEBUG", "api", null, { @@ -446,7 +448,6 @@ const postBack = async (req, res) => { ...logResponseMeta }); - // Insert new payments const paymentResult = await gqlClient.request(queries.INSERT_NEW_PAYMENT, { paymentInput: partialPayments.map((p) => ({ amount: p.amount, @@ -476,7 +477,7 @@ const postBack = async (req, res) => { ...logResponseMeta }); - if (values.origin === "OneLink" && parsedComment.userEmail) { + if (values?.origin === "OneLink" && parsedComment?.userEmail) { sendTaskEmail({ to: parsedComment.userEmail, subject: `New Payment(s) Received - RO ${jobs.jobs.map((j) => j.ro_number).join(", ")}`, @@ -500,8 +501,11 @@ const postBack = async (req, res) => { }); }); } - res.sendStatus(200); - } else if (values.invoice) { + + return res.sendStatus(200); + } + + if (values?.invoice) { const job = await gqlClient.request(queries.GET_JOB_BY_PK, { id: values.invoice }); @@ -551,14 +555,24 @@ const postBack = async (req, res) => { responseResults, ...logResponseMeta }); - res.sendStatus(200); + + return res.sendStatus(200); } + + // Default case: no valid conditions met + logger.log("intellipay-postback-invalid", "WARN", "api", null, { + message: "No valid invoice or comment provided", + ...logResponseMeta + }); + + return res.status(400).send("Bad Request: No valid invoice or comment provided"); } catch (error) { logger.log("intellipay-postback-error", "ERROR", "api", null, { message: error?.message, ...logResponseMeta }); - res.status(400).json({ successful: false, error: error.message, ...logResponseMeta }); + + return res.status(400).json({ successful: false, error: error.message, ...logResponseMeta }); } }; From c78b9866a3321a32f7d127f9f7f6810aa8e2e7db Mon Sep 17 00:00:00 2001 From: Dave Richer Date: Tue, 1 Apr 2025 15:15:48 -0400 Subject: [PATCH 5/8] feature/IO-2885-IntelliPay-App-Postback - Finish ticket --- .../down.sql | 4 + .../up.sql | 2 + server/graphql-client/queries.js | 12 ++ server/intellipay/intellipay.js | 110 ++++++++++++++---- server/routes/intellipayRoutes.js | 4 +- 5 files changed, 108 insertions(+), 24 deletions(-) create mode 100644 hasura/migrations/1743531377681_alter_table_public_bodyshops_add_column_intellipay_merchant_id/down.sql create mode 100644 hasura/migrations/1743531377681_alter_table_public_bodyshops_add_column_intellipay_merchant_id/up.sql diff --git a/hasura/migrations/1743531377681_alter_table_public_bodyshops_add_column_intellipay_merchant_id/down.sql b/hasura/migrations/1743531377681_alter_table_public_bodyshops_add_column_intellipay_merchant_id/down.sql new file mode 100644 index 000000000..2d6bb5c01 --- /dev/null +++ b/hasura/migrations/1743531377681_alter_table_public_bodyshops_add_column_intellipay_merchant_id/down.sql @@ -0,0 +1,4 @@ +-- Could not auto-generate a down migration. +-- Please write an appropriate down migration for the SQL below: +-- alter table "public"."bodyshops" add column "intellipay_merchant_id" text +-- null unique; diff --git a/hasura/migrations/1743531377681_alter_table_public_bodyshops_add_column_intellipay_merchant_id/up.sql b/hasura/migrations/1743531377681_alter_table_public_bodyshops_add_column_intellipay_merchant_id/up.sql new file mode 100644 index 000000000..90006bbda --- /dev/null +++ b/hasura/migrations/1743531377681_alter_table_public_bodyshops_add_column_intellipay_merchant_id/up.sql @@ -0,0 +1,2 @@ +alter table "public"."bodyshops" add column "intellipay_merchant_id" text + null unique; diff --git a/server/graphql-client/queries.js b/server/graphql-client/queries.js index f05ea7ec5..44a7cbffb 100644 --- a/server/graphql-client/queries.js +++ b/server/graphql-client/queries.js @@ -2832,3 +2832,15 @@ exports.GET_DOCUMENTS_BY_IDS = ` takenat } }`; + +exports.GET_JOBID_BY_MERCHANTID_RONUMBER = ` +query GET_JOBID_BY_MERCHANTID_RONUMBER($merchantID: String!, $roNumber: String!) { + jobs(where: {ro_number: {_eq: $roNumber}, bodyshop: {intellipay_merchant_id: {_eq: $merchantID}}}) { + id + shopid + bodyshop { + id + intellipay_config + } + } +}`; diff --git a/server/intellipay/intellipay.js b/server/intellipay/intellipay.js index 169e27fd2..be8d9f24c 100644 --- a/server/intellipay/intellipay.js +++ b/server/intellipay/intellipay.js @@ -18,21 +18,52 @@ const client = new SecretsManagerClient({ const gqlClient = require("../graphql-client/graphql-client").client; +/** + * Generates a properly formatted Cpteller API URL + * @param {Object} options - URL configuration options + * @param {string} options.apiType - 'webapi' or 'custapi' + * @param {string} [options.version] - API version (e.g., '26' for webapi) + * @param {Object} [options.params] - URL query parameters + * @returns {string} - The formatted Cpteller URL + */ +const getCptellerUrl = (options) => { + const { apiType = "webapi", version, params = {} } = options; + + // Base URL construction + let url = `https://${domain}.cpteller.com/api/`; + + // Add version if specified for webapi + if (apiType === "webapi" && version) { + url += `${version}/`; + } + + // Add the API endpoint + url += `${apiType}.cfc`; + + // Add query parameters if any exist + const queryParams = new URLSearchParams(params).toString(); + if (queryParams) { + url += `?${queryParams}`; + } + + return url; +}; + /** * @description Get shop credentials from AWS Secrets Manager * @param bodyshop * @returns {Promise<{error}|{merchantkey: *, apikey: *}|any>} */ const getShopCredentials = async (bodyshop) => { - // Development only - if (process.env.NODE_ENV === undefined) { + // In Dev/Testing we will use the environment variables + if (process.env?.NODE_ENV !== "production") { return { merchantkey: process.env.INTELLIPAY_MERCHANTKEY, apikey: process.env.INTELLIPAY_APIKEY }; } - // Production code + // In Production we will use the AWS Secrets Manager if (bodyshop?.imexshopid) { try { const secret = await client.send( @@ -106,7 +137,10 @@ const lightboxCredentials = async (req, res) => { ...shopCredentials, operatingenv: "businessattended" }), - url: `https://${domain}.cpteller.com/api/custapi.cfc?method=autoterminal${req.body.refresh ? "_refresh" : ""}` //autoterminal_refresh + url: getCptellerUrl({ + apiType: "custapi", + params: { method: `autoterminal${req.body.refresh ? "_refresh" : ""}` } + }) }; const response = await axios(options); @@ -178,7 +212,11 @@ const paymentRefund = async (req, res) => { paymentid: req.body.paymentid, amount: req.body.amount }), - url: `https://${domain}.cpteller.com/api/26/webapi.cfc?method=payment_refund` + url: getCptellerUrl({ + apiType: "webapi", + version: "26", + params: { method: "payment_refund" } + }) }; logger.log("intellipay-refund-options-prepared", "DEBUG", req.user?.email, null, { @@ -259,7 +297,10 @@ const generatePaymentUrl = async (req, res) => { invoice: req.body.invoice, createshorturl: true }), - url: `https://${domain}.cpteller.com/api/custapi.cfc?method=generate_lightbox_url` + url: getCptellerUrl({ + apiType: "custapi", + params: { method: "generate_lightbox_url" } + }) }; logger.log("intellipay-generate-payment-url-options-prepared", "DEBUG", req.user?.email, null, { @@ -344,7 +385,7 @@ const checkFee = async (req, res) => { }, { sort: false } // Ensure query string order is preserved ), - url: `https://${domain}.cpteller.com/api/26/webapi.cfc` + url: getCptellerUrl({ apiType: "webapi", version: "26" }) }; logger.log("intellipay-checkfee-options-prepared", "DEBUG", req.user?.email, null, { @@ -506,19 +547,49 @@ const postBack = async (req, res) => { } if (values?.invoice) { - const job = await gqlClient.request(queries.GET_JOB_BY_PK, { - id: values.invoice + // Early Bail on Merchant ID + if (!values?.merchantid) { + logger.log("intellipay-postback-no-merchantid", "ERROR", "api", null, { + message: "Merchant ID is missing", + ...logResponseMeta + }); + + return res.status(400).send("Bad Request: Merchant ID is missing"); + } + + const result = await gqlClient.request(queries.GET_JOBID_BY_MERCHANTID_RONUMBER, { + merchantID: values.merchantid, + roNumber: values.invoice }); - const bodyshop = await gqlClient.request(queries.GET_BODYSHOP_BY_ID, { - id: job.jobs_by_pk.shopid - }); + // Early Bail on No Jobs Found + if (!result?.jobs?.length) { + logger.log("intellipay-postback-job-not-found", "ERROR", "api", null, { + message: "Job not found", + ...logResponseMeta + }); - const ipMapping = bodyshop.bodyshops_by_pk.intellipay_config?.payment_map; + return res.status(400).send("Bad Request: Job not found"); + } + + const job = result?.jobs?.[0]; + + const bodyshop = job?.bodyshop; + + // Early Bail on no Bodyshop Found + if (!bodyshop) { + logger.log("intellipay-postback-bodyshop-not-found", "ERROR", "api", null, { + message: "Bodyshop not found", + ...logResponseMeta + }); + + return res.status(400).send("Bad Request: Bodyshop not found"); + } + + const ipMapping = bodyshop?.intellipay_config?.payment_map; logger.log("intellipay-postback-invoice-job-fetched", "DEBUG", "api", null, { job, - bodyshop, ...logResponseMeta }); @@ -528,7 +599,7 @@ const postBack = async (req, res) => { transactionid: values.authcode, payer: "Customer", type: ipMapping ? ipMapping[(values.cardtype || "").toLowerCase()] || values.cardtype : values.cardtype, - jobid: values.invoice, + jobid: job.id, date: moment(Date.now()) } }); @@ -541,9 +612,9 @@ const postBack = async (req, res) => { const responseResults = await gqlClient.request(queries.INSERT_PAYMENT_RESPONSE, { paymentResponse: { amount: values.total, - bodyshopid: bodyshop.bodyshops_by_pk.id, + bodyshopid: bodyshop.id, paymentid: paymentResult.id, - jobid: values.invoice, + jobid: job.id, declinereason: "Approved", ext_paymentid: values.paymentid, successful: true, @@ -576,13 +647,10 @@ const postBack = async (req, res) => { } }; -const postBackCallBack = async (req, res) => {}; - module.exports = { lightboxCredentials, paymentRefund, generatePaymentUrl, checkFee, - postBack, - postBackCallBack + postBack }; diff --git a/server/routes/intellipayRoutes.js b/server/routes/intellipayRoutes.js index 7c3a2ecec..7a0425fd2 100644 --- a/server/routes/intellipayRoutes.js +++ b/server/routes/intellipayRoutes.js @@ -6,8 +6,7 @@ const { paymentRefund, generatePaymentUrl, postBack, - checkFee, - postBackCallBack + checkFee } = require("../intellipay/intellipay"); router.post("/lightbox_credentials", validateFirebaseIdTokenMiddleware, lightboxCredentials); @@ -15,6 +14,5 @@ router.post("/payment_refund", validateFirebaseIdTokenMiddleware, paymentRefund) router.post("/generate_payment_url", validateFirebaseIdTokenMiddleware, generatePaymentUrl); router.post("/checkfee", validateFirebaseIdTokenMiddleware, checkFee); router.post("/postback", postBack); -router.post("/postback-callback", postBackCallBack); module.exports = router; From 9bf6ba9cf082c1e9e00986b00b021057161630b2 Mon Sep 17 00:00:00 2001 From: Dave Richer Date: Wed, 2 Apr 2025 11:09:03 -0400 Subject: [PATCH 6/8] feature/IO-2885-IntelliPay-App-Postback - Refactor / Add Tests --- server/intellipay/intellipay.js | 295 ++-------------- server/intellipay/intellipay.test.js | 316 ++++++++++++++++++ .../{ => lib}/aws-secrets-manager.js | 0 server/intellipay/lib/decodeComment.js | 14 + server/intellipay/lib/getCptellerUrl.js | 34 ++ server/intellipay/lib/getPaymentType.js | 12 + server/intellipay/lib/getShopCredentials.js | 40 +++ .../lib/handleCommentBasedPayment.js | 81 +++++ .../lib/handleInvoiceBasedPayment.js | 101 ++++++ .../lib/handlePaymentValidationError.js | 18 + .../lib/sendPaymentNotificationEmail.js | 41 +++ vitest.config.js | 9 +- 12 files changed, 686 insertions(+), 275 deletions(-) create mode 100644 server/intellipay/intellipay.test.js rename server/intellipay/{ => lib}/aws-secrets-manager.js (100%) create mode 100644 server/intellipay/lib/decodeComment.js create mode 100644 server/intellipay/lib/getCptellerUrl.js create mode 100644 server/intellipay/lib/getPaymentType.js create mode 100644 server/intellipay/lib/getShopCredentials.js create mode 100644 server/intellipay/lib/handleCommentBasedPayment.js create mode 100644 server/intellipay/lib/handleInvoiceBasedPayment.js create mode 100644 server/intellipay/lib/handlePaymentValidationError.js create mode 100644 server/intellipay/lib/sendPaymentNotificationEmail.js diff --git a/server/intellipay/intellipay.js b/server/intellipay/intellipay.js index be8d9f24c..29f8e978a 100644 --- a/server/intellipay/intellipay.js +++ b/server/intellipay/intellipay.js @@ -1,98 +1,14 @@ -const queries = require("../graphql-client/queries"); const Dinero = require("dinero.js"); const qs = require("query-string"); const axios = require("axios"); -const moment = require("moment"); const logger = require("../utils/logger"); -const { sendTaskEmail } = require("../email/sendemail"); -const generateEmailTemplate = require("../email/generateTemplate"); -const { SecretsManagerClient, GetSecretValueCommand } = require("@aws-sdk/client-secrets-manager"); -const { InstanceRegion, InstanceEndpoints } = require("../utils/instanceMgr"); const { isEmpty, isNumber } = require("lodash"); - -const domain = process.env.NODE_ENV ? "secure" : "test"; - -const client = new SecretsManagerClient({ - region: InstanceRegion() -}); - -const gqlClient = require("../graphql-client/graphql-client").client; - -/** - * Generates a properly formatted Cpteller API URL - * @param {Object} options - URL configuration options - * @param {string} options.apiType - 'webapi' or 'custapi' - * @param {string} [options.version] - API version (e.g., '26' for webapi) - * @param {Object} [options.params] - URL query parameters - * @returns {string} - The formatted Cpteller URL - */ -const getCptellerUrl = (options) => { - const { apiType = "webapi", version, params = {} } = options; - - // Base URL construction - let url = `https://${domain}.cpteller.com/api/`; - - // Add version if specified for webapi - if (apiType === "webapi" && version) { - url += `${version}/`; - } - - // Add the API endpoint - url += `${apiType}.cfc`; - - // Add query parameters if any exist - const queryParams = new URLSearchParams(params).toString(); - if (queryParams) { - url += `?${queryParams}`; - } - - return url; -}; - -/** - * @description Get shop credentials from AWS Secrets Manager - * @param bodyshop - * @returns {Promise<{error}|{merchantkey: *, apikey: *}|any>} - */ -const getShopCredentials = async (bodyshop) => { - // In Dev/Testing we will use the environment variables - if (process.env?.NODE_ENV !== "production") { - return { - merchantkey: process.env.INTELLIPAY_MERCHANTKEY, - apikey: process.env.INTELLIPAY_APIKEY - }; - } - - // In Production we will use the AWS Secrets Manager - if (bodyshop?.imexshopid) { - try { - const secret = await client.send( - new GetSecretValueCommand({ - SecretId: `intellipay-credentials-${bodyshop.imexshopid}`, - VersionStage: "AWSCURRENT" // VersionStage defaults to AWSCURRENT if unspecified - }) - ); - return JSON.parse(secret.SecretString); - } catch (error) { - return { - error: error.message - }; - } - } -}; - -/** - * @description Decode the comment from base64 - * @param comment - * @returns {any|null} - */ -const decodeComment = (comment) => { - try { - return comment ? JSON.parse(Buffer.from(comment, "base64").toString()) : null; - } catch (error) { - return null; // Handle malformed base64 string gracefully - } -}; +const handleCommentBasedPayment = require("./lib/handleCommentBasedPayment"); +const handleInvoiceBasedPayment = require("./lib/handleInvoiceBasedPayment"); +const logValidationError = require("./lib/handlePaymentValidationError"); +const getCptellerUrl = require("./lib/getCptellerUrl"); +const getShopCredentials = require("./lib/getShopCredentials"); +const decodeComment = require("./lib/decodeComment"); /** * @description Get lightbox credentials for the shop @@ -443,207 +359,42 @@ const checkFee = async (req, res) => { * @param res * @returns {Promise} */ +/** + * Handle the postback from Intellipay payment system + */ const postBack = async (req, res) => { const { body: values } = req; const decodedComment = decodeComment(values?.comment); + const logMeta = { iprequest: values, decodedComment }; - const logResponseMeta = { - iprequest: values, - decodedComment - }; - - logger.log("intellipay-postback-received", "DEBUG", "api", null, logResponseMeta); + logger.log("intellipay-postback-received", "DEBUG", "api", null, logMeta); try { + // Handle empty/invalid requests if (isEmpty(values?.invoice) && !decodedComment) { logger.log("intellipay-postback-ignored", "DEBUG", "api", null, { message: "No invoice or comment provided", - ...logResponseMeta + ...logMeta }); return res.sendStatus(200); } + // Process payment based on data type if (decodedComment) { - const parsedComment = decodedComment; - - logger.log("intellipay-postback-parsed-comment", "DEBUG", "api", null, { - parsedComment, - ...logResponseMeta - }); - - const partialPayments = Array.isArray(parsedComment) ? parsedComment : parsedComment.payments; - - const jobs = await gqlClient.request(queries.GET_JOBS_BY_PKS, { - ids: partialPayments.map((p) => p.jobid) - }); - - const bodyshop = await gqlClient.request(queries.GET_BODYSHOP_BY_ID, { - id: jobs.jobs[0].shopid - }); - - const ipMapping = bodyshop.bodyshops_by_pk.intellipay_config?.payment_map; - - logger.log("intellipay-postback-jobs-fetched", "DEBUG", "api", null, { - jobs, - parsedComment, - ...logResponseMeta - }); - - const paymentResult = await gqlClient.request(queries.INSERT_NEW_PAYMENT, { - paymentInput: partialPayments.map((p) => ({ - amount: p.amount, - transactionid: values.authcode, - payer: "Customer", - type: ipMapping ? ipMapping[(values.cardtype || "").toLowerCase()] || values.cardtype : values.cardtype, - jobid: p.jobid, - date: moment(Date.now()), - payment_responses: { - data: { - amount: values.total, - bodyshopid: bodyshop.bodyshops_by_pk.id, - jobid: p.jobid, - declinereason: "Approved", - ext_paymentid: values.paymentid, - successful: true, - response: values - } - } - })) - }); - - logger.log("intellipay-postback-payment-success", "DEBUG", "api", null, { - paymentResult, - jobs, - parsedComment, - ...logResponseMeta - }); - - if (values?.origin === "OneLink" && parsedComment?.userEmail) { - sendTaskEmail({ - to: parsedComment.userEmail, - subject: `New Payment(s) Received - RO ${jobs.jobs.map((j) => j.ro_number).join(", ")}`, - type: "html", - html: generateEmailTemplate({ - header: "New Payment(s) Received", - subHeader: "", - body: jobs.jobs - .map( - (job) => - `Reference: ${job.ro_number || "N/A"} | ${job.ownr_co_nm ? job.ownr_co_nm : `${job.ownr_fn || ""} ${job.ownr_ln || ""}`.trim()} | ${`${job.v_model_yr || ""} ${job.v_make_desc || ""} ${job.v_model_desc || ""}`.trim()} | $${partialPayments.find((p) => p.jobid === job.id).amount}` - ) - .join("
") - }) - }).catch((error) => { - logger.log("intellipay-postback-email-error", "ERROR", "api", null, { - message: error.message, - jobs, - paymentResult, - ...logResponseMeta - }); - }); - } - - return res.sendStatus(200); + return await handleCommentBasedPayment(values, decodedComment, logger, logMeta, res); + } else if (values?.invoice) { + return await handleInvoiceBasedPayment(values, logger, logMeta, res); + } else { + // This should be caught by first validation, but as a safeguard + logValidationError("intellipay-postback-invalid", "No valid invoice or comment provided", logMeta); + return res.status(400).send("Bad Request: No valid invoice or comment provided"); } - - if (values?.invoice) { - // Early Bail on Merchant ID - if (!values?.merchantid) { - logger.log("intellipay-postback-no-merchantid", "ERROR", "api", null, { - message: "Merchant ID is missing", - ...logResponseMeta - }); - - return res.status(400).send("Bad Request: Merchant ID is missing"); - } - - const result = await gqlClient.request(queries.GET_JOBID_BY_MERCHANTID_RONUMBER, { - merchantID: values.merchantid, - roNumber: values.invoice - }); - - // Early Bail on No Jobs Found - if (!result?.jobs?.length) { - logger.log("intellipay-postback-job-not-found", "ERROR", "api", null, { - message: "Job not found", - ...logResponseMeta - }); - - return res.status(400).send("Bad Request: Job not found"); - } - - const job = result?.jobs?.[0]; - - const bodyshop = job?.bodyshop; - - // Early Bail on no Bodyshop Found - if (!bodyshop) { - logger.log("intellipay-postback-bodyshop-not-found", "ERROR", "api", null, { - message: "Bodyshop not found", - ...logResponseMeta - }); - - return res.status(400).send("Bad Request: Bodyshop not found"); - } - - const ipMapping = bodyshop?.intellipay_config?.payment_map; - - logger.log("intellipay-postback-invoice-job-fetched", "DEBUG", "api", null, { - job, - ...logResponseMeta - }); - - const paymentResult = await gqlClient.request(queries.INSERT_NEW_PAYMENT, { - paymentInput: { - amount: values.total, - transactionid: values.authcode, - payer: "Customer", - type: ipMapping ? ipMapping[(values.cardtype || "").toLowerCase()] || values.cardtype : values.cardtype, - jobid: job.id, - date: moment(Date.now()) - } - }); - - logger.log("intellipay-postback-invoice-payment-success", "DEBUG", "api", null, { - paymentResult, - ...logResponseMeta - }); - - const responseResults = await gqlClient.request(queries.INSERT_PAYMENT_RESPONSE, { - paymentResponse: { - amount: values.total, - bodyshopid: bodyshop.id, - paymentid: paymentResult.id, - jobid: job.id, - declinereason: "Approved", - ext_paymentid: values.paymentid, - successful: true, - response: values - } - }); - - logger.log("intellipay-postback-invoice-response-success", "DEBUG", "api", null, { - responseResults, - ...logResponseMeta - }); - - return res.sendStatus(200); - } - - // Default case: no valid conditions met - logger.log("intellipay-postback-invalid", "WARN", "api", null, { - message: "No valid invoice or comment provided", - ...logResponseMeta - }); - - return res.status(400).send("Bad Request: No valid invoice or comment provided"); } catch (error) { logger.log("intellipay-postback-error", "ERROR", "api", null, { message: error?.message, - ...logResponseMeta + ...logMeta }); - - return res.status(400).json({ successful: false, error: error.message, ...logResponseMeta }); + return res.status(400).json({ successful: false, error: error.message, ...logMeta }); } }; diff --git a/server/intellipay/intellipay.test.js b/server/intellipay/intellipay.test.js new file mode 100644 index 000000000..472e2ea0f --- /dev/null +++ b/server/intellipay/intellipay.test.js @@ -0,0 +1,316 @@ +import { describe, it, expect, vi, beforeEach, afterEach } from "vitest"; + +const getPaymentType = require("./lib/getPaymentType"); +const decodeComment = require("./lib/decodeComment"); +const getCptellerUrl = require("./lib/getCptellerUrl"); +const handlePaymentValidationError = require("./lib/handlePaymentValidationError"); +const getShopCredentials = require("./lib/getShopCredentials"); + +/** + * @description Decode a base64-encoded JSON comment + */ +describe("decodeComment", () => { + it("decodes a valid base64-encoded JSON comment", () => { + // {"test":"data"} encoded in base64 + const encoded = "eyJ0ZXN0IjoiZGF0YSJ9"; + const expected = { test: "data" }; + expect(decodeComment(encoded)).toEqual(expected); + }); + + it("decodes a complex base64-encoded JSON with payments", () => { + // {"payments":[{"jobid":"123"}]} encoded in base64 + const encoded = "eyJwYXltZW50cyI6W3siam9iaWQiOiIxMjMifV19"; + const expected = { payments: [{ jobid: "123" }] }; + expect(decodeComment(encoded)).toEqual(expected); + }); + + it("returns null when comment is null", () => { + expect(decodeComment(null)).toBeNull(); + }); + + it("returns null when comment is undefined", () => { + expect(decodeComment(undefined)).toBeNull(); + }); + + it("returns null when comment is an empty string", () => { + expect(decodeComment("")).toBeNull(); + }); + + it("returns null when comment is malformed base64", () => { + expect(decodeComment("!@#$%")).toBeNull(); + }); + + it("returns null when comment is valid base64 but not valid JSON", () => { + // "invalid" in base64 is "aW52YWxpZA==" + expect(decodeComment("aW52YWxpZA==")).toBeNull(); + }); +}); + +/** + * @description Get the payment type based on the card type + */ +describe("getPaymentType", () => { + it("returns mapped value when card type exists in mapping", () => { + const ipMapping = { visa: "Visa Card", amex: "American Express" }; + expect(getPaymentType(ipMapping, "visa")).toBe("Visa Card"); + }); + + it("returns original value when card type not in mapping", () => { + const ipMapping = { visa: "Visa Card" }; + expect(getPaymentType(ipMapping, "mastercard")).toBe("mastercard"); + }); + + it("handles lowercase conversion", () => { + const ipMapping = { visa: "Visa Card" }; + expect(getPaymentType(ipMapping, "VISA")).toBe("Visa Card"); + }); + + it("handles null mapping", () => { + expect(getPaymentType(null, "visa")).toBe("visa"); + }); + + it("handles undefined mapping", () => { + expect(getPaymentType(undefined, "visa")).toBe("visa"); + }); + + it("handles empty string card type", () => { + const ipMapping = { visa: "Visa Card" }; + expect(getPaymentType(ipMapping, "")).toBe(""); + }); + + it("handles undefined card type", () => { + const ipMapping = { visa: "Visa Card" }; + expect(getPaymentType(ipMapping, undefined)).toBe(undefined); + }); +}); + +/** + * @description Get the CPTeller URL based on environment and parameters + */ +describe("getCptellerUrl", () => { + const originalEnv = process.env.NODE_ENV; + + afterEach(() => { + // Restore the original NODE_ENV after each test + process.env.NODE_ENV = originalEnv; + }); + + it("uses test domain in non-production environment", () => { + process.env.NODE_ENV = ""; + const url = getCptellerUrl({ apiType: "webapi" }); + expect(url).toEqual("https://test.cpteller.com/api/webapi.cfc"); + }); + + it("uses secure domain in production environment", () => { + process.env.NODE_ENV = "production"; + const url = getCptellerUrl({ apiType: "webapi" }); + expect(url).toEqual("https://secure.cpteller.com/api/webapi.cfc"); + }); + + it("adds version number for webapi type", () => { + process.env.NODE_ENV = ""; + const url = getCptellerUrl({ apiType: "webapi", version: "26" }); + expect(url).toEqual("https://test.cpteller.com/api/26/webapi.cfc"); + }); + + it("constructs custapi URL without version number", () => { + process.env.NODE_ENV = ""; + const url = getCptellerUrl({ apiType: "custapi", version: "26" }); + expect(url).toEqual("https://test.cpteller.com/api/custapi.cfc"); + }); + + it("adds query parameters to the URL", () => { + process.env.NODE_ENV = ""; + const url = getCptellerUrl({ + apiType: "webapi", + params: { method: "payment_refund", test: "value" } + }); + expect(url).toEqual("https://test.cpteller.com/api/webapi.cfc?method=payment_refund&test=value"); + }); + + it("handles empty params object", () => { + process.env.NODE_ENV = ""; + const url = getCptellerUrl({ apiType: "webapi", params: {} }); + expect(url).toEqual("https://test.cpteller.com/api/webapi.cfc"); + }); + + it("defaults to webapi when no apiType is provided", () => { + process.env.NODE_ENV = ""; + const url = getCptellerUrl({}); + expect(url).toEqual("https://test.cpteller.com/api/webapi.cfc"); + }); + + it("combines version and query parameters correctly", () => { + process.env.NODE_ENV = ""; + const url = getCptellerUrl({ + apiType: "webapi", + version: "26", + params: { method: "fee" } + }); + expect(url).toEqual("https://test.cpteller.com/api/26/webapi.cfc?method=fee"); + }); +}); + +/** + * @description Get shop credentials from AWS Secrets Manager or environment variables + */ + +describe("getShopCredentials", () => { + const originalEnv = { ...process.env }; + let mockSend; + + beforeEach(() => { + // Create a mock function for send + mockSend = vi.fn(); + + // Mock the entire AWS SDK module + vi.mock("@aws-sdk/client-secrets-manager", () => { + return { + SecretsManagerClient: vi.fn(() => ({ + send: mockSend + })), + GetSecretValueCommand: vi.fn((input) => input) + }; + }); + + // Setup test environment variables + process.env.INTELLIPAY_MERCHANTKEY = "test-merchant-key"; + process.env.INTELLIPAY_APIKEY = "test-api-key"; + + // Clear module cache to ensure fresh mock is used + vi.resetModules(); + }); + + afterEach(() => { + // Restore environment and clear mocks + process.env = { ...originalEnv }; + vi.restoreAllMocks(); + vi.unmock("@aws-sdk/client-secrets-manager"); + }); + + it("returns environment variables in non-production environment", async () => { + process.env.NODE_ENV = "development"; + + const result = await getShopCredentials({ imexshopid: "12345" }); + + expect(result).toEqual({ + merchantkey: "test-merchant-key", + apikey: "test-api-key" + }); + expect(mockSend).not.toHaveBeenCalled(); + }); + + it("returns undefined when imexshopid is missing in production", async () => { + process.env.NODE_ENV = "production"; + + const result = await getShopCredentials({ name: "Test Shop" }); + + expect(result).toBeUndefined(); + expect(mockSend).not.toHaveBeenCalled(); + }); + + it("returns undefined for null bodyshop in production", async () => { + process.env.NODE_ENV = "production"; + + const result = await getShopCredentials(null); + + expect(result).toBeUndefined(); + expect(mockSend).not.toHaveBeenCalled(); + }); + + it("returns undefined for undefined bodyshop in production", async () => { + process.env.NODE_ENV = "production"; + + const result = await getShopCredentials(undefined); + + expect(result).toBeUndefined(); + expect(mockSend).not.toHaveBeenCalled(); + }); +}); + +/** + * @description Handle payment validation errors + */ +describe("handlePaymentValidationError", () => { + it("logs error and sends 400 response", () => { + // Create mock objects + const mockLog = vi.fn(); + const mockLogger = { log: mockLog }; + const mockRes = { + status: vi.fn().mockReturnThis(), + send: vi.fn().mockReturnThis() + }; + + // Test data + const logCode = "test-validation-error"; + const message = "Invalid data"; + const logMeta = { field: "test", value: 123 }; + + // Call the function + const result = handlePaymentValidationError(mockRes, mockLogger, logCode, message, logMeta); + + // Verify logger.log was called correctly + expect(mockLog).toHaveBeenCalledWith(logCode, "ERROR", "api", null, { message, ...logMeta }); + + // Verify res.status was called with 400 + expect(mockRes.status).toHaveBeenCalledWith(400); + + // Verify res.send was called with correct message + expect(mockRes.send).toHaveBeenCalledWith(`Bad Request: ${message}`); + + // Verify the function returns the response + expect(result).toBe(mockRes); + }); + + it("formats different error messages correctly", () => { + const mockLog = vi.fn(); + const mockLogger = { log: mockLog }; + const mockRes = { + status: vi.fn().mockReturnThis(), + send: vi.fn().mockReturnThis() + }; + + handlePaymentValidationError(mockRes, mockLogger, "error-code", "Custom error"); + + expect(mockRes.send).toHaveBeenCalledWith("Bad Request: Custom error"); + }); + + it("passes different logCodes to logger", () => { + const mockLog = vi.fn(); + const mockLogger = { log: mockLog }; + const mockRes = { + status: vi.fn().mockReturnThis(), + send: vi.fn().mockReturnThis() + }; + + handlePaymentValidationError(mockRes, mockLogger, "custom-log-code", "Error message"); + + expect(mockLog).toHaveBeenCalledWith("custom-log-code", "ERROR", "api", null, { message: "Error message" }); + }); + + it("works with minimal logMeta", () => { + const mockLog = vi.fn(); + const mockLogger = { log: mockLog }; + const mockRes = { + status: vi.fn().mockReturnThis(), + send: vi.fn().mockReturnThis() + }; + + handlePaymentValidationError(mockRes, mockLogger, "error-code", "Error message", {}); + + expect(mockLog).toHaveBeenCalledWith("error-code", "ERROR", "api", null, { message: "Error message" }); + }); + + it("works with undefined logMeta", () => { + const mockLog = vi.fn(); + const mockLogger = { log: mockLog }; + const mockRes = { + status: vi.fn().mockReturnThis(), + send: vi.fn().mockReturnThis() + }; + + handlePaymentValidationError(mockRes, mockLogger, "error-code", "Error message"); + + expect(mockLog).toHaveBeenCalledWith("error-code", "ERROR", "api", null, { message: "Error message" }); + }); +}); diff --git a/server/intellipay/aws-secrets-manager.js b/server/intellipay/lib/aws-secrets-manager.js similarity index 100% rename from server/intellipay/aws-secrets-manager.js rename to server/intellipay/lib/aws-secrets-manager.js diff --git a/server/intellipay/lib/decodeComment.js b/server/intellipay/lib/decodeComment.js new file mode 100644 index 000000000..324e4e643 --- /dev/null +++ b/server/intellipay/lib/decodeComment.js @@ -0,0 +1,14 @@ +/** + * @description Decode the comment from base64 + * @param comment + * @returns {any|null} + */ +const decodeComment = (comment) => { + try { + return comment ? JSON.parse(Buffer.from(comment, "base64").toString()) : null; + } catch (error) { + return null; // Handle malformed base64 string gracefully + } +}; + +module.exports = decodeComment; diff --git a/server/intellipay/lib/getCptellerUrl.js b/server/intellipay/lib/getCptellerUrl.js new file mode 100644 index 000000000..358ce1c5e --- /dev/null +++ b/server/intellipay/lib/getCptellerUrl.js @@ -0,0 +1,34 @@ +/** + * Generates a properly formatted Cpteller API URL + * @param {Object} options - URL configuration options + * @param {string} options.apiType - 'webapi' or 'custapi' + * @param {string} [options.version] - API version (e.g., '26' for webapi) + * @param {Object} [options.params] - URL query parameters + * @returns {string} - The formatted Cpteller URL + */ +const getCptellerUrl = (options) => { + const domain = process.env?.NODE_ENV === "production" ? "secure" : "test"; + + const { apiType = "webapi", version, params = {} } = options; + + // Base URL construction + let url = `https://${domain}.cpteller.com/api/`; + + // Add version if specified for webapi + if (apiType === "webapi" && version) { + url += `${version}/`; + } + + // Add the API endpoint + url += `${apiType}.cfc`; + + // Add query parameters if any exist + const queryParams = new URLSearchParams(params).toString(); + if (queryParams) { + url += `?${queryParams}`; + } + + return url; +}; + +module.exports = getCptellerUrl; diff --git a/server/intellipay/lib/getPaymentType.js b/server/intellipay/lib/getPaymentType.js new file mode 100644 index 000000000..08be4f81b --- /dev/null +++ b/server/intellipay/lib/getPaymentType.js @@ -0,0 +1,12 @@ +/** + * @description Get payment type based on IP mapping + * @param ipMapping + * @param cardType + * @returns {*} + */ +const getPaymentType = (ipMapping, cardType) => { + const normalizedCardType = (cardType || "").toLowerCase(); + return ipMapping ? ipMapping[normalizedCardType] || cardType : cardType; +}; + +module.exports = getPaymentType; diff --git a/server/intellipay/lib/getShopCredentials.js b/server/intellipay/lib/getShopCredentials.js new file mode 100644 index 000000000..da18b9d25 --- /dev/null +++ b/server/intellipay/lib/getShopCredentials.js @@ -0,0 +1,40 @@ +const { SecretsManagerClient, GetSecretValueCommand } = require("@aws-sdk/client-secrets-manager"); +const { InstanceRegion } = require("../../utils/instanceMgr"); + +const client = new SecretsManagerClient({ + region: InstanceRegion() +}); + +/** + * @description Get shop credentials from AWS Secrets Manager + * @param bodyshop + * @returns {Promise<{error}|{merchantkey: *, apikey: *}|any>} + */ +const getShopCredentials = async (bodyshop) => { + // In Dev/Testing we will use the environment variables + if (process.env?.NODE_ENV !== "production") { + return { + merchantkey: process.env.INTELLIPAY_MERCHANTKEY, + apikey: process.env.INTELLIPAY_APIKEY + }; + } + + // In Production, we will use the AWS Secrets Manager + if (bodyshop?.imexshopid) { + try { + const secret = await client.send( + new GetSecretValueCommand({ + SecretId: `intellipay-credentials-${bodyshop.imexshopid}`, + VersionStage: "AWSCURRENT" // VersionStage defaults to AWSCURRENT if unspecified + }) + ); + return JSON.parse(secret.SecretString); + } catch (error) { + return { + error: error.message + }; + } + } +}; + +module.exports = getShopCredentials; diff --git a/server/intellipay/lib/handleCommentBasedPayment.js b/server/intellipay/lib/handleCommentBasedPayment.js new file mode 100644 index 000000000..535e92ab8 --- /dev/null +++ b/server/intellipay/lib/handleCommentBasedPayment.js @@ -0,0 +1,81 @@ +const sendPaymentNotificationEmail = require("./sendPaymentNotificationEmail"); +const { INSERT_NEW_PAYMENT, GET_BODYSHOP_BY_ID, GET_JOBS_BY_PKS } = require("../../graphql-client/queries"); +const getPaymentType = require("./getPaymentType"); +const moment = require("moment"); + +const gqlClient = require("../../graphql-client/graphql-client").client; + +/** + * @description Handle comment-based payment processing + * @param values + * @param decodedComment + * @param logger + * @param logMeta + * @param res + * @returns {Promise<*>} + */ +const handleCommentBasedPayment = async (values, decodedComment, logger, logMeta, res) => { + logger.log("intellipay-postback-parsed-comment", "DEBUG", "api", null, { + parsedComment: decodedComment, + ...logMeta + }); + + const partialPayments = Array.isArray(decodedComment) ? decodedComment : decodedComment.payments; + + // Fetch job data + const jobs = await gqlClient.request(GET_JOBS_BY_PKS, { + ids: partialPayments.map((p) => p.jobid) + }); + + // Fetch bodyshop data + const bodyshop = await gqlClient.request(GET_BODYSHOP_BY_ID, { + id: jobs.jobs[0].shopid + }); + + const ipMapping = bodyshop.bodyshops_by_pk.intellipay_config?.payment_map; + + logger.log("intellipay-postback-jobs-fetched", "DEBUG", "api", null, { + jobs, + parsedComment: decodedComment, + ...logMeta + }); + + // Create payment records + const paymentResult = await gqlClient.request(INSERT_NEW_PAYMENT, { + paymentInput: partialPayments.map((p) => ({ + amount: p.amount, + transactionid: values.authcode, + payer: "Customer", + type: getPaymentType(ipMapping, values.cardtype), + jobid: p.jobid, + date: moment(Date.now()), + payment_responses: { + data: { + amount: values.total, + bodyshopid: bodyshop.bodyshops_by_pk.id, + jobid: p.jobid, + declinereason: "Approved", + ext_paymentid: values.paymentid, + successful: true, + response: values + } + } + })) + }); + + logger.log("intellipay-postback-payment-success", "DEBUG", "api", null, { + paymentResult, + jobs, + parsedComment: decodedComment, + ...logMeta + }); + + // Send notification email if needed + if (values?.origin === "OneLink" && decodedComment?.userEmail) { + await sendPaymentNotificationEmail(decodedComment.userEmail, jobs, partialPayments, logger, logMeta); + } + + return res.sendStatus(200); +}; + +module.exports = handleCommentBasedPayment; diff --git a/server/intellipay/lib/handleInvoiceBasedPayment.js b/server/intellipay/lib/handleInvoiceBasedPayment.js new file mode 100644 index 000000000..f99378d56 --- /dev/null +++ b/server/intellipay/lib/handleInvoiceBasedPayment.js @@ -0,0 +1,101 @@ +const handlePaymentValidationError = require("./handlePaymentValidationError"); +const { + GET_JOBID_BY_MERCHANTID_RONUMBER, + INSERT_PAYMENT_RESPONSE, + INSERT_NEW_PAYMENT +} = require("../../graphql-client/queries"); +const getPaymentType = require("./getPaymentType"); +const moment = require("moment"); + +const gqlClient = require("../../graphql-client/graphql-client").client; + +/** + * @description Handle invoice-based payment processing + * @param values + * @param logger + * @param logMeta + * @param res + * @returns {Promise<*>} + */ +const handleInvoiceBasedPayment = async (values, logger, logMeta, res) => { + // Validate required fields + if (!values.merchantid) { + return handlePaymentValidationError( + res, + logger, + "intellipay-postback-no-merchantid", + "Merchant ID is missing", + logMeta + ); + } + + // Fetch job data + const result = await gqlClient.request(GET_JOBID_BY_MERCHANTID_RONUMBER, { + merchantID: values.merchantid, + roNumber: values.invoice + }); + + if (!result?.jobs?.length) { + return handlePaymentValidationError(res, logger, "intellipay-postback-job-not-found", "Job not found", logMeta); + } + + const job = result.jobs[0]; + const bodyshop = job?.bodyshop; + + if (!bodyshop) { + return handlePaymentValidationError( + res, + logger, + "intellipay-postback-bodyshop-not-found", + "Bodyshop not found", + logMeta + ); + } + + const ipMapping = bodyshop.intellipay_config?.payment_map; + + logger.log("intellipay-postback-invoice-job-fetched", "DEBUG", "api", null, { + job, + ...logMeta + }); + + // Create payment record + const paymentResult = await gqlClient.request(INSERT_NEW_PAYMENT, { + paymentInput: { + amount: values.total, + transactionid: values.authcode, + payer: "Customer", + type: getPaymentType(ipMapping, values.cardtype), + jobid: job.id, + date: moment(Date.now()) + } + }); + + logger.log("intellipay-postback-invoice-payment-success", "DEBUG", "api", null, { + paymentResult, + ...logMeta + }); + + // Create payment response record + const responseResults = await gqlClient.request(INSERT_PAYMENT_RESPONSE, { + paymentResponse: { + amount: values.total, + bodyshopid: bodyshop.id, + paymentid: paymentResult.id, + jobid: job.id, + declinereason: "Approved", + ext_paymentid: values.paymentid, + successful: true, + response: values + } + }); + + logger.log("intellipay-postback-invoice-response-success", "DEBUG", "api", null, { + responseResults, + ...logMeta + }); + + return res.sendStatus(200); +}; + +module.exports = handleInvoiceBasedPayment; diff --git a/server/intellipay/lib/handlePaymentValidationError.js b/server/intellipay/lib/handlePaymentValidationError.js new file mode 100644 index 000000000..fccf7a75f --- /dev/null +++ b/server/intellipay/lib/handlePaymentValidationError.js @@ -0,0 +1,18 @@ +/** + * @description Log validation error and send response + * @param res + * @param logger + * @param logCode + * @param message + * @param logMeta + * @returns {*} + */ +const handlePaymentValidationError = (res, logger, logCode, message, logMeta) => { + logger.log(logCode, "ERROR", "api", null, { + message, + ...logMeta + }); + return res.status(400).send(`Bad Request: ${message}`); +}; + +module.exports = handlePaymentValidationError; diff --git a/server/intellipay/lib/sendPaymentNotificationEmail.js b/server/intellipay/lib/sendPaymentNotificationEmail.js new file mode 100644 index 000000000..2f83d3a3b --- /dev/null +++ b/server/intellipay/lib/sendPaymentNotificationEmail.js @@ -0,0 +1,41 @@ +const { sendTaskEmail } = require("../../email/sendemail"); +const generateEmailTemplate = require("../../email/generateTemplate"); + +/** + * @description Send notification email to the user + * @param userEmail + * @param jobs + * @param partialPayments + * @param logger + * @param logMeta + * @returns {Promise} + */ +const sendPaymentNotificationEmail = async (userEmail, jobs, partialPayments, logger, logMeta) => { + try { + await sendTaskEmail({ + to: userEmail, + subject: `New Payment(s) Received - RO ${jobs.jobs.map((j) => j.ro_number).join(", ")}`, + type: "html", + html: generateEmailTemplate({ + header: "New Payment(s) Received", + subHeader: "", + body: jobs.jobs + .map( + (job) => + `Reference: ${job.ro_number || "N/A"} | ${ + job.ownr_co_nm ? job.ownr_co_nm : `${job.ownr_fn || ""} ${job.ownr_ln || ""}`.trim() + } | ${`${job.v_model_yr || ""} ${job.v_make_desc || ""} ${job.v_model_desc || ""}`.trim()} | $${partialPayments.find((p) => p.jobid === job.id).amount}` + ) + .join("
") + }) + }); + } catch (error) { + logger.log("intellipay-postback-email-error", "ERROR", "api", null, { + message: error.message, + jobs, + ...logMeta + }); + } +}; + +module.exports = sendPaymentNotificationEmail; diff --git a/vitest.config.js b/vitest.config.js index 7757f9a7e..c4b856ce5 100644 --- a/vitest.config.js +++ b/vitest.config.js @@ -1,10 +1,13 @@ -import { defineConfig } from "vitest/config"; +const { defineConfig } = require("vitest/config"); -export default defineConfig({ +module.exports = defineConfig({ test: { environment: "node", globals: true, - include: ["./server/tests/**/*.{test,spec}.[jt]s"], // Only search /tests in root + include: [ + "./server/tests/**/*.{test,spec}.[jt]s", // Existing pattern for /server/tests + "./server/**/*.test.js" // New pattern for test.js in server and subfolders + ], exclude: ["**/client/**", "**/node_modules/**", "**/dist/**"] // Explicitly exclude /client } }); From 09c4662436ab77b6461ae3598e8a45be7effa054 Mon Sep 17 00:00:00 2001 From: Dave Richer Date: Wed, 2 Apr 2025 11:34:48 -0400 Subject: [PATCH 7/8] feature/IO-2885-IntelliPay-App-Postback - Add Tests --- package-lock.json | 48 +++++- package.json | 1 + .../tests/handleCommentBasedPayment.test.js | 152 ++++++++++++++++++ .../tests/handleInvoiceBasedPayment.test.js | 129 +++++++++++++++ .../intellipay/{ => tests}/intellipay.test.js | 10 +- 5 files changed, 332 insertions(+), 8 deletions(-) create mode 100644 server/intellipay/lib/tests/handleCommentBasedPayment.test.js create mode 100644 server/intellipay/lib/tests/handleInvoiceBasedPayment.test.js rename server/intellipay/{ => tests}/intellipay.test.js (96%) diff --git a/package-lock.json b/package-lock.json index ffe02c7ec..09da429eb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -75,6 +75,7 @@ "eslint": "^9.23.0", "eslint-plugin-react": "^7.37.4", "globals": "^15.15.0", + "mock-require": "^3.0.3", "p-limit": "^3.1.0", "prettier": "^3.5.3", "source-map-explorer": "^2.5.2", @@ -8402,9 +8403,9 @@ } }, "node_modules/is-core-module": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, "license": "MIT", "dependencies": { @@ -9535,6 +9536,40 @@ "mkdirp": "bin/cmd.js" } }, + "node_modules/mock-require": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/mock-require/-/mock-require-3.0.3.tgz", + "integrity": "sha512-lLzfLHcyc10MKQnNUCv7dMcoY/2Qxd6wJfbqCcVk3LDb8An4hF6ohk5AztrvgKhJCqj36uyzi/p5se+tvyD+Wg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-caller-file": "^1.0.2", + "normalize-path": "^2.1.1" + }, + "engines": { + "node": ">=4.3.0" + } + }, + "node_modules/mock-require/node_modules/get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true, + "license": "ISC" + }, + "node_modules/mock-require/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/module-details-from-path": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", @@ -10709,6 +10744,13 @@ "proxy-from-env": "^1.1.0" } }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", + "dev": true, + "license": "ISC" + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", diff --git a/package.json b/package.json index aa3c57951..0a95a146e 100644 --- a/package.json +++ b/package.json @@ -81,6 +81,7 @@ "eslint": "^9.23.0", "eslint-plugin-react": "^7.37.4", "globals": "^15.15.0", + "mock-require": "^3.0.3", "p-limit": "^3.1.0", "prettier": "^3.5.3", "source-map-explorer": "^2.5.2", diff --git a/server/intellipay/lib/tests/handleCommentBasedPayment.test.js b/server/intellipay/lib/tests/handleCommentBasedPayment.test.js new file mode 100644 index 000000000..9fd7f4ffc --- /dev/null +++ b/server/intellipay/lib/tests/handleCommentBasedPayment.test.js @@ -0,0 +1,152 @@ +import { beforeEach, describe, expect, it, vi } from "vitest"; +import mockRequire from "mock-require"; + +const gqlRequestMock = { request: vi.fn() }; +const getPaymentTypeMock = vi.fn(() => "American Express"); +const sendPaymentNotificationEmailMock = vi.fn(); + +let handleCommentBasedPayment; + +beforeEach(() => { + vi.resetModules(); + vi.clearAllMocks(); + + // Mock dependencies using mock-require BEFORE requiring the target module + mockRequire("../../../graphql-client/graphql-client", { + client: gqlRequestMock + }); + + mockRequire("../getPaymentType", getPaymentTypeMock); + mockRequire("../sendPaymentNotificationEmail", sendPaymentNotificationEmailMock); + + // Now require the module under test + handleCommentBasedPayment = require("../handleCommentBasedPayment"); + + // Chain your GraphQL mocks + gqlRequestMock.request + .mockResolvedValueOnce({ + jobs: [ + { + id: "c1ffe09c-e7d4-46b3-aac5-f23e39563181", + shopid: "bfec8c8c-b7f1-49e0-be4c-524455f4e582" + } + ] + }) + .mockResolvedValueOnce({ + bodyshops_by_pk: { + id: "bfec8c8c-b7f1-49e0-be4c-524455f4e582", + intellipay_config: { + payment_map: { + amex: "American Express" + } + } + } + }) + .mockResolvedValueOnce({ + insert_payments: { + returning: [{ id: "5dfda3c4-c0a6-4b09-a73d-176ed0ac6499" }] + } + }); +}); + +describe("handleCommentBasedPayment", () => { + const mockLogger = { log: vi.fn() }; + const mockRes = { sendStatus: vi.fn() }; + + const values = { + authcode: "5557301", + total: "0.01", + origin: "Dejavoo", + paymentid: "24294378", + cardtype: "Amex" + }; + + const decodedComment = { + payments: [{ jobid: "c1ffe09c-e7d4-46b3-aac5-f23e39563181", amount: 0.01 }], + userEmail: "test@example.com" + }; + + const logMeta = { op: "xyz123" }; + + it("processes comment-based payment and returns 200", async () => { + await handleCommentBasedPayment(values, decodedComment, mockLogger, logMeta, mockRes); + + expect(gqlRequestMock.request).toHaveBeenCalledTimes(3); + expect(getPaymentTypeMock).toHaveBeenCalledWith({ amex: "American Express" }, "Amex"); + expect(sendPaymentNotificationEmailMock).not.toHaveBeenCalled(); + expect(mockRes.sendStatus).toHaveBeenCalledWith(200); + }); + + it("sends notification if origin is OneLink and userEmail exists", async () => { + const oneLinkValues = { ...values, origin: "OneLink" }; + + await handleCommentBasedPayment(oneLinkValues, decodedComment, mockLogger, logMeta, mockRes); + + expect(sendPaymentNotificationEmailMock).toHaveBeenCalledWith( + "test@example.com", + expect.anything(), + expect.anything(), + mockLogger, + logMeta + ); + + expect(mockRes.sendStatus).toHaveBeenCalledWith(200); + }); + + it("handles decodedComment as a direct array", async () => { + const arrayComment = [{ jobid: "c1ffe09c-e7d4-46b3-aac5-f23e39563181", amount: 0.01 }]; + + await handleCommentBasedPayment(values, arrayComment, mockLogger, logMeta, mockRes); + + expect(gqlRequestMock.request).toHaveBeenCalledTimes(3); + expect(mockRes.sendStatus).toHaveBeenCalledWith(200); + }); + + it("does not send email if origin is OneLink but userEmail is missing", async () => { + const commentWithoutEmail = { + payments: decodedComment.payments + // no userEmail + }; + + const oneLinkValues = { ...values, origin: "OneLink" }; + + await handleCommentBasedPayment(oneLinkValues, commentWithoutEmail, mockLogger, logMeta, mockRes); + + expect(sendPaymentNotificationEmailMock).not.toHaveBeenCalled(); + expect(mockRes.sendStatus).toHaveBeenCalledWith(200); + }); + + it("logs important stages of the process", async () => { + await handleCommentBasedPayment(values, decodedComment, mockLogger, logMeta, mockRes); + + const logCalls = mockLogger.log.mock.calls.map(([tag]) => tag); + + expect(logCalls).toContain("intellipay-postback-parsed-comment"); + expect(logCalls).toContain("intellipay-postback-payment-success"); + }); + + it("handles missing payment_map safely", async () => { + gqlRequestMock.request.mockReset(); // 🧹 Clear previous .mockResolvedValueOnce calls + + gqlRequestMock.request + .mockResolvedValueOnce({ + jobs: [{ id: "job1", shopid: "shop1" }] + }) + .mockResolvedValueOnce({ + bodyshops_by_pk: { + id: "shop1", + intellipay_config: null + } + }) + .mockResolvedValueOnce({ + insert_payments: { + returning: [{ id: "payment1" }] + } + }); + + await handleCommentBasedPayment(values, decodedComment, mockLogger, logMeta, mockRes); + + expect(getPaymentTypeMock).toHaveBeenCalledWith(undefined, "Amex"); + expect(mockRes.sendStatus).toHaveBeenCalledWith(200); + }); +}); diff --git a/server/intellipay/lib/tests/handleInvoiceBasedPayment.test.js b/server/intellipay/lib/tests/handleInvoiceBasedPayment.test.js new file mode 100644 index 000000000..b2a886e2f --- /dev/null +++ b/server/intellipay/lib/tests/handleInvoiceBasedPayment.test.js @@ -0,0 +1,129 @@ +import { beforeEach, describe, expect, it, vi } from "vitest"; +import mockRequire from "mock-require"; + +const gqlRequestMock = { request: vi.fn() }; +const getPaymentTypeMock = vi.fn(() => "Visa"); +const handlePaymentValidationErrorMock = vi.fn(); + +let handleInvoiceBasedPayment; + +beforeEach(() => { + vi.resetModules(); + vi.clearAllMocks(); + + mockRequire("../../../graphql-client/graphql-client", { + client: gqlRequestMock + }); + + mockRequire("../getPaymentType", getPaymentTypeMock); + mockRequire("../handlePaymentValidationError", handlePaymentValidationErrorMock); + + handleInvoiceBasedPayment = require("../handleInvoiceBasedPayment"); + + gqlRequestMock.request + .mockResolvedValueOnce({ + jobs: [ + { + id: "job123", + bodyshop: { + id: "shop123", + intellipay_config: { + payment_map: { + visa: "Visa" + } + } + } + } + ] + }) + .mockResolvedValueOnce({ + id: "payment123" + }) + .mockResolvedValueOnce({ + insert_payment_response: { + returning: [{ id: "response123" }] + } + }); +}); + +describe("handleInvoiceBasedPayment", () => { + const mockLogger = { log: vi.fn() }; + const mockRes = { sendStatus: vi.fn() }; + + const values = { + merchantid: "m123", + invoice: "INV-001", + total: 100.0, + authcode: "AUTH123", + cardtype: "visa", + paymentid: "P789" + }; + + const logMeta = { op: "abc123" }; + + it("processes a valid invoice-based payment", async () => { + await handleInvoiceBasedPayment(values, mockLogger, logMeta, mockRes); + + expect(gqlRequestMock.request).toHaveBeenCalledTimes(3); + expect(getPaymentTypeMock).toHaveBeenCalledWith({ visa: "Visa" }, "visa"); + expect(mockRes.sendStatus).toHaveBeenCalledWith(200); + expect(handlePaymentValidationErrorMock).not.toHaveBeenCalled(); + }); + + it("handles missing merchantid with validation error", async () => { + const invalidValues = { ...values, merchantid: undefined }; + + await handleInvoiceBasedPayment(invalidValues, mockLogger, logMeta, mockRes); + + expect(handlePaymentValidationErrorMock).toHaveBeenCalledWith( + mockRes, + mockLogger, + "intellipay-postback-no-merchantid", + "Merchant ID is missing", + logMeta + ); + expect(gqlRequestMock.request).not.toHaveBeenCalled(); + }); + + it("handles job not found with validation error", async () => { + gqlRequestMock.request.mockReset(); + gqlRequestMock.request.mockResolvedValueOnce({ jobs: [] }); + + await handleInvoiceBasedPayment(values, mockLogger, logMeta, mockRes); + + expect(handlePaymentValidationErrorMock).toHaveBeenCalledWith( + mockRes, + mockLogger, + "intellipay-postback-job-not-found", + "Job not found", + logMeta + ); + }); + + it("handles missing bodyshop with validation error", async () => { + gqlRequestMock.request.mockReset(); + gqlRequestMock.request.mockResolvedValueOnce({ + jobs: [{ id: "job123", bodyshop: null }] + }); + + await handleInvoiceBasedPayment(values, mockLogger, logMeta, mockRes); + + expect(handlePaymentValidationErrorMock).toHaveBeenCalledWith( + mockRes, + mockLogger, + "intellipay-postback-bodyshop-not-found", + "Bodyshop not found", + logMeta + ); + }); + + it("logs all expected stages of the process", async () => { + await handleInvoiceBasedPayment(values, mockLogger, logMeta, mockRes); + + const logTags = mockLogger.log.mock.calls.map(([tag]) => tag); + + expect(logTags).toContain("intellipay-postback-invoice-job-fetched"); + expect(logTags).toContain("intellipay-postback-invoice-payment-success"); + expect(logTags).toContain("intellipay-postback-invoice-response-success"); + }); +}); diff --git a/server/intellipay/intellipay.test.js b/server/intellipay/tests/intellipay.test.js similarity index 96% rename from server/intellipay/intellipay.test.js rename to server/intellipay/tests/intellipay.test.js index 472e2ea0f..689bfa517 100644 --- a/server/intellipay/intellipay.test.js +++ b/server/intellipay/tests/intellipay.test.js @@ -1,10 +1,10 @@ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest"; -const getPaymentType = require("./lib/getPaymentType"); -const decodeComment = require("./lib/decodeComment"); -const getCptellerUrl = require("./lib/getCptellerUrl"); -const handlePaymentValidationError = require("./lib/handlePaymentValidationError"); -const getShopCredentials = require("./lib/getShopCredentials"); +const getPaymentType = require("../lib/getPaymentType"); +const decodeComment = require("../lib/decodeComment"); +const getCptellerUrl = require("../lib/getCptellerUrl"); +const handlePaymentValidationError = require("../lib/handlePaymentValidationError"); +const getShopCredentials = require("../lib/getShopCredentials"); /** * @description Decode a base64-encoded JSON comment From 41e43dda963b1fe7fb15b450eca284748d32325a Mon Sep 17 00:00:00 2001 From: Dave Richer Date: Wed, 2 Apr 2025 11:59:54 -0400 Subject: [PATCH 8/8] feature/IO-2885-IntelliPay-App-Postback-Support - Cleanup --- .../lib/tests/intelliPayGeneralLibs.test.js | 277 +++++++++++++++ server/intellipay/tests/intellipay.test.js | 316 ------------------ 2 files changed, 277 insertions(+), 316 deletions(-) create mode 100644 server/intellipay/lib/tests/intelliPayGeneralLibs.test.js delete mode 100644 server/intellipay/tests/intellipay.test.js diff --git a/server/intellipay/lib/tests/intelliPayGeneralLibs.test.js b/server/intellipay/lib/tests/intelliPayGeneralLibs.test.js new file mode 100644 index 000000000..9c9bec789 --- /dev/null +++ b/server/intellipay/lib/tests/intelliPayGeneralLibs.test.js @@ -0,0 +1,277 @@ +import { describe, it, expect, vi, beforeEach, afterEach } from "vitest"; + +const getPaymentType = require("../getPaymentType"); +const decodeComment = require("../decodeComment"); +const getCptellerUrl = require("../getCptellerUrl"); +const handlePaymentValidationError = require("../handlePaymentValidationError"); +const getShopCredentials = require("../getShopCredentials"); + +describe("Payment Processing Functions", () => { + // DecodeComment Tests + describe("decodeComment", () => { + it("decodes a valid base64-encoded JSON comment", () => { + const encoded = "eyJ0ZXN0IjoiZGF0YSJ9"; + const expected = { test: "data" }; + expect(decodeComment(encoded)).toEqual(expected); + }); + + it("decodes a complex base64-encoded JSON with payments", () => { + const encoded = "eyJwYXltZW50cyI6W3siam9iaWQiOiIxMjMifV19"; + const expected = { payments: [{ jobid: "123" }] }; + expect(decodeComment(encoded)).toEqual(expected); + }); + + it("returns null when comment is null", () => { + expect(decodeComment(null)).toBeNull(); + }); + + it("returns null when comment is undefined", () => { + expect(decodeComment(undefined)).toBeNull(); + }); + + it("returns null when comment is an empty string", () => { + expect(decodeComment("")).toBeNull(); + }); + + it("returns null when comment is malformed base64", () => { + expect(decodeComment("!@#$%")).toBeNull(); + }); + + it("returns null when comment is valid base64 but not valid JSON", () => { + expect(decodeComment("aW52YWxpZA==")).toBeNull(); + }); + }); + + // GetPaymentType Tests + describe("getPaymentType", () => { + it("returns mapped value when card type exists in mapping", () => { + const ipMapping = { visa: "Visa Card", amex: "American Express" }; + expect(getPaymentType(ipMapping, "visa")).toBe("Visa Card"); + }); + + it("returns original value when card type not in mapping", () => { + const ipMapping = { visa: "Visa Card" }; + expect(getPaymentType(ipMapping, "mastercard")).toBe("mastercard"); + }); + + it("handles lowercase conversion", () => { + const ipMapping = { visa: "Visa Card" }; + expect(getPaymentType(ipMapping, "VISA")).toBe("Visa Card"); + }); + + it("handles null mapping", () => { + expect(getPaymentType(null, "visa")).toBe("visa"); + }); + + it("handles undefined mapping", () => { + expect(getPaymentType(undefined, "visa")).toBe("visa"); + }); + + it("handles empty string card type", () => { + const ipMapping = { visa: "Visa Card" }; + expect(getPaymentType(ipMapping, "")).toBe(""); + }); + + it("handles undefined card type", () => { + const ipMapping = { visa: "Visa Card" }; + expect(getPaymentType(ipMapping, undefined)).toBe(undefined); + }); + }); + + // GetCptellerUrl Tests + describe("getCptellerUrl", () => { + const originalEnv = process.env.NODE_ENV; + + afterEach(() => { + process.env.NODE_ENV = originalEnv; + }); + + it("uses test domain in non-production environment", () => { + process.env.NODE_ENV = ""; + const url = getCptellerUrl({ apiType: "webapi" }); + expect(url).toEqual("https://test.cpteller.com/api/webapi.cfc"); + }); + + it("uses secure domain in production environment", () => { + process.env.NODE_ENV = "production"; + const url = getCptellerUrl({ apiType: "webapi" }); + expect(url).toEqual("https://secure.cpteller.com/api/webapi.cfc"); + }); + + it("adds version number for webapi type", () => { + process.env.NODE_ENV = ""; + const url = getCptellerUrl({ apiType: "webapi", version: "26" }); + expect(url).toEqual("https://test.cpteller.com/api/26/webapi.cfc"); + }); + + it("constructs custapi URL without version number", () => { + process.env.NODE_ENV = ""; + const url = getCptellerUrl({ apiType: "custapi", version: "26" }); + expect(url).toEqual("https://test.cpteller.com/api/custapi.cfc"); + }); + + it("adds query parameters to the URL", () => { + process.env.NODE_ENV = ""; + const url = getCptellerUrl({ + apiType: "webapi", + params: { method: "payment_refund", test: "value" } + }); + expect(url).toEqual("https://test.cpteller.com/api/webapi.cfc?method=payment_refund&test=value"); + }); + + it("handles empty params object", () => { + process.env.NODE_ENV = ""; + const url = getCptellerUrl({ apiType: "webapi", params: {} }); + expect(url).toEqual("https://test.cpteller.com/api/webapi.cfc"); + }); + + it("defaults to webapi when no apiType is provided", () => { + process.env.NODE_ENV = ""; + const url = getCptellerUrl({}); + expect(url).toEqual("https://test.cpteller.com/api/webapi.cfc"); + }); + + it("combines version and query parameters correctly", () => { + process.env.NODE_ENV = ""; + const url = getCptellerUrl({ + apiType: "webapi", + version: "26", + params: { method: "fee" } + }); + expect(url).toEqual("https://test.cpteller.com/api/26/webapi.cfc?method=fee"); + }); + }); + + // GetShopCredentials Tests + describe("getShopCredentials", () => { + const originalEnv = { ...process.env }; + let mockSend; + + beforeEach(() => { + mockSend = vi.fn(); + vi.mock("@aws-sdk/client-secrets-manager", () => { + return { + SecretsManagerClient: vi.fn(() => ({ + send: mockSend + })), + GetSecretValueCommand: vi.fn((input) => input) + }; + }); + + process.env.INTELLIPAY_MERCHANTKEY = "test-merchant-key"; + process.env.INTELLIPAY_APIKEY = "test-api-key"; + vi.resetModules(); + }); + + afterEach(() => { + process.env = { ...originalEnv }; + vi.restoreAllMocks(); + vi.unmock("@aws-sdk/client-secrets-manager"); + }); + + it("returns environment variables in non-production environment", async () => { + process.env.NODE_ENV = "development"; + const result = await getShopCredentials({ imexshopid: "12345" }); + expect(result).toEqual({ + merchantkey: "test-merchant-key", + apikey: "test-api-key" + }); + expect(mockSend).not.toHaveBeenCalled(); + }); + + it("returns undefined when imexshopid is missing in production", async () => { + process.env.NODE_ENV = "production"; + const result = await getShopCredentials({ name: "Test Shop" }); + expect(result).toBeUndefined(); + expect(mockSend).not.toHaveBeenCalled(); + }); + + it("returns undefined for null bodyshop in production", async () => { + process.env.NODE_ENV = "production"; + const result = await getShopCredentials(null); + expect(result).toBeUndefined(); + expect(mockSend).not.toHaveBeenCalled(); + }); + + it("returns undefined for undefined bodyshop in production", async () => { + process.env.NODE_ENV = "production"; + const result = await getShopCredentials(undefined); + expect(result).toBeUndefined(); + expect(mockSend).not.toHaveBeenCalled(); + }); + }); + + // HandlePaymentValidationError Tests + describe("handlePaymentValidationError", () => { + it("logs error and sends 400 response", () => { + const mockLog = vi.fn(); + const mockLogger = { log: mockLog }; + const mockRes = { + status: vi.fn().mockReturnThis(), + send: vi.fn().mockReturnThis() + }; + + const logCode = "test-validation-error"; + const message = "Invalid data"; + const logMeta = { field: "test", value: 123 }; + + const result = handlePaymentValidationError(mockRes, mockLogger, logCode, message, logMeta); + + expect(mockLog).toHaveBeenCalledWith(logCode, "ERROR", "api", null, { + message, + ...logMeta + }); + expect(mockRes.status).toHaveBeenCalledWith(400); + expect(mockRes.send).toHaveBeenCalledWith(`Bad Request: ${message}`); + expect(result).toBe(mockRes); + }); + + it("formats different error messages correctly", () => { + const mockLog = vi.fn(); + const mockLogger = { log: mockLog }; + const mockRes = { + status: vi.fn().mockReturnThis(), + send: vi.fn().mockReturnThis() + }; + + handlePaymentValidationError(mockRes, mockLogger, "error-code", "Custom error"); + expect(mockRes.send).toHaveBeenCalledWith("Bad Request: Custom error"); + }); + + it("passes different logCodes to logger", () => { + const mockLog = vi.fn(); + const mockLogger = { log: mockLog }; + const mockRes = { + status: vi.fn().mockReturnThis(), + send: vi.fn().mockReturnThis() + }; + + handlePaymentValidationError(mockRes, mockLogger, "custom-log-code", "Error message"); + expect(mockLog).toHaveBeenCalledWith("custom-log-code", "ERROR", "api", null, { message: "Error message" }); + }); + + it("works with minimal logMeta", () => { + const mockLog = vi.fn(); + const mockLogger = { log: mockLog }; + const mockRes = { + status: vi.fn().mockReturnThis(), + send: vi.fn().mockReturnThis() + }; + + handlePaymentValidationError(mockRes, mockLogger, "error-code", "Error message", {}); + expect(mockLog).toHaveBeenCalledWith("error-code", "ERROR", "api", null, { message: "Error message" }); + }); + + it("works with undefined logMeta", () => { + const mockLog = vi.fn(); + const mockLogger = { log: mockLog }; + const mockRes = { + status: vi.fn().mockReturnThis(), + send: vi.fn().mockReturnThis() + }; + + handlePaymentValidationError(mockRes, mockLogger, "error-code", "Error message"); + expect(mockLog).toHaveBeenCalledWith("error-code", "ERROR", "api", null, { message: "Error message" }); + }); + }); +}); diff --git a/server/intellipay/tests/intellipay.test.js b/server/intellipay/tests/intellipay.test.js deleted file mode 100644 index 689bfa517..000000000 --- a/server/intellipay/tests/intellipay.test.js +++ /dev/null @@ -1,316 +0,0 @@ -import { describe, it, expect, vi, beforeEach, afterEach } from "vitest"; - -const getPaymentType = require("../lib/getPaymentType"); -const decodeComment = require("../lib/decodeComment"); -const getCptellerUrl = require("../lib/getCptellerUrl"); -const handlePaymentValidationError = require("../lib/handlePaymentValidationError"); -const getShopCredentials = require("../lib/getShopCredentials"); - -/** - * @description Decode a base64-encoded JSON comment - */ -describe("decodeComment", () => { - it("decodes a valid base64-encoded JSON comment", () => { - // {"test":"data"} encoded in base64 - const encoded = "eyJ0ZXN0IjoiZGF0YSJ9"; - const expected = { test: "data" }; - expect(decodeComment(encoded)).toEqual(expected); - }); - - it("decodes a complex base64-encoded JSON with payments", () => { - // {"payments":[{"jobid":"123"}]} encoded in base64 - const encoded = "eyJwYXltZW50cyI6W3siam9iaWQiOiIxMjMifV19"; - const expected = { payments: [{ jobid: "123" }] }; - expect(decodeComment(encoded)).toEqual(expected); - }); - - it("returns null when comment is null", () => { - expect(decodeComment(null)).toBeNull(); - }); - - it("returns null when comment is undefined", () => { - expect(decodeComment(undefined)).toBeNull(); - }); - - it("returns null when comment is an empty string", () => { - expect(decodeComment("")).toBeNull(); - }); - - it("returns null when comment is malformed base64", () => { - expect(decodeComment("!@#$%")).toBeNull(); - }); - - it("returns null when comment is valid base64 but not valid JSON", () => { - // "invalid" in base64 is "aW52YWxpZA==" - expect(decodeComment("aW52YWxpZA==")).toBeNull(); - }); -}); - -/** - * @description Get the payment type based on the card type - */ -describe("getPaymentType", () => { - it("returns mapped value when card type exists in mapping", () => { - const ipMapping = { visa: "Visa Card", amex: "American Express" }; - expect(getPaymentType(ipMapping, "visa")).toBe("Visa Card"); - }); - - it("returns original value when card type not in mapping", () => { - const ipMapping = { visa: "Visa Card" }; - expect(getPaymentType(ipMapping, "mastercard")).toBe("mastercard"); - }); - - it("handles lowercase conversion", () => { - const ipMapping = { visa: "Visa Card" }; - expect(getPaymentType(ipMapping, "VISA")).toBe("Visa Card"); - }); - - it("handles null mapping", () => { - expect(getPaymentType(null, "visa")).toBe("visa"); - }); - - it("handles undefined mapping", () => { - expect(getPaymentType(undefined, "visa")).toBe("visa"); - }); - - it("handles empty string card type", () => { - const ipMapping = { visa: "Visa Card" }; - expect(getPaymentType(ipMapping, "")).toBe(""); - }); - - it("handles undefined card type", () => { - const ipMapping = { visa: "Visa Card" }; - expect(getPaymentType(ipMapping, undefined)).toBe(undefined); - }); -}); - -/** - * @description Get the CPTeller URL based on environment and parameters - */ -describe("getCptellerUrl", () => { - const originalEnv = process.env.NODE_ENV; - - afterEach(() => { - // Restore the original NODE_ENV after each test - process.env.NODE_ENV = originalEnv; - }); - - it("uses test domain in non-production environment", () => { - process.env.NODE_ENV = ""; - const url = getCptellerUrl({ apiType: "webapi" }); - expect(url).toEqual("https://test.cpteller.com/api/webapi.cfc"); - }); - - it("uses secure domain in production environment", () => { - process.env.NODE_ENV = "production"; - const url = getCptellerUrl({ apiType: "webapi" }); - expect(url).toEqual("https://secure.cpteller.com/api/webapi.cfc"); - }); - - it("adds version number for webapi type", () => { - process.env.NODE_ENV = ""; - const url = getCptellerUrl({ apiType: "webapi", version: "26" }); - expect(url).toEqual("https://test.cpteller.com/api/26/webapi.cfc"); - }); - - it("constructs custapi URL without version number", () => { - process.env.NODE_ENV = ""; - const url = getCptellerUrl({ apiType: "custapi", version: "26" }); - expect(url).toEqual("https://test.cpteller.com/api/custapi.cfc"); - }); - - it("adds query parameters to the URL", () => { - process.env.NODE_ENV = ""; - const url = getCptellerUrl({ - apiType: "webapi", - params: { method: "payment_refund", test: "value" } - }); - expect(url).toEqual("https://test.cpteller.com/api/webapi.cfc?method=payment_refund&test=value"); - }); - - it("handles empty params object", () => { - process.env.NODE_ENV = ""; - const url = getCptellerUrl({ apiType: "webapi", params: {} }); - expect(url).toEqual("https://test.cpteller.com/api/webapi.cfc"); - }); - - it("defaults to webapi when no apiType is provided", () => { - process.env.NODE_ENV = ""; - const url = getCptellerUrl({}); - expect(url).toEqual("https://test.cpteller.com/api/webapi.cfc"); - }); - - it("combines version and query parameters correctly", () => { - process.env.NODE_ENV = ""; - const url = getCptellerUrl({ - apiType: "webapi", - version: "26", - params: { method: "fee" } - }); - expect(url).toEqual("https://test.cpteller.com/api/26/webapi.cfc?method=fee"); - }); -}); - -/** - * @description Get shop credentials from AWS Secrets Manager or environment variables - */ - -describe("getShopCredentials", () => { - const originalEnv = { ...process.env }; - let mockSend; - - beforeEach(() => { - // Create a mock function for send - mockSend = vi.fn(); - - // Mock the entire AWS SDK module - vi.mock("@aws-sdk/client-secrets-manager", () => { - return { - SecretsManagerClient: vi.fn(() => ({ - send: mockSend - })), - GetSecretValueCommand: vi.fn((input) => input) - }; - }); - - // Setup test environment variables - process.env.INTELLIPAY_MERCHANTKEY = "test-merchant-key"; - process.env.INTELLIPAY_APIKEY = "test-api-key"; - - // Clear module cache to ensure fresh mock is used - vi.resetModules(); - }); - - afterEach(() => { - // Restore environment and clear mocks - process.env = { ...originalEnv }; - vi.restoreAllMocks(); - vi.unmock("@aws-sdk/client-secrets-manager"); - }); - - it("returns environment variables in non-production environment", async () => { - process.env.NODE_ENV = "development"; - - const result = await getShopCredentials({ imexshopid: "12345" }); - - expect(result).toEqual({ - merchantkey: "test-merchant-key", - apikey: "test-api-key" - }); - expect(mockSend).not.toHaveBeenCalled(); - }); - - it("returns undefined when imexshopid is missing in production", async () => { - process.env.NODE_ENV = "production"; - - const result = await getShopCredentials({ name: "Test Shop" }); - - expect(result).toBeUndefined(); - expect(mockSend).not.toHaveBeenCalled(); - }); - - it("returns undefined for null bodyshop in production", async () => { - process.env.NODE_ENV = "production"; - - const result = await getShopCredentials(null); - - expect(result).toBeUndefined(); - expect(mockSend).not.toHaveBeenCalled(); - }); - - it("returns undefined for undefined bodyshop in production", async () => { - process.env.NODE_ENV = "production"; - - const result = await getShopCredentials(undefined); - - expect(result).toBeUndefined(); - expect(mockSend).not.toHaveBeenCalled(); - }); -}); - -/** - * @description Handle payment validation errors - */ -describe("handlePaymentValidationError", () => { - it("logs error and sends 400 response", () => { - // Create mock objects - const mockLog = vi.fn(); - const mockLogger = { log: mockLog }; - const mockRes = { - status: vi.fn().mockReturnThis(), - send: vi.fn().mockReturnThis() - }; - - // Test data - const logCode = "test-validation-error"; - const message = "Invalid data"; - const logMeta = { field: "test", value: 123 }; - - // Call the function - const result = handlePaymentValidationError(mockRes, mockLogger, logCode, message, logMeta); - - // Verify logger.log was called correctly - expect(mockLog).toHaveBeenCalledWith(logCode, "ERROR", "api", null, { message, ...logMeta }); - - // Verify res.status was called with 400 - expect(mockRes.status).toHaveBeenCalledWith(400); - - // Verify res.send was called with correct message - expect(mockRes.send).toHaveBeenCalledWith(`Bad Request: ${message}`); - - // Verify the function returns the response - expect(result).toBe(mockRes); - }); - - it("formats different error messages correctly", () => { - const mockLog = vi.fn(); - const mockLogger = { log: mockLog }; - const mockRes = { - status: vi.fn().mockReturnThis(), - send: vi.fn().mockReturnThis() - }; - - handlePaymentValidationError(mockRes, mockLogger, "error-code", "Custom error"); - - expect(mockRes.send).toHaveBeenCalledWith("Bad Request: Custom error"); - }); - - it("passes different logCodes to logger", () => { - const mockLog = vi.fn(); - const mockLogger = { log: mockLog }; - const mockRes = { - status: vi.fn().mockReturnThis(), - send: vi.fn().mockReturnThis() - }; - - handlePaymentValidationError(mockRes, mockLogger, "custom-log-code", "Error message"); - - expect(mockLog).toHaveBeenCalledWith("custom-log-code", "ERROR", "api", null, { message: "Error message" }); - }); - - it("works with minimal logMeta", () => { - const mockLog = vi.fn(); - const mockLogger = { log: mockLog }; - const mockRes = { - status: vi.fn().mockReturnThis(), - send: vi.fn().mockReturnThis() - }; - - handlePaymentValidationError(mockRes, mockLogger, "error-code", "Error message", {}); - - expect(mockLog).toHaveBeenCalledWith("error-code", "ERROR", "api", null, { message: "Error message" }); - }); - - it("works with undefined logMeta", () => { - const mockLog = vi.fn(); - const mockLogger = { log: mockLog }; - const mockRes = { - status: vi.fn().mockReturnThis(), - send: vi.fn().mockReturnThis() - }; - - handlePaymentValidationError(mockRes, mockLogger, "error-code", "Error message"); - - expect(mockLog).toHaveBeenCalledWith("error-code", "ERROR", "api", null, { message: "Error message" }); - }); -});