From 86855d4565df7bc0b8211a1ee737486ff31433fc Mon Sep 17 00:00:00 2001 From: lmarrai-sw <44811960+lmarrai-sw@users.noreply.github.com> Date: Fri, 8 Sep 2023 10:13:31 +0100 Subject: [PATCH 001/130] fix(DTFS2-6681): extract reset password payload in portal-api (#2045) --- portal-api/package-lock.json | 10 +++ portal-api/package.json | 1 + portal-api/src/v1/users/routes.js | 9 +-- portal-api/src/v1/users/routes.test.js | 89 ++++++++++++++++++++++++++ 4 files changed, 105 insertions(+), 4 deletions(-) create mode 100644 portal-api/src/v1/users/routes.test.js diff --git a/portal-api/package-lock.json b/portal-api/package-lock.json index f4380dba45..533301a456 100644 --- a/portal-api/package-lock.json +++ b/portal-api/package-lock.json @@ -41,6 +41,7 @@ "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.28.1", "jest": "^29.6.4", + "jest-when": "^3.6.0", "prettier": "^2.8.8", "supertest": "6.3.3" }, @@ -5131,6 +5132,15 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-when": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/jest-when/-/jest-when-3.6.0.tgz", + "integrity": "sha512-+cZWTy0ekAJo7M9Om0Scdor1jm3wDiYJWmXE8U22UVnkH54YCXAuaqz3P+up/FdtOg8g4wHOxV7Thd7nKhT6Dg==", + "dev": true, + "peerDependencies": { + "jest": ">= 25" + } + }, "node_modules/jest-worker": { "version": "29.6.4", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", diff --git a/portal-api/package.json b/portal-api/package.json index dba472457f..c196328fd5 100644 --- a/portal-api/package.json +++ b/portal-api/package.json @@ -68,6 +68,7 @@ "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.28.1", "jest": "^29.6.4", + "jest-when": "^3.6.0", "prettier": "^2.8.8", "supertest": "6.3.3" }, diff --git a/portal-api/src/v1/users/routes.js b/portal-api/src/v1/users/routes.js index 94b26bf497..87dba8ff97 100644 --- a/portal-api/src/v1/users/routes.js +++ b/portal-api/src/v1/users/routes.js @@ -302,7 +302,7 @@ module.exports.resetPasswordWithToken = async (req, res, next) => { } // Void token - Token expired - const user = await getUserByPasswordToken(resetPwdToken, req.body); + const user = await getUserByPasswordToken(resetPwdToken); // Stale token - Generated over 24 hours ago const hoursSincePasswordResetRequest = user.resetPwdTimestamp ? (Date.now() - user.resetPwdTimestamp) / 1000 / 60 / 60 @@ -324,8 +324,8 @@ module.exports.resetPasswordWithToken = async (req, res, next) => { } const errors = applyUpdateRules(user, { - resetPwdToken, - ...req.body, + password, + passwordConfirm, }); if (errors.length) { @@ -338,7 +338,8 @@ module.exports.resetPasswordWithToken = async (req, res, next) => { }); } const updateData = { - ...req.body, + password, + passwordConfirm, resetPwdToken: '', resetPwdTimestamp: '', currentPassword: '', diff --git a/portal-api/src/v1/users/routes.test.js b/portal-api/src/v1/users/routes.test.js new file mode 100644 index 0000000000..dd5708de0f --- /dev/null +++ b/portal-api/src/v1/users/routes.test.js @@ -0,0 +1,89 @@ +const { ObjectId } = require('mongodb'); +const { when } = require('jest-when'); +const { getUserByPasswordToken } = require('./reset-password.controller'); +const { update } = require('./controller'); +const { resetPasswordWithToken } = require('./routes'); +const utils = require('../../crypto/utils'); + +jest.mock('./reset-password.controller'); +jest.mock('./controller'); + +describe('users routes', () => { + describe('resetPasswordWithToken', () => { + const resetPwdToken = 'token'; + const oldPassword = 'Old-password1'; + const newPassword = 'New-password1'; + const { salt: currentSalt, hash: currentHash } = utils.genPassword(oldPassword); + + const req = { + params: { resetPwdToken }, + body: { + password: newPassword, + passwordConfirm: newPassword, + }, + }; + const res = { + status: jest.fn().mockReturnThis(), + json: jest.fn(), + }; + const next = jest.fn(); + + const reqWithExtraFieldsInBody = { + ...req, + body: { + ...req.body, + extraField: 'extraFieldValue', + }, + }; + + const user = { + _id: new ObjectId(), + resetPwdTimestamp: new Date().getTime(), + salt: currentSalt, + hash: currentHash, + }; + + beforeEach(() => { + jest.resetAllMocks(); + when(getUserByPasswordToken) + .calledWith(resetPwdToken) + .mockResolvedValueOnce(user); + }); + + it('updates the user\'s password and reset password details', async () => { + await resetPasswordWithToken(req, res, next); + + expect(update).toHaveBeenCalledWith( + user._id, + { + password: newPassword, + passwordConfirm: newPassword, + resetPwdToken: '', + resetPwdTimestamp: '', + currentPassword: '', + loginFailureCount: 0, + passwordUpdatedAt: expect.any(String), + }, + expect.any(Function) + ); + }); + + it('ignores unexpected fields supplied in the request body', async () => { + await resetPasswordWithToken(reqWithExtraFieldsInBody, res, next); + + expect(update).toHaveBeenCalledWith( + user._id, + { + password: newPassword, + passwordConfirm: newPassword, + resetPwdToken: '', + resetPwdTimestamp: '', + currentPassword: '', + loginFailureCount: 0, + passwordUpdatedAt: expect.any(String), + }, + expect.any(Function) + ); + }); + }); +}); From 3bf5c599ae01181340ebf95dc5ed05e7badb965f Mon Sep 17 00:00:00 2001 From: Abhi Markan <32125108+abhi-markan@users.noreply.github.com> Date: Fri, 8 Sep 2023 16:09:05 +0100 Subject: [PATCH 002/130] feat(DTFS2-6556): rename bank (#2046) Co-authored-by: Abhi Markan --- .../acbs-function/package-lock.json | 48 +- .../package-lock.json | 18 +- cspell.json | 5 +- dtfs-central-api/package-lock.json | 56 +- dtfs-central-api/package.json | 2 +- .../cron-jobs/cron-jobs.controller.js | 2 +- .../durable-functions.controller.js | 2 +- external-api/package-lock.json | 74 +-- external-api/package.json | 2 +- gef-ui/package-lock.json | 76 +-- gef-ui/package.json | 4 +- package-lock.json | 38 +- package.json | 2 +- portal-api/package-lock.json | 56 +- portal-api/package.json | 2 +- portal/package-lock.json | 76 +-- portal/package.json | 4 +- .../templates/_partials/before-you-start.njk | 2 +- .../api-tests/api-ssrf.api-test.js | 8 +- ...deals-submit.second-submission.api-test.js | 16 +- .../v1/mappings/map-deals.api-test.js | 16 +- trade-finance-manager-api/package-lock.json | 56 +- trade-finance-manager-api/package.json | 2 +- .../src/v1/__mocks__/api.js | 10 +- trade-finance-manager-api/src/v1/api.js | 6 +- .../src/v1/mappings/map-deal.js | 2 +- .../src/v1/mappings/map-deals.js | 2 +- trade-finance-manager-ui/package-lock.json | 70 +-- trade-finance-manager-ui/package.json | 4 +- .../amendments/bankDecision.controller.js | 2 +- utils/data-migration/package-lock.json | 586 ++++++++++-------- 31 files changed, 653 insertions(+), 596 deletions(-) diff --git a/azure-functions/acbs-function/package-lock.json b/azure-functions/acbs-function/package-lock.json index 5dfe5c7d00..1075c33bad 100644 --- a/azure-functions/acbs-function/package-lock.json +++ b/azure-functions/acbs-function/package-lock.json @@ -419,9 +419,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.15.tgz", - "integrity": "sha512-RWmQ/sklUN9BvGGpCDgSubhHWfAx24XDTDObup4ffvxaYsptOg2P3KG0j+1eWKLxpkX0j0uHxmpq2Z1SP/VhxA==", + "version": "7.22.16", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", + "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", "bin": { "parser": "bin/babel-parser.js" }, @@ -1539,13 +1539,13 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -1799,9 +1799,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001527", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001527.tgz", - "integrity": "sha512-YkJi7RwPgWtXVSgK4lG9AHH57nSzvvOp9MesgXmw4Q7n0C3H04L0foHqfxcmSAm5AcWb8dW9AYj2tR7/5GnddQ==", + "version": "1.0.30001529", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001529.tgz", + "integrity": "sha512-n2pUQYGAkrLG4QYj2desAh+NqsJpHbNmVZz87imptDdxLAtjxary7Df/psdfyDGmskJK/9Dt9cPnx5RZ3CU4Og==", "funding": [ { "type": "opencollective", @@ -2093,9 +2093,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.508", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.508.tgz", - "integrity": "sha512-FFa8QKjQK/A5QuFr2167myhMesGrhlOBD+3cYNxO9/S4XzHEXesyTD/1/xF644gC8buFPz3ca6G1LOQD0tZrrg==" + "version": "1.4.512", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.512.tgz", + "integrity": "sha512-1W8wRbYlQE4ph7eoj3TJ+uqwO6+xvAE/L+KGU7WTQQvX3tnSIGZAb90MTsMoJqzntamiwJhBAj4WZmygXhsOUg==" }, "node_modules/emittery": { "version": "0.13.1", @@ -4953,13 +4953,13 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -4969,13 +4969,13 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" diff --git a/azure-functions/number-generator-function/package-lock.json b/azure-functions/number-generator-function/package-lock.json index 9233a34832..b745765ab4 100644 --- a/azure-functions/number-generator-function/package-lock.json +++ b/azure-functions/number-generator-function/package-lock.json @@ -408,9 +408,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.15.tgz", - "integrity": "sha512-RWmQ/sklUN9BvGGpCDgSubhHWfAx24XDTDObup4ffvxaYsptOg2P3KG0j+1eWKLxpkX0j0uHxmpq2Z1SP/VhxA==", + "version": "7.22.16", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", + "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", "bin": { "parser": "bin/babel-parser.js" }, @@ -1366,9 +1366,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001527", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001527.tgz", - "integrity": "sha512-YkJi7RwPgWtXVSgK4lG9AHH57nSzvvOp9MesgXmw4Q7n0C3H04L0foHqfxcmSAm5AcWb8dW9AYj2tR7/5GnddQ==", + "version": "1.0.30001529", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001529.tgz", + "integrity": "sha512-n2pUQYGAkrLG4QYj2desAh+NqsJpHbNmVZz87imptDdxLAtjxary7Df/psdfyDGmskJK/9Dt9cPnx5RZ3CU4Og==", "funding": [ { "type": "opencollective", @@ -1609,9 +1609,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.508", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.508.tgz", - "integrity": "sha512-FFa8QKjQK/A5QuFr2167myhMesGrhlOBD+3cYNxO9/S4XzHEXesyTD/1/xF644gC8buFPz3ca6G1LOQD0tZrrg==" + "version": "1.4.512", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.512.tgz", + "integrity": "sha512-1W8wRbYlQE4ph7eoj3TJ+uqwO6+xvAE/L+KGU7WTQQvX3tnSIGZAb90MTsMoJqzntamiwJhBAj4WZmygXhsOUg==" }, "node_modules/emittery": { "version": "0.13.1", diff --git a/cspell.json b/cspell.json index 4e9c6823d9..6045d116c0 100644 --- a/cspell.json +++ b/cspell.json @@ -101,7 +101,10 @@ "Unauthorised", "venv", "VNET", - "XLXS" + "XLXS", + "Stringifying", + "SSRF", + "TYPEA" ], "dictionaries": [ "en-gb", diff --git a/dtfs-central-api/package-lock.json b/dtfs-central-api/package-lock.json index 4342c16ea2..e7c331ff2e 100644 --- a/dtfs-central-api/package-lock.json +++ b/dtfs-central-api/package-lock.json @@ -15,7 +15,7 @@ "dotenv": "16.0.3", "express": "4.18.2", "express-mongo-sanitize": "^2.2.0", - "express-rate-limit": "^6.10.0", + "express-rate-limit": "^6.11.0", "moment": "^2.29.4", "mongo-dot-notation": "3.1.0", "mongodb": "4.2.0", @@ -505,9 +505,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.15.tgz", - "integrity": "sha512-RWmQ/sklUN9BvGGpCDgSubhHWfAx24XDTDObup4ffvxaYsptOg2P3KG0j+1eWKLxpkX0j0uHxmpq2Z1SP/VhxA==", + "version": "7.22.16", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", + "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -1746,14 +1746,14 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -2132,9 +2132,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001527", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001527.tgz", - "integrity": "sha512-YkJi7RwPgWtXVSgK4lG9AHH57nSzvvOp9MesgXmw4Q7n0C3H04L0foHqfxcmSAm5AcWb8dW9AYj2tR7/5GnddQ==", + "version": "1.0.30001529", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001529.tgz", + "integrity": "sha512-n2pUQYGAkrLG4QYj2desAh+NqsJpHbNmVZz87imptDdxLAtjxary7Df/psdfyDGmskJK/9Dt9cPnx5RZ3CU4Og==", "dev": true, "funding": [ { @@ -2577,9 +2577,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.508", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.508.tgz", - "integrity": "sha512-FFa8QKjQK/A5QuFr2167myhMesGrhlOBD+3cYNxO9/S4XzHEXesyTD/1/xF644gC8buFPz3ca6G1LOQD0tZrrg==", + "version": "1.4.512", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.512.tgz", + "integrity": "sha512-1W8wRbYlQE4ph7eoj3TJ+uqwO6+xvAE/L+KGU7WTQQvX3tnSIGZAb90MTsMoJqzntamiwJhBAj4WZmygXhsOUg==", "dev": true }, "node_modules/emittery": { @@ -3153,9 +3153,9 @@ } }, "node_modules/express-rate-limit": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.10.0.tgz", - "integrity": "sha512-CtGn2IyklQnIWpA4pcRaovXkNR8psDQ9Fa0y5u7Yhz5TL74dNsm7oXpfm1HPKUYiNe5w0TPEyNbIrvNVU/xUIg==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.0.tgz", + "integrity": "sha512-H9afltGTaEZcvenAB5LFgb/ysTMHUzMxoB3TJM6UHP5FtAP1p2+heMj1xwTei54Zm4I9I/2qsS5m+XrdKQp/Hw==", "engines": { "node": ">= 14" }, @@ -6292,14 +6292,14 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -6309,14 +6309,14 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" diff --git a/dtfs-central-api/package.json b/dtfs-central-api/package.json index 69cc0d6447..805226f314 100644 --- a/dtfs-central-api/package.json +++ b/dtfs-central-api/package.json @@ -43,7 +43,7 @@ "dotenv": "16.0.3", "express": "4.18.2", "express-mongo-sanitize": "^2.2.0", - "express-rate-limit": "^6.10.0", + "express-rate-limit": "^6.11.0", "moment": "^2.29.4", "mongo-dot-notation": "3.1.0", "mongodb": "4.2.0", diff --git a/dtfs-central-api/src/v1/controllers/cron-jobs/cron-jobs.controller.js b/dtfs-central-api/src/v1/controllers/cron-jobs/cron-jobs.controller.js index 79a6d5c4d3..640e7c1a74 100644 --- a/dtfs-central-api/src/v1/controllers/cron-jobs/cron-jobs.controller.js +++ b/dtfs-central-api/src/v1/controllers/cron-jobs/cron-jobs.controller.js @@ -11,7 +11,7 @@ exports.deleteAllEstoreLogs = async (req, res) => { console.error('CRON job error %s', error); return res.status(500).send({ - error: 'An exception has occured', + error: 'An exception has occurred', }); } }; diff --git a/dtfs-central-api/src/v1/controllers/durable-functions/durable-functions.controller.js b/dtfs-central-api/src/v1/controllers/durable-functions/durable-functions.controller.js index ea12fbeca2..fdcf42ea8a 100644 --- a/dtfs-central-api/src/v1/controllers/durable-functions/durable-functions.controller.js +++ b/dtfs-central-api/src/v1/controllers/durable-functions/durable-functions.controller.js @@ -11,7 +11,7 @@ exports.deleteAllDurableFunctions = async (req, res) => { console.error('ACBS DOF error %s', error); return res.status(500).send({ - error: 'An exception has occured', + error: 'An exception has occurred', }); } }; diff --git a/external-api/package-lock.json b/external-api/package-lock.json index cc5f42d45d..eaf5440809 100644 --- a/external-api/package-lock.json +++ b/external-api/package-lock.json @@ -28,7 +28,7 @@ "dotenv": "16.3.1", "express": "4.18.2", "express-mongo-sanitize": "^2.2.0", - "express-rate-limit": "^6.10.0", + "express-rate-limit": "^6.11.0", "joi": "^17.10.1", "mongodb": "4.2.0", "nodemon": "^3.0.1", @@ -510,9 +510,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.15.tgz", - "integrity": "sha512-RWmQ/sklUN9BvGGpCDgSubhHWfAx24XDTDObup4ffvxaYsptOg2P3KG0j+1eWKLxpkX0j0uHxmpq2Z1SP/VhxA==", + "version": "7.22.16", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", + "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -2113,14 +2113,14 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -2131,16 +2131,16 @@ } }, "node_modules/array.prototype.tosorted": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", - "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz", + "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.3" + "get-intrinsic": "^1.2.1" } }, "node_modules/arraybuffer.prototype.slice": { @@ -2203,9 +2203,9 @@ } }, "node_modules/axe-core": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.2.tgz", - "integrity": "sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.8.0.tgz", + "integrity": "sha512-ZtlVZobOeDQhb/y2lMK6mznDw7TJHDNcKx5/bbBkFvArIQ5CVFhSI6hWWQnMx9I8cNmNmZ30wpDyOC2E2nvgbQ==", "dev": true, "engines": { "node": ">=4" @@ -2596,9 +2596,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001527", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001527.tgz", - "integrity": "sha512-YkJi7RwPgWtXVSgK4lG9AHH57nSzvvOp9MesgXmw4Q7n0C3H04L0foHqfxcmSAm5AcWb8dW9AYj2tR7/5GnddQ==", + "version": "1.0.30001529", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001529.tgz", + "integrity": "sha512-n2pUQYGAkrLG4QYj2desAh+NqsJpHbNmVZz87imptDdxLAtjxary7Df/psdfyDGmskJK/9Dt9cPnx5RZ3CU4Og==", "dev": true, "funding": [ { @@ -3137,9 +3137,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.508", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.508.tgz", - "integrity": "sha512-FFa8QKjQK/A5QuFr2167myhMesGrhlOBD+3cYNxO9/S4XzHEXesyTD/1/xF644gC8buFPz3ca6G1LOQD0tZrrg==", + "version": "1.4.512", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.512.tgz", + "integrity": "sha512-1W8wRbYlQE4ph7eoj3TJ+uqwO6+xvAE/L+KGU7WTQQvX3tnSIGZAb90MTsMoJqzntamiwJhBAj4WZmygXhsOUg==", "dev": true }, "node_modules/emittery": { @@ -4020,9 +4020,9 @@ } }, "node_modules/express-rate-limit": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.10.0.tgz", - "integrity": "sha512-CtGn2IyklQnIWpA4pcRaovXkNR8psDQ9Fa0y5u7Yhz5TL74dNsm7oXpfm1HPKUYiNe5w0TPEyNbIrvNVU/xUIg==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.0.tgz", + "integrity": "sha512-H9afltGTaEZcvenAB5LFgb/ysTMHUzMxoB3TJM6UHP5FtAP1p2+heMj1xwTei54Zm4I9I/2qsS5m+XrdKQp/Hw==", "engines": { "node": ">= 14" }, @@ -7523,14 +7523,14 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -7540,14 +7540,14 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" diff --git a/external-api/package.json b/external-api/package.json index 025c9bb51c..a0e667635c 100644 --- a/external-api/package.json +++ b/external-api/package.json @@ -54,7 +54,7 @@ "dotenv": "16.3.1", "express": "4.18.2", "express-mongo-sanitize": "^2.2.0", - "express-rate-limit": "^6.10.0", + "express-rate-limit": "^6.11.0", "joi": "^17.10.1", "mongodb": "4.2.0", "nodemon": "^3.0.1", diff --git a/gef-ui/package-lock.json b/gef-ui/package-lock.json index 90f43cca4a..3b567a2da0 100644 --- a/gef-ui/package-lock.json +++ b/gef-ui/package-lock.json @@ -20,13 +20,13 @@ "connect-flash": "0.1.1", "connect-redis": "5.2.0", "cookie-parser": "^1.4.6", - "core-js": "^3.32.1", + "core-js": "^3.32.2", "csurf": "^1.11.0", "date-fns": "^2.30.0", "dotenv": "16.0.3", "express": "^4.18.2", "express-fileupload": "^1.4.0", - "express-rate-limit": "^6.10.0", + "express-rate-limit": "^6.11.0", "express-session": "1.17.3", "filesize": "9.0.11", "form-data": "4.0.0", @@ -502,9 +502,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.15.tgz", - "integrity": "sha512-RWmQ/sklUN9BvGGpCDgSubhHWfAx24XDTDObup4ffvxaYsptOg2P3KG0j+1eWKLxpkX0j0uHxmpq2Z1SP/VhxA==", + "version": "7.22.16", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", + "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -3575,14 +3575,14 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -4072,9 +4072,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001527", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001527.tgz", - "integrity": "sha512-YkJi7RwPgWtXVSgK4lG9AHH57nSzvvOp9MesgXmw4Q7n0C3H04L0foHqfxcmSAm5AcWb8dW9AYj2tR7/5GnddQ==", + "version": "1.0.30001529", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001529.tgz", + "integrity": "sha512-n2pUQYGAkrLG4QYj2desAh+NqsJpHbNmVZz87imptDdxLAtjxary7Df/psdfyDGmskJK/9Dt9cPnx5RZ3CU4Og==", "dev": true, "funding": [ { @@ -4512,9 +4512,9 @@ "dev": true }, "node_modules/core-js": { - "version": "3.32.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.32.1.tgz", - "integrity": "sha512-lqufgNn9NLnESg5mQeYsxQP5w7wrViSj0jr/kv6ECQiByzQkrn1MKvV0L3acttpDqfQrHLwr2KCMgX5b8X+lyQ==", + "version": "3.32.2", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.32.2.tgz", + "integrity": "sha512-pxXSw1mYZPDGvTQqEc5vgIb83jGQKFGYWY76z4a7weZXUolw3G+OvpZqSRcfYOoOVUQJYEPsWeQK8pKEnUtWxQ==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -4522,9 +4522,9 @@ } }, "node_modules/core-js-compat": { - "version": "3.32.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.32.1.tgz", - "integrity": "sha512-GSvKDv4wE0bPnQtjklV101juQ85g6H3rm5PDP20mqlS5j0kXF3pP97YvAu5hl+uFHqMictp3b2VxOHljWMAtuA==", + "version": "3.32.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.32.2.tgz", + "integrity": "sha512-+GjlguTDINOijtVRUxrQOv3kfu9rl+qPNdX2LTbJ/ZyVTuxK+ksVSAGX1nHstu4hrv1En/uPTtWgq2gI5wt4AQ==", "dev": true, "dependencies": { "browserslist": "^4.21.10" @@ -5124,9 +5124,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.508", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.508.tgz", - "integrity": "sha512-FFa8QKjQK/A5QuFr2167myhMesGrhlOBD+3cYNxO9/S4XzHEXesyTD/1/xF644gC8buFPz3ca6G1LOQD0tZrrg==", + "version": "1.4.512", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.512.tgz", + "integrity": "sha512-1W8wRbYlQE4ph7eoj3TJ+uqwO6+xvAE/L+KGU7WTQQvX3tnSIGZAb90MTsMoJqzntamiwJhBAj4WZmygXhsOUg==", "dev": true }, "node_modules/emittery": { @@ -5936,9 +5936,9 @@ } }, "node_modules/express-rate-limit": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.10.0.tgz", - "integrity": "sha512-CtGn2IyklQnIWpA4pcRaovXkNR8psDQ9Fa0y5u7Yhz5TL74dNsm7oXpfm1HPKUYiNe5w0TPEyNbIrvNVU/xUIg==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.0.tgz", + "integrity": "sha512-H9afltGTaEZcvenAB5LFgb/ysTMHUzMxoB3TJM6UHP5FtAP1p2+heMj1xwTei54Zm4I9I/2qsS5m+XrdKQp/Hw==", "engines": { "node": ">= 14" }, @@ -11598,14 +11598,14 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -11615,14 +11615,14 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -12934,9 +12934,9 @@ } }, "node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.0.tgz", + "integrity": "sha512-WR0RJE9Ehsio6U4TuM+LmunEsjQ5ncHlw4sn9ihD6RoJKZrVyH9FWV3dmnwu8B2aNib1OvG2X6adUCyFpQyWcg==", "dev": true, "engines": { "node": ">=10.0.0" diff --git a/gef-ui/package.json b/gef-ui/package.json index 00ac77240d..55d3026f1f 100644 --- a/gef-ui/package.json +++ b/gef-ui/package.json @@ -50,13 +50,13 @@ "connect-flash": "0.1.1", "connect-redis": "5.2.0", "cookie-parser": "^1.4.6", - "core-js": "^3.32.1", + "core-js": "^3.32.2", "csurf": "^1.11.0", "date-fns": "^2.30.0", "dotenv": "16.0.3", "express": "^4.18.2", "express-fileupload": "^1.4.0", - "express-rate-limit": "^6.10.0", + "express-rate-limit": "^6.11.0", "express-session": "1.17.3", "filesize": "9.0.11", "form-data": "4.0.0", diff --git a/package-lock.json b/package-lock.json index 0a8b883f01..fad2e102ba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ "date-fns": "^2.30.0", "dotenv": "^16.3.1", "moment": "^2.29.4", - "npm-check-updates": "^16.13.2" + "npm-check-updates": "^16.13.3" }, "devDependencies": { "@commitlint/cli": "^17.7.1", @@ -2037,14 +2037,14 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -6865,9 +6865,9 @@ } }, "node_modules/npm-check-updates": { - "version": "16.13.2", - "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.13.2.tgz", - "integrity": "sha512-0pQI+k1y0JVwenB2gBc69tXFYfkckSVrNrlcn7TIrZfis4LnfdzakY/LYzZKt/lx37edN2isk3d2Zw4csptu/w==", + "version": "16.13.3", + "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.13.3.tgz", + "integrity": "sha512-l3FQtm+ZtDwqtK2r27vCuNdtnoDsXzk8D2WczvrAJy2bGPZJvRmuUa/Q9Gv+AbZV0IHSNJD2oHtQqUeqQRhEsw==", "dependencies": { "chalk": "^5.3.0", "cli-table3": "^0.6.3", @@ -8667,14 +8667,14 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -8684,14 +8684,14 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" diff --git a/package.json b/package.json index 43b904df13..4e998278d4 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "date-fns": "^2.30.0", "dotenv": "^16.3.1", "moment": "^2.29.4", - "npm-check-updates": "^16.13.2" + "npm-check-updates": "^16.13.3" }, "devDependencies": { "@commitlint/cli": "^17.7.1", diff --git a/portal-api/package-lock.json b/portal-api/package-lock.json index 533301a456..147e2626cd 100644 --- a/portal-api/package-lock.json +++ b/portal-api/package-lock.json @@ -19,7 +19,7 @@ "dotenv": "16.0.3", "express": "4.18.2", "express-mongo-sanitize": "^2.2.0", - "express-rate-limit": "^6.10.0", + "express-rate-limit": "^6.11.0", "filesize": "^8.0.7", "joi": "^17.10.1", "jsonwebtoken": "^9.0.2", @@ -591,9 +591,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.15.tgz", - "integrity": "sha512-RWmQ/sklUN9BvGGpCDgSubhHWfAx24XDTDObup4ffvxaYsptOg2P3KG0j+1eWKLxpkX0j0uHxmpq2Z1SP/VhxA==", + "version": "7.22.16", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", + "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -1897,14 +1897,14 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -2305,9 +2305,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001527", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001527.tgz", - "integrity": "sha512-YkJi7RwPgWtXVSgK4lG9AHH57nSzvvOp9MesgXmw4Q7n0C3H04L0foHqfxcmSAm5AcWb8dW9AYj2tR7/5GnddQ==", + "version": "1.0.30001529", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001529.tgz", + "integrity": "sha512-n2pUQYGAkrLG4QYj2desAh+NqsJpHbNmVZz87imptDdxLAtjxary7Df/psdfyDGmskJK/9Dt9cPnx5RZ3CU4Og==", "dev": true, "funding": [ { @@ -2847,9 +2847,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.508", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.508.tgz", - "integrity": "sha512-FFa8QKjQK/A5QuFr2167myhMesGrhlOBD+3cYNxO9/S4XzHEXesyTD/1/xF644gC8buFPz3ca6G1LOQD0tZrrg==", + "version": "1.4.512", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.512.tgz", + "integrity": "sha512-1W8wRbYlQE4ph7eoj3TJ+uqwO6+xvAE/L+KGU7WTQQvX3tnSIGZAb90MTsMoJqzntamiwJhBAj4WZmygXhsOUg==", "dev": true }, "node_modules/emittery": { @@ -3442,9 +3442,9 @@ } }, "node_modules/express-rate-limit": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.10.0.tgz", - "integrity": "sha512-CtGn2IyklQnIWpA4pcRaovXkNR8psDQ9Fa0y5u7Yhz5TL74dNsm7oXpfm1HPKUYiNe5w0TPEyNbIrvNVU/xUIg==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.0.tgz", + "integrity": "sha512-H9afltGTaEZcvenAB5LFgb/ysTMHUzMxoB3TJM6UHP5FtAP1p2+heMj1xwTei54Zm4I9I/2qsS5m+XrdKQp/Hw==", "engines": { "node": ">= 14" }, @@ -7033,14 +7033,14 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -7050,14 +7050,14 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" diff --git a/portal-api/package.json b/portal-api/package.json index c196328fd5..0720c51f40 100644 --- a/portal-api/package.json +++ b/portal-api/package.json @@ -46,7 +46,7 @@ "dotenv": "16.0.3", "express": "4.18.2", "express-mongo-sanitize": "^2.2.0", - "express-rate-limit": "^6.10.0", + "express-rate-limit": "^6.11.0", "filesize": "^8.0.7", "joi": "^17.10.1", "jsonwebtoken": "^9.0.2", diff --git a/portal/package-lock.json b/portal/package-lock.json index 90892e3930..0888254583 100644 --- a/portal/package-lock.json +++ b/portal/package-lock.json @@ -16,11 +16,11 @@ "connect-flash": "0.1.1", "connect-redis": "5.2.0", "cookie-parser": "^1.4.6", - "core-js": "^3.32.1", + "core-js": "^3.32.2", "csurf": "^1.11.0", "dotenv": "16.0.3", "express": "^4.18.2", - "express-rate-limit": "^6.10.0", + "express-rate-limit": "^6.11.0", "express-session": "1.17.3", "form-data": "4.0.0", "govuk-frontend": "4.6.0", @@ -492,9 +492,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.15.tgz", - "integrity": "sha512-RWmQ/sklUN9BvGGpCDgSubhHWfAx24XDTDObup4ffvxaYsptOg2P3KG0j+1eWKLxpkX0j0uHxmpq2Z1SP/VhxA==", + "version": "7.22.16", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", + "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -3557,14 +3557,14 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -4086,9 +4086,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001527", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001527.tgz", - "integrity": "sha512-YkJi7RwPgWtXVSgK4lG9AHH57nSzvvOp9MesgXmw4Q7n0C3H04L0foHqfxcmSAm5AcWb8dW9AYj2tR7/5GnddQ==", + "version": "1.0.30001529", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001529.tgz", + "integrity": "sha512-n2pUQYGAkrLG4QYj2desAh+NqsJpHbNmVZz87imptDdxLAtjxary7Df/psdfyDGmskJK/9Dt9cPnx5RZ3CU4Og==", "dev": true, "funding": [ { @@ -4429,9 +4429,9 @@ "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==" }, "node_modules/core-js": { - "version": "3.32.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.32.1.tgz", - "integrity": "sha512-lqufgNn9NLnESg5mQeYsxQP5w7wrViSj0jr/kv6ECQiByzQkrn1MKvV0L3acttpDqfQrHLwr2KCMgX5b8X+lyQ==", + "version": "3.32.2", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.32.2.tgz", + "integrity": "sha512-pxXSw1mYZPDGvTQqEc5vgIb83jGQKFGYWY76z4a7weZXUolw3G+OvpZqSRcfYOoOVUQJYEPsWeQK8pKEnUtWxQ==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -4439,9 +4439,9 @@ } }, "node_modules/core-js-compat": { - "version": "3.32.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.32.1.tgz", - "integrity": "sha512-GSvKDv4wE0bPnQtjklV101juQ85g6H3rm5PDP20mqlS5j0kXF3pP97YvAu5hl+uFHqMictp3b2VxOHljWMAtuA==", + "version": "3.32.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.32.2.tgz", + "integrity": "sha512-+GjlguTDINOijtVRUxrQOv3kfu9rl+qPNdX2LTbJ/ZyVTuxK+ksVSAGX1nHstu4hrv1En/uPTtWgq2gI5wt4AQ==", "dev": true, "dependencies": { "browserslist": "^4.21.10" @@ -4981,9 +4981,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.508", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.508.tgz", - "integrity": "sha512-FFa8QKjQK/A5QuFr2167myhMesGrhlOBD+3cYNxO9/S4XzHEXesyTD/1/xF644gC8buFPz3ca6G1LOQD0tZrrg==", + "version": "1.4.512", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.512.tgz", + "integrity": "sha512-1W8wRbYlQE4ph7eoj3TJ+uqwO6+xvAE/L+KGU7WTQQvX3tnSIGZAb90MTsMoJqzntamiwJhBAj4WZmygXhsOUg==", "dev": true }, "node_modules/emittery": { @@ -5760,9 +5760,9 @@ } }, "node_modules/express-rate-limit": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.10.0.tgz", - "integrity": "sha512-CtGn2IyklQnIWpA4pcRaovXkNR8psDQ9Fa0y5u7Yhz5TL74dNsm7oXpfm1HPKUYiNe5w0TPEyNbIrvNVU/xUIg==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.0.tgz", + "integrity": "sha512-H9afltGTaEZcvenAB5LFgb/ysTMHUzMxoB3TJM6UHP5FtAP1p2+heMj1xwTei54Zm4I9I/2qsS5m+XrdKQp/Hw==", "engines": { "node": ">= 14" }, @@ -11507,14 +11507,14 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -11524,14 +11524,14 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -12793,9 +12793,9 @@ } }, "node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.0.tgz", + "integrity": "sha512-WR0RJE9Ehsio6U4TuM+LmunEsjQ5ncHlw4sn9ihD6RoJKZrVyH9FWV3dmnwu8B2aNib1OvG2X6adUCyFpQyWcg==", "dev": true, "engines": { "node": ">=10.0.0" diff --git a/portal/package.json b/portal/package.json index 4b19179296..0764bb4d31 100644 --- a/portal/package.json +++ b/portal/package.json @@ -46,11 +46,11 @@ "connect-flash": "0.1.1", "connect-redis": "5.2.0", "cookie-parser": "^1.4.6", - "core-js": "^3.32.1", + "core-js": "^3.32.2", "csurf": "^1.11.0", "dotenv": "16.0.3", "express": "^4.18.2", - "express-rate-limit": "^6.10.0", + "express-rate-limit": "^6.11.0", "express-session": "1.17.3", "form-data": "4.0.0", "govuk-frontend": "4.6.0", diff --git a/portal/templates/_partials/before-you-start.njk b/portal/templates/_partials/before-you-start.njk index 92b671670a..5bf0fee0ba 100644 --- a/portal/templates/_partials/before-you-start.njk +++ b/portal/templates/_partials/before-you-start.njk @@ -16,7 +16,7 @@
  • Santander UK plc.
  • Newable Bank
  • Emirates NBD Bank (P.J.S.C)
  • -
  • Virgin Money UK
  • +
  • Virgin Money
  • Guarantees are provided by UK Export Finance under the terms of the master guarantee agreement (MGA) for either the:

    diff --git a/trade-finance-manager-api/api-tests/api-ssrf.api-test.js b/trade-finance-manager-api/api-tests/api-ssrf.api-test.js index 32ed6398cc..a1c749d5e9 100644 --- a/trade-finance-manager-api/api-tests/api-ssrf.api-test.js +++ b/trade-finance-manager-api/api-tests/api-ssrf.api-test.js @@ -323,7 +323,7 @@ describe('API is protected against SSRF attacks', () => { }); }); - describe('findFacilitesByDealId', () => { + describe('findFacilitiesByDealId', () => { const mockResponse = 'Mock facilities'; beforeAll(() => { mockAxios.reset(); @@ -335,7 +335,7 @@ describe('API is protected against SSRF attacks', () => { const urlTraversal = '../../../etc/stealpassword'; const expectedResponse = { status: 400, data: 'Invalid deal id' }; - const response = await api.findFacilitesByDealId(urlTraversal); + const response = await api.findFacilitiesByDealId(urlTraversal); expect(response).toMatchObject(expectedResponse); }); @@ -344,7 +344,7 @@ describe('API is protected against SSRF attacks', () => { const localIp = '127.0.0.1'; const expectedResponse = { status: 400, data: 'Invalid deal id' }; - const response = await api.findFacilitesByDealId(localIp); + const response = await api.findFacilitiesByDealId(localIp); expect(response).toMatchObject(expectedResponse); }); @@ -352,7 +352,7 @@ describe('API is protected against SSRF attacks', () => { it('Makes an axios request when the deal id is valid', async () => { const validDealId = '5ce819935e539c343f141ece'; - const response = await api.findFacilitesByDealId(validDealId); + const response = await api.findFacilitiesByDealId(validDealId); expect(response).toEqual(mockResponse); }); diff --git a/trade-finance-manager-api/api-tests/v1/deals/deals-submit.second-submission.api-test.js b/trade-finance-manager-api/api-tests/v1/deals/deals-submit.second-submission.api-test.js index 124c178c51..5b3fc0bc78 100644 --- a/trade-finance-manager-api/api-tests/v1/deals/deals-submit.second-submission.api-test.js +++ b/trade-finance-manager-api/api-tests/v1/deals/deals-submit.second-submission.api-test.js @@ -12,7 +12,7 @@ const MOCK_DEAL_MIA_SECOND_SUBMIT_FACILITIES_UNISSUED_TO_ISSUED = require('../.. const MOCK_DEAL_MIN_SECOND_SUBMIT_FACILITIES_UNISSUED_TO_ISSUED = require('../../../src/v1/__mocks__/mock-deal-MIN-second-submit-facilities-unissued-to-issued'); const MOCK_MIA_SECOND_SUBMIT = require('../../../src/v1/__mocks__/mock-deal-MIA-second-submit'); const MOCK_NOTIFY_EMAIL_RESPONSE = require('../../../src/v1/__mocks__/mock-notify-email-response'); -const MOCK_PREMIUM_SCHEUDLE_RESPONSE = require('../../../src/v1/__mocks__/mock-premium-schedule-response'); +const MOCK_PREMIUM_SCHEDULE_RESPONSE = require('../../../src/v1/__mocks__/mock-premium-schedule-response'); const { MOCK_FACILITIES } = require('../../../src/v1/__mocks__/mock-facilities'); const MOCK_GEF_DEAL = require('../../../src/v1/__mocks__/mock-gef-deal'); const MOCK_GEF_DEAL_SECOND_SUBMIT_MIA = require('../../../src/v1/__mocks__/mock-gef-deal-second-submit-MIA'); @@ -175,7 +175,7 @@ describe('/v1/deals', () => { const updatedBond = body.facilities.find((f) => f.type === CONSTANTS.FACILITIES.FACILITY_TYPE.BOND); - const expected = MOCK_PREMIUM_SCHEUDLE_RESPONSE; + const expected = MOCK_PREMIUM_SCHEDULE_RESPONSE; expect(updatedBond.tfm.premiumSchedule).toEqual(expected); }); @@ -210,7 +210,7 @@ describe('/v1/deals', () => { }); }); - describe('when a loan faciliy is issued (`Unconditional`)', () => { + describe('when a loan facility is issued (`Unconditional`)', () => { it('should update loan status to `Acknowledged`', async () => { // check status before calling submit endpoint const initialLoan = MOCK_DEAL_AIN_SECOND_SUBMIT_FACILITIES_UNISSUED_TO_ISSUED.loanTransactions.items[0]; @@ -273,7 +273,7 @@ describe('/v1/deals', () => { const updatedLoan = body.facilities.find((f) => f.type === CONSTANTS.FACILITIES.FACILITY_TYPE.LOAN); - const expected = MOCK_PREMIUM_SCHEUDLE_RESPONSE; + const expected = MOCK_PREMIUM_SCHEDULE_RESPONSE; expect(updatedLoan.tfm.premiumSchedule).toEqual(expected); }); @@ -422,7 +422,7 @@ describe('/v1/deals', () => { const updatedBond = body.facilities.find((f) => f.type === CONSTANTS.FACILITIES.FACILITY_TYPE.BOND); - const expected = MOCK_PREMIUM_SCHEUDLE_RESPONSE; + const expected = MOCK_PREMIUM_SCHEDULE_RESPONSE; expect(updatedBond.tfm.premiumSchedule).toEqual(expected); }); @@ -452,7 +452,7 @@ describe('/v1/deals', () => { const updatedLoan = body.facilities.find((f) => f.type === CONSTANTS.FACILITIES.FACILITY_TYPE.LOAN); - const expected = MOCK_PREMIUM_SCHEUDLE_RESPONSE; + const expected = MOCK_PREMIUM_SCHEDULE_RESPONSE; expect(updatedLoan.tfm.premiumSchedule).toEqual(expected); }); @@ -496,7 +496,7 @@ describe('/v1/deals', () => { const updatedBond = body.facilities.find((f) => f.type === CONSTANTS.FACILITIES.FACILITY_TYPE.BOND); - const expected = MOCK_PREMIUM_SCHEUDLE_RESPONSE; + const expected = MOCK_PREMIUM_SCHEDULE_RESPONSE; expect(updatedBond.tfm.premiumSchedule).toEqual(expected); }); @@ -526,7 +526,7 @@ describe('/v1/deals', () => { const updatedLoan = body.facilities.find((f) => f.type === CONSTANTS.FACILITIES.FACILITY_TYPE.LOAN); - const expected = MOCK_PREMIUM_SCHEUDLE_RESPONSE; + const expected = MOCK_PREMIUM_SCHEDULE_RESPONSE; expect(updatedLoan.tfm.premiumSchedule).toEqual(expected); }); diff --git a/trade-finance-manager-api/api-tests/v1/mappings/map-deals.api-test.js b/trade-finance-manager-api/api-tests/v1/mappings/map-deals.api-test.js index 2bc436bbee..6960747624 100644 --- a/trade-finance-manager-api/api-tests/v1/mappings/map-deals.api-test.js +++ b/trade-finance-manager-api/api-tests/v1/mappings/map-deals.api-test.js @@ -5,7 +5,7 @@ const MOCK_BSS_DEAL = require('../../../src/v1/__mocks__/mock-deal'); const MOCK_GEF_DEAL = require('../../../src/v1/__mocks__/mock-gef-deal'); describe('mappings - map-deals', () => { - const mockFindFacilitesByDealIdResponse = MOCK_GEF_DEAL.facilities.map((facility) => ({ + const mockFindFacilitiesByDealIdResponse = MOCK_GEF_DEAL.facilities.map((facility) => ({ facilitySnapshot: facility, tfm: {}, })); @@ -15,14 +15,14 @@ describe('mappings - map-deals', () => { tfm: {}, }; - const findFacilitesByDealIdSpy = jest.fn(() => Promise.resolve(mockFindFacilitesByDealIdResponse)); + const findFacilitiesByDealIdSpy = jest.fn(() => Promise.resolve(mockFindFacilitiesByDealIdResponse)); const findOneFacilitySpy = jest.fn(() => Promise.resolve(mockFindOneFacilityResponse)); beforeEach(() => { - findFacilitesByDealIdSpy.mockClear(); + findFacilitiesByDealIdSpy.mockClear(); findOneFacilitySpy.mockClear(); - externalApis.findFacilitesByDealId = findFacilitesByDealIdSpy; + externalApis.findFacilitiesByDealId = findFacilitiesByDealIdSpy; externalApis.findOneFacility = findOneFacilitySpy; }); @@ -32,14 +32,14 @@ describe('mappings - map-deals', () => { { _id: MOCK_GEF_DEAL._id, dealSnapshot: MOCK_GEF_DEAL }, ]; - it('should call api.findFacilitesByDealId with deal id', async () => { + it('should call api.findFacilitiesByDealId with deal id', async () => { await mapDeals(mockDeals); const expectedCallCount = mockDeals.length; - expect(findFacilitesByDealIdSpy).toHaveBeenCalledTimes(expectedCallCount); + expect(findFacilitiesByDealIdSpy).toHaveBeenCalledTimes(expectedCallCount); - const findOneFacilityCalls = externalApis.findFacilitesByDealId.mock.calls; + const findOneFacilityCalls = externalApis.findFacilitiesByDealId.mock.calls; // both deals use the same mock deals const expectedCalls = [ @@ -57,7 +57,7 @@ describe('mappings - map-deals', () => { ...mockDeals[0], dealSnapshot: { ...mockDeals[0].dealSnapshot, - facilities: mockFindFacilitesByDealIdResponse, + facilities: mockFindFacilitiesByDealIdResponse, }, }; diff --git a/trade-finance-manager-api/package-lock.json b/trade-finance-manager-api/package-lock.json index 05cda27b70..4539d4c897 100644 --- a/trade-finance-manager-api/package-lock.json +++ b/trade-finance-manager-api/package-lock.json @@ -21,7 +21,7 @@ "dotenv": "16.0.3", "express": "4.18.2", "express-mongo-sanitize": "^2.2.0", - "express-rate-limit": "^6.10.0", + "express-rate-limit": "^6.11.0", "express-validator": "7.0.1", "graphql": "^16.8.0", "graphql-middleware": "^6.1.35", @@ -697,9 +697,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.15.tgz", - "integrity": "sha512-RWmQ/sklUN9BvGGpCDgSubhHWfAx24XDTDObup4ffvxaYsptOg2P3KG0j+1eWKLxpkX0j0uHxmpq2Z1SP/VhxA==", + "version": "7.22.16", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", + "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -2573,14 +2573,14 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -2977,9 +2977,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001527", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001527.tgz", - "integrity": "sha512-YkJi7RwPgWtXVSgK4lG9AHH57nSzvvOp9MesgXmw4Q7n0C3H04L0foHqfxcmSAm5AcWb8dW9AYj2tR7/5GnddQ==", + "version": "1.0.30001529", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001529.tgz", + "integrity": "sha512-n2pUQYGAkrLG4QYj2desAh+NqsJpHbNmVZz87imptDdxLAtjxary7Df/psdfyDGmskJK/9Dt9cPnx5RZ3CU4Og==", "dev": true, "funding": [ { @@ -3521,9 +3521,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.508", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.508.tgz", - "integrity": "sha512-FFa8QKjQK/A5QuFr2167myhMesGrhlOBD+3cYNxO9/S4XzHEXesyTD/1/xF644gC8buFPz3ca6G1LOQD0tZrrg==", + "version": "1.4.512", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.512.tgz", + "integrity": "sha512-1W8wRbYlQE4ph7eoj3TJ+uqwO6+xvAE/L+KGU7WTQQvX3tnSIGZAb90MTsMoJqzntamiwJhBAj4WZmygXhsOUg==", "dev": true }, "node_modules/emittery": { @@ -4107,9 +4107,9 @@ } }, "node_modules/express-rate-limit": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.10.0.tgz", - "integrity": "sha512-CtGn2IyklQnIWpA4pcRaovXkNR8psDQ9Fa0y5u7Yhz5TL74dNsm7oXpfm1HPKUYiNe5w0TPEyNbIrvNVU/xUIg==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.0.tgz", + "integrity": "sha512-H9afltGTaEZcvenAB5LFgb/ysTMHUzMxoB3TJM6UHP5FtAP1p2+heMj1xwTei54Zm4I9I/2qsS5m+XrdKQp/Hw==", "engines": { "node": ">= 14" }, @@ -7718,14 +7718,14 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -7735,14 +7735,14 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" diff --git a/trade-finance-manager-api/package.json b/trade-finance-manager-api/package.json index eaac3d1120..b0c18c0d76 100644 --- a/trade-finance-manager-api/package.json +++ b/trade-finance-manager-api/package.json @@ -48,7 +48,7 @@ "dotenv": "16.0.3", "express": "4.18.2", "express-mongo-sanitize": "^2.2.0", - "express-rate-limit": "^6.10.0", + "express-rate-limit": "^6.11.0", "express-validator": "7.0.1", "graphql": "^16.8.0", "graphql-middleware": "^6.1.35", diff --git a/trade-finance-manager-api/src/v1/__mocks__/api.js b/trade-finance-manager-api/src/v1/__mocks__/api.js index b39d474734..bc7d65eb55 100644 --- a/trade-finance-manager-api/src/v1/__mocks__/api.js +++ b/trade-finance-manager-api/src/v1/__mocks__/api.js @@ -21,7 +21,7 @@ const MOCK_AIN_TASKS = require('./mock-AIN-tasks'); const MOCK_MIA_TASKS = require('./mock-MIA-tasks'); const MOCK_USERS = require('./mock-users'); const MOCK_TEAMS = require('./mock-teams'); -const MOCK_PREMIUM_SCHEUDLE_RESPONSE = require('./mock-premium-schedule-response'); +const MOCK_PREMIUM_SCHEDULE_RESPONSE = require('./mock-premium-schedule-response'); const MOCK_GEF_DEAL = require('./mock-gef-deal'); const MOCK_GEF_DEAL_MIA = require('./mock-gef-deal-MIA'); @@ -65,11 +65,11 @@ module.exports = { let tfmStage; let tfmProduct; - if (mockDeal && mockDeal.tfm && mockDeal.tfm.stage) { + if (mockDeal?.tfm?.stage) { tfmStage = mockDeal.tfm.stage; } - if (mockDeal && mockDeal.tfm && mockDeal.tfm.product) { + if (mockDeal?.tfm?.product) { tfmProduct = mockDeal.tfm.product; } @@ -274,7 +274,7 @@ module.exports = { }, }; }, - findFacilitesByDealId: (dealId) => { + findFacilitiesByDealId: (dealId) => { const facilities = ALL_MOCK_FACILITIES.filter((f) => f.dealId === dealId); const mapped = facilities.map((facility) => ({ @@ -355,7 +355,7 @@ module.exports = { }, })), createEstoreFolders: (deal) => deal, - getPremiumSchedule: jest.fn(() => MOCK_PREMIUM_SCHEUDLE_RESPONSE), + getPremiumSchedule: jest.fn(() => MOCK_PREMIUM_SCHEDULE_RESPONSE), sendEmail: jest.fn(( templateId, sendToEmailAddress, diff --git a/trade-finance-manager-api/src/v1/api.js b/trade-finance-manager-api/src/v1/api.js index dcbd6abfc6..23332a219e 100644 --- a/trade-finance-manager-api/src/v1/api.js +++ b/trade-finance-manager-api/src/v1/api.js @@ -283,12 +283,12 @@ const findOneFacility = async (facilityId) => { } }; -const findFacilitesByDealId = async (dealId) => { +const findFacilitiesByDealId = async (dealId) => { try { const isValidDealId = isValidMongoId(dealId); if (!isValidDealId) { - console.error('findFacilitesByDealId: Invalid deal id: %s', dealId); + console.error('findFacilitiesByDealId: Invalid deal id: %s', dealId); return { status: 400, data: 'Invalid deal id' }; } @@ -1200,7 +1200,7 @@ module.exports = { submitDeal, getAllFacilities, findOneFacility, - findFacilitesByDealId, + findFacilitiesByDealId, updateFacility, createFacilityAmendment, updateFacilityAmendment, diff --git a/trade-finance-manager-api/src/v1/mappings/map-deal.js b/trade-finance-manager-api/src/v1/mappings/map-deal.js index e47fb00d87..d8a1c33b8b 100644 --- a/trade-finance-manager-api/src/v1/mappings/map-deal.js +++ b/trade-finance-manager-api/src/v1/mappings/map-deal.js @@ -27,7 +27,7 @@ const mapDeal = async (deal) => { } if (deal.dealType === CONSTANTS.DEALS.DEAL_TYPE.GEF) { - mappedDeal.facilities = await api.findFacilitesByDealId(deal._id); + mappedDeal.facilities = await api.findFacilitiesByDealId(deal._id); } return mappedDeal; diff --git a/trade-finance-manager-api/src/v1/mappings/map-deals.js b/trade-finance-manager-api/src/v1/mappings/map-deals.js index 39587992bd..6f76fbb462 100644 --- a/trade-finance-manager-api/src/v1/mappings/map-deals.js +++ b/trade-finance-manager-api/src/v1/mappings/map-deals.js @@ -12,7 +12,7 @@ const mapDeals = async (deals) => { const { dealType } = dealSnapshot; if (dealType === CONSTANTS.DEALS.DEAL_TYPE.GEF) { - dealSnapshot.facilities = await api.findFacilitesByDealId(deal._id); + dealSnapshot.facilities = await api.findFacilitiesByDealId(deal._id); return deal; } diff --git a/trade-finance-manager-ui/package-lock.json b/trade-finance-manager-ui/package-lock.json index 8c0032e945..8906b240a3 100644 --- a/trade-finance-manager-ui/package-lock.json +++ b/trade-finance-manager-ui/package-lock.json @@ -23,12 +23,12 @@ "connect-flash": "0.1.1", "connect-redis": "^5.2.0", "cookie-parser": "^1.4.6", - "core-js": "^3.32.1", + "core-js": "^3.32.2", "csurf": "^1.11.0", "date-fns": "^2.30.0", "dotenv": "16.0.3", "express": "^4.18.2", - "express-rate-limit": "^6.10.0", + "express-rate-limit": "^6.11.0", "express-session": "1.17.3", "express-validator": "7.0.1", "express-xss-sanitizer": "^1.1.6", @@ -504,9 +504,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.15.tgz", - "integrity": "sha512-RWmQ/sklUN9BvGGpCDgSubhHWfAx24XDTDObup4ffvxaYsptOg2P3KG0j+1eWKLxpkX0j0uHxmpq2Z1SP/VhxA==", + "version": "7.22.16", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", + "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -3540,14 +3540,14 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -4063,9 +4063,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001527", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001527.tgz", - "integrity": "sha512-YkJi7RwPgWtXVSgK4lG9AHH57nSzvvOp9MesgXmw4Q7n0C3H04L0foHqfxcmSAm5AcWb8dW9AYj2tR7/5GnddQ==", + "version": "1.0.30001529", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001529.tgz", + "integrity": "sha512-n2pUQYGAkrLG4QYj2desAh+NqsJpHbNmVZz87imptDdxLAtjxary7Df/psdfyDGmskJK/9Dt9cPnx5RZ3CU4Og==", "dev": true, "funding": [ { @@ -4494,9 +4494,9 @@ } }, "node_modules/core-js": { - "version": "3.32.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.32.1.tgz", - "integrity": "sha512-lqufgNn9NLnESg5mQeYsxQP5w7wrViSj0jr/kv6ECQiByzQkrn1MKvV0L3acttpDqfQrHLwr2KCMgX5b8X+lyQ==", + "version": "3.32.2", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.32.2.tgz", + "integrity": "sha512-pxXSw1mYZPDGvTQqEc5vgIb83jGQKFGYWY76z4a7weZXUolw3G+OvpZqSRcfYOoOVUQJYEPsWeQK8pKEnUtWxQ==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -4504,9 +4504,9 @@ } }, "node_modules/core-js-compat": { - "version": "3.32.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.32.1.tgz", - "integrity": "sha512-GSvKDv4wE0bPnQtjklV101juQ85g6H3rm5PDP20mqlS5j0kXF3pP97YvAu5hl+uFHqMictp3b2VxOHljWMAtuA==", + "version": "3.32.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.32.2.tgz", + "integrity": "sha512-+GjlguTDINOijtVRUxrQOv3kfu9rl+qPNdX2LTbJ/ZyVTuxK+ksVSAGX1nHstu4hrv1En/uPTtWgq2gI5wt4AQ==", "dev": true, "dependencies": { "browserslist": "^4.21.10" @@ -4941,9 +4941,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.508", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.508.tgz", - "integrity": "sha512-FFa8QKjQK/A5QuFr2167myhMesGrhlOBD+3cYNxO9/S4XzHEXesyTD/1/xF644gC8buFPz3ca6G1LOQD0tZrrg==", + "version": "1.4.512", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.512.tgz", + "integrity": "sha512-1W8wRbYlQE4ph7eoj3TJ+uqwO6+xvAE/L+KGU7WTQQvX3tnSIGZAb90MTsMoJqzntamiwJhBAj4WZmygXhsOUg==", "dev": true }, "node_modules/emittery": { @@ -5733,9 +5733,9 @@ } }, "node_modules/express-rate-limit": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.10.0.tgz", - "integrity": "sha512-CtGn2IyklQnIWpA4pcRaovXkNR8psDQ9Fa0y5u7Yhz5TL74dNsm7oXpfm1HPKUYiNe5w0TPEyNbIrvNVU/xUIg==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.0.tgz", + "integrity": "sha512-H9afltGTaEZcvenAB5LFgb/ysTMHUzMxoB3TJM6UHP5FtAP1p2+heMj1xwTei54Zm4I9I/2qsS5m+XrdKQp/Hw==", "engines": { "node": ">= 14" }, @@ -11335,14 +11335,14 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -11352,14 +11352,14 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" diff --git a/trade-finance-manager-ui/package.json b/trade-finance-manager-ui/package.json index d7548cfa8f..43c00685d0 100644 --- a/trade-finance-manager-ui/package.json +++ b/trade-finance-manager-ui/package.json @@ -54,12 +54,12 @@ "connect-flash": "0.1.1", "connect-redis": "^5.2.0", "cookie-parser": "^1.4.6", - "core-js": "^3.32.1", + "core-js": "^3.32.2", "csurf": "^1.11.0", "date-fns": "^2.30.0", "dotenv": "16.0.3", "express": "^4.18.2", - "express-rate-limit": "^6.10.0", + "express-rate-limit": "^6.11.0", "express-session": "1.17.3", "express-validator": "7.0.1", "express-xss-sanitizer": "^1.1.6", diff --git a/trade-finance-manager-ui/server/controllers/case/amendments/bankDecision.controller.js b/trade-finance-manager-ui/server/controllers/case/amendments/bankDecision.controller.js index ee7222cf42..e8a4ae2697 100644 --- a/trade-finance-manager-ui/server/controllers/case/amendments/bankDecision.controller.js +++ b/trade-finance-manager-ui/server/controllers/case/amendments/bankDecision.controller.js @@ -228,7 +228,7 @@ const postAmendmentBankDecisionEffectiveDate = async (req, res) => { return res.redirect(`/case/${dealId}/facility/${facilityId}/amendment/${amendmentId}/banks-decision/check-answers`); } - console.error('Unable to add the bank\'s decision efective date'); + console.error('Unable to add the bank\'s decision effective date'); return res.redirect(`/case/${dealId}/underwriting`); } catch (error) { console.error('There was a problem adding the bank\'s decision effective date %s', error?.response?.data); diff --git a/utils/data-migration/package-lock.json b/utils/data-migration/package-lock.json index 9c670829bc..c695c81303 100644 --- a/utils/data-migration/package-lock.json +++ b/utils/data-migration/package-lock.json @@ -130,24 +130,24 @@ "optional": true }, "node_modules/@aws-sdk/client-cognito-identity": { - "version": "3.405.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.405.0.tgz", - "integrity": "sha512-kvmNAREFQbhaZoEMQzBOYTaN7cFIOLgk2DZYYlHh2ErUYXSbvbVOBUriMRW9hRDtKLooe3ZFBLO3sWKvQE/AfA==", + "version": "3.408.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.408.0.tgz", + "integrity": "sha512-SJfFXLvjnERmm9X4H/43J1Ax6lX3C5XwRn6eImBaBNwT4JQVMSG/kf9vG8dvLkvvnh4t1RM7p12bkc9AI41zBA==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.405.0", - "@aws-sdk/credential-provider-node": "3.405.0", - "@aws-sdk/middleware-host-header": "3.398.0", - "@aws-sdk/middleware-logger": "3.398.0", - "@aws-sdk/middleware-recursion-detection": "3.398.0", - "@aws-sdk/middleware-signing": "3.398.0", - "@aws-sdk/middleware-user-agent": "3.398.0", - "@aws-sdk/types": "3.398.0", - "@aws-sdk/util-endpoints": "3.398.0", - "@aws-sdk/util-user-agent-browser": "3.398.0", - "@aws-sdk/util-user-agent-node": "3.405.0", + "@aws-sdk/client-sts": "3.408.0", + "@aws-sdk/credential-provider-node": "3.408.0", + "@aws-sdk/middleware-host-header": "3.408.0", + "@aws-sdk/middleware-logger": "3.408.0", + "@aws-sdk/middleware-recursion-detection": "3.408.0", + "@aws-sdk/middleware-signing": "3.408.0", + "@aws-sdk/middleware-user-agent": "3.408.0", + "@aws-sdk/types": "3.408.0", + "@aws-sdk/util-endpoints": "3.408.0", + "@aws-sdk/util-user-agent-browser": "3.408.0", + "@aws-sdk/util-user-agent-node": "3.408.0", "@smithy/config-resolver": "^2.0.5", "@smithy/fetch-http-handler": "^2.0.5", "@smithy/hash-node": "^2.0.5", @@ -177,21 +177,21 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.405.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.405.0.tgz", - "integrity": "sha512-z1ssydU07bDhe0tNXQwVO+rWh/iSfK48JI8s8vgpBNwH+NejMzIJ9r3AkjCiJ+LSAwlBZItUsNWwR0veIfgBiw==", + "version": "3.408.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.408.0.tgz", + "integrity": "sha512-g0Y904ghLTg9JLJnmbuvf10Hrzwqn2pko6aCAK10vCI5Y2nQ6BAUXuPonxhZIlp+JHsk0B2FUBqquc+bErUspA==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/middleware-host-header": "3.398.0", - "@aws-sdk/middleware-logger": "3.398.0", - "@aws-sdk/middleware-recursion-detection": "3.398.0", - "@aws-sdk/middleware-user-agent": "3.398.0", - "@aws-sdk/types": "3.398.0", - "@aws-sdk/util-endpoints": "3.398.0", - "@aws-sdk/util-user-agent-browser": "3.398.0", - "@aws-sdk/util-user-agent-node": "3.405.0", + "@aws-sdk/middleware-host-header": "3.408.0", + "@aws-sdk/middleware-logger": "3.408.0", + "@aws-sdk/middleware-recursion-detection": "3.408.0", + "@aws-sdk/middleware-user-agent": "3.408.0", + "@aws-sdk/types": "3.408.0", + "@aws-sdk/util-endpoints": "3.408.0", + "@aws-sdk/util-user-agent-browser": "3.408.0", + "@aws-sdk/util-user-agent-node": "3.408.0", "@smithy/config-resolver": "^2.0.5", "@smithy/fetch-http-handler": "^2.0.5", "@smithy/hash-node": "^2.0.5", @@ -221,24 +221,24 @@ } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.405.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.405.0.tgz", - "integrity": "sha512-asVEpda3zu5QUO5ZNNjbLBS0718IhxxyUDVrNmVTKZoOhK1pMNouGZf+l49v0Lb5cOPbUds8cxsNaInj2MvIKw==", + "version": "3.408.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.408.0.tgz", + "integrity": "sha512-PpNmhCuFjVrgGBy00RVh3evBxzFfvUrALDqpBnPYhz489Qzg2I+T90FqdSUedPQPYe+qhq0YJMPKc9leYBEB/w==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/credential-provider-node": "3.405.0", - "@aws-sdk/middleware-host-header": "3.398.0", - "@aws-sdk/middleware-logger": "3.398.0", - "@aws-sdk/middleware-recursion-detection": "3.398.0", - "@aws-sdk/middleware-sdk-sts": "3.398.0", - "@aws-sdk/middleware-signing": "3.398.0", - "@aws-sdk/middleware-user-agent": "3.398.0", - "@aws-sdk/types": "3.398.0", - "@aws-sdk/util-endpoints": "3.398.0", - "@aws-sdk/util-user-agent-browser": "3.398.0", - "@aws-sdk/util-user-agent-node": "3.405.0", + "@aws-sdk/credential-provider-node": "3.408.0", + "@aws-sdk/middleware-host-header": "3.408.0", + "@aws-sdk/middleware-logger": "3.408.0", + "@aws-sdk/middleware-recursion-detection": "3.408.0", + "@aws-sdk/middleware-sdk-sts": "3.408.0", + "@aws-sdk/middleware-signing": "3.408.0", + "@aws-sdk/middleware-user-agent": "3.408.0", + "@aws-sdk/types": "3.408.0", + "@aws-sdk/util-endpoints": "3.408.0", + "@aws-sdk/util-user-agent-browser": "3.408.0", + "@aws-sdk/util-user-agent-node": "3.408.0", "@smithy/config-resolver": "^2.0.5", "@smithy/fetch-http-handler": "^2.0.5", "@smithy/hash-node": "^2.0.5", @@ -269,13 +269,13 @@ } }, "node_modules/@aws-sdk/credential-provider-cognito-identity": { - "version": "3.405.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.405.0.tgz", - "integrity": "sha512-tmu8r0kB3qHHIitQAwiziWzxoaGCv/vCh00EcabuW3x3UsKQUF71ZLuNcMOv5wqTsQw0Fmv3dKy2tzVmRm3Z5g==", + "version": "3.408.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.408.0.tgz", + "integrity": "sha512-P3Yj/u54oceD4CHzoHgvb2YAmrKTm/uqsgbJcWJ6RwEkJ7awF6aOzUYLRK1z1PCtfq6YdHUmrv2RkxcQnQeboA==", "optional": true, "dependencies": { - "@aws-sdk/client-cognito-identity": "3.405.0", - "@aws-sdk/types": "3.398.0", + "@aws-sdk/client-cognito-identity": "3.408.0", + "@aws-sdk/types": "3.408.0", "@smithy/property-provider": "^2.0.0", "@smithy/types": "^2.2.2", "tslib": "^2.5.0" @@ -285,12 +285,12 @@ } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.398.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.398.0.tgz", - "integrity": "sha512-Z8Yj5z7FroAsR6UVML+XUdlpoqEe9Dnle8c2h8/xWwIC2feTfIBhjLhRVxfbpbM1pLgBSNEcZ7U8fwq5l7ESVQ==", + "version": "3.408.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.408.0.tgz", + "integrity": "sha512-GCpgHEHxRTzKaMkwDC2gLb3xlD+ZxhKPUJ1DVcO7I9E3eCGJsYVedIi0/2XE+NP+HVoy8LyW2qH8QQWh64JKow==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.398.0", + "@aws-sdk/types": "3.408.0", "@smithy/property-provider": "^2.0.0", "@smithy/types": "^2.2.2", "tslib": "^2.5.0" @@ -300,16 +300,16 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.405.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.405.0.tgz", - "integrity": "sha512-b4TqVsM4WQM96GDVs+TYOhU2/0SnUWzz6NH55qY1y2xyF8/pZEhc0XXdpvZtQQBLGdROhXCbxhBVye8GmTpgcg==", + "version": "3.408.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.408.0.tgz", + "integrity": "sha512-vXuayXiwHncd3Xush0jQYrnu2aPPlE+fpdnpEdZGgUJwdbv2vSeYZ73ldH1LzCd179BEDVT0J7nHc7fposo3kg==", "optional": true, "dependencies": { - "@aws-sdk/credential-provider-env": "3.398.0", - "@aws-sdk/credential-provider-process": "3.405.0", - "@aws-sdk/credential-provider-sso": "3.405.0", - "@aws-sdk/credential-provider-web-identity": "3.398.0", - "@aws-sdk/types": "3.398.0", + "@aws-sdk/credential-provider-env": "3.408.0", + "@aws-sdk/credential-provider-process": "3.408.0", + "@aws-sdk/credential-provider-sso": "3.408.0", + "@aws-sdk/credential-provider-web-identity": "3.408.0", + "@aws-sdk/types": "3.408.0", "@smithy/credential-provider-imds": "^2.0.0", "@smithy/property-provider": "^2.0.0", "@smithy/shared-ini-file-loader": "^2.0.6", @@ -321,17 +321,17 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.405.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.405.0.tgz", - "integrity": "sha512-AMmRP09nwYsft0MXDlHIxMQe7IloWW8As0lbZmPrG7Y7mK5RDmCIwD2yMDz77Zqlv09FsYt+9+cOK2fTNhim+Q==", + "version": "3.408.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.408.0.tgz", + "integrity": "sha512-AzDtlj2Mb01K5+AiDI14HsIs9I/pI4nM3kxeOZZvocaaThF5OFR+4wR2v2plhfGJ8QAPEE/KnqcJ3JlJ7orShg==", "optional": true, "dependencies": { - "@aws-sdk/credential-provider-env": "3.398.0", - "@aws-sdk/credential-provider-ini": "3.405.0", - "@aws-sdk/credential-provider-process": "3.405.0", - "@aws-sdk/credential-provider-sso": "3.405.0", - "@aws-sdk/credential-provider-web-identity": "3.398.0", - "@aws-sdk/types": "3.398.0", + "@aws-sdk/credential-provider-env": "3.408.0", + "@aws-sdk/credential-provider-ini": "3.408.0", + "@aws-sdk/credential-provider-process": "3.408.0", + "@aws-sdk/credential-provider-sso": "3.408.0", + "@aws-sdk/credential-provider-web-identity": "3.408.0", + "@aws-sdk/types": "3.408.0", "@smithy/credential-provider-imds": "^2.0.0", "@smithy/property-provider": "^2.0.0", "@smithy/shared-ini-file-loader": "^2.0.6", @@ -343,12 +343,12 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.405.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.405.0.tgz", - "integrity": "sha512-EqAMcUVeZAICYHHL8x5Fi5CYPgCo9UCE7ScWmU5Sa2wAFY4XLyQ1mMxX3lKGYx9lBxWk3dqnhmvlcqdzN7AjyQ==", + "version": "3.408.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.408.0.tgz", + "integrity": "sha512-qCTf9tr6+I2s3+v5zP4YRQQrGlYw/jyZ7u/k6bGshhlvgwGPfjNuHrM8uK/W1kv4ng1myxaL1/tAY6RVVdXz4Q==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.398.0", + "@aws-sdk/types": "3.408.0", "@smithy/property-provider": "^2.0.0", "@smithy/shared-ini-file-loader": "^2.0.6", "@smithy/types": "^2.2.2", @@ -359,14 +359,14 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.405.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.405.0.tgz", - "integrity": "sha512-fXqSgQHz7qcmIWMVguwSMSjqFkVfN2+XiNgiskcmeYiCS7mIGAgUnKABZc9Ds2+YW9ATYiY0BOD5aWxc8TX5fA==", + "version": "3.408.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.408.0.tgz", + "integrity": "sha512-iKU91cxrttQyDhdhF7vJZd6XibvwGolFzuJBG4DD4jOdvmTcVq4L26AH8bjR1psnS6pvTa66FaYt6BGtbXgVeA==", "optional": true, "dependencies": { - "@aws-sdk/client-sso": "3.405.0", - "@aws-sdk/token-providers": "3.405.0", - "@aws-sdk/types": "3.398.0", + "@aws-sdk/client-sso": "3.408.0", + "@aws-sdk/token-providers": "3.408.0", + "@aws-sdk/types": "3.408.0", "@smithy/property-provider": "^2.0.0", "@smithy/shared-ini-file-loader": "^2.0.6", "@smithy/types": "^2.2.2", @@ -377,12 +377,12 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.398.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.398.0.tgz", - "integrity": "sha512-iG3905Alv9pINbQ8/MIsshgqYMbWx+NDQWpxbIW3W0MkSH3iAqdVpSCteYidYX9G/jv2Um1nW3y360ib20bvNg==", + "version": "3.408.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.408.0.tgz", + "integrity": "sha512-5FbDPF/zY/1t6k1zRI/HnrxcH2v7SwsEYu2SThI2qbzaP/K7MTnTanV5vNFcdQOpuQ7x3PrzTlH3AWZueCr3Vw==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.398.0", + "@aws-sdk/types": "3.408.0", "@smithy/property-provider": "^2.0.0", "@smithy/types": "^2.2.2", "tslib": "^2.5.0" @@ -392,22 +392,22 @@ } }, "node_modules/@aws-sdk/credential-providers": { - "version": "3.405.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.405.0.tgz", - "integrity": "sha512-332QZ2Wrr5gfFUGPLwITcjhxnBD4y94fxKg7qerSBq7fjjIkl/OjnchZf5ReePrjpglxs6hgLdGrPYIYPC4Hhw==", - "optional": true, - "dependencies": { - "@aws-sdk/client-cognito-identity": "3.405.0", - "@aws-sdk/client-sso": "3.405.0", - "@aws-sdk/client-sts": "3.405.0", - "@aws-sdk/credential-provider-cognito-identity": "3.405.0", - "@aws-sdk/credential-provider-env": "3.398.0", - "@aws-sdk/credential-provider-ini": "3.405.0", - "@aws-sdk/credential-provider-node": "3.405.0", - "@aws-sdk/credential-provider-process": "3.405.0", - "@aws-sdk/credential-provider-sso": "3.405.0", - "@aws-sdk/credential-provider-web-identity": "3.398.0", - "@aws-sdk/types": "3.398.0", + "version": "3.408.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.408.0.tgz", + "integrity": "sha512-NVE5hDXlY4I4nRtaxf4vPTABWn2PoRUjCGW9HEOzD/oQx054OsXW0n1umviDncYCfiroCveRERM2htVIGiREng==", + "optional": true, + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.408.0", + "@aws-sdk/client-sso": "3.408.0", + "@aws-sdk/client-sts": "3.408.0", + "@aws-sdk/credential-provider-cognito-identity": "3.408.0", + "@aws-sdk/credential-provider-env": "3.408.0", + "@aws-sdk/credential-provider-ini": "3.408.0", + "@aws-sdk/credential-provider-node": "3.408.0", + "@aws-sdk/credential-provider-process": "3.408.0", + "@aws-sdk/credential-provider-sso": "3.408.0", + "@aws-sdk/credential-provider-web-identity": "3.408.0", + "@aws-sdk/types": "3.408.0", "@smithy/credential-provider-imds": "^2.0.0", "@smithy/property-provider": "^2.0.0", "@smithy/types": "^2.2.2", @@ -418,12 +418,12 @@ } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.398.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.398.0.tgz", - "integrity": "sha512-m+5laWdBaxIZK2ko0OwcCHJZJ5V1MgEIt8QVQ3k4/kOkN9ICjevOYmba751pHoTnbOYB7zQd6D2OT3EYEEsUcA==", + "version": "3.408.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.408.0.tgz", + "integrity": "sha512-eofCXuSZ+ntbLzeCRdHzraXzgWqAplXU7W2qFFVC4O9lZBhADwNPI8n8x98TH0mftnmvZxh5Bo5U8WvEolIDkw==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.398.0", + "@aws-sdk/types": "3.408.0", "@smithy/protocol-http": "^2.0.5", "@smithy/types": "^2.2.2", "tslib": "^2.5.0" @@ -433,12 +433,12 @@ } }, "node_modules/@aws-sdk/middleware-logger": { - "version": "3.398.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.398.0.tgz", - "integrity": "sha512-CiJjW+FL12elS6Pn7/UVjVK8HWHhXMfvHZvOwx/Qkpy340sIhkuzOO6fZEruECDTZhl2Wqn81XdJ1ZQ4pRKpCg==", + "version": "3.408.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.408.0.tgz", + "integrity": "sha512-otwXPCubsGRFv8Hb6nKw6Vvnu4dC8CcPk05buStj42nF8QdjWrKGb2rDCvLph5lr576LF5HN+Y2moyOi7z/I7g==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.398.0", + "@aws-sdk/types": "3.408.0", "@smithy/types": "^2.2.2", "tslib": "^2.5.0" }, @@ -447,12 +447,12 @@ } }, "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.398.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.398.0.tgz", - "integrity": "sha512-7QpOqPQAZNXDXv6vsRex4R8dLniL0E/80OPK4PPFsrCh9btEyhN9Begh4i1T+5lL28hmYkztLOkTQ2N5J3hgRQ==", + "version": "3.408.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.408.0.tgz", + "integrity": "sha512-QfZwmX5z0IRC2c8pBi9VozSqbJw19V5oxyykSTqdjGe3CG3yNujXObV6xQesK67CWSnPb9wDgVGKUoYuIXwOxw==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.398.0", + "@aws-sdk/types": "3.408.0", "@smithy/protocol-http": "^2.0.5", "@smithy/types": "^2.2.2", "tslib": "^2.5.0" @@ -462,13 +462,13 @@ } }, "node_modules/@aws-sdk/middleware-sdk-sts": { - "version": "3.398.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.398.0.tgz", - "integrity": "sha512-+JH76XHEgfVihkY+GurohOQ5Z83zVN1nYcQzwCFnCDTh4dG4KwhnZKG+WPw6XJECocY0R+H0ivofeALHvVWJtQ==", + "version": "3.408.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.408.0.tgz", + "integrity": "sha512-dIO9BTX049P2PwaeAK2lxJeA2rZi9/bWzMP1GIE60VrMDHmN5Ljvh1lLActECLAqNQIqN5Ub0bKV2tC/jMn+CA==", "optional": true, "dependencies": { - "@aws-sdk/middleware-signing": "3.398.0", - "@aws-sdk/types": "3.398.0", + "@aws-sdk/middleware-signing": "3.408.0", + "@aws-sdk/types": "3.408.0", "@smithy/types": "^2.2.2", "tslib": "^2.5.0" }, @@ -477,12 +477,12 @@ } }, "node_modules/@aws-sdk/middleware-signing": { - "version": "3.398.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.398.0.tgz", - "integrity": "sha512-O0KqXAix1TcvZBFt1qoFkHMUNJOSgjJTYS7lFTRKSwgsD27bdW2TM2r9R8DAccWFt5Amjkdt+eOwQMIXPGTm8w==", + "version": "3.408.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.408.0.tgz", + "integrity": "sha512-flLiLKATJ4NLcLb7lPojyQ6NvLSyQ3axqIClqwMRnhSRxvREB7OgBKwmPecSl0I5JxsNEqo+mjARdMjUHadgWQ==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.398.0", + "@aws-sdk/types": "3.408.0", "@smithy/property-provider": "^2.0.0", "@smithy/protocol-http": "^2.0.5", "@smithy/signature-v4": "^2.0.0", @@ -495,13 +495,13 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.398.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.398.0.tgz", - "integrity": "sha512-nF1jg0L+18b5HvTcYzwyFgfZQQMELJINFqI0mi4yRKaX7T5a3aGp5RVLGGju/6tAGTuFbfBoEhkhU3kkxexPYQ==", + "version": "3.408.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.408.0.tgz", + "integrity": "sha512-UvlKri8/Mgf5W+tFU6ZJ65fC6HljcysIqfRFts/8Wurl322IS1I4j+pyjV2P6eK1054bzynfi3Trv+tRYHtVcA==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.398.0", - "@aws-sdk/util-endpoints": "3.398.0", + "@aws-sdk/types": "3.408.0", + "@aws-sdk/util-endpoints": "3.408.0", "@smithy/protocol-http": "^2.0.5", "@smithy/types": "^2.2.2", "tslib": "^2.5.0" @@ -511,21 +511,21 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.405.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.405.0.tgz", - "integrity": "sha512-rVzC7ptf7TlV84M9w+Ds9isio1EY7bs1MRFv/6lmYstsyTri+DaZG10TwXSGfzIMwB0yVh11niCxO9wSjQ36zg==", + "version": "3.408.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.408.0.tgz", + "integrity": "sha512-D//BjUrVtDzDdCz1mRdZZSAc822fh75Ssq46smeS6S6NKq3vJeHhfrQJMyVU1GclXu1tn9AwykaQW5Jwb5im+g==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/middleware-host-header": "3.398.0", - "@aws-sdk/middleware-logger": "3.398.0", - "@aws-sdk/middleware-recursion-detection": "3.398.0", - "@aws-sdk/middleware-user-agent": "3.398.0", - "@aws-sdk/types": "3.398.0", - "@aws-sdk/util-endpoints": "3.398.0", - "@aws-sdk/util-user-agent-browser": "3.398.0", - "@aws-sdk/util-user-agent-node": "3.405.0", + "@aws-sdk/middleware-host-header": "3.408.0", + "@aws-sdk/middleware-logger": "3.408.0", + "@aws-sdk/middleware-recursion-detection": "3.408.0", + "@aws-sdk/middleware-user-agent": "3.408.0", + "@aws-sdk/types": "3.408.0", + "@aws-sdk/util-endpoints": "3.408.0", + "@aws-sdk/util-user-agent-browser": "3.408.0", + "@aws-sdk/util-user-agent-node": "3.408.0", "@smithy/config-resolver": "^2.0.5", "@smithy/fetch-http-handler": "^2.0.5", "@smithy/hash-node": "^2.0.5", @@ -557,9 +557,9 @@ } }, "node_modules/@aws-sdk/types": { - "version": "3.398.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.398.0.tgz", - "integrity": "sha512-r44fkS+vsEgKCuEuTV+TIk0t0m5ZlXHNjSDYEUvzLStbbfUFiNus/YG4UCa0wOk9R7VuQI67badsvvPeVPCGDQ==", + "version": "3.408.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.408.0.tgz", + "integrity": "sha512-sIsR5224xWQTW7O6h4V0S7DMWs4bK4DCunwOo7Avpq7ZVmH2YyLTs0n4NGL186j8xTosycF1ACQgpM48SLIvaA==", "optional": true, "dependencies": { "@smithy/types": "^2.2.2", @@ -570,12 +570,12 @@ } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.398.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.398.0.tgz", - "integrity": "sha512-Fy0gLYAei/Rd6BrXG4baspCnWTUSd0NdokU1pZh4KlfEAEN1i8SPPgfiO5hLk7+2inqtCmqxVJlfqbMVe9k4bw==", + "version": "3.408.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.408.0.tgz", + "integrity": "sha512-N1D5cKEkCqf5Q7IF/pI9kfcNrT+/5ctZ6cQo4Ex6xaOcnUzdOZcXdPqaMRZVZRn8enjK2SpoLlRpXGISOugPaw==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.398.0", + "@aws-sdk/types": "3.408.0", "tslib": "^2.5.0" }, "engines": { @@ -595,24 +595,24 @@ } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.398.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.398.0.tgz", - "integrity": "sha512-A3Tzx1tkDHlBT+IgxmsMCHbV8LM7SwwCozq2ZjJRx0nqw3MCrrcxQFXldHeX/gdUMO+0Oocb7HGSnVODTq+0EA==", + "version": "3.408.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.408.0.tgz", + "integrity": "sha512-wOVjDprG5h6kM8aJZk/tRX/RgxNxr73d6kIsUePlAgil13q62M9lcFMcIXduqtDsa1B6FfVB2wx/pyUuOZri5g==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.398.0", + "@aws-sdk/types": "3.408.0", "@smithy/types": "^2.2.2", "bowser": "^2.11.0", "tslib": "^2.5.0" } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.405.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.405.0.tgz", - "integrity": "sha512-6Ssld7aalKCnW6lSGfiiWpqwo2L+AmYq2oV3P9yYAo9ZL+Q78dXquabwj3uq3plJ4l2xE4Gfcf2FJ/1PZpqDvQ==", + "version": "3.408.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.408.0.tgz", + "integrity": "sha512-BzMFV+cIXrtfcfJk3GpXnkANFkzZisvAtD306TMgIscn5FF26K1jD5DU+h5Q5WMq7gx+oXh9kJ3Lu3hi7hahKQ==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.398.0", + "@aws-sdk/types": "3.408.0", "@smithy/node-config-provider": "^2.0.6", "@smithy/types": "^2.2.2", "tslib": "^2.5.0" @@ -659,12 +659,12 @@ } }, "node_modules/@smithy/abort-controller": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.5.tgz", - "integrity": "sha512-byVZ2KWLMPYAZGKjRpniAzLcygJO4ruClZKdJTuB0eCB76ONFTdptBHlviHpAZXknRz7skYWPfcgO9v30A1SyA==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.6.tgz", + "integrity": "sha512-4I7g0lyGUlW2onf8mD76IzU37oRWSHsQ5zlW5MjDzgg4I4J9bOK4500Gx6qOuoN7+GulAnGLe1YwyrIluzhakg==", "optional": true, "dependencies": { - "@smithy/types": "^2.2.2", + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" }, "engines": { @@ -672,12 +672,13 @@ } }, "node_modules/@smithy/config-resolver": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.5.tgz", - "integrity": "sha512-n0c2AXz+kjALY2FQr7Zy9zhYigXzboIh1AuUUVCqFBKFtdEvTwnwPXrTDoEehLiRTUHNL+4yzZ3s+D0kKYSLSg==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.7.tgz", + "integrity": "sha512-J4J1AWiqaApC+3I9U++SuxAQ3BOoM5VoYnpFzCZcb63aLF80Zpc/nq2pFR1OsEIYyg2UYNdcBKKfHABmwo4WgQ==", "optional": true, "dependencies": { - "@smithy/types": "^2.2.2", + "@smithy/node-config-provider": "^2.0.9", + "@smithy/types": "^2.3.0", "@smithy/util-config-provider": "^2.0.0", "@smithy/util-middleware": "^2.0.0", "tslib": "^2.5.0" @@ -687,15 +688,15 @@ } }, "node_modules/@smithy/credential-provider-imds": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.0.7.tgz", - "integrity": "sha512-XivkZj/pipzpQPxgleE1odwJQ6oDsVViB4VUO/HRDI4EdEfZjud44USupOUOa/xOjS39/75DYB4zgTbyV+totw==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.0.9.tgz", + "integrity": "sha512-K7WZRkHS5HZofRgK+O8W4YXXyaVexU1K6hp9vlUL/8CsnrFbZS9quyH/6hTROrYh2PuJr24yii1kc83NJdxMGQ==", "optional": true, "dependencies": { - "@smithy/node-config-provider": "^2.0.7", - "@smithy/property-provider": "^2.0.6", - "@smithy/types": "^2.2.2", - "@smithy/url-parser": "^2.0.5", + "@smithy/node-config-provider": "^2.0.9", + "@smithy/property-provider": "^2.0.7", + "@smithy/types": "^2.3.0", + "@smithy/url-parser": "^2.0.6", "tslib": "^2.5.0" }, "engines": { @@ -703,37 +704,50 @@ } }, "node_modules/@smithy/eventstream-codec": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.5.tgz", - "integrity": "sha512-iqR6OuOV3zbQK8uVs9o+9AxhVk8kW9NAxA71nugwUB+kTY9C35pUd0A5/m4PRT0Y0oIW7W4kgnSR3fdYXQjECw==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.6.tgz", + "integrity": "sha512-J9xL82mlYRUMXFnB9VaThXkD7z2JLr52FIVZMoQQ1dxZG5ub+NOGmzaTTZC/cMmKXI/nwCoFuwDWCTjwQhYhQA==", "optional": true, "dependencies": { "@aws-crypto/crc32": "3.0.0", - "@smithy/types": "^2.2.2", + "@smithy/types": "^2.3.0", "@smithy/util-hex-encoding": "^2.0.0", "tslib": "^2.5.0" } }, "node_modules/@smithy/fetch-http-handler": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.0.5.tgz", - "integrity": "sha512-EzFoMowdBNy1VqtvkiXgPFEdosIAt4/4bgZ8uiDiUyfhmNXq/3bV+CagPFFBsgFOR/X2XK4zFZHRsoa7PNHVVg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.1.2.tgz", + "integrity": "sha512-3Gm3pQm4viUPU+e7KkRScS9t5phBxSNRS8rQSZ+HeCwK/busrX0/2HJZiwLvGblqPqi1laJB0lD18AdiOioJww==", "optional": true, "dependencies": { - "@smithy/protocol-http": "^2.0.5", - "@smithy/querystring-builder": "^2.0.5", - "@smithy/types": "^2.2.2", + "@smithy/protocol-http": "^3.0.2", + "@smithy/querystring-builder": "^2.0.6", + "@smithy/types": "^2.3.0", "@smithy/util-base64": "^2.0.0", "tslib": "^2.5.0" } }, + "node_modules/@smithy/fetch-http-handler/node_modules/@smithy/protocol-http": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.2.tgz", + "integrity": "sha512-LUOWCPRihvJBkdSs+ivK9m1f/rMfF3n9Zpzg8qdry2eIG4HQqqLBMWQyF9bgk7JhsrrOa3//jJKhXzvL7wL5Xw==", + "optional": true, + "dependencies": { + "@smithy/types": "^2.3.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@smithy/hash-node": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.5.tgz", - "integrity": "sha512-mk551hIywBITT+kXruRNXk7f8Fy7DTzBjZJSr/V6nolYKmUHIG3w5QU6nO9qPYEQGKc/yEPtkpdS28ndeG93lA==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.6.tgz", + "integrity": "sha512-xz7fzFxSzxohKGGyKPbLReRrY01JOZgRDHIXSks3PxQxG9c8PJMa5nUw0stH8UOySUgkofmMy0n7vTUsF5Mdqg==", "optional": true, "dependencies": { - "@smithy/types": "^2.2.2", + "@smithy/types": "^2.3.0", "@smithy/util-buffer-from": "^2.0.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" @@ -743,12 +757,12 @@ } }, "node_modules/@smithy/invalid-dependency": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.5.tgz", - "integrity": "sha512-0wEi+JT0hM+UUwrJVYbqjuGFhy5agY/zXyiN7BNAJ1XoCDjU5uaNSj8ekPWsXd/d4yM6NSe8UbPd8cOc1+3oBQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.6.tgz", + "integrity": "sha512-L5MUyl9mzawIvBxr0Hg3J/Q5qZFXKcBgMk0PacfK3Mthp4WAR6h7iMxdSQ23Q7X/kxOrpZuoYEdh1BWLKbDc8Q==", "optional": true, "dependencies": { - "@smithy/types": "^2.2.2", + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" } }, @@ -765,13 +779,26 @@ } }, "node_modules/@smithy/middleware-content-length": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.5.tgz", - "integrity": "sha512-E7VwV5H02fgZIUGRli4GevBCAPvkyEI/fgl9SU47nPPi3DAAX3nEtUb8xfGbXjOcJ5BdSUoWWZn42tEd/blOqA==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.8.tgz", + "integrity": "sha512-fHJFsscHXrYhUSWMFJNXfsZW8KsyhWQfBgU3b0nvDfpm+NAeQLqKYNhywGrDwZQc1k+lt7Fw9faAquhNPxTZRA==", "optional": true, "dependencies": { - "@smithy/protocol-http": "^2.0.5", - "@smithy/types": "^2.2.2", + "@smithy/protocol-http": "^3.0.2", + "@smithy/types": "^2.3.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-content-length/node_modules/@smithy/protocol-http": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.2.tgz", + "integrity": "sha512-LUOWCPRihvJBkdSs+ivK9m1f/rMfF3n9Zpzg8qdry2eIG4HQqqLBMWQyF9bgk7JhsrrOa3//jJKhXzvL7wL5Xw==", + "optional": true, + "dependencies": { + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" }, "engines": { @@ -779,14 +806,14 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.0.5.tgz", - "integrity": "sha512-tyzDuoNTbsMQCq5Xkc4QOt6e2GACUllQIV8SQ5fc59FtOIV9/vbf58/GxVjZm2o8+MMbdDBANjTDZe/ijZKfyA==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.0.6.tgz", + "integrity": "sha512-MuSPPtEHFal/M77tR3ffLsdOfX29IZpA990nGuoPj5zQnAYrA4PYBGoqqrASQKm8Xb3C0NwuYzOATT7WX4f5Pg==", "optional": true, "dependencies": { - "@smithy/middleware-serde": "^2.0.5", - "@smithy/types": "^2.2.2", - "@smithy/url-parser": "^2.0.5", + "@smithy/middleware-serde": "^2.0.6", + "@smithy/types": "^2.3.0", + "@smithy/url-parser": "^2.0.6", "@smithy/util-middleware": "^2.0.0", "tslib": "^2.5.0" }, @@ -795,14 +822,15 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.5.tgz", - "integrity": "sha512-ulIfbFyzQTVnJbLjUl1CTSi0etg6tej/ekwaLp0Gn8ybUkDkKYa+uB6CF/m2J5B6meRwyJlsryR+DjaOVyiicg==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.9.tgz", + "integrity": "sha512-gneEqWj4l/ZjHdZPk0BFMXoTalRArdQ8i579/KqJgBAc6Ux5vnR/SSppkMCkj2kOQYwdypvzSPeqEW3ZrvIg6g==", "optional": true, "dependencies": { - "@smithy/protocol-http": "^2.0.5", + "@smithy/node-config-provider": "^2.0.9", + "@smithy/protocol-http": "^3.0.2", "@smithy/service-error-classification": "^2.0.0", - "@smithy/types": "^2.2.2", + "@smithy/types": "^2.3.0", "@smithy/util-middleware": "^2.0.0", "@smithy/util-retry": "^2.0.0", "tslib": "^2.5.0", @@ -812,13 +840,26 @@ "node": ">=14.0.0" } }, + "node_modules/@smithy/middleware-retry/node_modules/@smithy/protocol-http": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.2.tgz", + "integrity": "sha512-LUOWCPRihvJBkdSs+ivK9m1f/rMfF3n9Zpzg8qdry2eIG4HQqqLBMWQyF9bgk7JhsrrOa3//jJKhXzvL7wL5Xw==", + "optional": true, + "dependencies": { + "@smithy/types": "^2.3.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@smithy/middleware-serde": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.5.tgz", - "integrity": "sha512-in0AA5sous74dOfTGU9rMJBXJ0bDVNxwdXtEt5lh3FVd2sEyjhI+rqpLLRF1E4ixbw3RSEf80hfRpcPdjg4vvQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.6.tgz", + "integrity": "sha512-8/GODBngYbrS28CMZtaHIL4R9rLNSQ/zgb+N1OAZ02NwBUawlnLDcatve9YRzhJC/IWz0/pt+WimJZaO1sGcig==", "optional": true, "dependencies": { - "@smithy/types": "^2.2.2", + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" }, "engines": { @@ -838,14 +879,14 @@ } }, "node_modules/@smithy/node-config-provider": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.0.7.tgz", - "integrity": "sha512-GuLxhnf0aVQsfQp4ZWaM1TRCIndpQjAswyFcmDFRNf4yFqpxpLPDeV540+O0Z21Hmu3deoQm/dCPXbVn90PYzg==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.0.9.tgz", + "integrity": "sha512-TlSPbCwtT/jgNnmPQqKuCR5CFN8UIrCCHRrgUfs3NqRMuaLLeP8TPe1fSKq2J8h1M/jd4BF853gneles0gWevg==", "optional": true, "dependencies": { - "@smithy/property-provider": "^2.0.6", - "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/types": "^2.2.2", + "@smithy/property-provider": "^2.0.7", + "@smithy/shared-ini-file-loader": "^2.0.8", + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" }, "engines": { @@ -853,15 +894,28 @@ } }, "node_modules/@smithy/node-http-handler": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.0.5.tgz", - "integrity": "sha512-lZm5DZf4b3V0saUw9WTC4/du887P6cy2fUyQgQQKRRV6OseButyD5yTzeMmXE53CaXJBMBsUvvIQ0hRVxIq56w==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.1.2.tgz", + "integrity": "sha512-PdEEDCShuM8zxGoaRxmGB/1ikB8oeqz+ZAF9VIA8FCP3E59j8zDTF+wCELoWd1Y6gtxr+RcTAg5sA8nvn5qH/w==", "optional": true, "dependencies": { - "@smithy/abort-controller": "^2.0.5", - "@smithy/protocol-http": "^2.0.5", - "@smithy/querystring-builder": "^2.0.5", - "@smithy/types": "^2.2.2", + "@smithy/abort-controller": "^2.0.6", + "@smithy/protocol-http": "^3.0.2", + "@smithy/querystring-builder": "^2.0.6", + "@smithy/types": "^2.3.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/node-http-handler/node_modules/@smithy/protocol-http": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.2.tgz", + "integrity": "sha512-LUOWCPRihvJBkdSs+ivK9m1f/rMfF3n9Zpzg8qdry2eIG4HQqqLBMWQyF9bgk7JhsrrOa3//jJKhXzvL7wL5Xw==", + "optional": true, + "dependencies": { + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" }, "engines": { @@ -869,12 +923,12 @@ } }, "node_modules/@smithy/property-provider": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.6.tgz", - "integrity": "sha512-CVem6ZkkWxbTnhjDLyLESY0oLA6IUZYtdqrCpGQKUXaFBOuc/izjm7fIFGBxEbjZ1EGcH9hHxrjqX36RWULNRg==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.7.tgz", + "integrity": "sha512-XT8Tl7YNxM8tCtGqy7v7DSf6PxyXaPE9cdA/Yj4dEw2b05V3RrPqsP+t5XJiZu0yIsQ7pdeYZWv2sSEWVjNeAg==", "optional": true, "dependencies": { - "@smithy/types": "^2.2.2", + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" }, "engines": { @@ -895,12 +949,12 @@ } }, "node_modules/@smithy/querystring-builder": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.5.tgz", - "integrity": "sha512-4DCX9krxLzATj+HdFPC3i8pb7XTAWzzKqSw8aTZMjXjtQY+vhe4azMAqIvbb6g7JKwIkmkRAjK6EXO3YWSnJVQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.6.tgz", + "integrity": "sha512-HnU00shCGoV8vKJZTiNBkNvR9NogU3NIUaVMAGJPSqNGJj3psWo+TUrC0BVCDcwiCljXwXCFGJqIcsWtClrktQ==", "optional": true, "dependencies": { - "@smithy/types": "^2.2.2", + "@smithy/types": "^2.3.0", "@smithy/util-uri-escape": "^2.0.0", "tslib": "^2.5.0" }, @@ -909,12 +963,12 @@ } }, "node_modules/@smithy/querystring-parser": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.5.tgz", - "integrity": "sha512-C2stCULH0r54KBksv3AWcN8CLS3u9+WsEW8nBrvctrJ5rQTNa1waHkffpVaiKvcW2nP0aIMBPCobD/kYf/q9mA==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.6.tgz", + "integrity": "sha512-i4LKoXHP7pTFAPjLIJyQXYOhWokbcFha3WWsX74sAKmuluv0XM2cxONZoFxwEzmWhsNyM6buSwJSZXyPiec0AQ==", "optional": true, "dependencies": { - "@smithy/types": "^2.2.2", + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" }, "engines": { @@ -931,12 +985,12 @@ } }, "node_modules/@smithy/shared-ini-file-loader": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.0.6.tgz", - "integrity": "sha512-NO6dHqho6APbVR0DxPtYoL4KXBqUeSM3Slsd103MOgL50YbzzsQmMLtDMZ87W8MlvvCN0tuiq+OrAO/rM7hTQg==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.0.8.tgz", + "integrity": "sha512-4u+V+Dv7JGpJ0tppB5rxCem7WhdFux950z4cGPhV0kHTPkKe8DDgINzOlVa2RBu5dI33D02OBJcxFjhW4FPORg==", "optional": true, "dependencies": { - "@smithy/types": "^2.2.2", + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" }, "engines": { @@ -944,14 +998,14 @@ } }, "node_modules/@smithy/signature-v4": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.5.tgz", - "integrity": "sha512-ABIzXmUDXK4n2c9cXjQLELgH2RdtABpYKT+U131e2I6RbCypFZmxIHmIBufJzU2kdMCQ3+thBGDWorAITFW04A==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.6.tgz", + "integrity": "sha512-4zNTi8w4sky07YKq7oYucZt4ogY00IEaS1NFDXxmCN5V/ywE0WiK+WMim+8wtYQmB0qy3oExZR4LoCAml6j/rA==", "optional": true, "dependencies": { - "@smithy/eventstream-codec": "^2.0.5", + "@smithy/eventstream-codec": "^2.0.6", "@smithy/is-array-buffer": "^2.0.0", - "@smithy/types": "^2.2.2", + "@smithy/types": "^2.3.0", "@smithy/util-hex-encoding": "^2.0.0", "@smithy/util-middleware": "^2.0.0", "@smithy/util-uri-escape": "^2.0.0", @@ -963,14 +1017,14 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.0.5.tgz", - "integrity": "sha512-kCTFr8wfOAWKDzGvfBElc6shHigWtHNhMQ1IbosjC4jOlayFyZMSs2PysKB+Ox/dhQ41KqOzgVjgiQ+PyWqHMQ==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.2.tgz", + "integrity": "sha512-quUuJ0SsqgG7Flopvfd8iQJLhHfnMYtYPuvImVQzPHXtqUQImtVz5msudMxW3t3jl+L0w8RlR+IN2zT6UqCJ6g==", "optional": true, "dependencies": { "@smithy/middleware-stack": "^2.0.0", - "@smithy/types": "^2.2.2", - "@smithy/util-stream": "^2.0.5", + "@smithy/types": "^2.3.0", + "@smithy/util-stream": "^2.0.8", "tslib": "^2.5.0" }, "engines": { @@ -978,9 +1032,9 @@ } }, "node_modules/@smithy/types": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.2.2.tgz", - "integrity": "sha512-4PS0y1VxDnELGHGgBWlDksB2LJK8TG8lcvlWxIsgR+8vROI7Ms8h1P4FQUx+ftAX2QZv5g1CJCdhdRmQKyonyw==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.3.0.tgz", + "integrity": "sha512-pJce3rd39MElkV57UTPAoSYAApjQLELUxjU5adHNLYk9gnPvyIGbJNJTZVVFu00BrgZH3W/cQe8QuFcknDyodQ==", "optional": true, "dependencies": { "tslib": "^2.5.0" @@ -990,13 +1044,13 @@ } }, "node_modules/@smithy/url-parser": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.5.tgz", - "integrity": "sha512-OdMBvZhpckQSkugCXNJQCvqJ71wE7Ftxce92UOQLQ9pwF6hoS5PLL7wEfpnuEXtStzBqJYkzu1C1ZfjuFGOXAA==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.6.tgz", + "integrity": "sha512-9i6j5QW6bapHZ4rtkXOAm0hOUG1+5IVdVJXNSUTcNskwJchZH5IQuDNPCbgUi/u2P8EZazKt4wXT51QxOXCz1A==", "optional": true, "dependencies": { - "@smithy/querystring-parser": "^2.0.5", - "@smithy/types": "^2.2.2", + "@smithy/querystring-parser": "^2.0.6", + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" } }, @@ -1060,13 +1114,13 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.6.tgz", - "integrity": "sha512-h8xyKTZIIom62DN4xbPUmL+RL1deZcK1qJGmCr4c2yXjOrs5/iZ1VtQQcl+xP78620ga/565AikZE1sktdg2yA==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.7.tgz", + "integrity": "sha512-s1caKxC7Y87Q72Goll//clZs2WNBfG9WtFDWVRS+Qgk147YPCOUYtkpuD0XZAh/vbayObFz5tQ1fiX4G19HSCA==", "optional": true, "dependencies": { - "@smithy/property-provider": "^2.0.6", - "@smithy/types": "^2.2.2", + "@smithy/property-provider": "^2.0.7", + "@smithy/types": "^2.3.0", "bowser": "^2.11.0", "tslib": "^2.5.0" }, @@ -1075,16 +1129,16 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.7.tgz", - "integrity": "sha512-2C1YfmYJj9bpM/cRAgQppYNzPd8gDEXZ5XIVDuEQg3TmmIiinZaFf/HsHYo9NK/PMy5oawJVdIuR7SVriIo1AQ==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.9.tgz", + "integrity": "sha512-HlV4iNL3/PgPpmDGs0+XrAKtwFQ8rOs5P2y5Dye8dUYaJauadlzHRrNKk7wH2aBYswvT2HM+PIgXamvrE7xbcw==", "optional": true, "dependencies": { - "@smithy/config-resolver": "^2.0.5", - "@smithy/credential-provider-imds": "^2.0.7", - "@smithy/node-config-provider": "^2.0.7", - "@smithy/property-provider": "^2.0.6", - "@smithy/types": "^2.2.2", + "@smithy/config-resolver": "^2.0.7", + "@smithy/credential-provider-imds": "^2.0.9", + "@smithy/node-config-provider": "^2.0.9", + "@smithy/property-provider": "^2.0.7", + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" }, "engines": { @@ -1129,14 +1183,14 @@ } }, "node_modules/@smithy/util-stream": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.5.tgz", - "integrity": "sha512-ylx27GwI05xLpYQ4hDIfS15vm+wYjNN0Sc2P0FxuzgRe8v0BOLHppGIQ+Bezcynk8C9nUzsUue3TmtRhjut43g==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.8.tgz", + "integrity": "sha512-1JoSHL/AOFRo/RVYdbOOGG5qSkU1IQN+F0f3HOZcwvGeGT5KnGwd4hLzmr0qkjKh4PW7nzuvPMdR7L8THV24Hw==", "optional": true, "dependencies": { - "@smithy/fetch-http-handler": "^2.0.5", - "@smithy/node-http-handler": "^2.0.5", - "@smithy/types": "^2.2.2", + "@smithy/fetch-http-handler": "^2.1.2", + "@smithy/node-http-handler": "^2.1.2", + "@smithy/types": "^2.3.0", "@smithy/util-base64": "^2.0.0", "@smithy/util-buffer-from": "^2.0.0", "@smithy/util-hex-encoding": "^2.0.0", From 560bd3e4e4fa4b3f8ce7a1e291f5c9fa9b352252 Mon Sep 17 00:00:00 2001 From: Abhi Markan Date: Wed, 13 Sep 2023 09:05:15 +0100 Subject: [PATCH 003/130] fix(docs): markdown syntax error --- .../acbs-function/package-lock.json | 605 +++++++------- azure-functions/acbs-function/package.json | 2 +- .../package-lock.json | 541 ++++++------ dtfs-central-api/package-lock.json | 618 +++++++------- dtfs-central-api/package.json | 4 +- external-api/package-lock.json | 641 ++++++++------- external-api/package.json | 8 +- gef-ui/package-lock.json | 726 +++++++++------- gef-ui/package.json | 6 +- package-lock.json | 142 +++- package.json | 4 +- portal-api/package-lock.json | 644 ++++++++------- portal-api/package.json | 8 +- portal/package-lock.json | 734 ++++++++++------- portal/package.json | 8 +- trade-finance-manager-api/package-lock.json | 636 +++++++------- trade-finance-manager-api/package.json | 6 +- trade-finance-manager-ui/package-lock.json | 706 +++++++++------- trade-finance-manager-ui/package.json | 6 +- utils/data-migration/package-lock.json | 774 ++++++++---------- 20 files changed, 3718 insertions(+), 3101 deletions(-) diff --git a/azure-functions/acbs-function/package-lock.json b/azure-functions/acbs-function/package-lock.json index 1075c33bad..87b46cc389 100644 --- a/azure-functions/acbs-function/package-lock.json +++ b/azure-functions/acbs-function/package-lock.json @@ -10,7 +10,7 @@ "date-fns": "^2.30.0", "dotenv": "^16.3.1", "durable-functions": "^1.5.4", - "eslint": "^8.48.0", + "eslint": "^8.49.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.28.1", "jest": "29.5.0", @@ -131,20 +131,20 @@ } }, "node_modules/@babel/core": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.15.tgz", - "integrity": "sha512-PtZqMmgRrvj8ruoEOIwVA3yoF91O+Hgw9o7DAUTNBA6Mo2jpu31clx9a7Nz/9JznqetTR6zwfC4L3LAjKQXUwA==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.17.tgz", + "integrity": "sha512-2EENLmhpwplDux5PSsZnSbnSkB3tZ6QTksgO25xwEL7pIDcNOMhF5v/s6RzwjMZzZzw9Ofc30gHv5ChCC8pifQ==", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.22.13", "@babel/generator": "^7.22.15", "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.22.15", + "@babel/helper-module-transforms": "^7.22.17", "@babel/helpers": "^7.22.15", - "@babel/parser": "^7.22.15", + "@babel/parser": "^7.22.16", "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.15", - "@babel/types": "^7.22.15", + "@babel/traverse": "^7.22.17", + "@babel/types": "^7.22.17", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -257,9 +257,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.15.tgz", - "integrity": "sha512-l1UiX4UyHSFsYt17iQ3Se5pQQZZHa22zyIXURmvkmLCD4t/aU+dvNWHatKac/D9Vm9UES7nvIqHs4jZqKviUmQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.17.tgz", + "integrity": "sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ==", "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-module-imports": "^7.22.15", @@ -617,9 +617,9 @@ } }, "node_modules/@babel/traverse": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.15.tgz", - "integrity": "sha512-DdHPwvJY0sEeN4xJU5uRLmZjgMMDIvMPniLuYzUVXj/GGzysPl0/fwt44JBkyUIzGJPV8QgHMcQdQ34XFuKTYQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.17.tgz", + "integrity": "sha512-xK4Uwm0JnAMvxYZxOVecss85WxTEIbTa7bnGyf/+EgCL5Zt3U7htUpEOWv9detPlamGKuRzCqw74xVglDWpPdg==", "dependencies": { "@babel/code-frame": "^7.22.13", "@babel/generator": "^7.22.15", @@ -627,8 +627,8 @@ "@babel/helper-function-name": "^7.22.5", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/types": "^7.22.17", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -666,9 +666,9 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/@babel/types": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.15.tgz", - "integrity": "sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.17.tgz", + "integrity": "sha512-YSQPHLFtQNE5xN9tHuZnzu8vPr61wVTBZdfv1meex1NBosa4iT05k/Jw06ddJugi4bk7The/oSwQGFcksmEJQg==", "dependencies": { "@babel/helper-string-parser": "^7.22.5", "@babel/helper-validator-identifier": "^7.22.15", @@ -698,9 +698,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", - "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", + "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -749,9 +749,9 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/@eslint/js": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", - "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", + "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -907,15 +907,15 @@ } }, "node_modules/@jest/console": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.4.tgz", - "integrity": "sha512-wNK6gC0Ha9QeEPSkeJedQuTQqxZYnDPuDcDhVuVatRvMkL4D0VTvFVZj+Yuh6caG2aOfzkUZ36KtCmLNtR02hw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -923,14 +923,14 @@ } }, "node_modules/@jest/core": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.4.tgz", - "integrity": "sha512-U/vq5ccNTSVgYH7mHnodHmCffGWHJnz/E1BEWlLuK5pM4FZmGfBn/nrJGLjUsSmyx3otCeqc1T31F4y08AMDLg==", - "dependencies": { - "@jest/console": "^29.6.4", - "@jest/reporters": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -938,21 +938,21 @@ "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.6.3", - "jest-config": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-resolve-dependencies": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "jest-watcher": "^29.6.4", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -969,35 +969,35 @@ } }, "node_modules/@jest/environment": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.4.tgz", - "integrity": "sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dependencies": { - "@jest/fake-timers": "^29.6.4", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.3" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.4.tgz", - "integrity": "sha512-Warhsa7d23+3X5bLbrbYvaehcgX5TLYhI03JKoedTiI8uJU4IhqYBWF7OSSgUyz4IgLpUYPkK0AehA5/fRclAA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dependencies": { - "expect": "^29.6.4", - "jest-snapshot": "^29.6.4" + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.4.tgz", - "integrity": "sha512-FEhkJhqtvBwgSpiTrocquJCdXPsyvNKcl/n7A3u7X4pVoF4bswm11c9d4AV+kfq2Gpv/mM8x7E7DsRvH+djkrg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dependencies": { "jest-get-type": "^29.6.3" }, @@ -1006,44 +1006,44 @@ } }, "node_modules/@jest/fake-timers": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.4.tgz", - "integrity": "sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.4.tgz", - "integrity": "sha512-wVIn5bdtjlChhXAzVXavcY/3PEjf4VqM174BM3eGL5kMxLiZD5CLnbmkEyA1Dwh9q8XjP6E8RwjBsY/iCWrWsA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", "@jest/types": "^29.6.3", - "jest-mock": "^29.6.3" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.4.tgz", - "integrity": "sha512-sxUjWxm7QdchdrD3NfWKrL8FBsortZeibSJv4XLjESOOjSUOkjQcb0ZHJwfhEGIvBvTluTzfG2yZWZhkrXJu8g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", @@ -1057,9 +1057,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -1102,11 +1102,11 @@ } }, "node_modules/@jest/test-result": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.4.tgz", - "integrity": "sha512-uQ1C0AUEN90/dsyEirgMLlouROgSY+Wc/JanVVk0OiUKa5UFh7sJpMEM3aoUBAz2BRNvUJ8j3d294WFuRxSyOQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dependencies": { - "@jest/console": "^29.6.4", + "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" @@ -1116,13 +1116,13 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.4.tgz", - "integrity": "sha512-E84M6LbpcRq3fT4ckfKs9ryVanwkaIB0Ws9bw3/yP4seRLg/VaCZ/LgW0MCq5wwk4/iP/qnilD41aj2fsw2RMg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dependencies": { - "@jest/test-result": "^29.6.4", + "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -1130,9 +1130,9 @@ } }, "node_modules/@jest/transform": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz", - "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", @@ -1142,9 +1142,9 @@ "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -1601,11 +1601,11 @@ } }, "node_modules/babel-jest": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.4.tgz", - "integrity": "sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dependencies": { - "@jest/transform": "^29.6.4", + "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", @@ -1799,9 +1799,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001529", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001529.tgz", - "integrity": "sha512-n2pUQYGAkrLG4QYj2desAh+NqsJpHbNmVZz87imptDdxLAtjxary7Df/psdfyDGmskJK/9Dt9cPnx5RZ3CU4Og==", + "version": "1.0.30001534", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001534.tgz", + "integrity": "sha512-vlPVrhsCS7XaSh2VvWluIQEzVhefrUQcEsQWSS5A5V+dM07uv1qHeQzAOTGIMy9i3e9bH15+muvI/UHojVgS/Q==", "funding": [ { "type": "opencollective", @@ -1939,6 +1939,26 @@ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -2001,11 +2021,25 @@ "node": ">=0.10.0" } }, + "node_modules/define-data-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.0.1.tgz", + "integrity": "sha512-22M+6zEspQHx10bfFQl2ET39IvfuQ7+rZIH7+ard8fCC4hPmkOSy+8JhKxBRLaWUziJ0O63NTYT97LR8zUfPTw==", + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -2093,9 +2127,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.512", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.512.tgz", - "integrity": "sha512-1W8wRbYlQE4ph7eoj3TJ+uqwO6+xvAE/L+KGU7WTQQvX3tnSIGZAb90MTsMoJqzntamiwJhBAj4WZmygXhsOUg==" + "version": "1.4.519", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.519.tgz", + "integrity": "sha512-kqs9oGYL4UFVkLKhqCTgBCYZv+wZ374yABDMqlDda9HvlkQxvSr7kgf4hfWVjMieDbX+1MwPHFBsOGCMIBaFKg==" }, "node_modules/emittery": { "version": "0.13.1", @@ -2230,15 +2264,15 @@ } }, "node_modules/eslint": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", - "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", + "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.48.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint/js": "8.49.0", + "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", @@ -2550,15 +2584,15 @@ } }, "node_modules/expect": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.4.tgz", - "integrity": "sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dependencies": { - "@jest/expect-utils": "^29.6.4", + "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3" + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -3457,12 +3491,12 @@ } }, "node_modules/jest-changed-files": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.6.3.tgz", - "integrity": "sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dependencies": { "execa": "^5.0.0", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "p-limit": "^3.1.0" }, "engines": { @@ -3470,27 +3504,27 @@ } }, "node_modules/jest-circus": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.4.tgz", - "integrity": "sha512-YXNrRyntVUgDfZbjXWBMPslX1mQ8MrSG0oM/Y06j9EYubODIyHWP8hMUbjbZ19M3M+zamqEur7O80HODwACoJw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", - "@jest/test-result": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "p-limit": "^3.1.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" @@ -3500,21 +3534,20 @@ } }, "node_modules/jest-cli": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.4.tgz", - "integrity": "sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dependencies": { - "@jest/core": "^29.6.4", - "@jest/test-result": "^29.6.4", + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "chalk": "^4.0.0", + "create-jest": "^29.7.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "prompts": "^2.0.1", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "yargs": "^17.3.1" }, "bin": { @@ -3533,30 +3566,30 @@ } }, "node_modules/jest-config": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.4.tgz", - "integrity": "sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.6.4", + "@jest/test-sequencer": "^29.7.0", "@jest/types": "^29.6.3", - "babel-jest": "^29.6.4", + "babel-jest": "^29.7.0", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.6.4", - "jest-environment-node": "^29.6.4", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", "jest-get-type": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -3577,23 +3610,23 @@ } }, "node_modules/jest-diff": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.4.tgz", - "integrity": "sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-docblock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.6.3.tgz", - "integrity": "sha512-2+H+GOTQBEm2+qFSQ7Ma+BvyV+waiIFxmZF5LdpBsAEjWX8QYjSCa4FrkIYtbfXUJJJnFCYrOtt6TZ+IAiTjBQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dependencies": { "detect-newline": "^3.0.0" }, @@ -3602,31 +3635,31 @@ } }, "node_modules/jest-each": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.3.tgz", - "integrity": "sha512-KoXfJ42k8cqbkfshW7sSHcdfnv5agDdHCPA87ZBdmHP+zJstTJc0ttQaJ/x7zK6noAL76hOuTIJ6ZkQRS5dcyg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", - "jest-util": "^29.6.3", - "pretty-format": "^29.6.3" + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-environment-node": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.4.tgz", - "integrity": "sha512-i7SbpH2dEIFGNmxGCpSc2w9cA4qVD+wfvg2ZnfQ7XVrKL0NA5uDVBIiGH8SR4F0dKEv/0qI5r+aDomDf04DpEQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -3641,9 +3674,9 @@ } }, "node_modules/jest-haste-map": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz", - "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", @@ -3652,8 +3685,8 @@ "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -3665,35 +3698,35 @@ } }, "node_modules/jest-leak-detector": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.3.tgz", - "integrity": "sha512-0kfbESIHXYdhAdpLsW7xdwmYhLf1BRu4AA118/OxFm0Ho1b2RcTmO4oF6aAMaxpxdxnJ3zve2rgwzNBD4Zbm7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dependencies": { "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.4.tgz", - "integrity": "sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.6.4", + "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-message-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.3.tgz", - "integrity": "sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", @@ -3701,7 +3734,7 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -3710,13 +3743,13 @@ } }, "node_modules/jest-mock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.3.tgz", - "integrity": "sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", - "jest-util": "^29.6.3" + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -3747,16 +3780,16 @@ } }, "node_modules/jest-resolve": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.4.tgz", - "integrity": "sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" @@ -3766,41 +3799,41 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.4.tgz", - "integrity": "sha512-7+6eAmr1ZBF3vOAJVsfLj1QdqeXG+WYhidfLHBRZqGN24MFRIiKG20ItpLw2qRAsW/D2ZUUmCNf6irUr/v6KHA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dependencies": { "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.6.4" + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.4.tgz", - "integrity": "sha512-SDaLrMmtVlQYDuG0iSPYLycG8P9jLI+fRm8AF/xPKhYDB2g6xDWjXBrR5M8gEWsK6KVFlebpZ4QsrxdyIX1Jaw==", - "dependencies": { - "@jest/console": "^29.6.4", - "@jest/environment": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.6.3", - "jest-environment-node": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-leak-detector": "^29.6.3", - "jest-message-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-util": "^29.6.3", - "jest-watcher": "^29.6.4", - "jest-worker": "^29.6.4", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -3809,16 +3842,16 @@ } }, "node_modules/jest-runtime": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.4.tgz", - "integrity": "sha512-s/QxMBLvmwLdchKEjcLfwzP7h+jsHvNEtxGP5P+Fl1FMaJX2jMiIqe4rJw4tFprzCwuSvVUo9bn0uj4gNRXsbA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", - "@jest/globals": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", @@ -3826,13 +3859,13 @@ "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -3841,29 +3874,29 @@ } }, "node_modules/jest-snapshot": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.4.tgz", - "integrity": "sha512-VC1N8ED7+4uboUKGIDsbvNAZb6LakgIPgAF4RSpF13dN6YaMokfRqO+BaqK4zIh6X3JffgwbzuGqDEjHm/MrvA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.6.4", + "expect": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-diff": "^29.6.4", + "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "natural-compare": "^1.4.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "semver": "^7.5.3" }, "engines": { @@ -3901,9 +3934,9 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/jest-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", - "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -3917,16 +3950,16 @@ } }, "node_modules/jest-validate": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz", - "integrity": "sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dependencies": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -3944,17 +3977,17 @@ } }, "node_modules/jest-watcher": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.4.tgz", - "integrity": "sha512-oqUWvx6+On04ShsT00Ir9T4/FvBeEh2M9PTubgITPxDa739p4hoQweWPRGyYeaojgT0xTpZKF0Y/rSY1UgMxvQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dependencies": { - "@jest/test-result": "^29.6.4", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "string-length": "^4.0.1" }, "engines": { @@ -3962,12 +3995,12 @@ } }, "node_modules/jest-worker": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", - "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dependencies": { "@types/node": "*", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -4594,9 +4627,9 @@ } }, "node_modules/pretty-format": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", - "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -4682,13 +4715,13 @@ "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" }, "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "set-function-name": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -4836,6 +4869,18 @@ "semver": "bin/semver.js" } }, + "node_modules/set-function-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.0.tgz", + "integrity": "sha512-WmS8UHojv5s1eSoRSmzO5zzgDq8PE1/X/ij0k+9fMYmINCc6+j+SF3Om8YyucKn2yjnK4ItNZOoQycNnHsZJTw==", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", diff --git a/azure-functions/acbs-function/package.json b/azure-functions/acbs-function/package.json index cc6828b3bb..41c7130c80 100644 --- a/azure-functions/acbs-function/package.json +++ b/azure-functions/acbs-function/package.json @@ -20,7 +20,7 @@ "date-fns": "^2.30.0", "dotenv": "^16.3.1", "durable-functions": "^1.5.4", - "eslint": "^8.48.0", + "eslint": "^8.49.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.28.1", "jest": "29.5.0", diff --git a/azure-functions/number-generator-function/package-lock.json b/azure-functions/number-generator-function/package-lock.json index b745765ab4..96581eb583 100644 --- a/azure-functions/number-generator-function/package-lock.json +++ b/azure-functions/number-generator-function/package-lock.json @@ -120,20 +120,20 @@ } }, "node_modules/@babel/core": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.15.tgz", - "integrity": "sha512-PtZqMmgRrvj8ruoEOIwVA3yoF91O+Hgw9o7DAUTNBA6Mo2jpu31clx9a7Nz/9JznqetTR6zwfC4L3LAjKQXUwA==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.17.tgz", + "integrity": "sha512-2EENLmhpwplDux5PSsZnSbnSkB3tZ6QTksgO25xwEL7pIDcNOMhF5v/s6RzwjMZzZzw9Ofc30gHv5ChCC8pifQ==", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.22.13", "@babel/generator": "^7.22.15", "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.22.15", + "@babel/helper-module-transforms": "^7.22.17", "@babel/helpers": "^7.22.15", - "@babel/parser": "^7.22.15", + "@babel/parser": "^7.22.16", "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.15", - "@babel/types": "^7.22.15", + "@babel/traverse": "^7.22.17", + "@babel/types": "^7.22.17", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -246,9 +246,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.15.tgz", - "integrity": "sha512-l1UiX4UyHSFsYt17iQ3Se5pQQZZHa22zyIXURmvkmLCD4t/aU+dvNWHatKac/D9Vm9UES7nvIqHs4jZqKviUmQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.17.tgz", + "integrity": "sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ==", "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-module-imports": "^7.22.15", @@ -595,9 +595,9 @@ } }, "node_modules/@babel/traverse": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.15.tgz", - "integrity": "sha512-DdHPwvJY0sEeN4xJU5uRLmZjgMMDIvMPniLuYzUVXj/GGzysPl0/fwt44JBkyUIzGJPV8QgHMcQdQ34XFuKTYQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.17.tgz", + "integrity": "sha512-xK4Uwm0JnAMvxYZxOVecss85WxTEIbTa7bnGyf/+EgCL5Zt3U7htUpEOWv9detPlamGKuRzCqw74xVglDWpPdg==", "dependencies": { "@babel/code-frame": "^7.22.13", "@babel/generator": "^7.22.15", @@ -605,8 +605,8 @@ "@babel/helper-function-name": "^7.22.5", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/types": "^7.22.17", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -636,9 +636,9 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/@babel/types": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.15.tgz", - "integrity": "sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.17.tgz", + "integrity": "sha512-YSQPHLFtQNE5xN9tHuZnzu8vPr61wVTBZdfv1meex1NBosa4iT05k/Jw06ddJugi4bk7The/oSwQGFcksmEJQg==", "dependencies": { "@babel/helper-string-parser": "^7.22.5", "@babel/helper-validator-identifier": "^7.22.15", @@ -677,15 +677,15 @@ } }, "node_modules/@jest/console": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.4.tgz", - "integrity": "sha512-wNK6gC0Ha9QeEPSkeJedQuTQqxZYnDPuDcDhVuVatRvMkL4D0VTvFVZj+Yuh6caG2aOfzkUZ36KtCmLNtR02hw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -693,14 +693,14 @@ } }, "node_modules/@jest/core": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.4.tgz", - "integrity": "sha512-U/vq5ccNTSVgYH7mHnodHmCffGWHJnz/E1BEWlLuK5pM4FZmGfBn/nrJGLjUsSmyx3otCeqc1T31F4y08AMDLg==", - "dependencies": { - "@jest/console": "^29.6.4", - "@jest/reporters": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -708,21 +708,21 @@ "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.6.3", - "jest-config": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-resolve-dependencies": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "jest-watcher": "^29.6.4", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -739,35 +739,35 @@ } }, "node_modules/@jest/environment": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.4.tgz", - "integrity": "sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dependencies": { - "@jest/fake-timers": "^29.6.4", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.3" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.4.tgz", - "integrity": "sha512-Warhsa7d23+3X5bLbrbYvaehcgX5TLYhI03JKoedTiI8uJU4IhqYBWF7OSSgUyz4IgLpUYPkK0AehA5/fRclAA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dependencies": { - "expect": "^29.6.4", - "jest-snapshot": "^29.6.4" + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.4.tgz", - "integrity": "sha512-FEhkJhqtvBwgSpiTrocquJCdXPsyvNKcl/n7A3u7X4pVoF4bswm11c9d4AV+kfq2Gpv/mM8x7E7DsRvH+djkrg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dependencies": { "jest-get-type": "^29.6.3" }, @@ -776,44 +776,44 @@ } }, "node_modules/@jest/fake-timers": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.4.tgz", - "integrity": "sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.4.tgz", - "integrity": "sha512-wVIn5bdtjlChhXAzVXavcY/3PEjf4VqM174BM3eGL5kMxLiZD5CLnbmkEyA1Dwh9q8XjP6E8RwjBsY/iCWrWsA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", "@jest/types": "^29.6.3", - "jest-mock": "^29.6.3" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.4.tgz", - "integrity": "sha512-sxUjWxm7QdchdrD3NfWKrL8FBsortZeibSJv4XLjESOOjSUOkjQcb0ZHJwfhEGIvBvTluTzfG2yZWZhkrXJu8g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", @@ -827,9 +827,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -872,11 +872,11 @@ } }, "node_modules/@jest/test-result": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.4.tgz", - "integrity": "sha512-uQ1C0AUEN90/dsyEirgMLlouROgSY+Wc/JanVVk0OiUKa5UFh7sJpMEM3aoUBAz2BRNvUJ8j3d294WFuRxSyOQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dependencies": { - "@jest/console": "^29.6.4", + "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" @@ -886,13 +886,13 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.4.tgz", - "integrity": "sha512-E84M6LbpcRq3fT4ckfKs9ryVanwkaIB0Ws9bw3/yP4seRLg/VaCZ/LgW0MCq5wwk4/iP/qnilD41aj2fsw2RMg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dependencies": { - "@jest/test-result": "^29.6.4", + "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -900,9 +900,9 @@ } }, "node_modules/@jest/transform": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz", - "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", @@ -912,9 +912,9 @@ "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -1180,11 +1180,11 @@ } }, "node_modules/babel-jest": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.4.tgz", - "integrity": "sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dependencies": { - "@jest/transform": "^29.6.4", + "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", @@ -1366,9 +1366,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001529", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001529.tgz", - "integrity": "sha512-n2pUQYGAkrLG4QYj2desAh+NqsJpHbNmVZz87imptDdxLAtjxary7Df/psdfyDGmskJK/9Dt9cPnx5RZ3CU4Og==", + "version": "1.0.30001534", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001534.tgz", + "integrity": "sha512-vlPVrhsCS7XaSh2VvWluIQEzVhefrUQcEsQWSS5A5V+dM07uv1qHeQzAOTGIMy9i3e9bH15+muvI/UHojVgS/Q==", "funding": [ { "type": "opencollective", @@ -1501,6 +1501,26 @@ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -1609,9 +1629,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.512", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.512.tgz", - "integrity": "sha512-1W8wRbYlQE4ph7eoj3TJ+uqwO6+xvAE/L+KGU7WTQQvX3tnSIGZAb90MTsMoJqzntamiwJhBAj4WZmygXhsOUg==" + "version": "1.4.519", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.519.tgz", + "integrity": "sha512-kqs9oGYL4UFVkLKhqCTgBCYZv+wZ374yABDMqlDda9HvlkQxvSr7kgf4hfWVjMieDbX+1MwPHFBsOGCMIBaFKg==" }, "node_modules/emittery": { "version": "0.13.1", @@ -1696,15 +1716,15 @@ } }, "node_modules/expect": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.4.tgz", - "integrity": "sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dependencies": { - "@jest/expect-utils": "^29.6.4", + "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3" + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -2139,12 +2159,12 @@ } }, "node_modules/jest-changed-files": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.6.3.tgz", - "integrity": "sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dependencies": { "execa": "^5.0.0", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "p-limit": "^3.1.0" }, "engines": { @@ -2152,27 +2172,27 @@ } }, "node_modules/jest-circus": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.4.tgz", - "integrity": "sha512-YXNrRyntVUgDfZbjXWBMPslX1mQ8MrSG0oM/Y06j9EYubODIyHWP8hMUbjbZ19M3M+zamqEur7O80HODwACoJw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", - "@jest/test-result": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "p-limit": "^3.1.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" @@ -2182,21 +2202,20 @@ } }, "node_modules/jest-cli": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.4.tgz", - "integrity": "sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dependencies": { - "@jest/core": "^29.6.4", - "@jest/test-result": "^29.6.4", + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "chalk": "^4.0.0", + "create-jest": "^29.7.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "prompts": "^2.0.1", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "yargs": "^17.3.1" }, "bin": { @@ -2215,30 +2234,30 @@ } }, "node_modules/jest-config": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.4.tgz", - "integrity": "sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.6.4", + "@jest/test-sequencer": "^29.7.0", "@jest/types": "^29.6.3", - "babel-jest": "^29.6.4", + "babel-jest": "^29.7.0", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.6.4", - "jest-environment-node": "^29.6.4", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", "jest-get-type": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -2259,23 +2278,23 @@ } }, "node_modules/jest-diff": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.4.tgz", - "integrity": "sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-docblock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.6.3.tgz", - "integrity": "sha512-2+H+GOTQBEm2+qFSQ7Ma+BvyV+waiIFxmZF5LdpBsAEjWX8QYjSCa4FrkIYtbfXUJJJnFCYrOtt6TZ+IAiTjBQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dependencies": { "detect-newline": "^3.0.0" }, @@ -2284,31 +2303,31 @@ } }, "node_modules/jest-each": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.3.tgz", - "integrity": "sha512-KoXfJ42k8cqbkfshW7sSHcdfnv5agDdHCPA87ZBdmHP+zJstTJc0ttQaJ/x7zK6noAL76hOuTIJ6ZkQRS5dcyg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", - "jest-util": "^29.6.3", - "pretty-format": "^29.6.3" + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-environment-node": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.4.tgz", - "integrity": "sha512-i7SbpH2dEIFGNmxGCpSc2w9cA4qVD+wfvg2ZnfQ7XVrKL0NA5uDVBIiGH8SR4F0dKEv/0qI5r+aDomDf04DpEQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -2323,9 +2342,9 @@ } }, "node_modules/jest-haste-map": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz", - "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", @@ -2334,8 +2353,8 @@ "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -2347,35 +2366,35 @@ } }, "node_modules/jest-leak-detector": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.3.tgz", - "integrity": "sha512-0kfbESIHXYdhAdpLsW7xdwmYhLf1BRu4AA118/OxFm0Ho1b2RcTmO4oF6aAMaxpxdxnJ3zve2rgwzNBD4Zbm7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dependencies": { "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.4.tgz", - "integrity": "sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.6.4", + "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-message-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.3.tgz", - "integrity": "sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", @@ -2383,7 +2402,7 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -2392,13 +2411,13 @@ } }, "node_modules/jest-mock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.3.tgz", - "integrity": "sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", - "jest-util": "^29.6.3" + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -2429,16 +2448,16 @@ } }, "node_modules/jest-resolve": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.4.tgz", - "integrity": "sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" @@ -2448,41 +2467,41 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.4.tgz", - "integrity": "sha512-7+6eAmr1ZBF3vOAJVsfLj1QdqeXG+WYhidfLHBRZqGN24MFRIiKG20ItpLw2qRAsW/D2ZUUmCNf6irUr/v6KHA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dependencies": { "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.6.4" + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.4.tgz", - "integrity": "sha512-SDaLrMmtVlQYDuG0iSPYLycG8P9jLI+fRm8AF/xPKhYDB2g6xDWjXBrR5M8gEWsK6KVFlebpZ4QsrxdyIX1Jaw==", - "dependencies": { - "@jest/console": "^29.6.4", - "@jest/environment": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.6.3", - "jest-environment-node": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-leak-detector": "^29.6.3", - "jest-message-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-util": "^29.6.3", - "jest-watcher": "^29.6.4", - "jest-worker": "^29.6.4", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -2491,16 +2510,16 @@ } }, "node_modules/jest-runtime": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.4.tgz", - "integrity": "sha512-s/QxMBLvmwLdchKEjcLfwzP7h+jsHvNEtxGP5P+Fl1FMaJX2jMiIqe4rJw4tFprzCwuSvVUo9bn0uj4gNRXsbA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", - "@jest/globals": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", @@ -2508,13 +2527,13 @@ "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -2523,29 +2542,29 @@ } }, "node_modules/jest-snapshot": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.4.tgz", - "integrity": "sha512-VC1N8ED7+4uboUKGIDsbvNAZb6LakgIPgAF4RSpF13dN6YaMokfRqO+BaqK4zIh6X3JffgwbzuGqDEjHm/MrvA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.6.4", + "expect": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-diff": "^29.6.4", + "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "natural-compare": "^1.4.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "semver": "^7.5.3" }, "engines": { @@ -2583,9 +2602,9 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/jest-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", - "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -2599,16 +2618,16 @@ } }, "node_modules/jest-validate": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz", - "integrity": "sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dependencies": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -2626,17 +2645,17 @@ } }, "node_modules/jest-watcher": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.4.tgz", - "integrity": "sha512-oqUWvx6+On04ShsT00Ir9T4/FvBeEh2M9PTubgITPxDa739p4hoQweWPRGyYeaojgT0xTpZKF0Y/rSY1UgMxvQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dependencies": { - "@jest/test-result": "^29.6.4", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "string-length": "^4.0.1" }, "engines": { @@ -2644,12 +2663,12 @@ } }, "node_modules/jest-worker": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", - "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dependencies": { "@types/node": "*", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -3057,9 +3076,9 @@ } }, "node_modules/pretty-format": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", - "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", diff --git a/dtfs-central-api/package-lock.json b/dtfs-central-api/package-lock.json index e7c331ff2e..c55a806534 100644 --- a/dtfs-central-api/package-lock.json +++ b/dtfs-central-api/package-lock.json @@ -15,7 +15,7 @@ "dotenv": "16.0.3", "express": "4.18.2", "express-mongo-sanitize": "^2.2.0", - "express-rate-limit": "^6.11.0", + "express-rate-limit": "^6.11.2", "moment": "^2.29.4", "mongo-dot-notation": "3.1.0", "mongodb": "4.2.0", @@ -24,7 +24,7 @@ "swagger-ui-express": "^4.6.3" }, "devDependencies": { - "eslint": "^8.48.0", + "eslint": "^8.49.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.28.1", "jest": "29.5.0", @@ -191,21 +191,21 @@ } }, "node_modules/@babel/core": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.15.tgz", - "integrity": "sha512-PtZqMmgRrvj8ruoEOIwVA3yoF91O+Hgw9o7DAUTNBA6Mo2jpu31clx9a7Nz/9JznqetTR6zwfC4L3LAjKQXUwA==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.17.tgz", + "integrity": "sha512-2EENLmhpwplDux5PSsZnSbnSkB3tZ6QTksgO25xwEL7pIDcNOMhF5v/s6RzwjMZzZzw9Ofc30gHv5ChCC8pifQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.22.13", "@babel/generator": "^7.22.15", "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.22.15", + "@babel/helper-module-transforms": "^7.22.17", "@babel/helpers": "^7.22.15", - "@babel/parser": "^7.22.15", + "@babel/parser": "^7.22.16", "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.15", - "@babel/types": "^7.22.15", + "@babel/traverse": "^7.22.17", + "@babel/types": "^7.22.17", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -327,9 +327,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.15.tgz", - "integrity": "sha512-l1UiX4UyHSFsYt17iQ3Se5pQQZZHa22zyIXURmvkmLCD4t/aU+dvNWHatKac/D9Vm9UES7nvIqHs4jZqKviUmQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.17.tgz", + "integrity": "sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", @@ -719,9 +719,9 @@ } }, "node_modules/@babel/traverse": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.15.tgz", - "integrity": "sha512-DdHPwvJY0sEeN4xJU5uRLmZjgMMDIvMPniLuYzUVXj/GGzysPl0/fwt44JBkyUIzGJPV8QgHMcQdQ34XFuKTYQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.17.tgz", + "integrity": "sha512-xK4Uwm0JnAMvxYZxOVecss85WxTEIbTa7bnGyf/+EgCL5Zt3U7htUpEOWv9detPlamGKuRzCqw74xVglDWpPdg==", "dev": true, "dependencies": { "@babel/code-frame": "^7.22.13", @@ -730,8 +730,8 @@ "@babel/helper-function-name": "^7.22.5", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/types": "^7.22.17", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -772,9 +772,9 @@ "dev": true }, "node_modules/@babel/types": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.15.tgz", - "integrity": "sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.17.tgz", + "integrity": "sha512-YSQPHLFtQNE5xN9tHuZnzu8vPr61wVTBZdfv1meex1NBosa4iT05k/Jw06ddJugi4bk7The/oSwQGFcksmEJQg==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", @@ -807,9 +807,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", - "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", + "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -862,9 +862,9 @@ "dev": true }, "node_modules/@eslint/js": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", - "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", + "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1035,16 +1035,16 @@ } }, "node_modules/@jest/console": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.4.tgz", - "integrity": "sha512-wNK6gC0Ha9QeEPSkeJedQuTQqxZYnDPuDcDhVuVatRvMkL4D0VTvFVZj+Yuh6caG2aOfzkUZ36KtCmLNtR02hw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -1052,15 +1052,15 @@ } }, "node_modules/@jest/core": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.4.tgz", - "integrity": "sha512-U/vq5ccNTSVgYH7mHnodHmCffGWHJnz/E1BEWlLuK5pM4FZmGfBn/nrJGLjUsSmyx3otCeqc1T31F4y08AMDLg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, "dependencies": { - "@jest/console": "^29.6.4", - "@jest/reporters": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -1068,21 +1068,21 @@ "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.6.3", - "jest-config": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-resolve-dependencies": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "jest-watcher": "^29.6.4", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -1099,37 +1099,37 @@ } }, "node_modules/@jest/environment": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.4.tgz", - "integrity": "sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "dependencies": { - "@jest/fake-timers": "^29.6.4", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.3" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.4.tgz", - "integrity": "sha512-Warhsa7d23+3X5bLbrbYvaehcgX5TLYhI03JKoedTiI8uJU4IhqYBWF7OSSgUyz4IgLpUYPkK0AehA5/fRclAA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, "dependencies": { - "expect": "^29.6.4", - "jest-snapshot": "^29.6.4" + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.4.tgz", - "integrity": "sha512-FEhkJhqtvBwgSpiTrocquJCdXPsyvNKcl/n7A3u7X4pVoF4bswm11c9d4AV+kfq2Gpv/mM8x7E7DsRvH+djkrg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, "dependencies": { "jest-get-type": "^29.6.3" @@ -1139,47 +1139,47 @@ } }, "node_modules/@jest/fake-timers": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.4.tgz", - "integrity": "sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.4.tgz", - "integrity": "sha512-wVIn5bdtjlChhXAzVXavcY/3PEjf4VqM174BM3eGL5kMxLiZD5CLnbmkEyA1Dwh9q8XjP6E8RwjBsY/iCWrWsA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", "@jest/types": "^29.6.3", - "jest-mock": "^29.6.3" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.4.tgz", - "integrity": "sha512-sxUjWxm7QdchdrD3NfWKrL8FBsortZeibSJv4XLjESOOjSUOkjQcb0ZHJwfhEGIvBvTluTzfG2yZWZhkrXJu8g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", @@ -1193,9 +1193,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -1240,12 +1240,12 @@ } }, "node_modules/@jest/test-result": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.4.tgz", - "integrity": "sha512-uQ1C0AUEN90/dsyEirgMLlouROgSY+Wc/JanVVk0OiUKa5UFh7sJpMEM3aoUBAz2BRNvUJ8j3d294WFuRxSyOQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, "dependencies": { - "@jest/console": "^29.6.4", + "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" @@ -1255,14 +1255,14 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.4.tgz", - "integrity": "sha512-E84M6LbpcRq3fT4ckfKs9ryVanwkaIB0Ws9bw3/yP4seRLg/VaCZ/LgW0MCq5wwk4/iP/qnilD41aj2fsw2RMg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, "dependencies": { - "@jest/test-result": "^29.6.4", + "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -1270,9 +1270,9 @@ } }, "node_modules/@jest/transform": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz", - "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -1283,9 +1283,9 @@ "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -1510,9 +1510,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.5.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.9.tgz", - "integrity": "sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==" + "version": "20.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.0.tgz", + "integrity": "sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==" }, "node_modules/@types/stack-utils": { "version": "2.0.1", @@ -1818,12 +1818,12 @@ } }, "node_modules/babel-jest": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.4.tgz", - "integrity": "sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "dependencies": { - "@jest/transform": "^29.6.4", + "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", @@ -2132,9 +2132,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001529", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001529.tgz", - "integrity": "sha512-n2pUQYGAkrLG4QYj2desAh+NqsJpHbNmVZz87imptDdxLAtjxary7Df/psdfyDGmskJK/9Dt9cPnx5RZ3CU4Og==", + "version": "1.0.30001534", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001534.tgz", + "integrity": "sha512-vlPVrhsCS7XaSh2VvWluIQEzVhefrUQcEsQWSS5A5V+dM07uv1qHeQzAOTGIMy9i3e9bH15+muvI/UHojVgS/Q==", "dev": true, "funding": [ { @@ -2409,6 +2409,27 @@ "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", "dev": true }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -2475,12 +2496,27 @@ "node": ">=0.10.0" } }, + "node_modules/define-data-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.0.1.tgz", + "integrity": "sha512-22M+6zEspQHx10bfFQl2ET39IvfuQ7+rZIH7+ard8fCC4hPmkOSy+8JhKxBRLaWUziJ0O63NTYT97LR8zUfPTw==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -2577,9 +2613,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.512", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.512.tgz", - "integrity": "sha512-1W8wRbYlQE4ph7eoj3TJ+uqwO6+xvAE/L+KGU7WTQQvX3tnSIGZAb90MTsMoJqzntamiwJhBAj4WZmygXhsOUg==", + "version": "1.4.519", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.519.tgz", + "integrity": "sha512-kqs9oGYL4UFVkLKhqCTgBCYZv+wZ374yABDMqlDda9HvlkQxvSr7kgf4hfWVjMieDbX+1MwPHFBsOGCMIBaFKg==", "dev": true }, "node_modules/emittery": { @@ -2737,16 +2773,16 @@ } }, "node_modules/eslint": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", - "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", + "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.48.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint/js": "8.49.0", + "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", @@ -3088,16 +3124,16 @@ } }, "node_modules/expect": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.4.tgz", - "integrity": "sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, "dependencies": { - "@jest/expect-utils": "^29.6.4", + "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3" + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -3153,9 +3189,9 @@ } }, "node_modules/express-rate-limit": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.0.tgz", - "integrity": "sha512-H9afltGTaEZcvenAB5LFgb/ysTMHUzMxoB3TJM6UHP5FtAP1p2+heMj1xwTei54Zm4I9I/2qsS5m+XrdKQp/Hw==", + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.2.tgz", + "integrity": "sha512-a7uwwfNTh1U60ssiIkuLFWHt4hAC5yxlLGU2VP0X4YNlyEDZAqF4tK3GD3NSitVBrCQmQ0++0uOyFOgC2y4DDw==", "engines": { "node": ">= 14" }, @@ -4255,13 +4291,13 @@ } }, "node_modules/jest-changed-files": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.6.3.tgz", - "integrity": "sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, "dependencies": { "execa": "^5.0.0", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "p-limit": "^3.1.0" }, "engines": { @@ -4269,28 +4305,28 @@ } }, "node_modules/jest-circus": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.4.tgz", - "integrity": "sha512-YXNrRyntVUgDfZbjXWBMPslX1mQ8MrSG0oM/Y06j9EYubODIyHWP8hMUbjbZ19M3M+zamqEur7O80HODwACoJw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", - "@jest/test-result": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "p-limit": "^3.1.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" @@ -4300,22 +4336,21 @@ } }, "node_modules/jest-cli": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.4.tgz", - "integrity": "sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, "dependencies": { - "@jest/core": "^29.6.4", - "@jest/test-result": "^29.6.4", + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "chalk": "^4.0.0", + "create-jest": "^29.7.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "prompts": "^2.0.1", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "yargs": "^17.3.1" }, "bin": { @@ -4334,31 +4369,31 @@ } }, "node_modules/jest-config": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.4.tgz", - "integrity": "sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.6.4", + "@jest/test-sequencer": "^29.7.0", "@jest/types": "^29.6.3", - "babel-jest": "^29.6.4", + "babel-jest": "^29.7.0", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.6.4", - "jest-environment-node": "^29.6.4", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", "jest-get-type": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -4379,24 +4414,24 @@ } }, "node_modules/jest-diff": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.4.tgz", - "integrity": "sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-docblock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.6.3.tgz", - "integrity": "sha512-2+H+GOTQBEm2+qFSQ7Ma+BvyV+waiIFxmZF5LdpBsAEjWX8QYjSCa4FrkIYtbfXUJJJnFCYrOtt6TZ+IAiTjBQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, "dependencies": { "detect-newline": "^3.0.0" @@ -4406,33 +4441,33 @@ } }, "node_modules/jest-each": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.3.tgz", - "integrity": "sha512-KoXfJ42k8cqbkfshW7sSHcdfnv5agDdHCPA87ZBdmHP+zJstTJc0ttQaJ/x7zK6noAL76hOuTIJ6ZkQRS5dcyg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", - "jest-util": "^29.6.3", - "pretty-format": "^29.6.3" + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-environment-node": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.4.tgz", - "integrity": "sha512-i7SbpH2dEIFGNmxGCpSc2w9cA4qVD+wfvg2ZnfQ7XVrKL0NA5uDVBIiGH8SR4F0dKEv/0qI5r+aDomDf04DpEQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -4448,9 +4483,9 @@ } }, "node_modules/jest-haste-map": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz", - "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -4460,8 +4495,8 @@ "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -4473,37 +4508,37 @@ } }, "node_modules/jest-leak-detector": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.3.tgz", - "integrity": "sha512-0kfbESIHXYdhAdpLsW7xdwmYhLf1BRu4AA118/OxFm0Ho1b2RcTmO4oF6aAMaxpxdxnJ3zve2rgwzNBD4Zbm7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, "dependencies": { "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.4.tgz", - "integrity": "sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.6.4", + "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-message-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.3.tgz", - "integrity": "sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", @@ -4512,7 +4547,7 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -4521,14 +4556,14 @@ } }, "node_modules/jest-mock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.3.tgz", - "integrity": "sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", - "jest-util": "^29.6.3" + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -4561,17 +4596,17 @@ } }, "node_modules/jest-resolve": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.4.tgz", - "integrity": "sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" @@ -4581,43 +4616,43 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.4.tgz", - "integrity": "sha512-7+6eAmr1ZBF3vOAJVsfLj1QdqeXG+WYhidfLHBRZqGN24MFRIiKG20ItpLw2qRAsW/D2ZUUmCNf6irUr/v6KHA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, "dependencies": { "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.6.4" + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.4.tgz", - "integrity": "sha512-SDaLrMmtVlQYDuG0iSPYLycG8P9jLI+fRm8AF/xPKhYDB2g6xDWjXBrR5M8gEWsK6KVFlebpZ4QsrxdyIX1Jaw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, "dependencies": { - "@jest/console": "^29.6.4", - "@jest/environment": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.6.3", - "jest-environment-node": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-leak-detector": "^29.6.3", - "jest-message-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-util": "^29.6.3", - "jest-watcher": "^29.6.4", - "jest-worker": "^29.6.4", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -4626,17 +4661,17 @@ } }, "node_modules/jest-runtime": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.4.tgz", - "integrity": "sha512-s/QxMBLvmwLdchKEjcLfwzP7h+jsHvNEtxGP5P+Fl1FMaJX2jMiIqe4rJw4tFprzCwuSvVUo9bn0uj4gNRXsbA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", - "@jest/globals": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", @@ -4644,13 +4679,13 @@ "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -4659,9 +4694,9 @@ } }, "node_modules/jest-snapshot": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.4.tgz", - "integrity": "sha512-VC1N8ED7+4uboUKGIDsbvNAZb6LakgIPgAF4RSpF13dN6YaMokfRqO+BaqK4zIh6X3JffgwbzuGqDEjHm/MrvA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -4669,20 +4704,20 @@ "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.6.4", + "expect": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-diff": "^29.6.4", + "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "natural-compare": "^1.4.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "semver": "^7.5.3" }, "engines": { @@ -4723,9 +4758,9 @@ "dev": true }, "node_modules/jest-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", - "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -4740,9 +4775,9 @@ } }, "node_modules/jest-validate": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz", - "integrity": "sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -4750,7 +4785,7 @@ "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -4769,18 +4804,18 @@ } }, "node_modules/jest-watcher": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.4.tgz", - "integrity": "sha512-oqUWvx6+On04ShsT00Ir9T4/FvBeEh2M9PTubgITPxDa739p4hoQweWPRGyYeaojgT0xTpZKF0Y/rSY1UgMxvQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, "dependencies": { - "@jest/test-result": "^29.6.4", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "string-length": "^4.0.1" }, "engines": { @@ -4788,13 +4823,13 @@ } }, "node_modules/jest-worker": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", - "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -5695,9 +5730,9 @@ } }, "node_modules/pretty-format": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", - "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", @@ -5866,14 +5901,14 @@ "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" }, "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "set-function-name": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -6100,6 +6135,19 @@ "node": ">= 0.8.0" } }, + "node_modules/set-function-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.0.tgz", + "integrity": "sha512-WmS8UHojv5s1eSoRSmzO5zzgDq8PE1/X/ij0k+9fMYmINCc6+j+SF3Om8YyucKn2yjnK4ItNZOoQycNnHsZJTw==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", diff --git a/dtfs-central-api/package.json b/dtfs-central-api/package.json index 805226f314..1b67bed4d4 100644 --- a/dtfs-central-api/package.json +++ b/dtfs-central-api/package.json @@ -43,7 +43,7 @@ "dotenv": "16.0.3", "express": "4.18.2", "express-mongo-sanitize": "^2.2.0", - "express-rate-limit": "^6.11.0", + "express-rate-limit": "^6.11.2", "moment": "^2.29.4", "mongo-dot-notation": "3.1.0", "mongodb": "4.2.0", @@ -52,7 +52,7 @@ "swagger-ui-express": "^4.6.3" }, "devDependencies": { - "eslint": "^8.48.0", + "eslint": "^8.49.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.28.1", "jest": "29.5.0", diff --git a/external-api/package-lock.json b/external-api/package-lock.json index eaf5440809..9d2a38542c 100644 --- a/external-api/package-lock.json +++ b/external-api/package-lock.json @@ -13,14 +13,14 @@ "@types/cors": "^2.8.14", "@types/express": "^4.17.17", "@types/jest": "^29.5.4", - "@types/node": "^18.17.14", + "@types/node": "^18.17.15", "@types/node-cron": "^3.0.8", "@types/supertest": "^2.0.12", "@types/swagger-jsdoc": "^6.0.1", "@types/swagger-ui-express": "^4.1.3", "@types/validator": "13.7.17", "axios": "^1.5.0", - "axios-mock-adapter": "^1.21.5", + "axios-mock-adapter": "^1.22.0", "compression": "^1.7.4", "cors": "^2.8.5", "cron-job-manager": "^2.3.1", @@ -28,7 +28,7 @@ "dotenv": "16.3.1", "express": "4.18.2", "express-mongo-sanitize": "^2.2.0", - "express-rate-limit": "^6.11.0", + "express-rate-limit": "^6.11.2", "joi": "^17.10.1", "mongodb": "4.2.0", "nodemon": "^3.0.1", @@ -43,7 +43,7 @@ "devDependencies": { "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", - "eslint": "^8.48.0", + "eslint": "^8.49.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-airbnb-typescript": "^17.1.0", "eslint-config-airbnb-typescript-prettier": "^5.0.0", @@ -210,21 +210,21 @@ } }, "node_modules/@babel/core": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.15.tgz", - "integrity": "sha512-PtZqMmgRrvj8ruoEOIwVA3yoF91O+Hgw9o7DAUTNBA6Mo2jpu31clx9a7Nz/9JznqetTR6zwfC4L3LAjKQXUwA==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.17.tgz", + "integrity": "sha512-2EENLmhpwplDux5PSsZnSbnSkB3tZ6QTksgO25xwEL7pIDcNOMhF5v/s6RzwjMZzZzw9Ofc30gHv5ChCC8pifQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.22.13", "@babel/generator": "^7.22.15", "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.22.15", + "@babel/helper-module-transforms": "^7.22.17", "@babel/helpers": "^7.22.15", - "@babel/parser": "^7.22.15", + "@babel/parser": "^7.22.16", "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.15", - "@babel/types": "^7.22.15", + "@babel/traverse": "^7.22.17", + "@babel/types": "^7.22.17", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -341,9 +341,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.15.tgz", - "integrity": "sha512-l1UiX4UyHSFsYt17iQ3Se5pQQZZHa22zyIXURmvkmLCD4t/aU+dvNWHatKac/D9Vm9UES7nvIqHs4jZqKviUmQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.17.tgz", + "integrity": "sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", @@ -724,9 +724,9 @@ } }, "node_modules/@babel/traverse": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.15.tgz", - "integrity": "sha512-DdHPwvJY0sEeN4xJU5uRLmZjgMMDIvMPniLuYzUVXj/GGzysPl0/fwt44JBkyUIzGJPV8QgHMcQdQ34XFuKTYQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.17.tgz", + "integrity": "sha512-xK4Uwm0JnAMvxYZxOVecss85WxTEIbTa7bnGyf/+EgCL5Zt3U7htUpEOWv9detPlamGKuRzCqw74xVglDWpPdg==", "dev": true, "dependencies": { "@babel/code-frame": "^7.22.13", @@ -735,8 +735,8 @@ "@babel/helper-function-name": "^7.22.5", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/types": "^7.22.17", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -754,9 +754,9 @@ } }, "node_modules/@babel/types": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.15.tgz", - "integrity": "sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.17.tgz", + "integrity": "sha512-YSQPHLFtQNE5xN9tHuZnzu8vPr61wVTBZdfv1meex1NBosa4iT05k/Jw06ddJugi4bk7The/oSwQGFcksmEJQg==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", @@ -809,9 +809,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", - "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", + "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -841,9 +841,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", - "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", + "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1004,16 +1004,16 @@ } }, "node_modules/@jest/console": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.4.tgz", - "integrity": "sha512-wNK6gC0Ha9QeEPSkeJedQuTQqxZYnDPuDcDhVuVatRvMkL4D0VTvFVZj+Yuh6caG2aOfzkUZ36KtCmLNtR02hw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -1021,15 +1021,15 @@ } }, "node_modules/@jest/core": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.4.tgz", - "integrity": "sha512-U/vq5ccNTSVgYH7mHnodHmCffGWHJnz/E1BEWlLuK5pM4FZmGfBn/nrJGLjUsSmyx3otCeqc1T31F4y08AMDLg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, "dependencies": { - "@jest/console": "^29.6.4", - "@jest/reporters": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -1037,21 +1037,21 @@ "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.6.3", - "jest-config": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-resolve-dependencies": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "jest-watcher": "^29.6.4", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -1068,37 +1068,37 @@ } }, "node_modules/@jest/environment": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.4.tgz", - "integrity": "sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "dependencies": { - "@jest/fake-timers": "^29.6.4", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.3" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.4.tgz", - "integrity": "sha512-Warhsa7d23+3X5bLbrbYvaehcgX5TLYhI03JKoedTiI8uJU4IhqYBWF7OSSgUyz4IgLpUYPkK0AehA5/fRclAA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, "dependencies": { - "expect": "^29.6.4", - "jest-snapshot": "^29.6.4" + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.4.tgz", - "integrity": "sha512-FEhkJhqtvBwgSpiTrocquJCdXPsyvNKcl/n7A3u7X4pVoF4bswm11c9d4AV+kfq2Gpv/mM8x7E7DsRvH+djkrg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dependencies": { "jest-get-type": "^29.6.3" }, @@ -1107,47 +1107,47 @@ } }, "node_modules/@jest/fake-timers": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.4.tgz", - "integrity": "sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.4.tgz", - "integrity": "sha512-wVIn5bdtjlChhXAzVXavcY/3PEjf4VqM174BM3eGL5kMxLiZD5CLnbmkEyA1Dwh9q8XjP6E8RwjBsY/iCWrWsA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", "@jest/types": "^29.6.3", - "jest-mock": "^29.6.3" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.4.tgz", - "integrity": "sha512-sxUjWxm7QdchdrD3NfWKrL8FBsortZeibSJv4XLjESOOjSUOkjQcb0ZHJwfhEGIvBvTluTzfG2yZWZhkrXJu8g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", @@ -1161,9 +1161,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -1207,12 +1207,12 @@ } }, "node_modules/@jest/test-result": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.4.tgz", - "integrity": "sha512-uQ1C0AUEN90/dsyEirgMLlouROgSY+Wc/JanVVk0OiUKa5UFh7sJpMEM3aoUBAz2BRNvUJ8j3d294WFuRxSyOQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, "dependencies": { - "@jest/console": "^29.6.4", + "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" @@ -1222,14 +1222,14 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.4.tgz", - "integrity": "sha512-E84M6LbpcRq3fT4ckfKs9ryVanwkaIB0Ws9bw3/yP4seRLg/VaCZ/LgW0MCq5wwk4/iP/qnilD41aj2fsw2RMg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, "dependencies": { - "@jest/test-result": "^29.6.4", + "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -1237,9 +1237,9 @@ } }, "node_modules/@jest/transform": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz", - "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -1250,9 +1250,9 @@ "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -1587,9 +1587,9 @@ "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, "node_modules/@types/node": { - "version": "18.17.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.14.tgz", - "integrity": "sha512-ZE/5aB73CyGqgQULkLG87N9GnyGe5TcQjv34pwS8tfBs1IkCh0ASM69mydb2znqd6v0eX+9Ytvk6oQRqu8T1Vw==" + "version": "18.17.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.15.tgz", + "integrity": "sha512-2yrWpBk32tvV/JAd3HNHWuZn/VDN1P+72hWirHnvsvTGSqbANi+kSeuQR9yAHnbvaBvHDsoTdXV0Fe+iRtHLKA==" }, "node_modules/@types/node-cron": { "version": "3.0.8", @@ -2203,9 +2203,9 @@ } }, "node_modules/axe-core": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.8.0.tgz", - "integrity": "sha512-ZtlVZobOeDQhb/y2lMK6mznDw7TJHDNcKx5/bbBkFvArIQ5CVFhSI6hWWQnMx9I8cNmNmZ30wpDyOC2E2nvgbQ==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.8.1.tgz", + "integrity": "sha512-9l850jDDPnKq48nbad8SiEelCv4OrUWrKab/cPj0GScVg6cb6NbCCt/Ulk26QEq5jP9NnGr04Bit1BHyV6r5CQ==", "dev": true, "engines": { "node": ">=4" @@ -2222,9 +2222,9 @@ } }, "node_modules/axios-mock-adapter": { - "version": "1.21.5", - "resolved": "https://registry.npmjs.org/axios-mock-adapter/-/axios-mock-adapter-1.21.5.tgz", - "integrity": "sha512-5NI1V/VK+8+JeTF8niqOowuysA4b8mGzdlMN/QnTnoXbYh4HZSNiopsDclN2g/m85+G++IrEtUdZaQ3GnaMsSA==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/axios-mock-adapter/-/axios-mock-adapter-1.22.0.tgz", + "integrity": "sha512-dmI0KbkyAhntUR05YY96qg2H6gg0XMl2+qTW0xmYg6Up+BFBAJYRLROMXRdDEL06/Wqwa0TJThAYvFtSFdRCZw==", "dependencies": { "fast-deep-equal": "^3.1.3", "is-buffer": "^2.0.5" @@ -2243,12 +2243,12 @@ } }, "node_modules/babel-jest": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.4.tgz", - "integrity": "sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "dependencies": { - "@jest/transform": "^29.6.4", + "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", @@ -2596,9 +2596,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001529", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001529.tgz", - "integrity": "sha512-n2pUQYGAkrLG4QYj2desAh+NqsJpHbNmVZz87imptDdxLAtjxary7Df/psdfyDGmskJK/9Dt9cPnx5RZ3CU4Og==", + "version": "1.0.30001534", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001534.tgz", + "integrity": "sha512-vlPVrhsCS7XaSh2VvWluIQEzVhefrUQcEsQWSS5A5V+dM07uv1qHeQzAOTGIMy9i3e9bH15+muvI/UHojVgS/Q==", "dev": true, "funding": [ { @@ -2894,6 +2894,27 @@ "node": ">= 0.10" } }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -2996,12 +3017,27 @@ "node": ">=0.10.0" } }, + "node_modules/define-data-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.0.1.tgz", + "integrity": "sha512-22M+6zEspQHx10bfFQl2ET39IvfuQ7+rZIH7+ard8fCC4hPmkOSy+8JhKxBRLaWUziJ0O63NTYT97LR8zUfPTw==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -3137,9 +3173,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.512", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.512.tgz", - "integrity": "sha512-1W8wRbYlQE4ph7eoj3TJ+uqwO6+xvAE/L+KGU7WTQQvX3tnSIGZAb90MTsMoJqzntamiwJhBAj4WZmygXhsOUg==", + "version": "1.4.519", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.519.tgz", + "integrity": "sha512-kqs9oGYL4UFVkLKhqCTgBCYZv+wZ374yABDMqlDda9HvlkQxvSr7kgf4hfWVjMieDbX+1MwPHFBsOGCMIBaFKg==", "dev": true }, "node_modules/emittery": { @@ -3332,16 +3368,16 @@ } }, "node_modules/eslint": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", - "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", + "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.48.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint/js": "8.49.0", + "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", @@ -3956,15 +3992,15 @@ } }, "node_modules/expect": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.4.tgz", - "integrity": "sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dependencies": { - "@jest/expect-utils": "^29.6.4", + "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3" + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -4020,9 +4056,9 @@ } }, "node_modules/express-rate-limit": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.0.tgz", - "integrity": "sha512-H9afltGTaEZcvenAB5LFgb/ysTMHUzMxoB3TJM6UHP5FtAP1p2+heMj1xwTei54Zm4I9I/2qsS5m+XrdKQp/Hw==", + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.2.tgz", + "integrity": "sha512-a7uwwfNTh1U60ssiIkuLFWHt4hAC5yxlLGU2VP0X4YNlyEDZAqF4tK3GD3NSitVBrCQmQ0++0uOyFOgC2y4DDw==", "engines": { "node": ">= 14" }, @@ -5280,13 +5316,13 @@ } }, "node_modules/jest-changed-files": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.6.3.tgz", - "integrity": "sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, "dependencies": { "execa": "^5.0.0", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "p-limit": "^3.1.0" }, "engines": { @@ -5294,28 +5330,28 @@ } }, "node_modules/jest-circus": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.4.tgz", - "integrity": "sha512-YXNrRyntVUgDfZbjXWBMPslX1mQ8MrSG0oM/Y06j9EYubODIyHWP8hMUbjbZ19M3M+zamqEur7O80HODwACoJw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", - "@jest/test-result": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "p-limit": "^3.1.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" @@ -5325,22 +5361,21 @@ } }, "node_modules/jest-cli": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.4.tgz", - "integrity": "sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, "dependencies": { - "@jest/core": "^29.6.4", - "@jest/test-result": "^29.6.4", + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "chalk": "^4.0.0", + "create-jest": "^29.7.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "prompts": "^2.0.1", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "yargs": "^17.3.1" }, "bin": { @@ -5359,31 +5394,31 @@ } }, "node_modules/jest-config": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.4.tgz", - "integrity": "sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.6.4", + "@jest/test-sequencer": "^29.7.0", "@jest/types": "^29.6.3", - "babel-jest": "^29.6.4", + "babel-jest": "^29.7.0", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.6.4", - "jest-environment-node": "^29.6.4", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", "jest-get-type": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -5404,23 +5439,23 @@ } }, "node_modules/jest-diff": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.4.tgz", - "integrity": "sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-docblock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.6.3.tgz", - "integrity": "sha512-2+H+GOTQBEm2+qFSQ7Ma+BvyV+waiIFxmZF5LdpBsAEjWX8QYjSCa4FrkIYtbfXUJJJnFCYrOtt6TZ+IAiTjBQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, "dependencies": { "detect-newline": "^3.0.0" @@ -5430,33 +5465,33 @@ } }, "node_modules/jest-each": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.3.tgz", - "integrity": "sha512-KoXfJ42k8cqbkfshW7sSHcdfnv5agDdHCPA87ZBdmHP+zJstTJc0ttQaJ/x7zK6noAL76hOuTIJ6ZkQRS5dcyg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", - "jest-util": "^29.6.3", - "pretty-format": "^29.6.3" + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-environment-node": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.4.tgz", - "integrity": "sha512-i7SbpH2dEIFGNmxGCpSc2w9cA4qVD+wfvg2ZnfQ7XVrKL0NA5uDVBIiGH8SR4F0dKEv/0qI5r+aDomDf04DpEQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -5471,9 +5506,9 @@ } }, "node_modules/jest-haste-map": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz", - "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -5483,8 +5518,8 @@ "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -5496,36 +5531,36 @@ } }, "node_modules/jest-leak-detector": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.3.tgz", - "integrity": "sha512-0kfbESIHXYdhAdpLsW7xdwmYhLf1BRu4AA118/OxFm0Ho1b2RcTmO4oF6aAMaxpxdxnJ3zve2rgwzNBD4Zbm7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, "dependencies": { "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.4.tgz", - "integrity": "sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.6.4", + "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-message-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.3.tgz", - "integrity": "sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", @@ -5533,7 +5568,7 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -5542,14 +5577,14 @@ } }, "node_modules/jest-mock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.3.tgz", - "integrity": "sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", - "jest-util": "^29.6.3" + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -5582,17 +5617,17 @@ } }, "node_modules/jest-resolve": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.4.tgz", - "integrity": "sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" @@ -5602,43 +5637,43 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.4.tgz", - "integrity": "sha512-7+6eAmr1ZBF3vOAJVsfLj1QdqeXG+WYhidfLHBRZqGN24MFRIiKG20ItpLw2qRAsW/D2ZUUmCNf6irUr/v6KHA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, "dependencies": { "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.6.4" + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.4.tgz", - "integrity": "sha512-SDaLrMmtVlQYDuG0iSPYLycG8P9jLI+fRm8AF/xPKhYDB2g6xDWjXBrR5M8gEWsK6KVFlebpZ4QsrxdyIX1Jaw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, "dependencies": { - "@jest/console": "^29.6.4", - "@jest/environment": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.6.3", - "jest-environment-node": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-leak-detector": "^29.6.3", - "jest-message-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-util": "^29.6.3", - "jest-watcher": "^29.6.4", - "jest-worker": "^29.6.4", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -5647,17 +5682,17 @@ } }, "node_modules/jest-runtime": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.4.tgz", - "integrity": "sha512-s/QxMBLvmwLdchKEjcLfwzP7h+jsHvNEtxGP5P+Fl1FMaJX2jMiIqe4rJw4tFprzCwuSvVUo9bn0uj4gNRXsbA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", - "@jest/globals": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", @@ -5665,13 +5700,13 @@ "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -5680,9 +5715,9 @@ } }, "node_modules/jest-snapshot": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.4.tgz", - "integrity": "sha512-VC1N8ED7+4uboUKGIDsbvNAZb6LakgIPgAF4RSpF13dN6YaMokfRqO+BaqK4zIh6X3JffgwbzuGqDEjHm/MrvA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -5690,20 +5725,20 @@ "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.6.4", + "expect": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-diff": "^29.6.4", + "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "natural-compare": "^1.4.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "semver": "^7.5.3" }, "engines": { @@ -5711,9 +5746,9 @@ } }, "node_modules/jest-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", - "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -5727,9 +5762,9 @@ } }, "node_modules/jest-validate": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz", - "integrity": "sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -5737,7 +5772,7 @@ "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -5756,18 +5791,18 @@ } }, "node_modules/jest-watcher": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.4.tgz", - "integrity": "sha512-oqUWvx6+On04ShsT00Ir9T4/FvBeEh2M9PTubgITPxDa739p4hoQweWPRGyYeaojgT0xTpZKF0Y/rSY1UgMxvQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, "dependencies": { - "@jest/test-result": "^29.6.4", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "string-length": "^4.0.1" }, "engines": { @@ -5775,13 +5810,13 @@ } }, "node_modules/jest-worker": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", - "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -6857,9 +6892,9 @@ } }, "node_modules/pretty-format": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", - "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -7062,14 +7097,14 @@ "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" }, "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "set-function-name": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -7339,6 +7374,19 @@ "node": ">= 0.8.0" } }, + "node_modules/set-function-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.0.tgz", + "integrity": "sha512-WmS8UHojv5s1eSoRSmzO5zzgDq8PE1/X/ij0k+9fMYmINCc6+j+SF3Om8YyucKn2yjnK4ItNZOoQycNnHsZJTw==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -7504,9 +7552,9 @@ "dev": true }, "node_modules/string.prototype.matchall": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.9.tgz", - "integrity": "sha512-6i5hL3MqG/K2G43mWXWgP+qizFW/QH/7kCNN13JrJS5q48FN5IKksLDscexKP3dnmB6cdm9jlNgAsWNLpSykmA==", + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", + "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", @@ -7516,6 +7564,7 @@ "has-symbols": "^1.0.3", "internal-slot": "^1.0.5", "regexp.prototype.flags": "^1.5.0", + "set-function-name": "^2.0.0", "side-channel": "^1.0.4" }, "funding": { diff --git a/external-api/package.json b/external-api/package.json index a0e667635c..3350702861 100644 --- a/external-api/package.json +++ b/external-api/package.json @@ -39,14 +39,14 @@ "@types/cors": "^2.8.14", "@types/express": "^4.17.17", "@types/jest": "^29.5.4", - "@types/node": "^18.17.14", + "@types/node": "^18.17.15", "@types/node-cron": "^3.0.8", "@types/supertest": "^2.0.12", "@types/swagger-jsdoc": "^6.0.1", "@types/swagger-ui-express": "^4.1.3", "@types/validator": "13.7.17", "axios": "^1.5.0", - "axios-mock-adapter": "^1.21.5", + "axios-mock-adapter": "^1.22.0", "compression": "^1.7.4", "cors": "^2.8.5", "cron-job-manager": "^2.3.1", @@ -54,7 +54,7 @@ "dotenv": "16.3.1", "express": "4.18.2", "express-mongo-sanitize": "^2.2.0", - "express-rate-limit": "^6.11.0", + "express-rate-limit": "^6.11.2", "joi": "^17.10.1", "mongodb": "4.2.0", "nodemon": "^3.0.1", @@ -69,7 +69,7 @@ "devDependencies": { "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", - "eslint": "^8.48.0", + "eslint": "^8.49.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-airbnb-typescript": "^17.1.0", "eslint-config-airbnb-typescript-prettier": "^5.0.0", diff --git a/gef-ui/package-lock.json b/gef-ui/package-lock.json index 3b567a2da0..b8ffaaf26b 100644 --- a/gef-ui/package-lock.json +++ b/gef-ui/package-lock.json @@ -26,7 +26,7 @@ "dotenv": "16.0.3", "express": "^4.18.2", "express-fileupload": "^1.4.0", - "express-rate-limit": "^6.11.0", + "express-rate-limit": "^6.11.2", "express-session": "1.17.3", "filesize": "9.0.11", "form-data": "4.0.0", @@ -57,12 +57,12 @@ "babel-jest": "29.5.0", "babel-loader": "9.1.2", "css-minimizer-webpack-plugin": "^5.0.1", - "eslint": "^8.48.0", + "eslint": "^8.49.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.28.1", "file-loader": "^6.2.0", "jest": "29.5.0", - "jest-environment-jsdom": "^29.6.4", + "jest-environment-jsdom": "^29.7.0", "rimraf": "^5.0.1", "sass": "^1.66.1", "sass-loader": "13.2.2", @@ -323,9 +323,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.15.tgz", - "integrity": "sha512-l1UiX4UyHSFsYt17iQ3Se5pQQZZHa22zyIXURmvkmLCD4t/aU+dvNWHatKac/D9Vm9UES7nvIqHs4jZqKviUmQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.17.tgz", + "integrity": "sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", @@ -363,14 +363,14 @@ } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz", - "integrity": "sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.17.tgz", + "integrity": "sha512-bxH77R5gjH3Nkde6/LuncQoLaP16THYPscurp1S8z7S9ZgezCyV3G8Hc+TZiCmY8pz4fp8CvKSgtJMW0FkLAxA==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-wrap-function": "^7.22.9" + "@babel/helper-wrap-function": "^7.22.17" }, "engines": { "node": ">=6.9.0" @@ -460,14 +460,14 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.10.tgz", - "integrity": "sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.17.tgz", + "integrity": "sha512-nAhoheCMlrqU41tAojw9GpVEKDlTS8r3lzFmF0lP52LwblCPbuFSO7nGIZoIcoU5NIm1ABrna0cJExE4Ay6l2Q==", "dev": true, "dependencies": { "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.10" + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.17" }, "engines": { "node": ">=6.9.0" @@ -1737,9 +1737,9 @@ } }, "node_modules/@babel/traverse": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.15.tgz", - "integrity": "sha512-DdHPwvJY0sEeN4xJU5uRLmZjgMMDIvMPniLuYzUVXj/GGzysPl0/fwt44JBkyUIzGJPV8QgHMcQdQ34XFuKTYQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.17.tgz", + "integrity": "sha512-xK4Uwm0JnAMvxYZxOVecss85WxTEIbTa7bnGyf/+EgCL5Zt3U7htUpEOWv9detPlamGKuRzCqw74xVglDWpPdg==", "dev": true, "dependencies": { "@babel/code-frame": "^7.22.13", @@ -1748,8 +1748,8 @@ "@babel/helper-function-name": "^7.22.5", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/types": "^7.22.17", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1758,9 +1758,9 @@ } }, "node_modules/@babel/types": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.15.tgz", - "integrity": "sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.17.tgz", + "integrity": "sha512-YSQPHLFtQNE5xN9tHuZnzu8vPr61wVTBZdfv1meex1NBosa4iT05k/Jw06ddJugi4bk7The/oSwQGFcksmEJQg==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", @@ -1802,9 +1802,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", - "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", + "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -1901,9 +1901,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", - "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", + "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2077,16 +2077,16 @@ } }, "node_modules/@jest/console": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.4.tgz", - "integrity": "sha512-wNK6gC0Ha9QeEPSkeJedQuTQqxZYnDPuDcDhVuVatRvMkL4D0VTvFVZj+Yuh6caG2aOfzkUZ36KtCmLNtR02hw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -2164,15 +2164,15 @@ } }, "node_modules/@jest/core": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.4.tgz", - "integrity": "sha512-U/vq5ccNTSVgYH7mHnodHmCffGWHJnz/E1BEWlLuK5pM4FZmGfBn/nrJGLjUsSmyx3otCeqc1T31F4y08AMDLg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, "dependencies": { - "@jest/console": "^29.6.4", - "@jest/reporters": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -2180,21 +2180,21 @@ "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.6.3", - "jest-config": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-resolve-dependencies": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "jest-watcher": "^29.6.4", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -2281,37 +2281,37 @@ } }, "node_modules/@jest/environment": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.4.tgz", - "integrity": "sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "dependencies": { - "@jest/fake-timers": "^29.6.4", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.3" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.4.tgz", - "integrity": "sha512-Warhsa7d23+3X5bLbrbYvaehcgX5TLYhI03JKoedTiI8uJU4IhqYBWF7OSSgUyz4IgLpUYPkK0AehA5/fRclAA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, "dependencies": { - "expect": "^29.6.4", - "jest-snapshot": "^29.6.4" + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.4.tgz", - "integrity": "sha512-FEhkJhqtvBwgSpiTrocquJCdXPsyvNKcl/n7A3u7X4pVoF4bswm11c9d4AV+kfq2Gpv/mM8x7E7DsRvH+djkrg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, "dependencies": { "jest-get-type": "^29.6.3" @@ -2321,47 +2321,47 @@ } }, "node_modules/@jest/fake-timers": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.4.tgz", - "integrity": "sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.4.tgz", - "integrity": "sha512-wVIn5bdtjlChhXAzVXavcY/3PEjf4VqM174BM3eGL5kMxLiZD5CLnbmkEyA1Dwh9q8XjP6E8RwjBsY/iCWrWsA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", "@jest/types": "^29.6.3", - "jest-mock": "^29.6.3" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.4.tgz", - "integrity": "sha512-sxUjWxm7QdchdrD3NfWKrL8FBsortZeibSJv4XLjESOOjSUOkjQcb0ZHJwfhEGIvBvTluTzfG2yZWZhkrXJu8g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", @@ -2375,9 +2375,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -2541,12 +2541,12 @@ } }, "node_modules/@jest/test-result": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.4.tgz", - "integrity": "sha512-uQ1C0AUEN90/dsyEirgMLlouROgSY+Wc/JanVVk0OiUKa5UFh7sJpMEM3aoUBAz2BRNvUJ8j3d294WFuRxSyOQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, "dependencies": { - "@jest/console": "^29.6.4", + "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" @@ -2556,14 +2556,14 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.4.tgz", - "integrity": "sha512-E84M6LbpcRq3fT4ckfKs9ryVanwkaIB0Ws9bw3/yP4seRLg/VaCZ/LgW0MCq5wwk4/iP/qnilD41aj2fsw2RMg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, "dependencies": { - "@jest/test-result": "^29.6.4", + "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -2571,9 +2571,9 @@ } }, "node_modules/@jest/transform": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz", - "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -2584,9 +2584,9 @@ "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -3071,9 +3071,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.5.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.9.tgz", - "integrity": "sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==", + "version": "20.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.0.tgz", + "integrity": "sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==", "dev": true }, "node_modules/@types/stack-utils": { @@ -3083,9 +3083,9 @@ "dev": true }, "node_modules/@types/tough-cookie": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", - "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.3.tgz", + "integrity": "sha512-THo502dA5PzG/sfQH+42Lw3fvmYkceefOspdCwpHRul8ik2Jv1K8I5OZz1AT3/rs46kwgMCe9bSBmDLYkkOMGg==", "dev": true }, "node_modules/@types/yargs": { @@ -4072,9 +4072,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001529", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001529.tgz", - "integrity": "sha512-n2pUQYGAkrLG4QYj2desAh+NqsJpHbNmVZz87imptDdxLAtjxary7Df/psdfyDGmskJK/9Dt9cPnx5RZ3CU4Og==", + "version": "1.0.30001534", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001534.tgz", + "integrity": "sha512-vlPVrhsCS7XaSh2VvWluIQEzVhefrUQcEsQWSS5A5V+dM07uv1qHeQzAOTGIMy9i3e9bH15+muvI/UHojVgS/Q==", "dev": true, "funding": [ { @@ -4539,6 +4539,97 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/create-jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/create-jest/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/create-jest/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/create-jest/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/create-jest/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -4952,12 +5043,27 @@ "node": ">=0.10.0" } }, + "node_modules/define-data-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.0.1.tgz", + "integrity": "sha512-22M+6zEspQHx10bfFQl2ET39IvfuQ7+rZIH7+ard8fCC4hPmkOSy+8JhKxBRLaWUziJ0O63NTYT97LR8zUfPTw==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -5124,9 +5230,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.512", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.512.tgz", - "integrity": "sha512-1W8wRbYlQE4ph7eoj3TJ+uqwO6+xvAE/L+KGU7WTQQvX3tnSIGZAb90MTsMoJqzntamiwJhBAj4WZmygXhsOUg==", + "version": "1.4.519", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.519.tgz", + "integrity": "sha512-kqs9oGYL4UFVkLKhqCTgBCYZv+wZ374yABDMqlDda9HvlkQxvSr7kgf4hfWVjMieDbX+1MwPHFBsOGCMIBaFKg==", "dev": true }, "node_modules/emittery": { @@ -5263,9 +5369,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", - "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz", + "integrity": "sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==", "dev": true }, "node_modules/es-set-tostringtag": { @@ -5353,16 +5459,16 @@ } }, "node_modules/eslint": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", - "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", + "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.48.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint/js": "8.49.0", + "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", @@ -5868,16 +5974,16 @@ } }, "node_modules/expect": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.4.tgz", - "integrity": "sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, "dependencies": { - "@jest/expect-utils": "^29.6.4", + "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3" + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -5936,9 +6042,9 @@ } }, "node_modules/express-rate-limit": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.0.tgz", - "integrity": "sha512-H9afltGTaEZcvenAB5LFgb/ysTMHUzMxoB3TJM6UHP5FtAP1p2+heMj1xwTei54Zm4I9I/2qsS5m+XrdKQp/Hw==", + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.2.tgz", + "integrity": "sha512-a7uwwfNTh1U60ssiIkuLFWHt4hAC5yxlLGU2VP0X4YNlyEDZAqF4tK3GD3NSitVBrCQmQ0++0uOyFOgC2y4DDw==", "engines": { "node": ">= 14" }, @@ -7404,13 +7510,13 @@ } }, "node_modules/jest-changed-files": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.6.3.tgz", - "integrity": "sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, "dependencies": { "execa": "^5.0.0", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "p-limit": "^3.1.0" }, "engines": { @@ -7418,28 +7524,28 @@ } }, "node_modules/jest-circus": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.4.tgz", - "integrity": "sha512-YXNrRyntVUgDfZbjXWBMPslX1mQ8MrSG0oM/Y06j9EYubODIyHWP8hMUbjbZ19M3M+zamqEur7O80HODwACoJw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", - "@jest/test-result": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "p-limit": "^3.1.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" @@ -7519,22 +7625,21 @@ } }, "node_modules/jest-cli": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.4.tgz", - "integrity": "sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, "dependencies": { - "@jest/core": "^29.6.4", - "@jest/test-result": "^29.6.4", + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "chalk": "^4.0.0", + "create-jest": "^29.7.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "prompts": "^2.0.1", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "yargs": "^17.3.1" }, "bin": { @@ -7623,31 +7728,31 @@ } }, "node_modules/jest-config": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.4.tgz", - "integrity": "sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.6.4", + "@jest/test-sequencer": "^29.7.0", "@jest/types": "^29.6.3", - "babel-jest": "^29.6.4", + "babel-jest": "^29.7.0", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.6.4", - "jest-environment-node": "^29.6.4", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", "jest-get-type": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -7683,12 +7788,12 @@ } }, "node_modules/jest-config/node_modules/babel-jest": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.4.tgz", - "integrity": "sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "dependencies": { - "@jest/transform": "^29.6.4", + "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", @@ -7759,15 +7864,15 @@ } }, "node_modules/jest-diff": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.4.tgz", - "integrity": "sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -7844,9 +7949,9 @@ } }, "node_modules/jest-docblock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.6.3.tgz", - "integrity": "sha512-2+H+GOTQBEm2+qFSQ7Ma+BvyV+waiIFxmZF5LdpBsAEjWX8QYjSCa4FrkIYtbfXUJJJnFCYrOtt6TZ+IAiTjBQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, "dependencies": { "detect-newline": "^3.0.0" @@ -7856,16 +7961,16 @@ } }, "node_modules/jest-each": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.3.tgz", - "integrity": "sha512-KoXfJ42k8cqbkfshW7sSHcdfnv5agDdHCPA87ZBdmHP+zJstTJc0ttQaJ/x7zK6noAL76hOuTIJ6ZkQRS5dcyg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", - "jest-util": "^29.6.3", - "pretty-format": "^29.6.3" + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -7942,18 +8047,18 @@ } }, "node_modules/jest-environment-jsdom": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.6.4.tgz", - "integrity": "sha512-K6wfgUJ16DoMs02JYFid9lOsqfpoVtyJxpRlnTxUHzvZWBnnh2VNGRB9EC1Cro96TQdq5TtSjb3qUjNaJP9IyA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", + "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/jsdom": "^20.0.0", "@types/node": "*", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0", "jsdom": "^20.0.0" }, "engines": { @@ -7969,17 +8074,17 @@ } }, "node_modules/jest-environment-node": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.4.tgz", - "integrity": "sha512-i7SbpH2dEIFGNmxGCpSc2w9cA4qVD+wfvg2ZnfQ7XVrKL0NA5uDVBIiGH8SR4F0dKEv/0qI5r+aDomDf04DpEQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -7995,9 +8100,9 @@ } }, "node_modules/jest-haste-map": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz", - "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -8007,8 +8112,8 @@ "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -8020,28 +8125,28 @@ } }, "node_modules/jest-leak-detector": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.3.tgz", - "integrity": "sha512-0kfbESIHXYdhAdpLsW7xdwmYhLf1BRu4AA118/OxFm0Ho1b2RcTmO4oF6aAMaxpxdxnJ3zve2rgwzNBD4Zbm7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, "dependencies": { "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.4.tgz", - "integrity": "sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.6.4", + "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -8118,9 +8223,9 @@ } }, "node_modules/jest-message-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.3.tgz", - "integrity": "sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", @@ -8129,7 +8234,7 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -8208,14 +8313,14 @@ } }, "node_modules/jest-mock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.3.tgz", - "integrity": "sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", - "jest-util": "^29.6.3" + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -8248,17 +8353,17 @@ } }, "node_modules/jest-resolve": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.4.tgz", - "integrity": "sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" @@ -8268,13 +8373,13 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.4.tgz", - "integrity": "sha512-7+6eAmr1ZBF3vOAJVsfLj1QdqeXG+WYhidfLHBRZqGN24MFRIiKG20ItpLw2qRAsW/D2ZUUmCNf6irUr/v6KHA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, "dependencies": { "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.6.4" + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -8351,30 +8456,30 @@ } }, "node_modules/jest-runner": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.4.tgz", - "integrity": "sha512-SDaLrMmtVlQYDuG0iSPYLycG8P9jLI+fRm8AF/xPKhYDB2g6xDWjXBrR5M8gEWsK6KVFlebpZ4QsrxdyIX1Jaw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, "dependencies": { - "@jest/console": "^29.6.4", - "@jest/environment": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.6.3", - "jest-environment-node": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-leak-detector": "^29.6.3", - "jest-message-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-util": "^29.6.3", - "jest-watcher": "^29.6.4", - "jest-worker": "^29.6.4", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -8453,17 +8558,17 @@ } }, "node_modules/jest-runtime": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.4.tgz", - "integrity": "sha512-s/QxMBLvmwLdchKEjcLfwzP7h+jsHvNEtxGP5P+Fl1FMaJX2jMiIqe4rJw4tFprzCwuSvVUo9bn0uj4gNRXsbA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", - "@jest/globals": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", @@ -8471,13 +8576,13 @@ "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -8556,9 +8661,9 @@ } }, "node_modules/jest-snapshot": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.4.tgz", - "integrity": "sha512-VC1N8ED7+4uboUKGIDsbvNAZb6LakgIPgAF4RSpF13dN6YaMokfRqO+BaqK4zIh6X3JffgwbzuGqDEjHm/MrvA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -8566,20 +8671,20 @@ "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.6.4", + "expect": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-diff": "^29.6.4", + "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "natural-compare": "^1.4.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "semver": "^7.5.3" }, "engines": { @@ -8690,9 +8795,9 @@ "dev": true }, "node_modules/jest-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", - "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -8777,9 +8882,9 @@ } }, "node_modules/jest-validate": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz", - "integrity": "sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -8787,7 +8892,7 @@ "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -8876,18 +8981,18 @@ } }, "node_modules/jest-watcher": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.4.tgz", - "integrity": "sha512-oqUWvx6+On04ShsT00Ir9T4/FvBeEh2M9PTubgITPxDa739p4hoQweWPRGyYeaojgT0xTpZKF0Y/rSY1UgMxvQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, "dependencies": { - "@jest/test-result": "^29.6.4", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "string-length": "^4.0.1" }, "engines": { @@ -8965,13 +9070,13 @@ } }, "node_modules/jest-worker": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", - "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -10599,9 +10704,9 @@ } }, "node_modules/pretty-format": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", - "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", @@ -10907,14 +11012,14 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "set-function-name": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -11364,6 +11469,19 @@ "node": ">= 0.8.0" } }, + "node_modules/set-function-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.0.tgz", + "integrity": "sha512-WmS8UHojv5s1eSoRSmzO5zzgDq8PE1/X/ij0k+9fMYmINCc6+j+SF3Om8YyucKn2yjnK4ItNZOoQycNnHsZJTw==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -12934,9 +13052,9 @@ } }, "node_modules/ws": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.0.tgz", - "integrity": "sha512-WR0RJE9Ehsio6U4TuM+LmunEsjQ5ncHlw4sn9ihD6RoJKZrVyH9FWV3dmnwu8B2aNib1OvG2X6adUCyFpQyWcg==", + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.1.tgz", + "integrity": "sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A==", "dev": true, "engines": { "node": ">=10.0.0" diff --git a/gef-ui/package.json b/gef-ui/package.json index 55d3026f1f..122a7bfbdf 100644 --- a/gef-ui/package.json +++ b/gef-ui/package.json @@ -56,7 +56,7 @@ "dotenv": "16.0.3", "express": "^4.18.2", "express-fileupload": "^1.4.0", - "express-rate-limit": "^6.11.0", + "express-rate-limit": "^6.11.2", "express-session": "1.17.3", "filesize": "9.0.11", "form-data": "4.0.0", @@ -87,12 +87,12 @@ "babel-jest": "29.5.0", "babel-loader": "9.1.2", "css-minimizer-webpack-plugin": "^5.0.1", - "eslint": "^8.48.0", + "eslint": "^8.49.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.28.1", "file-loader": "^6.2.0", "jest": "29.5.0", - "jest-environment-jsdom": "^29.6.4", + "jest-environment-jsdom": "^29.7.0", "rimraf": "^5.0.1", "sass": "^1.66.1", "sass-loader": "13.2.2", diff --git a/package-lock.json b/package-lock.json index fad2e102ba..1ec2b973d3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,14 +18,14 @@ "date-fns": "^2.30.0", "dotenv": "^16.3.1", "moment": "^2.29.4", - "npm-check-updates": "^16.13.3" + "npm-check-updates": "^16.14.0" }, "devDependencies": { "@commitlint/cli": "^17.7.1", "@commitlint/config-conventional": "^17.7.0", "@typescript-eslint/eslint-plugin": "^5.62.0", "cspell": "^6.31.3", - "eslint": "^8.48.0", + "eslint": "^8.49.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-cypress": "^2.14.0", "eslint-plugin-import": "^2.28.1", @@ -607,15 +607,15 @@ "dev": true }, "node_modules/@cspell/dict-companies": { - "version": "3.0.21", - "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.0.21.tgz", - "integrity": "sha512-u9b7qtCWYS728WqiJeAucJcjRs16Y1yGGwagS/w59SV25R0rXbXbPbQuX8wYDcaeIO8uRHGkbSWngx6O4qFoCQ==", + "version": "3.0.22", + "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.0.22.tgz", + "integrity": "sha512-hUN4polifWv1IIXb4NDNXctr/smJ7/1IrOy0rU6fOwPCY/u9DkQO+xeASzuFJasvs6v0Pub/y+NUQLaeXNRW6g==", "dev": true }, "node_modules/@cspell/dict-cpp": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-5.0.4.tgz", - "integrity": "sha512-Vmz/CCb2d91ES5juaO8+CFWeTa2AFsbpR8bkCPJq+P8cRP16+37tY0zNXEBSK/1ur4MakaRf76jeQBijpZxw0Q==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-5.0.5.tgz", + "integrity": "sha512-ojCpQ4z+sHHLJYfvA3SApqQ1BjO/k3TUdDgqR3sVhFl5qjT9yz1/srBNzqCaBBSz/fiO5A8NKdSA9+IFrUHcig==", "dev": true }, "node_modules/@cspell/dict-cryptocurrencies": { @@ -775,9 +775,9 @@ "dev": true }, "node_modules/@cspell/dict-node": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-node/-/dict-node-4.0.2.tgz", - "integrity": "sha512-FEQJ4TnMcXEFslqBQkXa5HposMoCGsiBv2ux4IZuIXgadXeHKHUHk60iarWpjhzNzQLyN2GD7NoRMd12bK3Llw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-node/-/dict-node-4.0.3.tgz", + "integrity": "sha512-sFlUNI5kOogy49KtPg8SMQYirDGIAoKBO3+cDLIwD4MLdsWy1q0upc7pzGht3mrjuyMiPRUV14Bb0rkVLrxOhg==", "dev": true }, "node_modules/@cspell/dict-npm": { @@ -805,9 +805,9 @@ "dev": true }, "node_modules/@cspell/dict-python": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.1.7.tgz", - "integrity": "sha512-8GkO7/w1QEpu4Y1GTHGYHrwfc/ZdiBRw7D/BGYCIiOoQPLi0YxMke7wzRC3j246yrzLt28ntDBjr4fB3+uFZtQ==", + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.1.8.tgz", + "integrity": "sha512-yFrO9gGI3KIbw0Y1odAEtagrzmthjJVank9B7qlsSQvN78RgD1JQQycTadNWpzdjCj+JuiiH8pJBFWflweZoxw==", "dev": true, "dependencies": { "@cspell/dict-data-science": "^1.0.11" @@ -838,9 +838,9 @@ "dev": true }, "node_modules/@cspell/dict-software-terms": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-3.2.2.tgz", - "integrity": "sha512-DmdS/qAyJVmKKku4ab89HVZhsvRIk84HoPUVIZ/zJhmuCO+LF45Ylzy1/7G32MYLjbG/o1Ze3UvbaE9HY4FKKA==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-3.2.3.tgz", + "integrity": "sha512-L1Fjkt+Q5MnjEOGPXQxdT4+8ieDBcaHSjh1gHzxdqFXTOnnfvsLUa5ykuv/fG06b/G/yget1066ftKosMaPcXA==", "dev": true }, "node_modules/@cspell/dict-sql": { @@ -967,9 +967,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", - "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", + "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -1021,9 +1021,9 @@ "dev": true }, "node_modules/@eslint/js": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", - "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", + "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2835,9 +2835,9 @@ "dev": true }, "node_modules/cosmiconfig": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.4.tgz", - "integrity": "sha512-SF+2P8+o/PTV05rgsAjDzL4OFdVXAulSfC/L19VaeVT7+tpOOSscCt2QLxDZ+CLxF2WOiq6y1K5asvs8qUJT/Q==", + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.5.tgz", + "integrity": "sha512-A5Xry3xfS96wy2qbiLkQLAg4JUrR2wvfybxj6yqLmrUfMAvhS3MZxIP2oQn0grgYIvJqzpeTEWu4vK0t+12NNw==", "dev": true, "dependencies": { "import-fresh": "^3.3.0", @@ -3163,9 +3163,9 @@ } }, "node_modules/cypress/node_modules/@types/node": { - "version": "16.18.48", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.48.tgz", - "integrity": "sha512-mlaecDKQ7rIZrYD7iiKNdzFb6e/qD5I9U1rAhq+Fd+DWvYVs+G2kv74UFHmSOlg5+i/vF3XxuR522V4u8BqO+Q==" + "version": "16.18.50", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.50.tgz", + "integrity": "sha512-OiDU5xRgYTJ203v4cprTs0RwOCd5c5Zjv+K5P8KSqfiCsB1W3LcamTUMcnQarpq5kOYbhHfSOgIEJvdPyb5xyw==" }, "node_modules/cypress/node_modules/commander": { "version": "6.2.1", @@ -3384,12 +3384,27 @@ "node": ">=10" } }, + "node_modules/define-data-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.0.1.tgz", + "integrity": "sha512-22M+6zEspQHx10bfFQl2ET39IvfuQ7+rZIH7+ard8fCC4hPmkOSy+8JhKxBRLaWUziJ0O63NTYT97LR8zUfPTw==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -3685,16 +3700,16 @@ } }, "node_modules/eslint": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", - "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", + "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.48.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint/js": "8.49.0", + "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", @@ -6865,9 +6880,9 @@ } }, "node_modules/npm-check-updates": { - "version": "16.13.3", - "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.13.3.tgz", - "integrity": "sha512-l3FQtm+ZtDwqtK2r27vCuNdtnoDsXzk8D2WczvrAJy2bGPZJvRmuUa/Q9Gv+AbZV0IHSNJD2oHtQqUeqQRhEsw==", + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.14.0.tgz", + "integrity": "sha512-0R4S0qsx2FhuSiIYloHc7RQwfZpzO4jdL3rUoYwbOkx5fBc9u77GHHS0FlXYpczHR/kPYmmB/CRkFElOofVeSg==", "dependencies": { "chalk": "^5.3.0", "cli-table3": "^0.6.3", @@ -6897,6 +6912,7 @@ "semver-utils": "^1.1.4", "source-map-support": "^0.5.21", "spawn-please": "^2.0.1", + "strip-ansi": "^7.1.0", "strip-json-comments": "^5.0.1", "untildify": "^4.0.0", "update-notifier": "^6.0.2" @@ -6909,6 +6925,17 @@ "node": ">=14.14" } }, + "node_modules/npm-check-updates/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, "node_modules/npm-check-updates/node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -6986,6 +7013,20 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/npm-check-updates/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/npm-check-updates/node_modules/strip-json-comments": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.1.tgz", @@ -7965,14 +8006,14 @@ "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" }, "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "set-function-name": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -8319,6 +8360,19 @@ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, + "node_modules/set-function-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.0.tgz", + "integrity": "sha512-WmS8UHojv5s1eSoRSmzO5zzgDq8PE1/X/ij0k+9fMYmINCc6+j+SF3Om8YyucKn2yjnK4ItNZOoQycNnHsZJTw==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", diff --git a/package.json b/package.json index 4e998278d4..ed4157eb33 100644 --- a/package.json +++ b/package.json @@ -41,14 +41,14 @@ "date-fns": "^2.30.0", "dotenv": "^16.3.1", "moment": "^2.29.4", - "npm-check-updates": "^16.13.3" + "npm-check-updates": "^16.14.0" }, "devDependencies": { "@commitlint/cli": "^17.7.1", "@commitlint/config-conventional": "^17.7.0", "@typescript-eslint/eslint-plugin": "^5.62.0", "cspell": "^6.31.3", - "eslint": "^8.48.0", + "eslint": "^8.49.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-cypress": "^2.14.0", "eslint-plugin-import": "^2.28.1", diff --git a/portal-api/package-lock.json b/portal-api/package-lock.json index 147e2626cd..95e3f07d5b 100644 --- a/portal-api/package-lock.json +++ b/portal-api/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@azure/storage-file-share": "12.14.0", "axios": "^1.5.0", - "axios-mock-adapter": "^1.21.5", + "axios-mock-adapter": "^1.22.0", "comma-number": "^2.1.0", "compression": "^1.7.4", "cors": "2.8.5", @@ -19,7 +19,7 @@ "dotenv": "16.0.3", "express": "4.18.2", "express-mongo-sanitize": "^2.2.0", - "express-rate-limit": "^6.11.0", + "express-rate-limit": "^6.11.2", "filesize": "^8.0.7", "joi": "^17.10.1", "jsonwebtoken": "^9.0.2", @@ -37,10 +37,10 @@ "xss": "^1.0.14" }, "devDependencies": { - "eslint": "^8.48.0", + "eslint": "^8.49.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.28.1", - "jest": "^29.6.4", + "jest": "^29.7.0", "jest-when": "^3.6.0", "prettier": "^2.8.8", "supertest": "6.3.3" @@ -277,21 +277,21 @@ } }, "node_modules/@babel/core": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.15.tgz", - "integrity": "sha512-PtZqMmgRrvj8ruoEOIwVA3yoF91O+Hgw9o7DAUTNBA6Mo2jpu31clx9a7Nz/9JznqetTR6zwfC4L3LAjKQXUwA==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.17.tgz", + "integrity": "sha512-2EENLmhpwplDux5PSsZnSbnSkB3tZ6QTksgO25xwEL7pIDcNOMhF5v/s6RzwjMZzZzw9Ofc30gHv5ChCC8pifQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.22.13", "@babel/generator": "^7.22.15", "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.22.15", + "@babel/helper-module-transforms": "^7.22.17", "@babel/helpers": "^7.22.15", - "@babel/parser": "^7.22.15", + "@babel/parser": "^7.22.16", "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.15", - "@babel/types": "^7.22.15", + "@babel/traverse": "^7.22.17", + "@babel/types": "^7.22.17", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -413,9 +413,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.15.tgz", - "integrity": "sha512-l1UiX4UyHSFsYt17iQ3Se5pQQZZHa22zyIXURmvkmLCD4t/aU+dvNWHatKac/D9Vm9UES7nvIqHs4jZqKviUmQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.17.tgz", + "integrity": "sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", @@ -805,9 +805,9 @@ } }, "node_modules/@babel/traverse": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.15.tgz", - "integrity": "sha512-DdHPwvJY0sEeN4xJU5uRLmZjgMMDIvMPniLuYzUVXj/GGzysPl0/fwt44JBkyUIzGJPV8QgHMcQdQ34XFuKTYQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.17.tgz", + "integrity": "sha512-xK4Uwm0JnAMvxYZxOVecss85WxTEIbTa7bnGyf/+EgCL5Zt3U7htUpEOWv9detPlamGKuRzCqw74xVglDWpPdg==", "dev": true, "dependencies": { "@babel/code-frame": "^7.22.13", @@ -816,8 +816,8 @@ "@babel/helper-function-name": "^7.22.5", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/types": "^7.22.17", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -858,9 +858,9 @@ "dev": true }, "node_modules/@babel/types": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.15.tgz", - "integrity": "sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.17.tgz", + "integrity": "sha512-YSQPHLFtQNE5xN9tHuZnzu8vPr61wVTBZdfv1meex1NBosa4iT05k/Jw06ddJugi4bk7The/oSwQGFcksmEJQg==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", @@ -893,9 +893,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", - "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", + "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -948,9 +948,9 @@ "dev": true }, "node_modules/@eslint/js": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", - "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", + "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1134,16 +1134,16 @@ } }, "node_modules/@jest/console": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.4.tgz", - "integrity": "sha512-wNK6gC0Ha9QeEPSkeJedQuTQqxZYnDPuDcDhVuVatRvMkL4D0VTvFVZj+Yuh6caG2aOfzkUZ36KtCmLNtR02hw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -1151,15 +1151,15 @@ } }, "node_modules/@jest/core": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.4.tgz", - "integrity": "sha512-U/vq5ccNTSVgYH7mHnodHmCffGWHJnz/E1BEWlLuK5pM4FZmGfBn/nrJGLjUsSmyx3otCeqc1T31F4y08AMDLg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, "dependencies": { - "@jest/console": "^29.6.4", - "@jest/reporters": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -1167,21 +1167,21 @@ "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.6.3", - "jest-config": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-resolve-dependencies": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "jest-watcher": "^29.6.4", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -1198,37 +1198,37 @@ } }, "node_modules/@jest/environment": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.4.tgz", - "integrity": "sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "dependencies": { - "@jest/fake-timers": "^29.6.4", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.3" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.4.tgz", - "integrity": "sha512-Warhsa7d23+3X5bLbrbYvaehcgX5TLYhI03JKoedTiI8uJU4IhqYBWF7OSSgUyz4IgLpUYPkK0AehA5/fRclAA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, "dependencies": { - "expect": "^29.6.4", - "jest-snapshot": "^29.6.4" + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.4.tgz", - "integrity": "sha512-FEhkJhqtvBwgSpiTrocquJCdXPsyvNKcl/n7A3u7X4pVoF4bswm11c9d4AV+kfq2Gpv/mM8x7E7DsRvH+djkrg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, "dependencies": { "jest-get-type": "^29.6.3" @@ -1238,47 +1238,47 @@ } }, "node_modules/@jest/fake-timers": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.4.tgz", - "integrity": "sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.4.tgz", - "integrity": "sha512-wVIn5bdtjlChhXAzVXavcY/3PEjf4VqM174BM3eGL5kMxLiZD5CLnbmkEyA1Dwh9q8XjP6E8RwjBsY/iCWrWsA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", "@jest/types": "^29.6.3", - "jest-mock": "^29.6.3" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.4.tgz", - "integrity": "sha512-sxUjWxm7QdchdrD3NfWKrL8FBsortZeibSJv4XLjESOOjSUOkjQcb0ZHJwfhEGIvBvTluTzfG2yZWZhkrXJu8g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", @@ -1292,9 +1292,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -1339,12 +1339,12 @@ } }, "node_modules/@jest/test-result": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.4.tgz", - "integrity": "sha512-uQ1C0AUEN90/dsyEirgMLlouROgSY+Wc/JanVVk0OiUKa5UFh7sJpMEM3aoUBAz2BRNvUJ8j3d294WFuRxSyOQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, "dependencies": { - "@jest/console": "^29.6.4", + "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" @@ -1354,14 +1354,14 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.4.tgz", - "integrity": "sha512-E84M6LbpcRq3fT4ckfKs9ryVanwkaIB0Ws9bw3/yP4seRLg/VaCZ/LgW0MCq5wwk4/iP/qnilD41aj2fsw2RMg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, "dependencies": { - "@jest/test-result": "^29.6.4", + "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -1369,9 +1369,9 @@ } }, "node_modules/@jest/transform": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz", - "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -1382,9 +1382,9 @@ "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -1495,9 +1495,9 @@ } }, "node_modules/@opentelemetry/api": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.4.1.tgz", - "integrity": "sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.6.0.tgz", + "integrity": "sha512-OWlrQAnWn9577PhVgqjUvMr1pg57Bc4jv0iL4w0PRuOSRvq67rvHW9Ie/dZVMvCzhSCB+UxhcY/PmCmFj33Q+g==", "engines": { "node": ">=8.0.0" } @@ -1625,9 +1625,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.5.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.9.tgz", - "integrity": "sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==" + "version": "20.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.0.tgz", + "integrity": "sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==" }, "node_modules/@types/node-fetch": { "version": "2.6.4", @@ -1969,9 +1969,9 @@ } }, "node_modules/axios-mock-adapter": { - "version": "1.21.5", - "resolved": "https://registry.npmjs.org/axios-mock-adapter/-/axios-mock-adapter-1.21.5.tgz", - "integrity": "sha512-5NI1V/VK+8+JeTF8niqOowuysA4b8mGzdlMN/QnTnoXbYh4HZSNiopsDclN2g/m85+G++IrEtUdZaQ3GnaMsSA==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/axios-mock-adapter/-/axios-mock-adapter-1.22.0.tgz", + "integrity": "sha512-dmI0KbkyAhntUR05YY96qg2H6gg0XMl2+qTW0xmYg6Up+BFBAJYRLROMXRdDEL06/Wqwa0TJThAYvFtSFdRCZw==", "dependencies": { "fast-deep-equal": "^3.1.3", "is-buffer": "^2.0.5" @@ -1981,12 +1981,12 @@ } }, "node_modules/babel-jest": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.4.tgz", - "integrity": "sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "dependencies": { - "@jest/transform": "^29.6.4", + "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", @@ -2305,9 +2305,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001529", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001529.tgz", - "integrity": "sha512-n2pUQYGAkrLG4QYj2desAh+NqsJpHbNmVZz87imptDdxLAtjxary7Df/psdfyDGmskJK/9Dt9cPnx5RZ3CU4Og==", + "version": "1.0.30001534", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001534.tgz", + "integrity": "sha512-vlPVrhsCS7XaSh2VvWluIQEzVhefrUQcEsQWSS5A5V+dM07uv1qHeQzAOTGIMy9i3e9bH15+muvI/UHojVgS/Q==", "dev": true, "funding": [ { @@ -2615,6 +2615,27 @@ "node": ">= 0.10" } }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -2685,12 +2706,27 @@ "node": ">=0.10.0" } }, + "node_modules/define-data-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.0.1.tgz", + "integrity": "sha512-22M+6zEspQHx10bfFQl2ET39IvfuQ7+rZIH7+ard8fCC4hPmkOSy+8JhKxBRLaWUziJ0O63NTYT97LR8zUfPTw==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -2847,9 +2883,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.512", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.512.tgz", - "integrity": "sha512-1W8wRbYlQE4ph7eoj3TJ+uqwO6+xvAE/L+KGU7WTQQvX3tnSIGZAb90MTsMoJqzntamiwJhBAj4WZmygXhsOUg==", + "version": "1.4.519", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.519.tgz", + "integrity": "sha512-kqs9oGYL4UFVkLKhqCTgBCYZv+wZ374yABDMqlDda9HvlkQxvSr7kgf4hfWVjMieDbX+1MwPHFBsOGCMIBaFKg==", "dev": true }, "node_modules/emittery": { @@ -3017,16 +3053,16 @@ } }, "node_modules/eslint": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", - "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", + "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.48.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint/js": "8.49.0", + "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", @@ -3377,16 +3413,16 @@ } }, "node_modules/expect": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.4.tgz", - "integrity": "sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, "dependencies": { - "@jest/expect-utils": "^29.6.4", + "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3" + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -3442,9 +3478,9 @@ } }, "node_modules/express-rate-limit": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.0.tgz", - "integrity": "sha512-H9afltGTaEZcvenAB5LFgb/ysTMHUzMxoB3TJM6UHP5FtAP1p2+heMj1xwTei54Zm4I9I/2qsS5m+XrdKQp/Hw==", + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.2.tgz", + "integrity": "sha512-a7uwwfNTh1U60ssiIkuLFWHt4hAC5yxlLGU2VP0X4YNlyEDZAqF4tK3GD3NSitVBrCQmQ0++0uOyFOgC2y4DDw==", "engines": { "node": ">= 14" }, @@ -4574,15 +4610,15 @@ } }, "node_modules/jest": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.4.tgz", - "integrity": "sha512-tEFhVQFF/bzoYV1YuGyzLPZ6vlPrdfvDmmAxudA1dLEuiztqg2Rkx20vkKY32xiDROcD2KXlgZ7Cu8RPeEHRKw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, "dependencies": { - "@jest/core": "^29.6.4", + "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", "import-local": "^3.0.2", - "jest-cli": "^29.6.4" + "jest-cli": "^29.7.0" }, "bin": { "jest": "bin/jest.js" @@ -4600,13 +4636,13 @@ } }, "node_modules/jest-changed-files": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.6.3.tgz", - "integrity": "sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, "dependencies": { "execa": "^5.0.0", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "p-limit": "^3.1.0" }, "engines": { @@ -4614,28 +4650,28 @@ } }, "node_modules/jest-circus": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.4.tgz", - "integrity": "sha512-YXNrRyntVUgDfZbjXWBMPslX1mQ8MrSG0oM/Y06j9EYubODIyHWP8hMUbjbZ19M3M+zamqEur7O80HODwACoJw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", - "@jest/test-result": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "p-limit": "^3.1.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" @@ -4645,22 +4681,21 @@ } }, "node_modules/jest-cli": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.4.tgz", - "integrity": "sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, "dependencies": { - "@jest/core": "^29.6.4", - "@jest/test-result": "^29.6.4", + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "chalk": "^4.0.0", + "create-jest": "^29.7.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "prompts": "^2.0.1", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "yargs": "^17.3.1" }, "bin": { @@ -4679,31 +4714,31 @@ } }, "node_modules/jest-config": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.4.tgz", - "integrity": "sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.6.4", + "@jest/test-sequencer": "^29.7.0", "@jest/types": "^29.6.3", - "babel-jest": "^29.6.4", + "babel-jest": "^29.7.0", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.6.4", - "jest-environment-node": "^29.6.4", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", "jest-get-type": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -4724,24 +4759,24 @@ } }, "node_modules/jest-diff": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.4.tgz", - "integrity": "sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-docblock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.6.3.tgz", - "integrity": "sha512-2+H+GOTQBEm2+qFSQ7Ma+BvyV+waiIFxmZF5LdpBsAEjWX8QYjSCa4FrkIYtbfXUJJJnFCYrOtt6TZ+IAiTjBQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, "dependencies": { "detect-newline": "^3.0.0" @@ -4751,33 +4786,33 @@ } }, "node_modules/jest-each": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.3.tgz", - "integrity": "sha512-KoXfJ42k8cqbkfshW7sSHcdfnv5agDdHCPA87ZBdmHP+zJstTJc0ttQaJ/x7zK6noAL76hOuTIJ6ZkQRS5dcyg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", - "jest-util": "^29.6.3", - "pretty-format": "^29.6.3" + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-environment-node": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.4.tgz", - "integrity": "sha512-i7SbpH2dEIFGNmxGCpSc2w9cA4qVD+wfvg2ZnfQ7XVrKL0NA5uDVBIiGH8SR4F0dKEv/0qI5r+aDomDf04DpEQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -4793,9 +4828,9 @@ } }, "node_modules/jest-haste-map": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz", - "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -4805,8 +4840,8 @@ "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -4818,37 +4853,37 @@ } }, "node_modules/jest-leak-detector": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.3.tgz", - "integrity": "sha512-0kfbESIHXYdhAdpLsW7xdwmYhLf1BRu4AA118/OxFm0Ho1b2RcTmO4oF6aAMaxpxdxnJ3zve2rgwzNBD4Zbm7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, "dependencies": { "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.4.tgz", - "integrity": "sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.6.4", + "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-message-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.3.tgz", - "integrity": "sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", @@ -4857,7 +4892,7 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -4866,14 +4901,14 @@ } }, "node_modules/jest-mock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.3.tgz", - "integrity": "sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", - "jest-util": "^29.6.3" + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -4906,17 +4941,17 @@ } }, "node_modules/jest-resolve": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.4.tgz", - "integrity": "sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" @@ -4926,43 +4961,43 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.4.tgz", - "integrity": "sha512-7+6eAmr1ZBF3vOAJVsfLj1QdqeXG+WYhidfLHBRZqGN24MFRIiKG20ItpLw2qRAsW/D2ZUUmCNf6irUr/v6KHA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, "dependencies": { "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.6.4" + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.4.tgz", - "integrity": "sha512-SDaLrMmtVlQYDuG0iSPYLycG8P9jLI+fRm8AF/xPKhYDB2g6xDWjXBrR5M8gEWsK6KVFlebpZ4QsrxdyIX1Jaw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, "dependencies": { - "@jest/console": "^29.6.4", - "@jest/environment": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.6.3", - "jest-environment-node": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-leak-detector": "^29.6.3", - "jest-message-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-util": "^29.6.3", - "jest-watcher": "^29.6.4", - "jest-worker": "^29.6.4", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -4971,17 +5006,17 @@ } }, "node_modules/jest-runtime": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.4.tgz", - "integrity": "sha512-s/QxMBLvmwLdchKEjcLfwzP7h+jsHvNEtxGP5P+Fl1FMaJX2jMiIqe4rJw4tFprzCwuSvVUo9bn0uj4gNRXsbA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", - "@jest/globals": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", @@ -4989,13 +5024,13 @@ "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -5004,9 +5039,9 @@ } }, "node_modules/jest-snapshot": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.4.tgz", - "integrity": "sha512-VC1N8ED7+4uboUKGIDsbvNAZb6LakgIPgAF4RSpF13dN6YaMokfRqO+BaqK4zIh6X3JffgwbzuGqDEjHm/MrvA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -5014,20 +5049,20 @@ "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.6.4", + "expect": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-diff": "^29.6.4", + "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "natural-compare": "^1.4.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "semver": "^7.5.3" }, "engines": { @@ -5068,9 +5103,9 @@ "dev": true }, "node_modules/jest-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", - "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -5085,9 +5120,9 @@ } }, "node_modules/jest-validate": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz", - "integrity": "sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -5095,7 +5130,7 @@ "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -5114,18 +5149,18 @@ } }, "node_modules/jest-watcher": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.4.tgz", - "integrity": "sha512-oqUWvx6+On04ShsT00Ir9T4/FvBeEh2M9PTubgITPxDa739p4hoQweWPRGyYeaojgT0xTpZKF0Y/rSY1UgMxvQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, "dependencies": { - "@jest/test-result": "^29.6.4", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "string-length": "^4.0.1" }, "engines": { @@ -5142,13 +5177,13 @@ } }, "node_modules/jest-worker": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", - "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -6361,9 +6396,9 @@ } }, "node_modules/pretty-format": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", - "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", @@ -6559,14 +6594,14 @@ "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" }, "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "set-function-name": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -6817,6 +6852,19 @@ "node": ">= 0.8.0" } }, + "node_modules/set-function-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.0.tgz", + "integrity": "sha512-WmS8UHojv5s1eSoRSmzO5zzgDq8PE1/X/ij0k+9fMYmINCc6+j+SF3Om8YyucKn2yjnK4ItNZOoQycNnHsZJTw==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", diff --git a/portal-api/package.json b/portal-api/package.json index 0720c51f40..88b1329cb9 100644 --- a/portal-api/package.json +++ b/portal-api/package.json @@ -38,7 +38,7 @@ "dependencies": { "@azure/storage-file-share": "12.14.0", "axios": "^1.5.0", - "axios-mock-adapter": "^1.21.5", + "axios-mock-adapter": "^1.22.0", "comma-number": "^2.1.0", "compression": "^1.7.4", "cors": "2.8.5", @@ -46,7 +46,7 @@ "dotenv": "16.0.3", "express": "4.18.2", "express-mongo-sanitize": "^2.2.0", - "express-rate-limit": "^6.11.0", + "express-rate-limit": "^6.11.2", "filesize": "^8.0.7", "joi": "^17.10.1", "jsonwebtoken": "^9.0.2", @@ -64,10 +64,10 @@ "xss": "^1.0.14" }, "devDependencies": { - "eslint": "^8.48.0", + "eslint": "^8.49.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.28.1", - "jest": "^29.6.4", + "jest": "^29.7.0", "jest-when": "^3.6.0", "prettier": "^2.8.8", "supertest": "6.3.3" diff --git a/portal/package-lock.json b/portal/package-lock.json index 0888254583..705ffcd7a1 100644 --- a/portal/package-lock.json +++ b/portal/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@ministryofjustice/frontend": "1.8.0", "axios": "^1.5.0", - "axios-mock-adapter": "^1.21.5", + "axios-mock-adapter": "^1.22.0", "cheerio": "^1.0.0-rc.12", "connect-flash": "0.1.1", "connect-redis": "5.2.0", @@ -20,7 +20,7 @@ "csurf": "^1.11.0", "dotenv": "16.0.3", "express": "^4.18.2", - "express-rate-limit": "^6.11.0", + "express-rate-limit": "^6.11.2", "express-session": "1.17.3", "form-data": "4.0.0", "govuk-frontend": "4.6.0", @@ -48,12 +48,12 @@ "babel-jest": "29.5.0", "babel-loader": "9.1.2", "css-minimizer-webpack-plugin": "^5.0.1", - "eslint": "^8.48.0", + "eslint": "^8.49.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.28.1", "file-loader": "^6.2.0", "jest": "29.5.0", - "jest-environment-jsdom": "^29.6.4", + "jest-environment-jsdom": "^29.7.0", "rimraf": "^5.0.1", "sass": "^1.66.1", "sass-loader": "13.2.2", @@ -313,9 +313,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.15.tgz", - "integrity": "sha512-l1UiX4UyHSFsYt17iQ3Se5pQQZZHa22zyIXURmvkmLCD4t/aU+dvNWHatKac/D9Vm9UES7nvIqHs4jZqKviUmQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.17.tgz", + "integrity": "sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", @@ -353,14 +353,14 @@ } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz", - "integrity": "sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.17.tgz", + "integrity": "sha512-bxH77R5gjH3Nkde6/LuncQoLaP16THYPscurp1S8z7S9ZgezCyV3G8Hc+TZiCmY8pz4fp8CvKSgtJMW0FkLAxA==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-wrap-function": "^7.22.9" + "@babel/helper-wrap-function": "^7.22.17" }, "engines": { "node": ">=6.9.0" @@ -450,14 +450,14 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.10.tgz", - "integrity": "sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.17.tgz", + "integrity": "sha512-nAhoheCMlrqU41tAojw9GpVEKDlTS8r3lzFmF0lP52LwblCPbuFSO7nGIZoIcoU5NIm1ABrna0cJExE4Ay6l2Q==", "dev": true, "dependencies": { "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.10" + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.17" }, "engines": { "node": ">=6.9.0" @@ -1728,9 +1728,9 @@ } }, "node_modules/@babel/traverse": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.15.tgz", - "integrity": "sha512-DdHPwvJY0sEeN4xJU5uRLmZjgMMDIvMPniLuYzUVXj/GGzysPl0/fwt44JBkyUIzGJPV8QgHMcQdQ34XFuKTYQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.17.tgz", + "integrity": "sha512-xK4Uwm0JnAMvxYZxOVecss85WxTEIbTa7bnGyf/+EgCL5Zt3U7htUpEOWv9detPlamGKuRzCqw74xVglDWpPdg==", "dev": true, "dependencies": { "@babel/code-frame": "^7.22.13", @@ -1739,8 +1739,8 @@ "@babel/helper-function-name": "^7.22.5", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/types": "^7.22.17", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1749,9 +1749,9 @@ } }, "node_modules/@babel/types": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.15.tgz", - "integrity": "sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.17.tgz", + "integrity": "sha512-YSQPHLFtQNE5xN9tHuZnzu8vPr61wVTBZdfv1meex1NBosa4iT05k/Jw06ddJugi4bk7The/oSwQGFcksmEJQg==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", @@ -1793,9 +1793,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", - "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", + "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -1870,9 +1870,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", - "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", + "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2046,16 +2046,16 @@ } }, "node_modules/@jest/console": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.4.tgz", - "integrity": "sha512-wNK6gC0Ha9QeEPSkeJedQuTQqxZYnDPuDcDhVuVatRvMkL4D0VTvFVZj+Yuh6caG2aOfzkUZ36KtCmLNtR02hw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -2133,15 +2133,15 @@ } }, "node_modules/@jest/core": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.4.tgz", - "integrity": "sha512-U/vq5ccNTSVgYH7mHnodHmCffGWHJnz/E1BEWlLuK5pM4FZmGfBn/nrJGLjUsSmyx3otCeqc1T31F4y08AMDLg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, "dependencies": { - "@jest/console": "^29.6.4", - "@jest/reporters": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -2149,21 +2149,21 @@ "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.6.3", - "jest-config": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-resolve-dependencies": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "jest-watcher": "^29.6.4", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -2250,37 +2250,37 @@ } }, "node_modules/@jest/environment": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.4.tgz", - "integrity": "sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "dependencies": { - "@jest/fake-timers": "^29.6.4", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.3" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.4.tgz", - "integrity": "sha512-Warhsa7d23+3X5bLbrbYvaehcgX5TLYhI03JKoedTiI8uJU4IhqYBWF7OSSgUyz4IgLpUYPkK0AehA5/fRclAA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, "dependencies": { - "expect": "^29.6.4", - "jest-snapshot": "^29.6.4" + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.4.tgz", - "integrity": "sha512-FEhkJhqtvBwgSpiTrocquJCdXPsyvNKcl/n7A3u7X4pVoF4bswm11c9d4AV+kfq2Gpv/mM8x7E7DsRvH+djkrg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, "dependencies": { "jest-get-type": "^29.6.3" @@ -2290,47 +2290,47 @@ } }, "node_modules/@jest/fake-timers": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.4.tgz", - "integrity": "sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.4.tgz", - "integrity": "sha512-wVIn5bdtjlChhXAzVXavcY/3PEjf4VqM174BM3eGL5kMxLiZD5CLnbmkEyA1Dwh9q8XjP6E8RwjBsY/iCWrWsA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", "@jest/types": "^29.6.3", - "jest-mock": "^29.6.3" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.4.tgz", - "integrity": "sha512-sxUjWxm7QdchdrD3NfWKrL8FBsortZeibSJv4XLjESOOjSUOkjQcb0ZHJwfhEGIvBvTluTzfG2yZWZhkrXJu8g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", @@ -2344,9 +2344,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -2510,12 +2510,12 @@ } }, "node_modules/@jest/test-result": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.4.tgz", - "integrity": "sha512-uQ1C0AUEN90/dsyEirgMLlouROgSY+Wc/JanVVk0OiUKa5UFh7sJpMEM3aoUBAz2BRNvUJ8j3d294WFuRxSyOQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, "dependencies": { - "@jest/console": "^29.6.4", + "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" @@ -2525,14 +2525,14 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.4.tgz", - "integrity": "sha512-E84M6LbpcRq3fT4ckfKs9ryVanwkaIB0Ws9bw3/yP4seRLg/VaCZ/LgW0MCq5wwk4/iP/qnilD41aj2fsw2RMg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, "dependencies": { - "@jest/test-result": "^29.6.4", + "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -2540,9 +2540,9 @@ } }, "node_modules/@jest/transform": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz", - "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -2553,9 +2553,9 @@ "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -3030,9 +3030,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.5.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.9.tgz", - "integrity": "sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==", + "version": "20.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.0.tgz", + "integrity": "sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==", "dev": true }, "node_modules/@types/stack-utils": { @@ -3042,9 +3042,9 @@ "dev": true }, "node_modules/@types/tough-cookie": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", - "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.3.tgz", + "integrity": "sha512-THo502dA5PzG/sfQH+42Lw3fvmYkceefOspdCwpHRul8ik2Jv1K8I5OZz1AT3/rs46kwgMCe9bSBmDLYkkOMGg==", "dev": true }, "node_modules/@types/yargs": { @@ -3628,9 +3628,9 @@ } }, "node_modules/axios-mock-adapter": { - "version": "1.21.5", - "resolved": "https://registry.npmjs.org/axios-mock-adapter/-/axios-mock-adapter-1.21.5.tgz", - "integrity": "sha512-5NI1V/VK+8+JeTF8niqOowuysA4b8mGzdlMN/QnTnoXbYh4HZSNiopsDclN2g/m85+G++IrEtUdZaQ3GnaMsSA==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/axios-mock-adapter/-/axios-mock-adapter-1.22.0.tgz", + "integrity": "sha512-dmI0KbkyAhntUR05YY96qg2H6gg0XMl2+qTW0xmYg6Up+BFBAJYRLROMXRdDEL06/Wqwa0TJThAYvFtSFdRCZw==", "dependencies": { "fast-deep-equal": "^3.1.3", "is-buffer": "^2.0.5" @@ -4086,9 +4086,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001529", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001529.tgz", - "integrity": "sha512-n2pUQYGAkrLG4QYj2desAh+NqsJpHbNmVZz87imptDdxLAtjxary7Df/psdfyDGmskJK/9Dt9cPnx5RZ3CU4Og==", + "version": "1.0.30001534", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001534.tgz", + "integrity": "sha512-vlPVrhsCS7XaSh2VvWluIQEzVhefrUQcEsQWSS5A5V+dM07uv1qHeQzAOTGIMy9i3e9bH15+muvI/UHojVgS/Q==", "dev": true, "funding": [ { @@ -4456,6 +4456,97 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/create-jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/create-jest/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/create-jest/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/create-jest/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/create-jest/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -4810,12 +4901,27 @@ "node": ">=0.10.0" } }, + "node_modules/define-data-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.0.1.tgz", + "integrity": "sha512-22M+6zEspQHx10bfFQl2ET39IvfuQ7+rZIH7+ard8fCC4hPmkOSy+8JhKxBRLaWUziJ0O63NTYT97LR8zUfPTw==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -4981,9 +5087,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.512", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.512.tgz", - "integrity": "sha512-1W8wRbYlQE4ph7eoj3TJ+uqwO6+xvAE/L+KGU7WTQQvX3tnSIGZAb90MTsMoJqzntamiwJhBAj4WZmygXhsOUg==", + "version": "1.4.519", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.519.tgz", + "integrity": "sha512-kqs9oGYL4UFVkLKhqCTgBCYZv+wZ374yABDMqlDda9HvlkQxvSr7kgf4hfWVjMieDbX+1MwPHFBsOGCMIBaFKg==", "dev": true }, "node_modules/emittery": { @@ -5120,9 +5226,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", - "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz", + "integrity": "sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==", "dev": true }, "node_modules/es-set-tostringtag": { @@ -5210,16 +5316,16 @@ } }, "node_modules/eslint": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", - "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", + "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.48.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint/js": "8.49.0", + "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", @@ -5703,16 +5809,16 @@ } }, "node_modules/expect": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.4.tgz", - "integrity": "sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, "dependencies": { - "@jest/expect-utils": "^29.6.4", + "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3" + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -5760,9 +5866,9 @@ } }, "node_modules/express-rate-limit": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.0.tgz", - "integrity": "sha512-H9afltGTaEZcvenAB5LFgb/ysTMHUzMxoB3TJM6UHP5FtAP1p2+heMj1xwTei54Zm4I9I/2qsS5m+XrdKQp/Hw==", + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.2.tgz", + "integrity": "sha512-a7uwwfNTh1U60ssiIkuLFWHt4hAC5yxlLGU2VP0X4YNlyEDZAqF4tK3GD3NSitVBrCQmQ0++0uOyFOgC2y4DDw==", "engines": { "node": ">= 14" }, @@ -7227,13 +7333,13 @@ } }, "node_modules/jest-changed-files": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.6.3.tgz", - "integrity": "sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, "dependencies": { "execa": "^5.0.0", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "p-limit": "^3.1.0" }, "engines": { @@ -7241,28 +7347,28 @@ } }, "node_modules/jest-circus": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.4.tgz", - "integrity": "sha512-YXNrRyntVUgDfZbjXWBMPslX1mQ8MrSG0oM/Y06j9EYubODIyHWP8hMUbjbZ19M3M+zamqEur7O80HODwACoJw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", - "@jest/test-result": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "p-limit": "^3.1.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" @@ -7342,22 +7448,21 @@ } }, "node_modules/jest-cli": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.4.tgz", - "integrity": "sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, "dependencies": { - "@jest/core": "^29.6.4", - "@jest/test-result": "^29.6.4", + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "chalk": "^4.0.0", + "create-jest": "^29.7.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "prompts": "^2.0.1", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "yargs": "^17.3.1" }, "bin": { @@ -7446,31 +7551,31 @@ } }, "node_modules/jest-config": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.4.tgz", - "integrity": "sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.6.4", + "@jest/test-sequencer": "^29.7.0", "@jest/types": "^29.6.3", - "babel-jest": "^29.6.4", + "babel-jest": "^29.7.0", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.6.4", - "jest-environment-node": "^29.6.4", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", "jest-get-type": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -7506,12 +7611,12 @@ } }, "node_modules/jest-config/node_modules/babel-jest": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.4.tgz", - "integrity": "sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "dependencies": { - "@jest/transform": "^29.6.4", + "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", @@ -7582,15 +7687,15 @@ } }, "node_modules/jest-diff": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.4.tgz", - "integrity": "sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -7667,9 +7772,9 @@ } }, "node_modules/jest-docblock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.6.3.tgz", - "integrity": "sha512-2+H+GOTQBEm2+qFSQ7Ma+BvyV+waiIFxmZF5LdpBsAEjWX8QYjSCa4FrkIYtbfXUJJJnFCYrOtt6TZ+IAiTjBQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, "dependencies": { "detect-newline": "^3.0.0" @@ -7679,16 +7784,16 @@ } }, "node_modules/jest-each": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.3.tgz", - "integrity": "sha512-KoXfJ42k8cqbkfshW7sSHcdfnv5agDdHCPA87ZBdmHP+zJstTJc0ttQaJ/x7zK6noAL76hOuTIJ6ZkQRS5dcyg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", - "jest-util": "^29.6.3", - "pretty-format": "^29.6.3" + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -7765,18 +7870,18 @@ } }, "node_modules/jest-environment-jsdom": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.6.4.tgz", - "integrity": "sha512-K6wfgUJ16DoMs02JYFid9lOsqfpoVtyJxpRlnTxUHzvZWBnnh2VNGRB9EC1Cro96TQdq5TtSjb3qUjNaJP9IyA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", + "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/jsdom": "^20.0.0", "@types/node": "*", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0", "jsdom": "^20.0.0" }, "engines": { @@ -7792,17 +7897,17 @@ } }, "node_modules/jest-environment-node": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.4.tgz", - "integrity": "sha512-i7SbpH2dEIFGNmxGCpSc2w9cA4qVD+wfvg2ZnfQ7XVrKL0NA5uDVBIiGH8SR4F0dKEv/0qI5r+aDomDf04DpEQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -7818,9 +7923,9 @@ } }, "node_modules/jest-haste-map": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz", - "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -7830,8 +7935,8 @@ "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -7843,28 +7948,28 @@ } }, "node_modules/jest-leak-detector": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.3.tgz", - "integrity": "sha512-0kfbESIHXYdhAdpLsW7xdwmYhLf1BRu4AA118/OxFm0Ho1b2RcTmO4oF6aAMaxpxdxnJ3zve2rgwzNBD4Zbm7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, "dependencies": { "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.4.tgz", - "integrity": "sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.6.4", + "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -7941,9 +8046,9 @@ } }, "node_modules/jest-message-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.3.tgz", - "integrity": "sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", @@ -7952,7 +8057,7 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -8031,14 +8136,14 @@ } }, "node_modules/jest-mock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.3.tgz", - "integrity": "sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", - "jest-util": "^29.6.3" + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -8071,17 +8176,17 @@ } }, "node_modules/jest-resolve": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.4.tgz", - "integrity": "sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" @@ -8091,13 +8196,13 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.4.tgz", - "integrity": "sha512-7+6eAmr1ZBF3vOAJVsfLj1QdqeXG+WYhidfLHBRZqGN24MFRIiKG20ItpLw2qRAsW/D2ZUUmCNf6irUr/v6KHA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, "dependencies": { "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.6.4" + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -8174,30 +8279,30 @@ } }, "node_modules/jest-runner": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.4.tgz", - "integrity": "sha512-SDaLrMmtVlQYDuG0iSPYLycG8P9jLI+fRm8AF/xPKhYDB2g6xDWjXBrR5M8gEWsK6KVFlebpZ4QsrxdyIX1Jaw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, "dependencies": { - "@jest/console": "^29.6.4", - "@jest/environment": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.6.3", - "jest-environment-node": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-leak-detector": "^29.6.3", - "jest-message-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-util": "^29.6.3", - "jest-watcher": "^29.6.4", - "jest-worker": "^29.6.4", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -8276,17 +8381,17 @@ } }, "node_modules/jest-runtime": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.4.tgz", - "integrity": "sha512-s/QxMBLvmwLdchKEjcLfwzP7h+jsHvNEtxGP5P+Fl1FMaJX2jMiIqe4rJw4tFprzCwuSvVUo9bn0uj4gNRXsbA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", - "@jest/globals": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", @@ -8294,13 +8399,13 @@ "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -8379,9 +8484,9 @@ } }, "node_modules/jest-snapshot": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.4.tgz", - "integrity": "sha512-VC1N8ED7+4uboUKGIDsbvNAZb6LakgIPgAF4RSpF13dN6YaMokfRqO+BaqK4zIh6X3JffgwbzuGqDEjHm/MrvA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -8389,20 +8494,20 @@ "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.6.4", + "expect": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-diff": "^29.6.4", + "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "natural-compare": "^1.4.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "semver": "^7.5.3" }, "engines": { @@ -8513,9 +8618,9 @@ "dev": true }, "node_modules/jest-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", - "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -8600,9 +8705,9 @@ } }, "node_modules/jest-validate": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz", - "integrity": "sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -8610,7 +8715,7 @@ "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -8699,18 +8804,18 @@ } }, "node_modules/jest-watcher": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.4.tgz", - "integrity": "sha512-oqUWvx6+On04ShsT00Ir9T4/FvBeEh2M9PTubgITPxDa739p4hoQweWPRGyYeaojgT0xTpZKF0Y/rSY1UgMxvQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, "dependencies": { - "@jest/test-result": "^29.6.4", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "string-length": "^4.0.1" }, "engines": { @@ -8788,13 +8893,13 @@ } }, "node_modules/jest-worker": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", - "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -10444,9 +10549,9 @@ } }, "node_modules/pretty-format": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", - "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", @@ -10774,14 +10879,14 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "set-function-name": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -11267,6 +11372,19 @@ "node": ">= 0.8.0" } }, + "node_modules/set-function-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.0.tgz", + "integrity": "sha512-WmS8UHojv5s1eSoRSmzO5zzgDq8PE1/X/ij0k+9fMYmINCc6+j+SF3Om8YyucKn2yjnK4ItNZOoQycNnHsZJTw==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -12793,9 +12911,9 @@ } }, "node_modules/ws": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.0.tgz", - "integrity": "sha512-WR0RJE9Ehsio6U4TuM+LmunEsjQ5ncHlw4sn9ihD6RoJKZrVyH9FWV3dmnwu8B2aNib1OvG2X6adUCyFpQyWcg==", + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.1.tgz", + "integrity": "sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A==", "dev": true, "engines": { "node": ">=10.0.0" diff --git a/portal/package.json b/portal/package.json index 0764bb4d31..286c73066d 100644 --- a/portal/package.json +++ b/portal/package.json @@ -41,7 +41,7 @@ "dependencies": { "@ministryofjustice/frontend": "1.8.0", "axios": "^1.5.0", - "axios-mock-adapter": "^1.21.5", + "axios-mock-adapter": "^1.22.0", "cheerio": "^1.0.0-rc.12", "connect-flash": "0.1.1", "connect-redis": "5.2.0", @@ -50,7 +50,7 @@ "csurf": "^1.11.0", "dotenv": "16.0.3", "express": "^4.18.2", - "express-rate-limit": "^6.11.0", + "express-rate-limit": "^6.11.2", "express-session": "1.17.3", "form-data": "4.0.0", "govuk-frontend": "4.6.0", @@ -78,12 +78,12 @@ "babel-jest": "29.5.0", "babel-loader": "9.1.2", "css-minimizer-webpack-plugin": "^5.0.1", - "eslint": "^8.48.0", + "eslint": "^8.49.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.28.1", "file-loader": "^6.2.0", "jest": "29.5.0", - "jest-environment-jsdom": "^29.6.4", + "jest-environment-jsdom": "^29.7.0", "rimraf": "^5.0.1", "sass": "^1.66.1", "sass-loader": "13.2.2", diff --git a/trade-finance-manager-api/package-lock.json b/trade-finance-manager-api/package-lock.json index 4539d4c897..3ab012b181 100644 --- a/trade-finance-manager-api/package-lock.json +++ b/trade-finance-manager-api/package-lock.json @@ -21,7 +21,7 @@ "dotenv": "16.0.3", "express": "4.18.2", "express-mongo-sanitize": "^2.2.0", - "express-rate-limit": "^6.11.0", + "express-rate-limit": "^6.11.2", "express-validator": "7.0.1", "graphql": "^16.8.0", "graphql-middleware": "^6.1.35", @@ -49,8 +49,8 @@ "@types/jest": "^29.5.4", "@types/mongodb": "^4.0.7", "@types/swagger-ui-express": "^4.1.3", - "axios-mock-adapter": "^1.21.5", - "eslint": "^8.48.0", + "axios-mock-adapter": "^1.22.0", + "eslint": "^8.49.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.28.1", "jest": "29.5.0", @@ -368,21 +368,21 @@ } }, "node_modules/@babel/core": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.15.tgz", - "integrity": "sha512-PtZqMmgRrvj8ruoEOIwVA3yoF91O+Hgw9o7DAUTNBA6Mo2jpu31clx9a7Nz/9JznqetTR6zwfC4L3LAjKQXUwA==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.17.tgz", + "integrity": "sha512-2EENLmhpwplDux5PSsZnSbnSkB3tZ6QTksgO25xwEL7pIDcNOMhF5v/s6RzwjMZzZzw9Ofc30gHv5ChCC8pifQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.22.13", "@babel/generator": "^7.22.15", "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.22.15", + "@babel/helper-module-transforms": "^7.22.17", "@babel/helpers": "^7.22.15", - "@babel/parser": "^7.22.15", + "@babel/parser": "^7.22.16", "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.15", - "@babel/types": "^7.22.15", + "@babel/traverse": "^7.22.17", + "@babel/types": "^7.22.17", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -519,9 +519,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.15.tgz", - "integrity": "sha512-l1UiX4UyHSFsYt17iQ3Se5pQQZZHa22zyIXURmvkmLCD4t/aU+dvNWHatKac/D9Vm9UES7nvIqHs4jZqKviUmQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.17.tgz", + "integrity": "sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", @@ -911,9 +911,9 @@ } }, "node_modules/@babel/traverse": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.15.tgz", - "integrity": "sha512-DdHPwvJY0sEeN4xJU5uRLmZjgMMDIvMPniLuYzUVXj/GGzysPl0/fwt44JBkyUIzGJPV8QgHMcQdQ34XFuKTYQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.17.tgz", + "integrity": "sha512-xK4Uwm0JnAMvxYZxOVecss85WxTEIbTa7bnGyf/+EgCL5Zt3U7htUpEOWv9detPlamGKuRzCqw74xVglDWpPdg==", "dev": true, "dependencies": { "@babel/code-frame": "^7.22.13", @@ -922,8 +922,8 @@ "@babel/helper-function-name": "^7.22.5", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/types": "^7.22.17", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -964,9 +964,9 @@ "dev": true }, "node_modules/@babel/types": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.15.tgz", - "integrity": "sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.17.tgz", + "integrity": "sha512-YSQPHLFtQNE5xN9tHuZnzu8vPr61wVTBZdfv1meex1NBosa4iT05k/Jw06ddJugi4bk7The/oSwQGFcksmEJQg==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", @@ -999,9 +999,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", - "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", + "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -1054,9 +1054,9 @@ "dev": true }, "node_modules/@eslint/js": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", - "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", + "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1399,16 +1399,16 @@ } }, "node_modules/@jest/console": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.4.tgz", - "integrity": "sha512-wNK6gC0Ha9QeEPSkeJedQuTQqxZYnDPuDcDhVuVatRvMkL4D0VTvFVZj+Yuh6caG2aOfzkUZ36KtCmLNtR02hw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -1416,15 +1416,15 @@ } }, "node_modules/@jest/core": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.4.tgz", - "integrity": "sha512-U/vq5ccNTSVgYH7mHnodHmCffGWHJnz/E1BEWlLuK5pM4FZmGfBn/nrJGLjUsSmyx3otCeqc1T31F4y08AMDLg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, "dependencies": { - "@jest/console": "^29.6.4", - "@jest/reporters": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -1432,21 +1432,21 @@ "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.6.3", - "jest-config": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-resolve-dependencies": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "jest-watcher": "^29.6.4", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -1463,37 +1463,37 @@ } }, "node_modules/@jest/environment": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.4.tgz", - "integrity": "sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "dependencies": { - "@jest/fake-timers": "^29.6.4", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.3" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.4.tgz", - "integrity": "sha512-Warhsa7d23+3X5bLbrbYvaehcgX5TLYhI03JKoedTiI8uJU4IhqYBWF7OSSgUyz4IgLpUYPkK0AehA5/fRclAA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, "dependencies": { - "expect": "^29.6.4", - "jest-snapshot": "^29.6.4" + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.4.tgz", - "integrity": "sha512-FEhkJhqtvBwgSpiTrocquJCdXPsyvNKcl/n7A3u7X4pVoF4bswm11c9d4AV+kfq2Gpv/mM8x7E7DsRvH+djkrg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, "dependencies": { "jest-get-type": "^29.6.3" @@ -1503,47 +1503,47 @@ } }, "node_modules/@jest/fake-timers": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.4.tgz", - "integrity": "sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.4.tgz", - "integrity": "sha512-wVIn5bdtjlChhXAzVXavcY/3PEjf4VqM174BM3eGL5kMxLiZD5CLnbmkEyA1Dwh9q8XjP6E8RwjBsY/iCWrWsA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", "@jest/types": "^29.6.3", - "jest-mock": "^29.6.3" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.4.tgz", - "integrity": "sha512-sxUjWxm7QdchdrD3NfWKrL8FBsortZeibSJv4XLjESOOjSUOkjQcb0ZHJwfhEGIvBvTluTzfG2yZWZhkrXJu8g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", @@ -1557,9 +1557,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -1604,12 +1604,12 @@ } }, "node_modules/@jest/test-result": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.4.tgz", - "integrity": "sha512-uQ1C0AUEN90/dsyEirgMLlouROgSY+Wc/JanVVk0OiUKa5UFh7sJpMEM3aoUBAz2BRNvUJ8j3d294WFuRxSyOQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, "dependencies": { - "@jest/console": "^29.6.4", + "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" @@ -1619,14 +1619,14 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.4.tgz", - "integrity": "sha512-E84M6LbpcRq3fT4ckfKs9ryVanwkaIB0Ws9bw3/yP4seRLg/VaCZ/LgW0MCq5wwk4/iP/qnilD41aj2fsw2RMg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, "dependencies": { - "@jest/test-result": "^29.6.4", + "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -1634,9 +1634,9 @@ } }, "node_modules/@jest/transform": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz", - "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -1647,9 +1647,9 @@ "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -2054,9 +2054,9 @@ } }, "node_modules/@types/node": { - "version": "20.5.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.9.tgz", - "integrity": "sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==" + "version": "20.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.0.tgz", + "integrity": "sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==" }, "node_modules/@types/qs": { "version": "6.9.8", @@ -2653,9 +2653,9 @@ } }, "node_modules/axios-mock-adapter": { - "version": "1.21.5", - "resolved": "https://registry.npmjs.org/axios-mock-adapter/-/axios-mock-adapter-1.21.5.tgz", - "integrity": "sha512-5NI1V/VK+8+JeTF8niqOowuysA4b8mGzdlMN/QnTnoXbYh4HZSNiopsDclN2g/m85+G++IrEtUdZaQ3GnaMsSA==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/axios-mock-adapter/-/axios-mock-adapter-1.22.0.tgz", + "integrity": "sha512-dmI0KbkyAhntUR05YY96qg2H6gg0XMl2+qTW0xmYg6Up+BFBAJYRLROMXRdDEL06/Wqwa0TJThAYvFtSFdRCZw==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.3", @@ -2666,12 +2666,12 @@ } }, "node_modules/babel-jest": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.4.tgz", - "integrity": "sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "dependencies": { - "@jest/transform": "^29.6.4", + "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", @@ -2977,9 +2977,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001529", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001529.tgz", - "integrity": "sha512-n2pUQYGAkrLG4QYj2desAh+NqsJpHbNmVZz87imptDdxLAtjxary7Df/psdfyDGmskJK/9Dt9cPnx5RZ3CU4Og==", + "version": "1.0.30001534", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001534.tgz", + "integrity": "sha512-vlPVrhsCS7XaSh2VvWluIQEzVhefrUQcEsQWSS5A5V+dM07uv1qHeQzAOTGIMy9i3e9bH15+muvI/UHojVgS/Q==", "dev": true, "funding": [ { @@ -3279,6 +3279,27 @@ "node": ">= 0.10" } }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -3360,12 +3381,27 @@ "node": ">=0.10.0" } }, + "node_modules/define-data-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.0.1.tgz", + "integrity": "sha512-22M+6zEspQHx10bfFQl2ET39IvfuQ7+rZIH7+ard8fCC4hPmkOSy+8JhKxBRLaWUziJ0O63NTYT97LR8zUfPTw==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -3521,9 +3557,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.512", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.512.tgz", - "integrity": "sha512-1W8wRbYlQE4ph7eoj3TJ+uqwO6+xvAE/L+KGU7WTQQvX3tnSIGZAb90MTsMoJqzntamiwJhBAj4WZmygXhsOUg==", + "version": "1.4.519", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.519.tgz", + "integrity": "sha512-kqs9oGYL4UFVkLKhqCTgBCYZv+wZ374yABDMqlDda9HvlkQxvSr7kgf4hfWVjMieDbX+1MwPHFBsOGCMIBaFKg==", "dev": true }, "node_modules/emittery": { @@ -3691,16 +3727,16 @@ } }, "node_modules/eslint": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", - "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", + "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.48.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint/js": "8.49.0", + "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", @@ -4042,16 +4078,16 @@ } }, "node_modules/expect": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.4.tgz", - "integrity": "sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, "dependencies": { - "@jest/expect-utils": "^29.6.4", + "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3" + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -4107,9 +4143,9 @@ } }, "node_modules/express-rate-limit": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.0.tgz", - "integrity": "sha512-H9afltGTaEZcvenAB5LFgb/ysTMHUzMxoB3TJM6UHP5FtAP1p2+heMj1xwTei54Zm4I9I/2qsS5m+XrdKQp/Hw==", + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.2.tgz", + "integrity": "sha512-a7uwwfNTh1U60ssiIkuLFWHt4hAC5yxlLGU2VP0X4YNlyEDZAqF4tK3GD3NSitVBrCQmQ0++0uOyFOgC2y4DDw==", "engines": { "node": ">= 14" }, @@ -5390,13 +5426,13 @@ } }, "node_modules/jest-changed-files": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.6.3.tgz", - "integrity": "sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, "dependencies": { "execa": "^5.0.0", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "p-limit": "^3.1.0" }, "engines": { @@ -5404,28 +5440,28 @@ } }, "node_modules/jest-circus": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.4.tgz", - "integrity": "sha512-YXNrRyntVUgDfZbjXWBMPslX1mQ8MrSG0oM/Y06j9EYubODIyHWP8hMUbjbZ19M3M+zamqEur7O80HODwACoJw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", - "@jest/test-result": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "p-limit": "^3.1.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" @@ -5435,22 +5471,21 @@ } }, "node_modules/jest-cli": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.4.tgz", - "integrity": "sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, "dependencies": { - "@jest/core": "^29.6.4", - "@jest/test-result": "^29.6.4", + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "chalk": "^4.0.0", + "create-jest": "^29.7.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "prompts": "^2.0.1", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "yargs": "^17.3.1" }, "bin": { @@ -5469,31 +5504,31 @@ } }, "node_modules/jest-config": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.4.tgz", - "integrity": "sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.6.4", + "@jest/test-sequencer": "^29.7.0", "@jest/types": "^29.6.3", - "babel-jest": "^29.6.4", + "babel-jest": "^29.7.0", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.6.4", - "jest-environment-node": "^29.6.4", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", "jest-get-type": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -5514,24 +5549,24 @@ } }, "node_modules/jest-diff": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.4.tgz", - "integrity": "sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-docblock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.6.3.tgz", - "integrity": "sha512-2+H+GOTQBEm2+qFSQ7Ma+BvyV+waiIFxmZF5LdpBsAEjWX8QYjSCa4FrkIYtbfXUJJJnFCYrOtt6TZ+IAiTjBQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, "dependencies": { "detect-newline": "^3.0.0" @@ -5541,33 +5576,33 @@ } }, "node_modules/jest-each": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.3.tgz", - "integrity": "sha512-KoXfJ42k8cqbkfshW7sSHcdfnv5agDdHCPA87ZBdmHP+zJstTJc0ttQaJ/x7zK6noAL76hOuTIJ6ZkQRS5dcyg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", - "jest-util": "^29.6.3", - "pretty-format": "^29.6.3" + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-environment-node": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.4.tgz", - "integrity": "sha512-i7SbpH2dEIFGNmxGCpSc2w9cA4qVD+wfvg2ZnfQ7XVrKL0NA5uDVBIiGH8SR4F0dKEv/0qI5r+aDomDf04DpEQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -5583,9 +5618,9 @@ } }, "node_modules/jest-haste-map": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz", - "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -5595,8 +5630,8 @@ "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -5608,37 +5643,37 @@ } }, "node_modules/jest-leak-detector": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.3.tgz", - "integrity": "sha512-0kfbESIHXYdhAdpLsW7xdwmYhLf1BRu4AA118/OxFm0Ho1b2RcTmO4oF6aAMaxpxdxnJ3zve2rgwzNBD4Zbm7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, "dependencies": { "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.4.tgz", - "integrity": "sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.6.4", + "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-message-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.3.tgz", - "integrity": "sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", @@ -5647,7 +5682,7 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -5656,14 +5691,14 @@ } }, "node_modules/jest-mock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.3.tgz", - "integrity": "sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", - "jest-util": "^29.6.3" + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -5696,17 +5731,17 @@ } }, "node_modules/jest-resolve": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.4.tgz", - "integrity": "sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" @@ -5716,43 +5751,43 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.4.tgz", - "integrity": "sha512-7+6eAmr1ZBF3vOAJVsfLj1QdqeXG+WYhidfLHBRZqGN24MFRIiKG20ItpLw2qRAsW/D2ZUUmCNf6irUr/v6KHA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, "dependencies": { "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.6.4" + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.4.tgz", - "integrity": "sha512-SDaLrMmtVlQYDuG0iSPYLycG8P9jLI+fRm8AF/xPKhYDB2g6xDWjXBrR5M8gEWsK6KVFlebpZ4QsrxdyIX1Jaw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, "dependencies": { - "@jest/console": "^29.6.4", - "@jest/environment": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.6.3", - "jest-environment-node": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-leak-detector": "^29.6.3", - "jest-message-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-util": "^29.6.3", - "jest-watcher": "^29.6.4", - "jest-worker": "^29.6.4", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -5761,17 +5796,17 @@ } }, "node_modules/jest-runtime": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.4.tgz", - "integrity": "sha512-s/QxMBLvmwLdchKEjcLfwzP7h+jsHvNEtxGP5P+Fl1FMaJX2jMiIqe4rJw4tFprzCwuSvVUo9bn0uj4gNRXsbA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", - "@jest/globals": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", @@ -5779,13 +5814,13 @@ "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -5794,9 +5829,9 @@ } }, "node_modules/jest-snapshot": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.4.tgz", - "integrity": "sha512-VC1N8ED7+4uboUKGIDsbvNAZb6LakgIPgAF4RSpF13dN6YaMokfRqO+BaqK4zIh6X3JffgwbzuGqDEjHm/MrvA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -5804,20 +5839,20 @@ "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.6.4", + "expect": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-diff": "^29.6.4", + "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "natural-compare": "^1.4.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "semver": "^7.5.3" }, "engines": { @@ -5840,9 +5875,9 @@ } }, "node_modules/jest-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", - "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -5857,9 +5892,9 @@ } }, "node_modules/jest-validate": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz", - "integrity": "sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -5867,7 +5902,7 @@ "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -5886,18 +5921,18 @@ } }, "node_modules/jest-watcher": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.4.tgz", - "integrity": "sha512-oqUWvx6+On04ShsT00Ir9T4/FvBeEh2M9PTubgITPxDa739p4hoQweWPRGyYeaojgT0xTpZKF0Y/rSY1UgMxvQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, "dependencies": { - "@jest/test-result": "^29.6.4", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "string-length": "^4.0.1" }, "engines": { @@ -5905,13 +5940,13 @@ } }, "node_modules/jest-worker": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", - "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -7099,9 +7134,9 @@ } }, "node_modules/pretty-format": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", - "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", @@ -7267,14 +7302,14 @@ "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" }, "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "set-function-name": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -7522,6 +7557,19 @@ "node": ">= 0.8.0" } }, + "node_modules/set-function-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.0.tgz", + "integrity": "sha512-WmS8UHojv5s1eSoRSmzO5zzgDq8PE1/X/ij0k+9fMYmINCc6+j+SF3Om8YyucKn2yjnK4ItNZOoQycNnHsZJTw==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -8285,9 +8333,13 @@ } }, "node_modules/uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "bin": { "uuid": "dist/bin/uuid" } diff --git a/trade-finance-manager-api/package.json b/trade-finance-manager-api/package.json index b0c18c0d76..2fd8ed395d 100644 --- a/trade-finance-manager-api/package.json +++ b/trade-finance-manager-api/package.json @@ -48,7 +48,7 @@ "dotenv": "16.0.3", "express": "4.18.2", "express-mongo-sanitize": "^2.2.0", - "express-rate-limit": "^6.11.0", + "express-rate-limit": "^6.11.2", "express-validator": "7.0.1", "graphql": "^16.8.0", "graphql-middleware": "^6.1.35", @@ -76,8 +76,8 @@ "@types/jest": "^29.5.4", "@types/mongodb": "^4.0.7", "@types/swagger-ui-express": "^4.1.3", - "axios-mock-adapter": "^1.21.5", - "eslint": "^8.48.0", + "axios-mock-adapter": "^1.22.0", + "eslint": "^8.49.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.28.1", "jest": "29.5.0", diff --git a/trade-finance-manager-ui/package-lock.json b/trade-finance-manager-ui/package-lock.json index 8906b240a3..8ed17dbd81 100644 --- a/trade-finance-manager-ui/package-lock.json +++ b/trade-finance-manager-ui/package-lock.json @@ -28,7 +28,7 @@ "date-fns": "^2.30.0", "dotenv": "16.0.3", "express": "^4.18.2", - "express-rate-limit": "^6.11.0", + "express-rate-limit": "^6.11.2", "express-session": "1.17.3", "express-validator": "7.0.1", "express-xss-sanitizer": "^1.1.6", @@ -57,11 +57,11 @@ "@babel/preset-env": "7.21.5", "@babel/runtime": "7.21.5", "@types/jest": "^29.5.4", - "axios-mock-adapter": "^1.21.5", + "axios-mock-adapter": "^1.22.0", "babel-jest": "29.5.0", "babel-loader": "9.1.2", "copy-webpack-plugin": "^11.0.0", - "eslint": "^8.48.0", + "eslint": "^8.49.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.28.1", "file-loader": "^6.2.0", @@ -325,9 +325,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.15.tgz", - "integrity": "sha512-l1UiX4UyHSFsYt17iQ3Se5pQQZZHa22zyIXURmvkmLCD4t/aU+dvNWHatKac/D9Vm9UES7nvIqHs4jZqKviUmQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.17.tgz", + "integrity": "sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", @@ -365,14 +365,14 @@ } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz", - "integrity": "sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.17.tgz", + "integrity": "sha512-bxH77R5gjH3Nkde6/LuncQoLaP16THYPscurp1S8z7S9ZgezCyV3G8Hc+TZiCmY8pz4fp8CvKSgtJMW0FkLAxA==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-wrap-function": "^7.22.9" + "@babel/helper-wrap-function": "^7.22.17" }, "engines": { "node": ">=6.9.0" @@ -462,14 +462,14 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.10.tgz", - "integrity": "sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.17.tgz", + "integrity": "sha512-nAhoheCMlrqU41tAojw9GpVEKDlTS8r3lzFmF0lP52LwblCPbuFSO7nGIZoIcoU5NIm1ABrna0cJExE4Ay6l2Q==", "dev": true, "dependencies": { "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.10" + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.17" }, "engines": { "node": ">=6.9.0" @@ -1756,9 +1756,9 @@ } }, "node_modules/@babel/traverse": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.15.tgz", - "integrity": "sha512-DdHPwvJY0sEeN4xJU5uRLmZjgMMDIvMPniLuYzUVXj/GGzysPl0/fwt44JBkyUIzGJPV8QgHMcQdQ34XFuKTYQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.17.tgz", + "integrity": "sha512-xK4Uwm0JnAMvxYZxOVecss85WxTEIbTa7bnGyf/+EgCL5Zt3U7htUpEOWv9detPlamGKuRzCqw74xVglDWpPdg==", "dev": true, "dependencies": { "@babel/code-frame": "^7.22.13", @@ -1767,8 +1767,8 @@ "@babel/helper-function-name": "^7.22.5", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/types": "^7.22.17", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1777,9 +1777,9 @@ } }, "node_modules/@babel/types": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.15.tgz", - "integrity": "sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.17.tgz", + "integrity": "sha512-YSQPHLFtQNE5xN9tHuZnzu8vPr61wVTBZdfv1meex1NBosa4iT05k/Jw06ddJugi4bk7The/oSwQGFcksmEJQg==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", @@ -1821,9 +1821,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", - "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", + "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -1920,9 +1920,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", - "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", + "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2000,16 +2000,16 @@ } }, "node_modules/@jest/console": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.4.tgz", - "integrity": "sha512-wNK6gC0Ha9QeEPSkeJedQuTQqxZYnDPuDcDhVuVatRvMkL4D0VTvFVZj+Yuh6caG2aOfzkUZ36KtCmLNtR02hw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -2087,15 +2087,15 @@ } }, "node_modules/@jest/core": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.4.tgz", - "integrity": "sha512-U/vq5ccNTSVgYH7mHnodHmCffGWHJnz/E1BEWlLuK5pM4FZmGfBn/nrJGLjUsSmyx3otCeqc1T31F4y08AMDLg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, "dependencies": { - "@jest/console": "^29.6.4", - "@jest/reporters": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -2103,21 +2103,21 @@ "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.6.3", - "jest-config": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-resolve-dependencies": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "jest-watcher": "^29.6.4", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -2204,37 +2204,37 @@ } }, "node_modules/@jest/environment": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.4.tgz", - "integrity": "sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "dependencies": { - "@jest/fake-timers": "^29.6.4", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.3" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.4.tgz", - "integrity": "sha512-Warhsa7d23+3X5bLbrbYvaehcgX5TLYhI03JKoedTiI8uJU4IhqYBWF7OSSgUyz4IgLpUYPkK0AehA5/fRclAA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, "dependencies": { - "expect": "^29.6.4", - "jest-snapshot": "^29.6.4" + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.4.tgz", - "integrity": "sha512-FEhkJhqtvBwgSpiTrocquJCdXPsyvNKcl/n7A3u7X4pVoF4bswm11c9d4AV+kfq2Gpv/mM8x7E7DsRvH+djkrg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, "dependencies": { "jest-get-type": "^29.6.3" @@ -2244,47 +2244,47 @@ } }, "node_modules/@jest/fake-timers": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.4.tgz", - "integrity": "sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.4.tgz", - "integrity": "sha512-wVIn5bdtjlChhXAzVXavcY/3PEjf4VqM174BM3eGL5kMxLiZD5CLnbmkEyA1Dwh9q8XjP6E8RwjBsY/iCWrWsA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", "@jest/types": "^29.6.3", - "jest-mock": "^29.6.3" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.4.tgz", - "integrity": "sha512-sxUjWxm7QdchdrD3NfWKrL8FBsortZeibSJv4XLjESOOjSUOkjQcb0ZHJwfhEGIvBvTluTzfG2yZWZhkrXJu8g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", @@ -2298,9 +2298,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -2464,12 +2464,12 @@ } }, "node_modules/@jest/test-result": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.4.tgz", - "integrity": "sha512-uQ1C0AUEN90/dsyEirgMLlouROgSY+Wc/JanVVk0OiUKa5UFh7sJpMEM3aoUBAz2BRNvUJ8j3d294WFuRxSyOQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, "dependencies": { - "@jest/console": "^29.6.4", + "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" @@ -2479,14 +2479,14 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.4.tgz", - "integrity": "sha512-E84M6LbpcRq3fT4ckfKs9ryVanwkaIB0Ws9bw3/yP4seRLg/VaCZ/LgW0MCq5wwk4/iP/qnilD41aj2fsw2RMg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, "dependencies": { - "@jest/test-result": "^29.6.4", + "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -2494,9 +2494,9 @@ } }, "node_modules/@jest/transform": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz", - "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -2507,9 +2507,9 @@ "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -2964,9 +2964,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.5.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.9.tgz", - "integrity": "sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==" + "version": "20.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.0.tgz", + "integrity": "sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==" }, "node_modules/@types/stack-utils": { "version": "2.0.1", @@ -3611,9 +3611,9 @@ } }, "node_modules/axios-mock-adapter": { - "version": "1.21.5", - "resolved": "https://registry.npmjs.org/axios-mock-adapter/-/axios-mock-adapter-1.21.5.tgz", - "integrity": "sha512-5NI1V/VK+8+JeTF8niqOowuysA4b8mGzdlMN/QnTnoXbYh4HZSNiopsDclN2g/m85+G++IrEtUdZaQ3GnaMsSA==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/axios-mock-adapter/-/axios-mock-adapter-1.22.0.tgz", + "integrity": "sha512-dmI0KbkyAhntUR05YY96qg2H6gg0XMl2+qTW0xmYg6Up+BFBAJYRLROMXRdDEL06/Wqwa0TJThAYvFtSFdRCZw==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.3", @@ -4063,9 +4063,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001529", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001529.tgz", - "integrity": "sha512-n2pUQYGAkrLG4QYj2desAh+NqsJpHbNmVZz87imptDdxLAtjxary7Df/psdfyDGmskJK/9Dt9cPnx5RZ3CU4Og==", + "version": "1.0.30001534", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001534.tgz", + "integrity": "sha512-vlPVrhsCS7XaSh2VvWluIQEzVhefrUQcEsQWSS5A5V+dM07uv1qHeQzAOTGIMy9i3e9bH15+muvI/UHojVgS/Q==", "dev": true, "funding": [ { @@ -4516,6 +4516,97 @@ "url": "https://opencollective.com/core-js" } }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/create-jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/create-jest/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/create-jest/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/create-jest/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/create-jest/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -4776,12 +4867,27 @@ "node": ">=0.10.0" } }, + "node_modules/define-data-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.0.1.tgz", + "integrity": "sha512-22M+6zEspQHx10bfFQl2ET39IvfuQ7+rZIH7+ard8fCC4hPmkOSy+8JhKxBRLaWUziJ0O63NTYT97LR8zUfPTw==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -4941,9 +5047,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.512", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.512.tgz", - "integrity": "sha512-1W8wRbYlQE4ph7eoj3TJ+uqwO6+xvAE/L+KGU7WTQQvX3tnSIGZAb90MTsMoJqzntamiwJhBAj4WZmygXhsOUg==", + "version": "1.4.519", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.519.tgz", + "integrity": "sha512-kqs9oGYL4UFVkLKhqCTgBCYZv+wZ374yABDMqlDda9HvlkQxvSr7kgf4hfWVjMieDbX+1MwPHFBsOGCMIBaFKg==", "dev": true }, "node_modules/emittery": { @@ -5080,9 +5186,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", - "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz", + "integrity": "sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==", "dev": true }, "node_modules/es-set-tostringtag": { @@ -5149,16 +5255,16 @@ } }, "node_modules/eslint": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", - "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", + "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.48.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint/js": "8.49.0", + "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", @@ -5676,16 +5782,16 @@ } }, "node_modules/expect": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.4.tgz", - "integrity": "sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, "dependencies": { - "@jest/expect-utils": "^29.6.4", + "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3" + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -5733,9 +5839,9 @@ } }, "node_modules/express-rate-limit": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.0.tgz", - "integrity": "sha512-H9afltGTaEZcvenAB5LFgb/ysTMHUzMxoB3TJM6UHP5FtAP1p2+heMj1xwTei54Zm4I9I/2qsS5m+XrdKQp/Hw==", + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.2.tgz", + "integrity": "sha512-a7uwwfNTh1U60ssiIkuLFWHt4hAC5yxlLGU2VP0X4YNlyEDZAqF4tK3GD3NSitVBrCQmQ0++0uOyFOgC2y4DDw==", "engines": { "node": ">= 14" }, @@ -7334,13 +7440,13 @@ } }, "node_modules/jest-changed-files": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.6.3.tgz", - "integrity": "sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, "dependencies": { "execa": "^5.0.0", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "p-limit": "^3.1.0" }, "engines": { @@ -7348,28 +7454,28 @@ } }, "node_modules/jest-circus": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.4.tgz", - "integrity": "sha512-YXNrRyntVUgDfZbjXWBMPslX1mQ8MrSG0oM/Y06j9EYubODIyHWP8hMUbjbZ19M3M+zamqEur7O80HODwACoJw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", - "@jest/test-result": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "p-limit": "^3.1.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" @@ -7449,22 +7555,21 @@ } }, "node_modules/jest-cli": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.4.tgz", - "integrity": "sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, "dependencies": { - "@jest/core": "^29.6.4", - "@jest/test-result": "^29.6.4", + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "chalk": "^4.0.0", + "create-jest": "^29.7.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "prompts": "^2.0.1", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "yargs": "^17.3.1" }, "bin": { @@ -7553,31 +7658,31 @@ } }, "node_modules/jest-config": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.4.tgz", - "integrity": "sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.6.4", + "@jest/test-sequencer": "^29.7.0", "@jest/types": "^29.6.3", - "babel-jest": "^29.6.4", + "babel-jest": "^29.7.0", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.6.4", - "jest-environment-node": "^29.6.4", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", "jest-get-type": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -7613,12 +7718,12 @@ } }, "node_modules/jest-config/node_modules/babel-jest": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.4.tgz", - "integrity": "sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "dependencies": { - "@jest/transform": "^29.6.4", + "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", @@ -7689,15 +7794,15 @@ } }, "node_modules/jest-diff": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.4.tgz", - "integrity": "sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -7774,9 +7879,9 @@ } }, "node_modules/jest-docblock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.6.3.tgz", - "integrity": "sha512-2+H+GOTQBEm2+qFSQ7Ma+BvyV+waiIFxmZF5LdpBsAEjWX8QYjSCa4FrkIYtbfXUJJJnFCYrOtt6TZ+IAiTjBQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, "dependencies": { "detect-newline": "^3.0.0" @@ -7786,16 +7891,16 @@ } }, "node_modules/jest-each": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.3.tgz", - "integrity": "sha512-KoXfJ42k8cqbkfshW7sSHcdfnv5agDdHCPA87ZBdmHP+zJstTJc0ttQaJ/x7zK6noAL76hOuTIJ6ZkQRS5dcyg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", - "jest-util": "^29.6.3", - "pretty-format": "^29.6.3" + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -7872,17 +7977,17 @@ } }, "node_modules/jest-environment-node": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.4.tgz", - "integrity": "sha512-i7SbpH2dEIFGNmxGCpSc2w9cA4qVD+wfvg2ZnfQ7XVrKL0NA5uDVBIiGH8SR4F0dKEv/0qI5r+aDomDf04DpEQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -7898,9 +8003,9 @@ } }, "node_modules/jest-haste-map": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz", - "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -7910,8 +8015,8 @@ "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -7923,28 +8028,28 @@ } }, "node_modules/jest-leak-detector": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.3.tgz", - "integrity": "sha512-0kfbESIHXYdhAdpLsW7xdwmYhLf1BRu4AA118/OxFm0Ho1b2RcTmO4oF6aAMaxpxdxnJ3zve2rgwzNBD4Zbm7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, "dependencies": { "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.4.tgz", - "integrity": "sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.6.4", + "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -8021,9 +8126,9 @@ } }, "node_modules/jest-message-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.3.tgz", - "integrity": "sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", @@ -8032,7 +8137,7 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -8111,14 +8216,14 @@ } }, "node_modules/jest-mock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.3.tgz", - "integrity": "sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", - "jest-util": "^29.6.3" + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -8151,17 +8256,17 @@ } }, "node_modules/jest-resolve": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.4.tgz", - "integrity": "sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" @@ -8171,13 +8276,13 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.4.tgz", - "integrity": "sha512-7+6eAmr1ZBF3vOAJVsfLj1QdqeXG+WYhidfLHBRZqGN24MFRIiKG20ItpLw2qRAsW/D2ZUUmCNf6irUr/v6KHA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, "dependencies": { "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.6.4" + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -8254,30 +8359,30 @@ } }, "node_modules/jest-runner": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.4.tgz", - "integrity": "sha512-SDaLrMmtVlQYDuG0iSPYLycG8P9jLI+fRm8AF/xPKhYDB2g6xDWjXBrR5M8gEWsK6KVFlebpZ4QsrxdyIX1Jaw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, "dependencies": { - "@jest/console": "^29.6.4", - "@jest/environment": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.6.3", - "jest-environment-node": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-leak-detector": "^29.6.3", - "jest-message-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-util": "^29.6.3", - "jest-watcher": "^29.6.4", - "jest-worker": "^29.6.4", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -8356,17 +8461,17 @@ } }, "node_modules/jest-runtime": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.4.tgz", - "integrity": "sha512-s/QxMBLvmwLdchKEjcLfwzP7h+jsHvNEtxGP5P+Fl1FMaJX2jMiIqe4rJw4tFprzCwuSvVUo9bn0uj4gNRXsbA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", - "@jest/globals": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", @@ -8374,13 +8479,13 @@ "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -8459,9 +8564,9 @@ } }, "node_modules/jest-snapshot": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.4.tgz", - "integrity": "sha512-VC1N8ED7+4uboUKGIDsbvNAZb6LakgIPgAF4RSpF13dN6YaMokfRqO+BaqK4zIh6X3JffgwbzuGqDEjHm/MrvA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -8469,20 +8574,20 @@ "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.6.4", + "expect": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-diff": "^29.6.4", + "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "natural-compare": "^1.4.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "semver": "^7.5.3" }, "engines": { @@ -8593,9 +8698,9 @@ "dev": true }, "node_modules/jest-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", - "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -8680,9 +8785,9 @@ } }, "node_modules/jest-validate": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz", - "integrity": "sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -8690,7 +8795,7 @@ "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -8779,18 +8884,18 @@ } }, "node_modules/jest-watcher": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.4.tgz", - "integrity": "sha512-oqUWvx6+On04ShsT00Ir9T4/FvBeEh2M9PTubgITPxDa739p4hoQweWPRGyYeaojgT0xTpZKF0Y/rSY1UgMxvQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, "dependencies": { - "@jest/test-result": "^29.6.4", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "string-length": "^4.0.1" }, "engines": { @@ -8868,13 +8973,13 @@ } }, "node_modules/jest-worker": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", - "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -10412,9 +10517,9 @@ } }, "node_modules/pretty-format": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", - "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", @@ -10712,14 +10817,14 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "set-function-name": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -11119,6 +11224,19 @@ "node": ">= 0.8.0" } }, + "node_modules/set-function-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.0.tgz", + "integrity": "sha512-WmS8UHojv5s1eSoRSmzO5zzgDq8PE1/X/ij0k+9fMYmINCc6+j+SF3Om8YyucKn2yjnK4ItNZOoQycNnHsZJTw==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", diff --git a/trade-finance-manager-ui/package.json b/trade-finance-manager-ui/package.json index 43c00685d0..2b96a37e02 100644 --- a/trade-finance-manager-ui/package.json +++ b/trade-finance-manager-ui/package.json @@ -59,7 +59,7 @@ "date-fns": "^2.30.0", "dotenv": "16.0.3", "express": "^4.18.2", - "express-rate-limit": "^6.11.0", + "express-rate-limit": "^6.11.2", "express-session": "1.17.3", "express-validator": "7.0.1", "express-xss-sanitizer": "^1.1.6", @@ -88,11 +88,11 @@ "@babel/preset-env": "7.21.5", "@babel/runtime": "7.21.5", "@types/jest": "^29.5.4", - "axios-mock-adapter": "^1.21.5", + "axios-mock-adapter": "^1.22.0", "babel-jest": "29.5.0", "babel-loader": "9.1.2", "copy-webpack-plugin": "^11.0.0", - "eslint": "^8.48.0", + "eslint": "^8.49.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.28.1", "file-loader": "^6.2.0", diff --git a/utils/data-migration/package-lock.json b/utils/data-migration/package-lock.json index c695c81303..7dc04a6ee7 100644 --- a/utils/data-migration/package-lock.json +++ b/utils/data-migration/package-lock.json @@ -130,44 +130,44 @@ "optional": true }, "node_modules/@aws-sdk/client-cognito-identity": { - "version": "3.408.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.408.0.tgz", - "integrity": "sha512-SJfFXLvjnERmm9X4H/43J1Ax6lX3C5XwRn6eImBaBNwT4JQVMSG/kf9vG8dvLkvvnh4t1RM7p12bkc9AI41zBA==", + "version": "3.410.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.410.0.tgz", + "integrity": "sha512-J4iPhXswm66Fsk1x0Kly+PWzBizmms4kkkoAU1sk9n08XfWqNBTyf01mx6/t/X+Yh43p2zaeB/XvUwa0jSsWaQ==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.408.0", - "@aws-sdk/credential-provider-node": "3.408.0", - "@aws-sdk/middleware-host-header": "3.408.0", - "@aws-sdk/middleware-logger": "3.408.0", - "@aws-sdk/middleware-recursion-detection": "3.408.0", - "@aws-sdk/middleware-signing": "3.408.0", - "@aws-sdk/middleware-user-agent": "3.408.0", - "@aws-sdk/types": "3.408.0", - "@aws-sdk/util-endpoints": "3.408.0", - "@aws-sdk/util-user-agent-browser": "3.408.0", - "@aws-sdk/util-user-agent-node": "3.408.0", - "@smithy/config-resolver": "^2.0.5", - "@smithy/fetch-http-handler": "^2.0.5", - "@smithy/hash-node": "^2.0.5", - "@smithy/invalid-dependency": "^2.0.5", - "@smithy/middleware-content-length": "^2.0.5", - "@smithy/middleware-endpoint": "^2.0.5", - "@smithy/middleware-retry": "^2.0.5", - "@smithy/middleware-serde": "^2.0.5", + "@aws-sdk/client-sts": "3.410.0", + "@aws-sdk/credential-provider-node": "3.410.0", + "@aws-sdk/middleware-host-header": "3.410.0", + "@aws-sdk/middleware-logger": "3.410.0", + "@aws-sdk/middleware-recursion-detection": "3.410.0", + "@aws-sdk/middleware-signing": "3.410.0", + "@aws-sdk/middleware-user-agent": "3.410.0", + "@aws-sdk/types": "3.410.0", + "@aws-sdk/util-endpoints": "3.410.0", + "@aws-sdk/util-user-agent-browser": "3.410.0", + "@aws-sdk/util-user-agent-node": "3.410.0", + "@smithy/config-resolver": "^2.0.7", + "@smithy/fetch-http-handler": "^2.1.2", + "@smithy/hash-node": "^2.0.6", + "@smithy/invalid-dependency": "^2.0.6", + "@smithy/middleware-content-length": "^2.0.8", + "@smithy/middleware-endpoint": "^2.0.6", + "@smithy/middleware-retry": "^2.0.9", + "@smithy/middleware-serde": "^2.0.6", "@smithy/middleware-stack": "^2.0.0", - "@smithy/node-config-provider": "^2.0.6", - "@smithy/node-http-handler": "^2.0.5", - "@smithy/protocol-http": "^2.0.5", - "@smithy/smithy-client": "^2.0.5", - "@smithy/types": "^2.2.2", - "@smithy/url-parser": "^2.0.5", + "@smithy/node-config-provider": "^2.0.9", + "@smithy/node-http-handler": "^2.1.2", + "@smithy/protocol-http": "^3.0.2", + "@smithy/smithy-client": "^2.1.3", + "@smithy/types": "^2.3.0", + "@smithy/url-parser": "^2.0.6", "@smithy/util-base64": "^2.0.0", "@smithy/util-body-length-browser": "^2.0.0", "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.6", - "@smithy/util-defaults-mode-node": "^2.0.6", + "@smithy/util-defaults-mode-browser": "^2.0.7", + "@smithy/util-defaults-mode-node": "^2.0.9", "@smithy/util-retry": "^2.0.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" @@ -177,41 +177,41 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.408.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.408.0.tgz", - "integrity": "sha512-g0Y904ghLTg9JLJnmbuvf10Hrzwqn2pko6aCAK10vCI5Y2nQ6BAUXuPonxhZIlp+JHsk0B2FUBqquc+bErUspA==", + "version": "3.410.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.410.0.tgz", + "integrity": "sha512-MC9GrgwtlOuSL2WS3DRM3dQ/5y+49KSMMJRH6JiEcU5vE0dX/OtEcX+VfEwpi73x5pSfIjm7xnzjzOFx+sQBIg==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/middleware-host-header": "3.408.0", - "@aws-sdk/middleware-logger": "3.408.0", - "@aws-sdk/middleware-recursion-detection": "3.408.0", - "@aws-sdk/middleware-user-agent": "3.408.0", - "@aws-sdk/types": "3.408.0", - "@aws-sdk/util-endpoints": "3.408.0", - "@aws-sdk/util-user-agent-browser": "3.408.0", - "@aws-sdk/util-user-agent-node": "3.408.0", - "@smithy/config-resolver": "^2.0.5", - "@smithy/fetch-http-handler": "^2.0.5", - "@smithy/hash-node": "^2.0.5", - "@smithy/invalid-dependency": "^2.0.5", - "@smithy/middleware-content-length": "^2.0.5", - "@smithy/middleware-endpoint": "^2.0.5", - "@smithy/middleware-retry": "^2.0.5", - "@smithy/middleware-serde": "^2.0.5", + "@aws-sdk/middleware-host-header": "3.410.0", + "@aws-sdk/middleware-logger": "3.410.0", + "@aws-sdk/middleware-recursion-detection": "3.410.0", + "@aws-sdk/middleware-user-agent": "3.410.0", + "@aws-sdk/types": "3.410.0", + "@aws-sdk/util-endpoints": "3.410.0", + "@aws-sdk/util-user-agent-browser": "3.410.0", + "@aws-sdk/util-user-agent-node": "3.410.0", + "@smithy/config-resolver": "^2.0.7", + "@smithy/fetch-http-handler": "^2.1.2", + "@smithy/hash-node": "^2.0.6", + "@smithy/invalid-dependency": "^2.0.6", + "@smithy/middleware-content-length": "^2.0.8", + "@smithy/middleware-endpoint": "^2.0.6", + "@smithy/middleware-retry": "^2.0.9", + "@smithy/middleware-serde": "^2.0.6", "@smithy/middleware-stack": "^2.0.0", - "@smithy/node-config-provider": "^2.0.6", - "@smithy/node-http-handler": "^2.0.5", - "@smithy/protocol-http": "^2.0.5", - "@smithy/smithy-client": "^2.0.5", - "@smithy/types": "^2.2.2", - "@smithy/url-parser": "^2.0.5", + "@smithy/node-config-provider": "^2.0.9", + "@smithy/node-http-handler": "^2.1.2", + "@smithy/protocol-http": "^3.0.2", + "@smithy/smithy-client": "^2.1.3", + "@smithy/types": "^2.3.0", + "@smithy/url-parser": "^2.0.6", "@smithy/util-base64": "^2.0.0", "@smithy/util-body-length-browser": "^2.0.0", "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.6", - "@smithy/util-defaults-mode-node": "^2.0.6", + "@smithy/util-defaults-mode-browser": "^2.0.7", + "@smithy/util-defaults-mode-node": "^2.0.9", "@smithy/util-retry": "^2.0.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" @@ -221,44 +221,44 @@ } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.408.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.408.0.tgz", - "integrity": "sha512-PpNmhCuFjVrgGBy00RVh3evBxzFfvUrALDqpBnPYhz489Qzg2I+T90FqdSUedPQPYe+qhq0YJMPKc9leYBEB/w==", + "version": "3.410.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.410.0.tgz", + "integrity": "sha512-e6VMrBJtnTxxUXwDmkADGIvyppmDMFf4+cGGA68tVCUm1cFNlCI6M/67bVSIPN/WVKAAfhEL5O2vVXCM7aatYg==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/credential-provider-node": "3.408.0", - "@aws-sdk/middleware-host-header": "3.408.0", - "@aws-sdk/middleware-logger": "3.408.0", - "@aws-sdk/middleware-recursion-detection": "3.408.0", - "@aws-sdk/middleware-sdk-sts": "3.408.0", - "@aws-sdk/middleware-signing": "3.408.0", - "@aws-sdk/middleware-user-agent": "3.408.0", - "@aws-sdk/types": "3.408.0", - "@aws-sdk/util-endpoints": "3.408.0", - "@aws-sdk/util-user-agent-browser": "3.408.0", - "@aws-sdk/util-user-agent-node": "3.408.0", - "@smithy/config-resolver": "^2.0.5", - "@smithy/fetch-http-handler": "^2.0.5", - "@smithy/hash-node": "^2.0.5", - "@smithy/invalid-dependency": "^2.0.5", - "@smithy/middleware-content-length": "^2.0.5", - "@smithy/middleware-endpoint": "^2.0.5", - "@smithy/middleware-retry": "^2.0.5", - "@smithy/middleware-serde": "^2.0.5", + "@aws-sdk/credential-provider-node": "3.410.0", + "@aws-sdk/middleware-host-header": "3.410.0", + "@aws-sdk/middleware-logger": "3.410.0", + "@aws-sdk/middleware-recursion-detection": "3.410.0", + "@aws-sdk/middleware-sdk-sts": "3.410.0", + "@aws-sdk/middleware-signing": "3.410.0", + "@aws-sdk/middleware-user-agent": "3.410.0", + "@aws-sdk/types": "3.410.0", + "@aws-sdk/util-endpoints": "3.410.0", + "@aws-sdk/util-user-agent-browser": "3.410.0", + "@aws-sdk/util-user-agent-node": "3.410.0", + "@smithy/config-resolver": "^2.0.7", + "@smithy/fetch-http-handler": "^2.1.2", + "@smithy/hash-node": "^2.0.6", + "@smithy/invalid-dependency": "^2.0.6", + "@smithy/middleware-content-length": "^2.0.8", + "@smithy/middleware-endpoint": "^2.0.6", + "@smithy/middleware-retry": "^2.0.9", + "@smithy/middleware-serde": "^2.0.6", "@smithy/middleware-stack": "^2.0.0", - "@smithy/node-config-provider": "^2.0.6", - "@smithy/node-http-handler": "^2.0.5", - "@smithy/protocol-http": "^2.0.5", - "@smithy/smithy-client": "^2.0.5", - "@smithy/types": "^2.2.2", - "@smithy/url-parser": "^2.0.5", + "@smithy/node-config-provider": "^2.0.9", + "@smithy/node-http-handler": "^2.1.2", + "@smithy/protocol-http": "^3.0.2", + "@smithy/smithy-client": "^2.1.3", + "@smithy/types": "^2.3.0", + "@smithy/url-parser": "^2.0.6", "@smithy/util-base64": "^2.0.0", "@smithy/util-body-length-browser": "^2.0.0", "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.6", - "@smithy/util-defaults-mode-node": "^2.0.6", + "@smithy/util-defaults-mode-browser": "^2.0.7", + "@smithy/util-defaults-mode-node": "^2.0.9", "@smithy/util-retry": "^2.0.0", "@smithy/util-utf8": "^2.0.0", "fast-xml-parser": "4.2.5", @@ -269,15 +269,15 @@ } }, "node_modules/@aws-sdk/credential-provider-cognito-identity": { - "version": "3.408.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.408.0.tgz", - "integrity": "sha512-P3Yj/u54oceD4CHzoHgvb2YAmrKTm/uqsgbJcWJ6RwEkJ7awF6aOzUYLRK1z1PCtfq6YdHUmrv2RkxcQnQeboA==", + "version": "3.410.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.410.0.tgz", + "integrity": "sha512-2QMvdnwnYsKnwy8O+o9ozKL80VFWI0skXVvKB3DFW4cr9IX5cBCx7xuhI7TXbCqiBxuz5SSiA1s19fVtq0sUmw==", "optional": true, "dependencies": { - "@aws-sdk/client-cognito-identity": "3.408.0", - "@aws-sdk/types": "3.408.0", + "@aws-sdk/client-cognito-identity": "3.410.0", + "@aws-sdk/types": "3.410.0", "@smithy/property-provider": "^2.0.0", - "@smithy/types": "^2.2.2", + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" }, "engines": { @@ -285,14 +285,14 @@ } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.408.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.408.0.tgz", - "integrity": "sha512-GCpgHEHxRTzKaMkwDC2gLb3xlD+ZxhKPUJ1DVcO7I9E3eCGJsYVedIi0/2XE+NP+HVoy8LyW2qH8QQWh64JKow==", + "version": "3.410.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.410.0.tgz", + "integrity": "sha512-c7TB9LbN0PkFOsXI0lcRJnqPNOmc4VBvrHf8jP/BkTDg4YUoKQKOFd4d0SqzODmlZiAyoMQVZTR4ISZo95Zj4Q==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.408.0", + "@aws-sdk/types": "3.410.0", "@smithy/property-provider": "^2.0.0", - "@smithy/types": "^2.2.2", + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" }, "engines": { @@ -300,20 +300,20 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.408.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.408.0.tgz", - "integrity": "sha512-vXuayXiwHncd3Xush0jQYrnu2aPPlE+fpdnpEdZGgUJwdbv2vSeYZ73ldH1LzCd179BEDVT0J7nHc7fposo3kg==", + "version": "3.410.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.410.0.tgz", + "integrity": "sha512-D8rcr5bRCFD0f42MPQ7K6TWZq5d3pfqrKINL1/bpfkK5BJbvq1BGYmR88UC6CLpTRtZ1LHY2HgYG0fp/2zjjww==", "optional": true, "dependencies": { - "@aws-sdk/credential-provider-env": "3.408.0", - "@aws-sdk/credential-provider-process": "3.408.0", - "@aws-sdk/credential-provider-sso": "3.408.0", - "@aws-sdk/credential-provider-web-identity": "3.408.0", - "@aws-sdk/types": "3.408.0", + "@aws-sdk/credential-provider-env": "3.410.0", + "@aws-sdk/credential-provider-process": "3.410.0", + "@aws-sdk/credential-provider-sso": "3.410.0", + "@aws-sdk/credential-provider-web-identity": "3.410.0", + "@aws-sdk/types": "3.410.0", "@smithy/credential-provider-imds": "^2.0.0", "@smithy/property-provider": "^2.0.0", "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/types": "^2.2.2", + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" }, "engines": { @@ -321,21 +321,21 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.408.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.408.0.tgz", - "integrity": "sha512-AzDtlj2Mb01K5+AiDI14HsIs9I/pI4nM3kxeOZZvocaaThF5OFR+4wR2v2plhfGJ8QAPEE/KnqcJ3JlJ7orShg==", + "version": "3.410.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.410.0.tgz", + "integrity": "sha512-0wmVm33T/j1FS7MZ/j+WsPlgSc0YnCXnpbWSov1Mn6R86SHI2b2JhdIPRRE4XbGfyW2QGNUl2CwoZVaqhXeF5g==", "optional": true, "dependencies": { - "@aws-sdk/credential-provider-env": "3.408.0", - "@aws-sdk/credential-provider-ini": "3.408.0", - "@aws-sdk/credential-provider-process": "3.408.0", - "@aws-sdk/credential-provider-sso": "3.408.0", - "@aws-sdk/credential-provider-web-identity": "3.408.0", - "@aws-sdk/types": "3.408.0", + "@aws-sdk/credential-provider-env": "3.410.0", + "@aws-sdk/credential-provider-ini": "3.410.0", + "@aws-sdk/credential-provider-process": "3.410.0", + "@aws-sdk/credential-provider-sso": "3.410.0", + "@aws-sdk/credential-provider-web-identity": "3.410.0", + "@aws-sdk/types": "3.410.0", "@smithy/credential-provider-imds": "^2.0.0", "@smithy/property-provider": "^2.0.0", "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/types": "^2.2.2", + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" }, "engines": { @@ -343,15 +343,15 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.408.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.408.0.tgz", - "integrity": "sha512-qCTf9tr6+I2s3+v5zP4YRQQrGlYw/jyZ7u/k6bGshhlvgwGPfjNuHrM8uK/W1kv4ng1myxaL1/tAY6RVVdXz4Q==", + "version": "3.410.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.410.0.tgz", + "integrity": "sha512-BMju1hlDCDNkkSZpKF5SQ8G0WCLRj6/Jvw9QmudLHJuVwYJXEW1r2AsVMg98OZ3hB9G+MAvHruHZIbMiNmUMXQ==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.408.0", + "@aws-sdk/types": "3.410.0", "@smithy/property-provider": "^2.0.0", "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/types": "^2.2.2", + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" }, "engines": { @@ -359,17 +359,17 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.408.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.408.0.tgz", - "integrity": "sha512-iKU91cxrttQyDhdhF7vJZd6XibvwGolFzuJBG4DD4jOdvmTcVq4L26AH8bjR1psnS6pvTa66FaYt6BGtbXgVeA==", + "version": "3.410.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.410.0.tgz", + "integrity": "sha512-zEaoY/sY+KYTlQUkp9dvveAHf175b8RIt0DsQkDrRPtrg/RBHR00r5rFvz9+nrwsR8546RaBU7h/zzTaQGhmcA==", "optional": true, "dependencies": { - "@aws-sdk/client-sso": "3.408.0", - "@aws-sdk/token-providers": "3.408.0", - "@aws-sdk/types": "3.408.0", + "@aws-sdk/client-sso": "3.410.0", + "@aws-sdk/token-providers": "3.410.0", + "@aws-sdk/types": "3.410.0", "@smithy/property-provider": "^2.0.0", "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/types": "^2.2.2", + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" }, "engines": { @@ -377,14 +377,14 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.408.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.408.0.tgz", - "integrity": "sha512-5FbDPF/zY/1t6k1zRI/HnrxcH2v7SwsEYu2SThI2qbzaP/K7MTnTanV5vNFcdQOpuQ7x3PrzTlH3AWZueCr3Vw==", + "version": "3.410.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.410.0.tgz", + "integrity": "sha512-cE0l8LmEHdWbDkdPNgrfdYSgp4/cIVXrjUKI1QCATA729CrHZ/OQjB/maOBOrMHO9YTiggko887NkslVvwVB7w==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.408.0", + "@aws-sdk/types": "3.410.0", "@smithy/property-provider": "^2.0.0", - "@smithy/types": "^2.2.2", + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" }, "engines": { @@ -392,25 +392,25 @@ } }, "node_modules/@aws-sdk/credential-providers": { - "version": "3.408.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.408.0.tgz", - "integrity": "sha512-NVE5hDXlY4I4nRtaxf4vPTABWn2PoRUjCGW9HEOzD/oQx054OsXW0n1umviDncYCfiroCveRERM2htVIGiREng==", - "optional": true, - "dependencies": { - "@aws-sdk/client-cognito-identity": "3.408.0", - "@aws-sdk/client-sso": "3.408.0", - "@aws-sdk/client-sts": "3.408.0", - "@aws-sdk/credential-provider-cognito-identity": "3.408.0", - "@aws-sdk/credential-provider-env": "3.408.0", - "@aws-sdk/credential-provider-ini": "3.408.0", - "@aws-sdk/credential-provider-node": "3.408.0", - "@aws-sdk/credential-provider-process": "3.408.0", - "@aws-sdk/credential-provider-sso": "3.408.0", - "@aws-sdk/credential-provider-web-identity": "3.408.0", - "@aws-sdk/types": "3.408.0", + "version": "3.410.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.410.0.tgz", + "integrity": "sha512-QcunzQRNi9dJdAGdduST7itRW+QhDrb9zZHn+HhLKUoVwLrqk1iuH2R9SoEdZg8eV5jR04yoOPdjj1jzdIkFXQ==", + "optional": true, + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.410.0", + "@aws-sdk/client-sso": "3.410.0", + "@aws-sdk/client-sts": "3.410.0", + "@aws-sdk/credential-provider-cognito-identity": "3.410.0", + "@aws-sdk/credential-provider-env": "3.410.0", + "@aws-sdk/credential-provider-ini": "3.410.0", + "@aws-sdk/credential-provider-node": "3.410.0", + "@aws-sdk/credential-provider-process": "3.410.0", + "@aws-sdk/credential-provider-sso": "3.410.0", + "@aws-sdk/credential-provider-web-identity": "3.410.0", + "@aws-sdk/types": "3.410.0", "@smithy/credential-provider-imds": "^2.0.0", "@smithy/property-provider": "^2.0.0", - "@smithy/types": "^2.2.2", + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" }, "engines": { @@ -418,14 +418,14 @@ } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.408.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.408.0.tgz", - "integrity": "sha512-eofCXuSZ+ntbLzeCRdHzraXzgWqAplXU7W2qFFVC4O9lZBhADwNPI8n8x98TH0mftnmvZxh5Bo5U8WvEolIDkw==", + "version": "3.410.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.410.0.tgz", + "integrity": "sha512-ED/OVcyITln5rrxnajZP+V0PN1nug+gSDHJDqdDo/oLy7eiDr/ZWn3nlWW7WcMplQ1/Jnb+hK0UetBp/25XooA==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.408.0", - "@smithy/protocol-http": "^2.0.5", - "@smithy/types": "^2.2.2", + "@aws-sdk/types": "3.410.0", + "@smithy/protocol-http": "^3.0.2", + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" }, "engines": { @@ -433,13 +433,13 @@ } }, "node_modules/@aws-sdk/middleware-logger": { - "version": "3.408.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.408.0.tgz", - "integrity": "sha512-otwXPCubsGRFv8Hb6nKw6Vvnu4dC8CcPk05buStj42nF8QdjWrKGb2rDCvLph5lr576LF5HN+Y2moyOi7z/I7g==", + "version": "3.410.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.410.0.tgz", + "integrity": "sha512-YtmKYCVtBfScq3/UFJk+aSZOktKJBNZL9DaSc2aPcy/goCVsYDOkGwtHk0jIkC1JRSNCkVTqL7ya60sSr8zaQQ==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.408.0", - "@smithy/types": "^2.2.2", + "@aws-sdk/types": "3.410.0", + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" }, "engines": { @@ -447,14 +447,14 @@ } }, "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.408.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.408.0.tgz", - "integrity": "sha512-QfZwmX5z0IRC2c8pBi9VozSqbJw19V5oxyykSTqdjGe3CG3yNujXObV6xQesK67CWSnPb9wDgVGKUoYuIXwOxw==", + "version": "3.410.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.410.0.tgz", + "integrity": "sha512-KWaes5FLzRqj28vaIEE4Bimpga2E596WdPF2HaH6zsVMJddoRDsc3ZX9ZhLOGrXzIO1RqBd0QxbLrM0S/B2aOQ==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.408.0", - "@smithy/protocol-http": "^2.0.5", - "@smithy/types": "^2.2.2", + "@aws-sdk/types": "3.410.0", + "@smithy/protocol-http": "^3.0.2", + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" }, "engines": { @@ -462,14 +462,14 @@ } }, "node_modules/@aws-sdk/middleware-sdk-sts": { - "version": "3.408.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.408.0.tgz", - "integrity": "sha512-dIO9BTX049P2PwaeAK2lxJeA2rZi9/bWzMP1GIE60VrMDHmN5Ljvh1lLActECLAqNQIqN5Ub0bKV2tC/jMn+CA==", + "version": "3.410.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.410.0.tgz", + "integrity": "sha512-YfBpctDocRR4CcROoDueJA7D+aMLBV8nTFfmVNdLLLgyuLZ/AUR11VQSu1lf9gQZKl8IpKE/BLf2fRE/qV1ZuA==", "optional": true, "dependencies": { - "@aws-sdk/middleware-signing": "3.408.0", - "@aws-sdk/types": "3.408.0", - "@smithy/types": "^2.2.2", + "@aws-sdk/middleware-signing": "3.410.0", + "@aws-sdk/types": "3.410.0", + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" }, "engines": { @@ -477,16 +477,16 @@ } }, "node_modules/@aws-sdk/middleware-signing": { - "version": "3.408.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.408.0.tgz", - "integrity": "sha512-flLiLKATJ4NLcLb7lPojyQ6NvLSyQ3axqIClqwMRnhSRxvREB7OgBKwmPecSl0I5JxsNEqo+mjARdMjUHadgWQ==", + "version": "3.410.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.410.0.tgz", + "integrity": "sha512-KBAZ/eoAJUSJv5us2HsKwK2OszG2s9FEyKpEhgnHLcbbKzW873zHBH5GcOGEQu4AWArTy2ndzJu3FF+9/J9hJQ==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.408.0", + "@aws-sdk/types": "3.410.0", "@smithy/property-provider": "^2.0.0", - "@smithy/protocol-http": "^2.0.5", + "@smithy/protocol-http": "^3.0.2", "@smithy/signature-v4": "^2.0.0", - "@smithy/types": "^2.2.2", + "@smithy/types": "^2.3.0", "@smithy/util-middleware": "^2.0.0", "tslib": "^2.5.0" }, @@ -495,15 +495,15 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.408.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.408.0.tgz", - "integrity": "sha512-UvlKri8/Mgf5W+tFU6ZJ65fC6HljcysIqfRFts/8Wurl322IS1I4j+pyjV2P6eK1054bzynfi3Trv+tRYHtVcA==", + "version": "3.410.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.410.0.tgz", + "integrity": "sha512-ZayDtLfvCZUohSxQc/49BfoU/y6bDHLfLdyyUJbJ54Sv8zQcrmdyKvCBFUZwE6tHQgAmv9/ZT18xECMl+xiONA==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.408.0", - "@aws-sdk/util-endpoints": "3.408.0", - "@smithy/protocol-http": "^2.0.5", - "@smithy/types": "^2.2.2", + "@aws-sdk/types": "3.410.0", + "@aws-sdk/util-endpoints": "3.410.0", + "@smithy/protocol-http": "^3.0.2", + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" }, "engines": { @@ -511,43 +511,43 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.408.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.408.0.tgz", - "integrity": "sha512-D//BjUrVtDzDdCz1mRdZZSAc822fh75Ssq46smeS6S6NKq3vJeHhfrQJMyVU1GclXu1tn9AwykaQW5Jwb5im+g==", + "version": "3.410.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.410.0.tgz", + "integrity": "sha512-d5Nc0xydkH/X0LA1HDyhGY5sEv4LuADFk+QpDtT8ogLilcre+b1jpdY8Sih/gd1KoGS1H+d1tz2hSGwUHAbUbw==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/middleware-host-header": "3.408.0", - "@aws-sdk/middleware-logger": "3.408.0", - "@aws-sdk/middleware-recursion-detection": "3.408.0", - "@aws-sdk/middleware-user-agent": "3.408.0", - "@aws-sdk/types": "3.408.0", - "@aws-sdk/util-endpoints": "3.408.0", - "@aws-sdk/util-user-agent-browser": "3.408.0", - "@aws-sdk/util-user-agent-node": "3.408.0", - "@smithy/config-resolver": "^2.0.5", - "@smithy/fetch-http-handler": "^2.0.5", - "@smithy/hash-node": "^2.0.5", - "@smithy/invalid-dependency": "^2.0.5", - "@smithy/middleware-content-length": "^2.0.5", - "@smithy/middleware-endpoint": "^2.0.5", - "@smithy/middleware-retry": "^2.0.5", - "@smithy/middleware-serde": "^2.0.5", + "@aws-sdk/middleware-host-header": "3.410.0", + "@aws-sdk/middleware-logger": "3.410.0", + "@aws-sdk/middleware-recursion-detection": "3.410.0", + "@aws-sdk/middleware-user-agent": "3.410.0", + "@aws-sdk/types": "3.410.0", + "@aws-sdk/util-endpoints": "3.410.0", + "@aws-sdk/util-user-agent-browser": "3.410.0", + "@aws-sdk/util-user-agent-node": "3.410.0", + "@smithy/config-resolver": "^2.0.7", + "@smithy/fetch-http-handler": "^2.1.2", + "@smithy/hash-node": "^2.0.6", + "@smithy/invalid-dependency": "^2.0.6", + "@smithy/middleware-content-length": "^2.0.8", + "@smithy/middleware-endpoint": "^2.0.6", + "@smithy/middleware-retry": "^2.0.9", + "@smithy/middleware-serde": "^2.0.6", "@smithy/middleware-stack": "^2.0.0", - "@smithy/node-config-provider": "^2.0.6", - "@smithy/node-http-handler": "^2.0.5", + "@smithy/node-config-provider": "^2.0.9", + "@smithy/node-http-handler": "^2.1.2", "@smithy/property-provider": "^2.0.0", - "@smithy/protocol-http": "^2.0.5", + "@smithy/protocol-http": "^3.0.2", "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/smithy-client": "^2.0.5", - "@smithy/types": "^2.2.2", - "@smithy/url-parser": "^2.0.5", + "@smithy/smithy-client": "^2.1.3", + "@smithy/types": "^2.3.0", + "@smithy/url-parser": "^2.0.6", "@smithy/util-base64": "^2.0.0", "@smithy/util-body-length-browser": "^2.0.0", "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.6", - "@smithy/util-defaults-mode-node": "^2.0.6", + "@smithy/util-defaults-mode-browser": "^2.0.7", + "@smithy/util-defaults-mode-node": "^2.0.9", "@smithy/util-retry": "^2.0.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" @@ -557,12 +557,12 @@ } }, "node_modules/@aws-sdk/types": { - "version": "3.408.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.408.0.tgz", - "integrity": "sha512-sIsR5224xWQTW7O6h4V0S7DMWs4bK4DCunwOo7Avpq7ZVmH2YyLTs0n4NGL186j8xTosycF1ACQgpM48SLIvaA==", + "version": "3.410.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.410.0.tgz", + "integrity": "sha512-D7iaUCszv/v04NDaZUmCmekamy6VD/lKozm/3gS9+dkfU6cC2CsNoUfPV8BlV6dPdw0oWgF91am3I1stdvfVrQ==", "optional": true, "dependencies": { - "@smithy/types": "^2.2.2", + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" }, "engines": { @@ -570,12 +570,12 @@ } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.408.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.408.0.tgz", - "integrity": "sha512-N1D5cKEkCqf5Q7IF/pI9kfcNrT+/5ctZ6cQo4Ex6xaOcnUzdOZcXdPqaMRZVZRn8enjK2SpoLlRpXGISOugPaw==", + "version": "3.410.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.410.0.tgz", + "integrity": "sha512-iNiqJyC7N3+8zFwnXUqcWSxrZecVZLToo1iTQQdeYL2af1IcOtRgb7n8jpAI/hmXhBSx2+3RI+Y7pxyFo1vu+w==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.408.0", + "@aws-sdk/types": "3.410.0", "tslib": "^2.5.0" }, "engines": { @@ -595,26 +595,26 @@ } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.408.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.408.0.tgz", - "integrity": "sha512-wOVjDprG5h6kM8aJZk/tRX/RgxNxr73d6kIsUePlAgil13q62M9lcFMcIXduqtDsa1B6FfVB2wx/pyUuOZri5g==", + "version": "3.410.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.410.0.tgz", + "integrity": "sha512-i1G/XGpXGMRT2zEiAhi1xucJsfCWk8nNYjk/LbC0sA+7B9Huri96YAzVib12wkHPsJQvZxZC6CpQDIHWm4lXMA==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.408.0", - "@smithy/types": "^2.2.2", + "@aws-sdk/types": "3.410.0", + "@smithy/types": "^2.3.0", "bowser": "^2.11.0", "tslib": "^2.5.0" } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.408.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.408.0.tgz", - "integrity": "sha512-BzMFV+cIXrtfcfJk3GpXnkANFkzZisvAtD306TMgIscn5FF26K1jD5DU+h5Q5WMq7gx+oXh9kJ3Lu3hi7hahKQ==", + "version": "3.410.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.410.0.tgz", + "integrity": "sha512-bK70t1jHRl8HrJXd4hEIwc5PBZ7U0w+81AKFnanIVKZwZedd6nLibUXDTK14z/Jp2GFcBqd4zkt2YLGkRt/U4A==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.408.0", - "@smithy/node-config-provider": "^2.0.6", - "@smithy/types": "^2.2.2", + "@aws-sdk/types": "3.410.0", + "@smithy/node-config-provider": "^2.0.9", + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" }, "engines": { @@ -659,12 +659,12 @@ } }, "node_modules/@smithy/abort-controller": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.6.tgz", - "integrity": "sha512-4I7g0lyGUlW2onf8mD76IzU37oRWSHsQ5zlW5MjDzgg4I4J9bOK4500Gx6qOuoN7+GulAnGLe1YwyrIluzhakg==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.7.tgz", + "integrity": "sha512-rITz65zk8QA3GQ1OeoJ3/Q4+8j/HqubWU8TBqk57BMYTOX+P+LNMoVHPqzLHhE6qKot5muhThNCYvOKNt7ojJA==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.0", + "@smithy/types": "^2.3.1", "tslib": "^2.5.0" }, "engines": { @@ -672,13 +672,13 @@ } }, "node_modules/@smithy/config-resolver": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.7.tgz", - "integrity": "sha512-J4J1AWiqaApC+3I9U++SuxAQ3BOoM5VoYnpFzCZcb63aLF80Zpc/nq2pFR1OsEIYyg2UYNdcBKKfHABmwo4WgQ==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.8.tgz", + "integrity": "sha512-e7mwQteHjo9S1GK+TfzP3o7ujE2ZK30d6wkv5brKtabrZF7MBflj9CwUP2XYuOYebdWirHOtv8ZfkMrpcbJfYw==", "optional": true, "dependencies": { - "@smithy/node-config-provider": "^2.0.9", - "@smithy/types": "^2.3.0", + "@smithy/node-config-provider": "^2.0.10", + "@smithy/types": "^2.3.1", "@smithy/util-config-provider": "^2.0.0", "@smithy/util-middleware": "^2.0.0", "tslib": "^2.5.0" @@ -688,15 +688,15 @@ } }, "node_modules/@smithy/credential-provider-imds": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.0.9.tgz", - "integrity": "sha512-K7WZRkHS5HZofRgK+O8W4YXXyaVexU1K6hp9vlUL/8CsnrFbZS9quyH/6hTROrYh2PuJr24yii1kc83NJdxMGQ==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.0.10.tgz", + "integrity": "sha512-may2/gYlDip2rjlU1Z5fcCEWY0Fu3tSu/HykgZrLfb2/171P6OYuz7dGNKBOCS1W57vP4W5wmUhm0WGehrixig==", "optional": true, "dependencies": { - "@smithy/node-config-provider": "^2.0.9", - "@smithy/property-provider": "^2.0.7", - "@smithy/types": "^2.3.0", - "@smithy/url-parser": "^2.0.6", + "@smithy/node-config-provider": "^2.0.10", + "@smithy/property-provider": "^2.0.8", + "@smithy/types": "^2.3.1", + "@smithy/url-parser": "^2.0.7", "tslib": "^2.5.0" }, "engines": { @@ -704,50 +704,37 @@ } }, "node_modules/@smithy/eventstream-codec": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.6.tgz", - "integrity": "sha512-J9xL82mlYRUMXFnB9VaThXkD7z2JLr52FIVZMoQQ1dxZG5ub+NOGmzaTTZC/cMmKXI/nwCoFuwDWCTjwQhYhQA==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.7.tgz", + "integrity": "sha512-sW3AhXZhmmhh0f11EOotmNNa0rjrKwnMYNKfbp3B/qigdw6foKcmFGX+HF3XGN7w7fFeEFuXr97Ok24gRj92Xg==", "optional": true, "dependencies": { "@aws-crypto/crc32": "3.0.0", - "@smithy/types": "^2.3.0", + "@smithy/types": "^2.3.1", "@smithy/util-hex-encoding": "^2.0.0", "tslib": "^2.5.0" } }, "node_modules/@smithy/fetch-http-handler": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.1.2.tgz", - "integrity": "sha512-3Gm3pQm4viUPU+e7KkRScS9t5phBxSNRS8rQSZ+HeCwK/busrX0/2HJZiwLvGblqPqi1laJB0lD18AdiOioJww==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.1.3.tgz", + "integrity": "sha512-kUg+Ey4mJeR/3+Ponuhb1rsmsfZRwjCLvC+WcPgeI+ittretEzuWAPN+9anD0HJEoApVjHpndzxPtlncbCUJDQ==", "optional": true, "dependencies": { - "@smithy/protocol-http": "^3.0.2", - "@smithy/querystring-builder": "^2.0.6", - "@smithy/types": "^2.3.0", + "@smithy/protocol-http": "^3.0.3", + "@smithy/querystring-builder": "^2.0.7", + "@smithy/types": "^2.3.1", "@smithy/util-base64": "^2.0.0", "tslib": "^2.5.0" } }, - "node_modules/@smithy/fetch-http-handler/node_modules/@smithy/protocol-http": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.2.tgz", - "integrity": "sha512-LUOWCPRihvJBkdSs+ivK9m1f/rMfF3n9Zpzg8qdry2eIG4HQqqLBMWQyF9bgk7JhsrrOa3//jJKhXzvL7wL5Xw==", - "optional": true, - "dependencies": { - "@smithy/types": "^2.3.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/@smithy/hash-node": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.6.tgz", - "integrity": "sha512-xz7fzFxSzxohKGGyKPbLReRrY01JOZgRDHIXSks3PxQxG9c8PJMa5nUw0stH8UOySUgkofmMy0n7vTUsF5Mdqg==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.7.tgz", + "integrity": "sha512-aB5lvIDP1v+ZUUS8ek3XW5xnZ6jUQ86JXqG7a5jMP6AbjAc3439mIbs6+f1EQ5MtYmrQCEtRRyvv5QofvotH0w==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.0", + "@smithy/types": "^2.3.1", "@smithy/util-buffer-from": "^2.0.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" @@ -757,12 +744,12 @@ } }, "node_modules/@smithy/invalid-dependency": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.6.tgz", - "integrity": "sha512-L5MUyl9mzawIvBxr0Hg3J/Q5qZFXKcBgMk0PacfK3Mthp4WAR6h7iMxdSQ23Q7X/kxOrpZuoYEdh1BWLKbDc8Q==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.7.tgz", + "integrity": "sha512-qVOZnHFPzQo4BS47/PANHX32Y69c0tJxKBkqTL795D/DKInqBwmBO/m1gS7v0ZQqmtCuoy2l87RflQfRY2xEIw==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.0", + "@smithy/types": "^2.3.1", "tslib": "^2.5.0" } }, @@ -779,26 +766,13 @@ } }, "node_modules/@smithy/middleware-content-length": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.8.tgz", - "integrity": "sha512-fHJFsscHXrYhUSWMFJNXfsZW8KsyhWQfBgU3b0nvDfpm+NAeQLqKYNhywGrDwZQc1k+lt7Fw9faAquhNPxTZRA==", - "optional": true, - "dependencies": { - "@smithy/protocol-http": "^3.0.2", - "@smithy/types": "^2.3.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/middleware-content-length/node_modules/@smithy/protocol-http": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.2.tgz", - "integrity": "sha512-LUOWCPRihvJBkdSs+ivK9m1f/rMfF3n9Zpzg8qdry2eIG4HQqqLBMWQyF9bgk7JhsrrOa3//jJKhXzvL7wL5Xw==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.9.tgz", + "integrity": "sha512-2XVFsGqswxrIBi0w4Njwzb1zsbte26U513K+WPFm9z6SB/3WR5/VBVjTaTcamrXznTAqBjTwTL0Ysisv1dW0Rw==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.0", + "@smithy/protocol-http": "^3.0.3", + "@smithy/types": "^2.3.1", "tslib": "^2.5.0" }, "engines": { @@ -806,14 +780,14 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.0.6.tgz", - "integrity": "sha512-MuSPPtEHFal/M77tR3ffLsdOfX29IZpA990nGuoPj5zQnAYrA4PYBGoqqrASQKm8Xb3C0NwuYzOATT7WX4f5Pg==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.0.7.tgz", + "integrity": "sha512-4/L0wV7PzHEprJB0gazSTIwlW/2cCfwC9EHavUMhoCyl1tLer6CJwDbAMit1IMvwbHkwuKopueb8dFPHfpS2Pw==", "optional": true, "dependencies": { - "@smithy/middleware-serde": "^2.0.6", - "@smithy/types": "^2.3.0", - "@smithy/url-parser": "^2.0.6", + "@smithy/middleware-serde": "^2.0.7", + "@smithy/types": "^2.3.1", + "@smithy/url-parser": "^2.0.7", "@smithy/util-middleware": "^2.0.0", "tslib": "^2.5.0" }, @@ -822,15 +796,15 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.9.tgz", - "integrity": "sha512-gneEqWj4l/ZjHdZPk0BFMXoTalRArdQ8i579/KqJgBAc6Ux5vnR/SSppkMCkj2kOQYwdypvzSPeqEW3ZrvIg6g==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.10.tgz", + "integrity": "sha512-VwAQOR5Rh/y9BzUgb5DzUk7qYBiMZu3pEQa5EwwAf/F7lpMuNildGrAxtDmsXk90490FJwa6LyFknXP3kO5BnA==", "optional": true, "dependencies": { - "@smithy/node-config-provider": "^2.0.9", - "@smithy/protocol-http": "^3.0.2", + "@smithy/node-config-provider": "^2.0.10", + "@smithy/protocol-http": "^3.0.3", "@smithy/service-error-classification": "^2.0.0", - "@smithy/types": "^2.3.0", + "@smithy/types": "^2.3.1", "@smithy/util-middleware": "^2.0.0", "@smithy/util-retry": "^2.0.0", "tslib": "^2.5.0", @@ -840,26 +814,13 @@ "node": ">=14.0.0" } }, - "node_modules/@smithy/middleware-retry/node_modules/@smithy/protocol-http": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.2.tgz", - "integrity": "sha512-LUOWCPRihvJBkdSs+ivK9m1f/rMfF3n9Zpzg8qdry2eIG4HQqqLBMWQyF9bgk7JhsrrOa3//jJKhXzvL7wL5Xw==", - "optional": true, - "dependencies": { - "@smithy/types": "^2.3.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/@smithy/middleware-serde": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.6.tgz", - "integrity": "sha512-8/GODBngYbrS28CMZtaHIL4R9rLNSQ/zgb+N1OAZ02NwBUawlnLDcatve9YRzhJC/IWz0/pt+WimJZaO1sGcig==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.7.tgz", + "integrity": "sha512-tOldis4PUNafdGErLZ+33p9Pf3MmTlLa176X321Z6ZaCf1XNEow9m3T5vXrcHErVAvjPG0mp3l54J94HnPc+rQ==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.0", + "@smithy/types": "^2.3.1", "tslib": "^2.5.0" }, "engines": { @@ -879,14 +840,14 @@ } }, "node_modules/@smithy/node-config-provider": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.0.9.tgz", - "integrity": "sha512-TlSPbCwtT/jgNnmPQqKuCR5CFN8UIrCCHRrgUfs3NqRMuaLLeP8TPe1fSKq2J8h1M/jd4BF853gneles0gWevg==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.0.10.tgz", + "integrity": "sha512-e5MiLH5Eu+BbYsmhZIkvUKCzite6JCBPL75PNjlRK2TWvSpfp19hNf2SiJIQbPalcFj5zlyBvtcEkF1sfYIdhg==", "optional": true, "dependencies": { - "@smithy/property-provider": "^2.0.7", - "@smithy/shared-ini-file-loader": "^2.0.8", - "@smithy/types": "^2.3.0", + "@smithy/property-provider": "^2.0.8", + "@smithy/shared-ini-file-loader": "^2.0.9", + "@smithy/types": "^2.3.1", "tslib": "^2.5.0" }, "engines": { @@ -894,28 +855,15 @@ } }, "node_modules/@smithy/node-http-handler": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.1.2.tgz", - "integrity": "sha512-PdEEDCShuM8zxGoaRxmGB/1ikB8oeqz+ZAF9VIA8FCP3E59j8zDTF+wCELoWd1Y6gtxr+RcTAg5sA8nvn5qH/w==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.1.3.tgz", + "integrity": "sha512-TGkgpx68SqvbspVHaG3iwqP2mKYOT4whiq7Kv2X9v+InngL4MkpH3LQ0Dk7kbloahZr+hAOyb6s8D7T8TXRrzA==", "optional": true, "dependencies": { - "@smithy/abort-controller": "^2.0.6", - "@smithy/protocol-http": "^3.0.2", - "@smithy/querystring-builder": "^2.0.6", - "@smithy/types": "^2.3.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/node-http-handler/node_modules/@smithy/protocol-http": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.2.tgz", - "integrity": "sha512-LUOWCPRihvJBkdSs+ivK9m1f/rMfF3n9Zpzg8qdry2eIG4HQqqLBMWQyF9bgk7JhsrrOa3//jJKhXzvL7wL5Xw==", - "optional": true, - "dependencies": { - "@smithy/types": "^2.3.0", + "@smithy/abort-controller": "^2.0.7", + "@smithy/protocol-http": "^3.0.3", + "@smithy/querystring-builder": "^2.0.7", + "@smithy/types": "^2.3.1", "tslib": "^2.5.0" }, "engines": { @@ -923,12 +871,12 @@ } }, "node_modules/@smithy/property-provider": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.7.tgz", - "integrity": "sha512-XT8Tl7YNxM8tCtGqy7v7DSf6PxyXaPE9cdA/Yj4dEw2b05V3RrPqsP+t5XJiZu0yIsQ7pdeYZWv2sSEWVjNeAg==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.8.tgz", + "integrity": "sha512-oaaP/i7bGG8XbxG9Kx4PZh83iJ2jo/vt8RmJdi9hmc8APBaW1HGDperVXDCyPQdVYXmiqrtxc/rPImyBma1G3A==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.0", + "@smithy/types": "^2.3.1", "tslib": "^2.5.0" }, "engines": { @@ -936,12 +884,12 @@ } }, "node_modules/@smithy/protocol-http": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-2.0.5.tgz", - "integrity": "sha512-d2hhHj34mA2V86doiDfrsy2fNTnUOowGaf9hKb0hIPHqvcnShU4/OSc4Uf1FwHkAdYF3cFXTrj5VGUYbEuvMdw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.3.tgz", + "integrity": "sha512-UGfmQNdijlFV+UzgdRyfe05S5vLDdcdkvNcxhGvQ+Er7TjUkZSxjukQB9VXtT8oTHztgOMX74DDlPBsVzZR5Pg==", "optional": true, "dependencies": { - "@smithy/types": "^2.2.2", + "@smithy/types": "^2.3.1", "tslib": "^2.5.0" }, "engines": { @@ -949,12 +897,12 @@ } }, "node_modules/@smithy/querystring-builder": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.6.tgz", - "integrity": "sha512-HnU00shCGoV8vKJZTiNBkNvR9NogU3NIUaVMAGJPSqNGJj3psWo+TUrC0BVCDcwiCljXwXCFGJqIcsWtClrktQ==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.7.tgz", + "integrity": "sha512-RPHnqt4iH1Kwp1Zbf4gJI88hZiynEZjE5hEWJNBmKqCe1Q6v7HBLtaovTaiuYaMEmPyb2KxOi3lISAdT6uuPqw==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.0", + "@smithy/types": "^2.3.1", "@smithy/util-uri-escape": "^2.0.0", "tslib": "^2.5.0" }, @@ -963,12 +911,12 @@ } }, "node_modules/@smithy/querystring-parser": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.6.tgz", - "integrity": "sha512-i4LKoXHP7pTFAPjLIJyQXYOhWokbcFha3WWsX74sAKmuluv0XM2cxONZoFxwEzmWhsNyM6buSwJSZXyPiec0AQ==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.7.tgz", + "integrity": "sha512-Cwi/Hgs73nbLKfgH7dXAxzvDxyTrK+BLrlAd0KXU7xcBR94V132nvxoq39BMWckYAPmnMwxCwq8uusNH4Dnagw==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.0", + "@smithy/types": "^2.3.1", "tslib": "^2.5.0" }, "engines": { @@ -985,12 +933,12 @@ } }, "node_modules/@smithy/shared-ini-file-loader": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.0.8.tgz", - "integrity": "sha512-4u+V+Dv7JGpJ0tppB5rxCem7WhdFux950z4cGPhV0kHTPkKe8DDgINzOlVa2RBu5dI33D02OBJcxFjhW4FPORg==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.0.9.tgz", + "integrity": "sha512-vBLgJI+Qpz1TZ0W2kUBOmG2Q+geVEhiXE99UX02+UFag2WzOQ6frvV6rpadwJu0uwF02GG620NbiKGboqZ19YA==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.0", + "@smithy/types": "^2.3.1", "tslib": "^2.5.0" }, "engines": { @@ -998,14 +946,14 @@ } }, "node_modules/@smithy/signature-v4": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.6.tgz", - "integrity": "sha512-4zNTi8w4sky07YKq7oYucZt4ogY00IEaS1NFDXxmCN5V/ywE0WiK+WMim+8wtYQmB0qy3oExZR4LoCAml6j/rA==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.7.tgz", + "integrity": "sha512-qNCJpyhRWxT5RWmeSo/Zv+miQ60Y/D2JmPdFw7v2WpPVxVK7JDpqUbvq0QYE+dBGPX/uagAkE3NvJUcn0fTE3A==", "optional": true, "dependencies": { - "@smithy/eventstream-codec": "^2.0.6", + "@smithy/eventstream-codec": "^2.0.7", "@smithy/is-array-buffer": "^2.0.0", - "@smithy/types": "^2.3.0", + "@smithy/types": "^2.3.1", "@smithy/util-hex-encoding": "^2.0.0", "@smithy/util-middleware": "^2.0.0", "@smithy/util-uri-escape": "^2.0.0", @@ -1017,14 +965,14 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.2.tgz", - "integrity": "sha512-quUuJ0SsqgG7Flopvfd8iQJLhHfnMYtYPuvImVQzPHXtqUQImtVz5msudMxW3t3jl+L0w8RlR+IN2zT6UqCJ6g==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.4.tgz", + "integrity": "sha512-KRQvYYjEGqvmwnKSAZ8EL0hZvPxGQMYbAKS/AMGq2fuRmwAlinSVJ/fkIs65bZp2oYjcskd1ZgKcP+2UDjNPTQ==", "optional": true, "dependencies": { "@smithy/middleware-stack": "^2.0.0", - "@smithy/types": "^2.3.0", - "@smithy/util-stream": "^2.0.8", + "@smithy/types": "^2.3.1", + "@smithy/util-stream": "^2.0.10", "tslib": "^2.5.0" }, "engines": { @@ -1032,9 +980,9 @@ } }, "node_modules/@smithy/types": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.3.0.tgz", - "integrity": "sha512-pJce3rd39MElkV57UTPAoSYAApjQLELUxjU5adHNLYk9gnPvyIGbJNJTZVVFu00BrgZH3W/cQe8QuFcknDyodQ==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.3.1.tgz", + "integrity": "sha512-cS48e4Yawb6pGakj7DBJUIPFIkqnUWyXTe2ndPRNagD73b6kEJqTc8bhTyfUve0A+sijK256UKE0J1juAfCeDA==", "optional": true, "dependencies": { "tslib": "^2.5.0" @@ -1044,13 +992,13 @@ } }, "node_modules/@smithy/url-parser": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.6.tgz", - "integrity": "sha512-9i6j5QW6bapHZ4rtkXOAm0hOUG1+5IVdVJXNSUTcNskwJchZH5IQuDNPCbgUi/u2P8EZazKt4wXT51QxOXCz1A==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.7.tgz", + "integrity": "sha512-SwMl1Lq3yFR2hzhwWYKg04uJHpfcXWMBPycm4Z8GkLI6Dw7rJNDApEbMtujlYw6pVP2WKbrpaGHjQ9MdP92kMQ==", "optional": true, "dependencies": { - "@smithy/querystring-parser": "^2.0.6", - "@smithy/types": "^2.3.0", + "@smithy/querystring-parser": "^2.0.7", + "@smithy/types": "^2.3.1", "tslib": "^2.5.0" } }, @@ -1114,13 +1062,13 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.7.tgz", - "integrity": "sha512-s1caKxC7Y87Q72Goll//clZs2WNBfG9WtFDWVRS+Qgk147YPCOUYtkpuD0XZAh/vbayObFz5tQ1fiX4G19HSCA==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.8.tgz", + "integrity": "sha512-8znx01mkmfKxhiSB2bOF5eMutuCLMd8m2Kh0ulRp8vgzhwRLDJoU6aHSEUoNptbuTAtiFf4u0gpkYC2XfbWwuA==", "optional": true, "dependencies": { - "@smithy/property-provider": "^2.0.7", - "@smithy/types": "^2.3.0", + "@smithy/property-provider": "^2.0.8", + "@smithy/types": "^2.3.1", "bowser": "^2.11.0", "tslib": "^2.5.0" }, @@ -1129,16 +1077,16 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.9.tgz", - "integrity": "sha512-HlV4iNL3/PgPpmDGs0+XrAKtwFQ8rOs5P2y5Dye8dUYaJauadlzHRrNKk7wH2aBYswvT2HM+PIgXamvrE7xbcw==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.10.tgz", + "integrity": "sha512-QUcUckL4ZqDFVwLnh7zStRUnXtTC6hcJZ4FmMqnxlPcL33Rko0sMQwrMDnMdzF3rS3wvqugAaq3zzop1HCluvw==", "optional": true, "dependencies": { - "@smithy/config-resolver": "^2.0.7", - "@smithy/credential-provider-imds": "^2.0.9", - "@smithy/node-config-provider": "^2.0.9", - "@smithy/property-provider": "^2.0.7", - "@smithy/types": "^2.3.0", + "@smithy/config-resolver": "^2.0.8", + "@smithy/credential-provider-imds": "^2.0.10", + "@smithy/node-config-provider": "^2.0.10", + "@smithy/property-provider": "^2.0.8", + "@smithy/types": "^2.3.1", "tslib": "^2.5.0" }, "engines": { @@ -1183,14 +1131,14 @@ } }, "node_modules/@smithy/util-stream": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.8.tgz", - "integrity": "sha512-1JoSHL/AOFRo/RVYdbOOGG5qSkU1IQN+F0f3HOZcwvGeGT5KnGwd4hLzmr0qkjKh4PW7nzuvPMdR7L8THV24Hw==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.10.tgz", + "integrity": "sha512-2EgK5cBiv9OaDmhSXmsZY8ZByBl1dg/Tbc51iBJ5GkLGVYhaA6/1l6vHHV41m4Im3D0XfZV1tmeLlQgmRnYsTQ==", "optional": true, "dependencies": { - "@smithy/fetch-http-handler": "^2.1.2", - "@smithy/node-http-handler": "^2.1.2", - "@smithy/types": "^2.3.0", + "@smithy/fetch-http-handler": "^2.1.3", + "@smithy/node-http-handler": "^2.1.3", + "@smithy/types": "^2.3.1", "@smithy/util-base64": "^2.0.0", "@smithy/util-buffer-from": "^2.0.0", "@smithy/util-hex-encoding": "^2.0.0", @@ -1227,9 +1175,9 @@ } }, "node_modules/@types/node": { - "version": "20.5.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.9.tgz", - "integrity": "sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==" + "version": "20.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.0.tgz", + "integrity": "sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==" }, "node_modules/@types/webidl-conversions": { "version": "7.0.0", From a574c0827764ac6ea140e8bcb96e99138be53d6e Mon Sep 17 00:00:00 2001 From: Abhi Markan Date: Wed, 13 Sep 2023 09:07:06 +0100 Subject: [PATCH 004/130] Revert "fix(docs): markdown syntax error" This reverts commit 560bd3e4e4fa4b3f8ce7a1e291f5c9fa9b352252. --- .../acbs-function/package-lock.json | 605 +++++++------- azure-functions/acbs-function/package.json | 2 +- .../package-lock.json | 541 ++++++------ dtfs-central-api/package-lock.json | 618 +++++++------- dtfs-central-api/package.json | 4 +- external-api/package-lock.json | 641 +++++++-------- external-api/package.json | 8 +- gef-ui/package-lock.json | 726 +++++++--------- gef-ui/package.json | 6 +- package-lock.json | 142 +--- package.json | 4 +- portal-api/package-lock.json | 644 +++++++-------- portal-api/package.json | 8 +- portal/package-lock.json | 734 +++++++---------- portal/package.json | 8 +- trade-finance-manager-api/package-lock.json | 636 +++++++------- trade-finance-manager-api/package.json | 6 +- trade-finance-manager-ui/package-lock.json | 706 +++++++--------- trade-finance-manager-ui/package.json | 6 +- utils/data-migration/package-lock.json | 774 ++++++++++-------- 20 files changed, 3101 insertions(+), 3718 deletions(-) diff --git a/azure-functions/acbs-function/package-lock.json b/azure-functions/acbs-function/package-lock.json index 87b46cc389..1075c33bad 100644 --- a/azure-functions/acbs-function/package-lock.json +++ b/azure-functions/acbs-function/package-lock.json @@ -10,7 +10,7 @@ "date-fns": "^2.30.0", "dotenv": "^16.3.1", "durable-functions": "^1.5.4", - "eslint": "^8.49.0", + "eslint": "^8.48.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.28.1", "jest": "29.5.0", @@ -131,20 +131,20 @@ } }, "node_modules/@babel/core": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.17.tgz", - "integrity": "sha512-2EENLmhpwplDux5PSsZnSbnSkB3tZ6QTksgO25xwEL7pIDcNOMhF5v/s6RzwjMZzZzw9Ofc30gHv5ChCC8pifQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.15.tgz", + "integrity": "sha512-PtZqMmgRrvj8ruoEOIwVA3yoF91O+Hgw9o7DAUTNBA6Mo2jpu31clx9a7Nz/9JznqetTR6zwfC4L3LAjKQXUwA==", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.22.13", "@babel/generator": "^7.22.15", "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.22.17", + "@babel/helper-module-transforms": "^7.22.15", "@babel/helpers": "^7.22.15", - "@babel/parser": "^7.22.16", + "@babel/parser": "^7.22.15", "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.17", - "@babel/types": "^7.22.17", + "@babel/traverse": "^7.22.15", + "@babel/types": "^7.22.15", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -257,9 +257,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.17.tgz", - "integrity": "sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.15.tgz", + "integrity": "sha512-l1UiX4UyHSFsYt17iQ3Se5pQQZZHa22zyIXURmvkmLCD4t/aU+dvNWHatKac/D9Vm9UES7nvIqHs4jZqKviUmQ==", "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-module-imports": "^7.22.15", @@ -617,9 +617,9 @@ } }, "node_modules/@babel/traverse": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.17.tgz", - "integrity": "sha512-xK4Uwm0JnAMvxYZxOVecss85WxTEIbTa7bnGyf/+EgCL5Zt3U7htUpEOWv9detPlamGKuRzCqw74xVglDWpPdg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.15.tgz", + "integrity": "sha512-DdHPwvJY0sEeN4xJU5uRLmZjgMMDIvMPniLuYzUVXj/GGzysPl0/fwt44JBkyUIzGJPV8QgHMcQdQ34XFuKTYQ==", "dependencies": { "@babel/code-frame": "^7.22.13", "@babel/generator": "^7.22.15", @@ -627,8 +627,8 @@ "@babel/helper-function-name": "^7.22.5", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.16", - "@babel/types": "^7.22.17", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -666,9 +666,9 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/@babel/types": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.17.tgz", - "integrity": "sha512-YSQPHLFtQNE5xN9tHuZnzu8vPr61wVTBZdfv1meex1NBosa4iT05k/Jw06ddJugi4bk7The/oSwQGFcksmEJQg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.15.tgz", + "integrity": "sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==", "dependencies": { "@babel/helper-string-parser": "^7.22.5", "@babel/helper-validator-identifier": "^7.22.15", @@ -698,9 +698,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", - "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", + "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -749,9 +749,9 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/@eslint/js": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", - "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", + "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -907,15 +907,15 @@ } }, "node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.4.tgz", + "integrity": "sha512-wNK6gC0Ha9QeEPSkeJedQuTQqxZYnDPuDcDhVuVatRvMkL4D0VTvFVZj+Yuh6caG2aOfzkUZ36KtCmLNtR02hw==", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3", "slash": "^3.0.0" }, "engines": { @@ -923,14 +923,14 @@ } }, "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.4.tgz", + "integrity": "sha512-U/vq5ccNTSVgYH7mHnodHmCffGWHJnz/E1BEWlLuK5pM4FZmGfBn/nrJGLjUsSmyx3otCeqc1T31F4y08AMDLg==", + "dependencies": { + "@jest/console": "^29.6.4", + "@jest/reporters": "^29.6.4", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -938,21 +938,21 @@ "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", + "jest-changed-files": "^29.6.3", + "jest-config": "^29.6.4", + "jest-haste-map": "^29.6.4", + "jest-message-util": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", + "jest-resolve": "^29.6.4", + "jest-resolve-dependencies": "^29.6.4", + "jest-runner": "^29.6.4", + "jest-runtime": "^29.6.4", + "jest-snapshot": "^29.6.4", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", + "jest-watcher": "^29.6.4", "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", + "pretty-format": "^29.6.3", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -969,35 +969,35 @@ } }, "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.4.tgz", + "integrity": "sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ==", "dependencies": { - "@jest/fake-timers": "^29.7.0", + "@jest/fake-timers": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.7.0" + "jest-mock": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.4.tgz", + "integrity": "sha512-Warhsa7d23+3X5bLbrbYvaehcgX5TLYhI03JKoedTiI8uJU4IhqYBWF7OSSgUyz4IgLpUYPkK0AehA5/fRclAA==", "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" + "expect": "^29.6.4", + "jest-snapshot": "^29.6.4" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.4.tgz", + "integrity": "sha512-FEhkJhqtvBwgSpiTrocquJCdXPsyvNKcl/n7A3u7X4pVoF4bswm11c9d4AV+kfq2Gpv/mM8x7E7DsRvH+djkrg==", "dependencies": { "jest-get-type": "^29.6.3" }, @@ -1006,44 +1006,44 @@ } }, "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.4.tgz", + "integrity": "sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw==", "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" + "jest-message-util": "^29.6.3", + "jest-mock": "^29.6.3", + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.4.tgz", + "integrity": "sha512-wVIn5bdtjlChhXAzVXavcY/3PEjf4VqM174BM3eGL5kMxLiZD5CLnbmkEyA1Dwh9q8XjP6E8RwjBsY/iCWrWsA==", "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", + "@jest/environment": "^29.6.4", + "@jest/expect": "^29.6.4", "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" + "jest-mock": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.4.tgz", + "integrity": "sha512-sxUjWxm7QdchdrD3NfWKrL8FBsortZeibSJv4XLjESOOjSUOkjQcb0ZHJwfhEGIvBvTluTzfG2yZWZhkrXJu8g==", "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", + "@jest/console": "^29.6.4", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", @@ -1057,9 +1057,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3", + "jest-worker": "^29.6.4", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -1102,11 +1102,11 @@ } }, "node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.4.tgz", + "integrity": "sha512-uQ1C0AUEN90/dsyEirgMLlouROgSY+Wc/JanVVk0OiUKa5UFh7sJpMEM3aoUBAz2BRNvUJ8j3d294WFuRxSyOQ==", "dependencies": { - "@jest/console": "^29.7.0", + "@jest/console": "^29.6.4", "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" @@ -1116,13 +1116,13 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.4.tgz", + "integrity": "sha512-E84M6LbpcRq3fT4ckfKs9ryVanwkaIB0Ws9bw3/yP4seRLg/VaCZ/LgW0MCq5wwk4/iP/qnilD41aj2fsw2RMg==", "dependencies": { - "@jest/test-result": "^29.7.0", + "@jest/test-result": "^29.6.4", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", + "jest-haste-map": "^29.6.4", "slash": "^3.0.0" }, "engines": { @@ -1130,9 +1130,9 @@ } }, "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz", + "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==", "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", @@ -1142,9 +1142,9 @@ "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", + "jest-haste-map": "^29.6.4", "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", + "jest-util": "^29.6.3", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -1601,11 +1601,11 @@ } }, "node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.4.tgz", + "integrity": "sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==", "dependencies": { - "@jest/transform": "^29.7.0", + "@jest/transform": "^29.6.4", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", @@ -1799,9 +1799,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001534", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001534.tgz", - "integrity": "sha512-vlPVrhsCS7XaSh2VvWluIQEzVhefrUQcEsQWSS5A5V+dM07uv1qHeQzAOTGIMy9i3e9bH15+muvI/UHojVgS/Q==", + "version": "1.0.30001529", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001529.tgz", + "integrity": "sha512-n2pUQYGAkrLG4QYj2desAh+NqsJpHbNmVZz87imptDdxLAtjxary7Df/psdfyDGmskJK/9Dt9cPnx5RZ3CU4Og==", "funding": [ { "type": "opencollective", @@ -1939,26 +1939,6 @@ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, - "node_modules/create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -2021,25 +2001,11 @@ "node": ">=0.10.0" } }, - "node_modules/define-data-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.0.1.tgz", - "integrity": "sha512-22M+6zEspQHx10bfFQl2ET39IvfuQ7+rZIH7+ard8fCC4hPmkOSy+8JhKxBRLaWUziJ0O63NTYT97LR8zUfPTw==", - "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", "dependencies": { - "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -2127,9 +2093,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.519", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.519.tgz", - "integrity": "sha512-kqs9oGYL4UFVkLKhqCTgBCYZv+wZ374yABDMqlDda9HvlkQxvSr7kgf4hfWVjMieDbX+1MwPHFBsOGCMIBaFKg==" + "version": "1.4.512", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.512.tgz", + "integrity": "sha512-1W8wRbYlQE4ph7eoj3TJ+uqwO6+xvAE/L+KGU7WTQQvX3tnSIGZAb90MTsMoJqzntamiwJhBAj4WZmygXhsOUg==" }, "node_modules/emittery": { "version": "0.13.1", @@ -2264,15 +2230,15 @@ } }, "node_modules/eslint": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", - "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", + "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.49.0", - "@humanwhocodes/config-array": "^0.11.11", + "@eslint/js": "8.48.0", + "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", @@ -2584,15 +2550,15 @@ } }, "node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.4.tgz", + "integrity": "sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA==", "dependencies": { - "@jest/expect-utils": "^29.7.0", + "@jest/expect-utils": "^29.6.4", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" + "jest-matcher-utils": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -3491,12 +3457,12 @@ } }, "node_modules/jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.6.3.tgz", + "integrity": "sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg==", "dependencies": { "execa": "^5.0.0", - "jest-util": "^29.7.0", + "jest-util": "^29.6.3", "p-limit": "^3.1.0" }, "engines": { @@ -3504,27 +3470,27 @@ } }, "node_modules/jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.4.tgz", + "integrity": "sha512-YXNrRyntVUgDfZbjXWBMPslX1mQ8MrSG0oM/Y06j9EYubODIyHWP8hMUbjbZ19M3M+zamqEur7O80HODwACoJw==", "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", + "@jest/environment": "^29.6.4", + "@jest/expect": "^29.6.4", + "@jest/test-result": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", + "jest-each": "^29.6.3", + "jest-matcher-utils": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-runtime": "^29.6.4", + "jest-snapshot": "^29.6.4", + "jest-util": "^29.6.3", "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", + "pretty-format": "^29.6.3", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" @@ -3534,20 +3500,21 @@ } }, "node_modules/jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.4.tgz", + "integrity": "sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ==", "dependencies": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", + "@jest/core": "^29.6.4", + "@jest/test-result": "^29.6.4", "@jest/types": "^29.6.3", "chalk": "^4.0.0", - "create-jest": "^29.7.0", "exit": "^0.1.2", + "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", + "jest-config": "^29.6.4", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", + "prompts": "^2.0.1", "yargs": "^17.3.1" }, "bin": { @@ -3566,30 +3533,30 @@ } }, "node_modules/jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.4.tgz", + "integrity": "sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A==", "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", + "@jest/test-sequencer": "^29.6.4", "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", + "babel-jest": "^29.6.4", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", + "jest-circus": "^29.6.4", + "jest-environment-node": "^29.6.4", "jest-get-type": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", + "jest-resolve": "^29.6.4", + "jest-runner": "^29.6.4", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", + "pretty-format": "^29.6.3", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -3610,23 +3577,23 @@ } }, "node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.4.tgz", + "integrity": "sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==", "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.6.3.tgz", + "integrity": "sha512-2+H+GOTQBEm2+qFSQ7Ma+BvyV+waiIFxmZF5LdpBsAEjWX8QYjSCa4FrkIYtbfXUJJJnFCYrOtt6TZ+IAiTjBQ==", "dependencies": { "detect-newline": "^3.0.0" }, @@ -3635,31 +3602,31 @@ } }, "node_modules/jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.3.tgz", + "integrity": "sha512-KoXfJ42k8cqbkfshW7sSHcdfnv5agDdHCPA87ZBdmHP+zJstTJc0ttQaJ/x7zK6noAL76hOuTIJ6ZkQRS5dcyg==", "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" + "jest-util": "^29.6.3", + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.4.tgz", + "integrity": "sha512-i7SbpH2dEIFGNmxGCpSc2w9cA4qVD+wfvg2ZnfQ7XVrKL0NA5uDVBIiGH8SR4F0dKEv/0qI5r+aDomDf04DpEQ==", "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", + "@jest/environment": "^29.6.4", + "@jest/fake-timers": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" + "jest-mock": "^29.6.3", + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -3674,9 +3641,9 @@ } }, "node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz", + "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==", "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", @@ -3685,8 +3652,8 @@ "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", + "jest-util": "^29.6.3", + "jest-worker": "^29.6.4", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -3698,35 +3665,35 @@ } }, "node_modules/jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.3.tgz", + "integrity": "sha512-0kfbESIHXYdhAdpLsW7xdwmYhLf1BRu4AA118/OxFm0Ho1b2RcTmO4oF6aAMaxpxdxnJ3zve2rgwzNBD4Zbm7Q==", "dependencies": { "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.4.tgz", + "integrity": "sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ==", "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.7.0", + "jest-diff": "^29.6.4", "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.3.tgz", + "integrity": "sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==", "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", @@ -3734,7 +3701,7 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", + "pretty-format": "^29.6.3", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -3743,13 +3710,13 @@ } }, "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.3.tgz", + "integrity": "sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", - "jest-util": "^29.7.0" + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -3780,16 +3747,16 @@ } }, "node_modules/jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.4.tgz", + "integrity": "sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q==", "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", + "jest-haste-map": "^29.6.4", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" @@ -3799,41 +3766,41 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.4.tgz", + "integrity": "sha512-7+6eAmr1ZBF3vOAJVsfLj1QdqeXG+WYhidfLHBRZqGN24MFRIiKG20ItpLw2qRAsW/D2ZUUmCNf6irUr/v6KHA==", "dependencies": { "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" + "jest-snapshot": "^29.6.4" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.4.tgz", + "integrity": "sha512-SDaLrMmtVlQYDuG0iSPYLycG8P9jLI+fRm8AF/xPKhYDB2g6xDWjXBrR5M8gEWsK6KVFlebpZ4QsrxdyIX1Jaw==", + "dependencies": { + "@jest/console": "^29.6.4", + "@jest/environment": "^29.6.4", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", + "jest-docblock": "^29.6.3", + "jest-environment-node": "^29.6.4", + "jest-haste-map": "^29.6.4", + "jest-leak-detector": "^29.6.3", + "jest-message-util": "^29.6.3", + "jest-resolve": "^29.6.4", + "jest-runtime": "^29.6.4", + "jest-util": "^29.6.3", + "jest-watcher": "^29.6.4", + "jest-worker": "^29.6.4", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -3842,16 +3809,16 @@ } }, "node_modules/jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.4.tgz", + "integrity": "sha512-s/QxMBLvmwLdchKEjcLfwzP7h+jsHvNEtxGP5P+Fl1FMaJX2jMiIqe4rJw4tFprzCwuSvVUo9bn0uj4gNRXsbA==", "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", + "@jest/environment": "^29.6.4", + "@jest/fake-timers": "^29.6.4", + "@jest/globals": "^29.6.4", "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", @@ -3859,13 +3826,13 @@ "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", + "jest-haste-map": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-mock": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", + "jest-resolve": "^29.6.4", + "jest-snapshot": "^29.6.4", + "jest-util": "^29.6.3", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -3874,29 +3841,29 @@ } }, "node_modules/jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.4.tgz", + "integrity": "sha512-VC1N8ED7+4uboUKGIDsbvNAZb6LakgIPgAF4RSpF13dN6YaMokfRqO+BaqK4zIh6X3JffgwbzuGqDEjHm/MrvA==", "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", + "@jest/expect-utils": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.7.0", + "expect": "^29.6.4", "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", + "jest-diff": "^29.6.4", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", + "jest-matcher-utils": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3", "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", + "pretty-format": "^29.6.3", "semver": "^7.5.3" }, "engines": { @@ -3934,9 +3901,9 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", + "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -3950,16 +3917,16 @@ } }, "node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz", + "integrity": "sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==", "dependencies": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^29.7.0" + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -3977,17 +3944,17 @@ } }, "node_modules/jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.4.tgz", + "integrity": "sha512-oqUWvx6+On04ShsT00Ir9T4/FvBeEh2M9PTubgITPxDa739p4hoQweWPRGyYeaojgT0xTpZKF0Y/rSY1UgMxvQ==", "dependencies": { - "@jest/test-result": "^29.7.0", + "@jest/test-result": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.7.0", + "jest-util": "^29.6.3", "string-length": "^4.0.1" }, "engines": { @@ -3995,12 +3962,12 @@ } }, "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", + "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==", "dependencies": { "@types/node": "*", - "jest-util": "^29.7.0", + "jest-util": "^29.6.3", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -4627,9 +4594,9 @@ } }, "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", + "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -4715,13 +4682,13 @@ "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" }, "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -4869,18 +4836,6 @@ "semver": "bin/semver.js" } }, - "node_modules/set-function-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.0.tgz", - "integrity": "sha512-WmS8UHojv5s1eSoRSmzO5zzgDq8PE1/X/ij0k+9fMYmINCc6+j+SF3Om8YyucKn2yjnK4ItNZOoQycNnHsZJTw==", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", diff --git a/azure-functions/acbs-function/package.json b/azure-functions/acbs-function/package.json index 41c7130c80..cc6828b3bb 100644 --- a/azure-functions/acbs-function/package.json +++ b/azure-functions/acbs-function/package.json @@ -20,7 +20,7 @@ "date-fns": "^2.30.0", "dotenv": "^16.3.1", "durable-functions": "^1.5.4", - "eslint": "^8.49.0", + "eslint": "^8.48.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.28.1", "jest": "29.5.0", diff --git a/azure-functions/number-generator-function/package-lock.json b/azure-functions/number-generator-function/package-lock.json index 96581eb583..b745765ab4 100644 --- a/azure-functions/number-generator-function/package-lock.json +++ b/azure-functions/number-generator-function/package-lock.json @@ -120,20 +120,20 @@ } }, "node_modules/@babel/core": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.17.tgz", - "integrity": "sha512-2EENLmhpwplDux5PSsZnSbnSkB3tZ6QTksgO25xwEL7pIDcNOMhF5v/s6RzwjMZzZzw9Ofc30gHv5ChCC8pifQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.15.tgz", + "integrity": "sha512-PtZqMmgRrvj8ruoEOIwVA3yoF91O+Hgw9o7DAUTNBA6Mo2jpu31clx9a7Nz/9JznqetTR6zwfC4L3LAjKQXUwA==", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.22.13", "@babel/generator": "^7.22.15", "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.22.17", + "@babel/helper-module-transforms": "^7.22.15", "@babel/helpers": "^7.22.15", - "@babel/parser": "^7.22.16", + "@babel/parser": "^7.22.15", "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.17", - "@babel/types": "^7.22.17", + "@babel/traverse": "^7.22.15", + "@babel/types": "^7.22.15", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -246,9 +246,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.17.tgz", - "integrity": "sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.15.tgz", + "integrity": "sha512-l1UiX4UyHSFsYt17iQ3Se5pQQZZHa22zyIXURmvkmLCD4t/aU+dvNWHatKac/D9Vm9UES7nvIqHs4jZqKviUmQ==", "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-module-imports": "^7.22.15", @@ -595,9 +595,9 @@ } }, "node_modules/@babel/traverse": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.17.tgz", - "integrity": "sha512-xK4Uwm0JnAMvxYZxOVecss85WxTEIbTa7bnGyf/+EgCL5Zt3U7htUpEOWv9detPlamGKuRzCqw74xVglDWpPdg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.15.tgz", + "integrity": "sha512-DdHPwvJY0sEeN4xJU5uRLmZjgMMDIvMPniLuYzUVXj/GGzysPl0/fwt44JBkyUIzGJPV8QgHMcQdQ34XFuKTYQ==", "dependencies": { "@babel/code-frame": "^7.22.13", "@babel/generator": "^7.22.15", @@ -605,8 +605,8 @@ "@babel/helper-function-name": "^7.22.5", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.16", - "@babel/types": "^7.22.17", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -636,9 +636,9 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/@babel/types": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.17.tgz", - "integrity": "sha512-YSQPHLFtQNE5xN9tHuZnzu8vPr61wVTBZdfv1meex1NBosa4iT05k/Jw06ddJugi4bk7The/oSwQGFcksmEJQg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.15.tgz", + "integrity": "sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==", "dependencies": { "@babel/helper-string-parser": "^7.22.5", "@babel/helper-validator-identifier": "^7.22.15", @@ -677,15 +677,15 @@ } }, "node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.4.tgz", + "integrity": "sha512-wNK6gC0Ha9QeEPSkeJedQuTQqxZYnDPuDcDhVuVatRvMkL4D0VTvFVZj+Yuh6caG2aOfzkUZ36KtCmLNtR02hw==", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3", "slash": "^3.0.0" }, "engines": { @@ -693,14 +693,14 @@ } }, "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.4.tgz", + "integrity": "sha512-U/vq5ccNTSVgYH7mHnodHmCffGWHJnz/E1BEWlLuK5pM4FZmGfBn/nrJGLjUsSmyx3otCeqc1T31F4y08AMDLg==", + "dependencies": { + "@jest/console": "^29.6.4", + "@jest/reporters": "^29.6.4", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -708,21 +708,21 @@ "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", + "jest-changed-files": "^29.6.3", + "jest-config": "^29.6.4", + "jest-haste-map": "^29.6.4", + "jest-message-util": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", + "jest-resolve": "^29.6.4", + "jest-resolve-dependencies": "^29.6.4", + "jest-runner": "^29.6.4", + "jest-runtime": "^29.6.4", + "jest-snapshot": "^29.6.4", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", + "jest-watcher": "^29.6.4", "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", + "pretty-format": "^29.6.3", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -739,35 +739,35 @@ } }, "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.4.tgz", + "integrity": "sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ==", "dependencies": { - "@jest/fake-timers": "^29.7.0", + "@jest/fake-timers": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.7.0" + "jest-mock": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.4.tgz", + "integrity": "sha512-Warhsa7d23+3X5bLbrbYvaehcgX5TLYhI03JKoedTiI8uJU4IhqYBWF7OSSgUyz4IgLpUYPkK0AehA5/fRclAA==", "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" + "expect": "^29.6.4", + "jest-snapshot": "^29.6.4" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.4.tgz", + "integrity": "sha512-FEhkJhqtvBwgSpiTrocquJCdXPsyvNKcl/n7A3u7X4pVoF4bswm11c9d4AV+kfq2Gpv/mM8x7E7DsRvH+djkrg==", "dependencies": { "jest-get-type": "^29.6.3" }, @@ -776,44 +776,44 @@ } }, "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.4.tgz", + "integrity": "sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw==", "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" + "jest-message-util": "^29.6.3", + "jest-mock": "^29.6.3", + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.4.tgz", + "integrity": "sha512-wVIn5bdtjlChhXAzVXavcY/3PEjf4VqM174BM3eGL5kMxLiZD5CLnbmkEyA1Dwh9q8XjP6E8RwjBsY/iCWrWsA==", "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", + "@jest/environment": "^29.6.4", + "@jest/expect": "^29.6.4", "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" + "jest-mock": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.4.tgz", + "integrity": "sha512-sxUjWxm7QdchdrD3NfWKrL8FBsortZeibSJv4XLjESOOjSUOkjQcb0ZHJwfhEGIvBvTluTzfG2yZWZhkrXJu8g==", "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", + "@jest/console": "^29.6.4", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", @@ -827,9 +827,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3", + "jest-worker": "^29.6.4", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -872,11 +872,11 @@ } }, "node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.4.tgz", + "integrity": "sha512-uQ1C0AUEN90/dsyEirgMLlouROgSY+Wc/JanVVk0OiUKa5UFh7sJpMEM3aoUBAz2BRNvUJ8j3d294WFuRxSyOQ==", "dependencies": { - "@jest/console": "^29.7.0", + "@jest/console": "^29.6.4", "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" @@ -886,13 +886,13 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.4.tgz", + "integrity": "sha512-E84M6LbpcRq3fT4ckfKs9ryVanwkaIB0Ws9bw3/yP4seRLg/VaCZ/LgW0MCq5wwk4/iP/qnilD41aj2fsw2RMg==", "dependencies": { - "@jest/test-result": "^29.7.0", + "@jest/test-result": "^29.6.4", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", + "jest-haste-map": "^29.6.4", "slash": "^3.0.0" }, "engines": { @@ -900,9 +900,9 @@ } }, "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz", + "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==", "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", @@ -912,9 +912,9 @@ "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", + "jest-haste-map": "^29.6.4", "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", + "jest-util": "^29.6.3", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -1180,11 +1180,11 @@ } }, "node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.4.tgz", + "integrity": "sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==", "dependencies": { - "@jest/transform": "^29.7.0", + "@jest/transform": "^29.6.4", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", @@ -1366,9 +1366,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001534", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001534.tgz", - "integrity": "sha512-vlPVrhsCS7XaSh2VvWluIQEzVhefrUQcEsQWSS5A5V+dM07uv1qHeQzAOTGIMy9i3e9bH15+muvI/UHojVgS/Q==", + "version": "1.0.30001529", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001529.tgz", + "integrity": "sha512-n2pUQYGAkrLG4QYj2desAh+NqsJpHbNmVZz87imptDdxLAtjxary7Df/psdfyDGmskJK/9Dt9cPnx5RZ3CU4Og==", "funding": [ { "type": "opencollective", @@ -1501,26 +1501,6 @@ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, - "node_modules/create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -1629,9 +1609,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.519", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.519.tgz", - "integrity": "sha512-kqs9oGYL4UFVkLKhqCTgBCYZv+wZ374yABDMqlDda9HvlkQxvSr7kgf4hfWVjMieDbX+1MwPHFBsOGCMIBaFKg==" + "version": "1.4.512", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.512.tgz", + "integrity": "sha512-1W8wRbYlQE4ph7eoj3TJ+uqwO6+xvAE/L+KGU7WTQQvX3tnSIGZAb90MTsMoJqzntamiwJhBAj4WZmygXhsOUg==" }, "node_modules/emittery": { "version": "0.13.1", @@ -1716,15 +1696,15 @@ } }, "node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.4.tgz", + "integrity": "sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA==", "dependencies": { - "@jest/expect-utils": "^29.7.0", + "@jest/expect-utils": "^29.6.4", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" + "jest-matcher-utils": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -2159,12 +2139,12 @@ } }, "node_modules/jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.6.3.tgz", + "integrity": "sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg==", "dependencies": { "execa": "^5.0.0", - "jest-util": "^29.7.0", + "jest-util": "^29.6.3", "p-limit": "^3.1.0" }, "engines": { @@ -2172,27 +2152,27 @@ } }, "node_modules/jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.4.tgz", + "integrity": "sha512-YXNrRyntVUgDfZbjXWBMPslX1mQ8MrSG0oM/Y06j9EYubODIyHWP8hMUbjbZ19M3M+zamqEur7O80HODwACoJw==", "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", + "@jest/environment": "^29.6.4", + "@jest/expect": "^29.6.4", + "@jest/test-result": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", + "jest-each": "^29.6.3", + "jest-matcher-utils": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-runtime": "^29.6.4", + "jest-snapshot": "^29.6.4", + "jest-util": "^29.6.3", "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", + "pretty-format": "^29.6.3", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" @@ -2202,20 +2182,21 @@ } }, "node_modules/jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.4.tgz", + "integrity": "sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ==", "dependencies": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", + "@jest/core": "^29.6.4", + "@jest/test-result": "^29.6.4", "@jest/types": "^29.6.3", "chalk": "^4.0.0", - "create-jest": "^29.7.0", "exit": "^0.1.2", + "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", + "jest-config": "^29.6.4", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", + "prompts": "^2.0.1", "yargs": "^17.3.1" }, "bin": { @@ -2234,30 +2215,30 @@ } }, "node_modules/jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.4.tgz", + "integrity": "sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A==", "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", + "@jest/test-sequencer": "^29.6.4", "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", + "babel-jest": "^29.6.4", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", + "jest-circus": "^29.6.4", + "jest-environment-node": "^29.6.4", "jest-get-type": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", + "jest-resolve": "^29.6.4", + "jest-runner": "^29.6.4", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", + "pretty-format": "^29.6.3", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -2278,23 +2259,23 @@ } }, "node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.4.tgz", + "integrity": "sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==", "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.6.3.tgz", + "integrity": "sha512-2+H+GOTQBEm2+qFSQ7Ma+BvyV+waiIFxmZF5LdpBsAEjWX8QYjSCa4FrkIYtbfXUJJJnFCYrOtt6TZ+IAiTjBQ==", "dependencies": { "detect-newline": "^3.0.0" }, @@ -2303,31 +2284,31 @@ } }, "node_modules/jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.3.tgz", + "integrity": "sha512-KoXfJ42k8cqbkfshW7sSHcdfnv5agDdHCPA87ZBdmHP+zJstTJc0ttQaJ/x7zK6noAL76hOuTIJ6ZkQRS5dcyg==", "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" + "jest-util": "^29.6.3", + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.4.tgz", + "integrity": "sha512-i7SbpH2dEIFGNmxGCpSc2w9cA4qVD+wfvg2ZnfQ7XVrKL0NA5uDVBIiGH8SR4F0dKEv/0qI5r+aDomDf04DpEQ==", "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", + "@jest/environment": "^29.6.4", + "@jest/fake-timers": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" + "jest-mock": "^29.6.3", + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -2342,9 +2323,9 @@ } }, "node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz", + "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==", "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", @@ -2353,8 +2334,8 @@ "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", + "jest-util": "^29.6.3", + "jest-worker": "^29.6.4", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -2366,35 +2347,35 @@ } }, "node_modules/jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.3.tgz", + "integrity": "sha512-0kfbESIHXYdhAdpLsW7xdwmYhLf1BRu4AA118/OxFm0Ho1b2RcTmO4oF6aAMaxpxdxnJ3zve2rgwzNBD4Zbm7Q==", "dependencies": { "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.4.tgz", + "integrity": "sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ==", "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.7.0", + "jest-diff": "^29.6.4", "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.3.tgz", + "integrity": "sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==", "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", @@ -2402,7 +2383,7 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", + "pretty-format": "^29.6.3", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -2411,13 +2392,13 @@ } }, "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.3.tgz", + "integrity": "sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", - "jest-util": "^29.7.0" + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -2448,16 +2429,16 @@ } }, "node_modules/jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.4.tgz", + "integrity": "sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q==", "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", + "jest-haste-map": "^29.6.4", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" @@ -2467,41 +2448,41 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.4.tgz", + "integrity": "sha512-7+6eAmr1ZBF3vOAJVsfLj1QdqeXG+WYhidfLHBRZqGN24MFRIiKG20ItpLw2qRAsW/D2ZUUmCNf6irUr/v6KHA==", "dependencies": { "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" + "jest-snapshot": "^29.6.4" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.4.tgz", + "integrity": "sha512-SDaLrMmtVlQYDuG0iSPYLycG8P9jLI+fRm8AF/xPKhYDB2g6xDWjXBrR5M8gEWsK6KVFlebpZ4QsrxdyIX1Jaw==", + "dependencies": { + "@jest/console": "^29.6.4", + "@jest/environment": "^29.6.4", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", + "jest-docblock": "^29.6.3", + "jest-environment-node": "^29.6.4", + "jest-haste-map": "^29.6.4", + "jest-leak-detector": "^29.6.3", + "jest-message-util": "^29.6.3", + "jest-resolve": "^29.6.4", + "jest-runtime": "^29.6.4", + "jest-util": "^29.6.3", + "jest-watcher": "^29.6.4", + "jest-worker": "^29.6.4", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -2510,16 +2491,16 @@ } }, "node_modules/jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.4.tgz", + "integrity": "sha512-s/QxMBLvmwLdchKEjcLfwzP7h+jsHvNEtxGP5P+Fl1FMaJX2jMiIqe4rJw4tFprzCwuSvVUo9bn0uj4gNRXsbA==", "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", + "@jest/environment": "^29.6.4", + "@jest/fake-timers": "^29.6.4", + "@jest/globals": "^29.6.4", "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", @@ -2527,13 +2508,13 @@ "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", + "jest-haste-map": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-mock": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", + "jest-resolve": "^29.6.4", + "jest-snapshot": "^29.6.4", + "jest-util": "^29.6.3", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -2542,29 +2523,29 @@ } }, "node_modules/jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.4.tgz", + "integrity": "sha512-VC1N8ED7+4uboUKGIDsbvNAZb6LakgIPgAF4RSpF13dN6YaMokfRqO+BaqK4zIh6X3JffgwbzuGqDEjHm/MrvA==", "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", + "@jest/expect-utils": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.7.0", + "expect": "^29.6.4", "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", + "jest-diff": "^29.6.4", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", + "jest-matcher-utils": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3", "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", + "pretty-format": "^29.6.3", "semver": "^7.5.3" }, "engines": { @@ -2602,9 +2583,9 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", + "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -2618,16 +2599,16 @@ } }, "node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz", + "integrity": "sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==", "dependencies": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^29.7.0" + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -2645,17 +2626,17 @@ } }, "node_modules/jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.4.tgz", + "integrity": "sha512-oqUWvx6+On04ShsT00Ir9T4/FvBeEh2M9PTubgITPxDa739p4hoQweWPRGyYeaojgT0xTpZKF0Y/rSY1UgMxvQ==", "dependencies": { - "@jest/test-result": "^29.7.0", + "@jest/test-result": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.7.0", + "jest-util": "^29.6.3", "string-length": "^4.0.1" }, "engines": { @@ -2663,12 +2644,12 @@ } }, "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", + "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==", "dependencies": { "@types/node": "*", - "jest-util": "^29.7.0", + "jest-util": "^29.6.3", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -3076,9 +3057,9 @@ } }, "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", + "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", diff --git a/dtfs-central-api/package-lock.json b/dtfs-central-api/package-lock.json index c55a806534..e7c331ff2e 100644 --- a/dtfs-central-api/package-lock.json +++ b/dtfs-central-api/package-lock.json @@ -15,7 +15,7 @@ "dotenv": "16.0.3", "express": "4.18.2", "express-mongo-sanitize": "^2.2.0", - "express-rate-limit": "^6.11.2", + "express-rate-limit": "^6.11.0", "moment": "^2.29.4", "mongo-dot-notation": "3.1.0", "mongodb": "4.2.0", @@ -24,7 +24,7 @@ "swagger-ui-express": "^4.6.3" }, "devDependencies": { - "eslint": "^8.49.0", + "eslint": "^8.48.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.28.1", "jest": "29.5.0", @@ -191,21 +191,21 @@ } }, "node_modules/@babel/core": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.17.tgz", - "integrity": "sha512-2EENLmhpwplDux5PSsZnSbnSkB3tZ6QTksgO25xwEL7pIDcNOMhF5v/s6RzwjMZzZzw9Ofc30gHv5ChCC8pifQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.15.tgz", + "integrity": "sha512-PtZqMmgRrvj8ruoEOIwVA3yoF91O+Hgw9o7DAUTNBA6Mo2jpu31clx9a7Nz/9JznqetTR6zwfC4L3LAjKQXUwA==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.22.13", "@babel/generator": "^7.22.15", "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.22.17", + "@babel/helper-module-transforms": "^7.22.15", "@babel/helpers": "^7.22.15", - "@babel/parser": "^7.22.16", + "@babel/parser": "^7.22.15", "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.17", - "@babel/types": "^7.22.17", + "@babel/traverse": "^7.22.15", + "@babel/types": "^7.22.15", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -327,9 +327,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.17.tgz", - "integrity": "sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.15.tgz", + "integrity": "sha512-l1UiX4UyHSFsYt17iQ3Se5pQQZZHa22zyIXURmvkmLCD4t/aU+dvNWHatKac/D9Vm9UES7nvIqHs4jZqKviUmQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", @@ -719,9 +719,9 @@ } }, "node_modules/@babel/traverse": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.17.tgz", - "integrity": "sha512-xK4Uwm0JnAMvxYZxOVecss85WxTEIbTa7bnGyf/+EgCL5Zt3U7htUpEOWv9detPlamGKuRzCqw74xVglDWpPdg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.15.tgz", + "integrity": "sha512-DdHPwvJY0sEeN4xJU5uRLmZjgMMDIvMPniLuYzUVXj/GGzysPl0/fwt44JBkyUIzGJPV8QgHMcQdQ34XFuKTYQ==", "dev": true, "dependencies": { "@babel/code-frame": "^7.22.13", @@ -730,8 +730,8 @@ "@babel/helper-function-name": "^7.22.5", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.16", - "@babel/types": "^7.22.17", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -772,9 +772,9 @@ "dev": true }, "node_modules/@babel/types": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.17.tgz", - "integrity": "sha512-YSQPHLFtQNE5xN9tHuZnzu8vPr61wVTBZdfv1meex1NBosa4iT05k/Jw06ddJugi4bk7The/oSwQGFcksmEJQg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.15.tgz", + "integrity": "sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", @@ -807,9 +807,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", - "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", + "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -862,9 +862,9 @@ "dev": true }, "node_modules/@eslint/js": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", - "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", + "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1035,16 +1035,16 @@ } }, "node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.4.tgz", + "integrity": "sha512-wNK6gC0Ha9QeEPSkeJedQuTQqxZYnDPuDcDhVuVatRvMkL4D0VTvFVZj+Yuh6caG2aOfzkUZ36KtCmLNtR02hw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3", "slash": "^3.0.0" }, "engines": { @@ -1052,15 +1052,15 @@ } }, "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.4.tgz", + "integrity": "sha512-U/vq5ccNTSVgYH7mHnodHmCffGWHJnz/E1BEWlLuK5pM4FZmGfBn/nrJGLjUsSmyx3otCeqc1T31F4y08AMDLg==", "dev": true, "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", + "@jest/console": "^29.6.4", + "@jest/reporters": "^29.6.4", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -1068,21 +1068,21 @@ "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", + "jest-changed-files": "^29.6.3", + "jest-config": "^29.6.4", + "jest-haste-map": "^29.6.4", + "jest-message-util": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", + "jest-resolve": "^29.6.4", + "jest-resolve-dependencies": "^29.6.4", + "jest-runner": "^29.6.4", + "jest-runtime": "^29.6.4", + "jest-snapshot": "^29.6.4", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", + "jest-watcher": "^29.6.4", "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", + "pretty-format": "^29.6.3", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -1099,37 +1099,37 @@ } }, "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.4.tgz", + "integrity": "sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ==", "dev": true, "dependencies": { - "@jest/fake-timers": "^29.7.0", + "@jest/fake-timers": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.7.0" + "jest-mock": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.4.tgz", + "integrity": "sha512-Warhsa7d23+3X5bLbrbYvaehcgX5TLYhI03JKoedTiI8uJU4IhqYBWF7OSSgUyz4IgLpUYPkK0AehA5/fRclAA==", "dev": true, "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" + "expect": "^29.6.4", + "jest-snapshot": "^29.6.4" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.4.tgz", + "integrity": "sha512-FEhkJhqtvBwgSpiTrocquJCdXPsyvNKcl/n7A3u7X4pVoF4bswm11c9d4AV+kfq2Gpv/mM8x7E7DsRvH+djkrg==", "dev": true, "dependencies": { "jest-get-type": "^29.6.3" @@ -1139,47 +1139,47 @@ } }, "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.4.tgz", + "integrity": "sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" + "jest-message-util": "^29.6.3", + "jest-mock": "^29.6.3", + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.4.tgz", + "integrity": "sha512-wVIn5bdtjlChhXAzVXavcY/3PEjf4VqM174BM3eGL5kMxLiZD5CLnbmkEyA1Dwh9q8XjP6E8RwjBsY/iCWrWsA==", "dev": true, "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", + "@jest/environment": "^29.6.4", + "@jest/expect": "^29.6.4", "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" + "jest-mock": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.4.tgz", + "integrity": "sha512-sxUjWxm7QdchdrD3NfWKrL8FBsortZeibSJv4XLjESOOjSUOkjQcb0ZHJwfhEGIvBvTluTzfG2yZWZhkrXJu8g==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", + "@jest/console": "^29.6.4", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", @@ -1193,9 +1193,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3", + "jest-worker": "^29.6.4", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -1240,12 +1240,12 @@ } }, "node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.4.tgz", + "integrity": "sha512-uQ1C0AUEN90/dsyEirgMLlouROgSY+Wc/JanVVk0OiUKa5UFh7sJpMEM3aoUBAz2BRNvUJ8j3d294WFuRxSyOQ==", "dev": true, "dependencies": { - "@jest/console": "^29.7.0", + "@jest/console": "^29.6.4", "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" @@ -1255,14 +1255,14 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.4.tgz", + "integrity": "sha512-E84M6LbpcRq3fT4ckfKs9ryVanwkaIB0Ws9bw3/yP4seRLg/VaCZ/LgW0MCq5wwk4/iP/qnilD41aj2fsw2RMg==", "dev": true, "dependencies": { - "@jest/test-result": "^29.7.0", + "@jest/test-result": "^29.6.4", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", + "jest-haste-map": "^29.6.4", "slash": "^3.0.0" }, "engines": { @@ -1270,9 +1270,9 @@ } }, "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz", + "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -1283,9 +1283,9 @@ "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", + "jest-haste-map": "^29.6.4", "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", + "jest-util": "^29.6.3", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -1510,9 +1510,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.6.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.0.tgz", - "integrity": "sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==" + "version": "20.5.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.9.tgz", + "integrity": "sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==" }, "node_modules/@types/stack-utils": { "version": "2.0.1", @@ -1818,12 +1818,12 @@ } }, "node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.4.tgz", + "integrity": "sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==", "dev": true, "dependencies": { - "@jest/transform": "^29.7.0", + "@jest/transform": "^29.6.4", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", @@ -2132,9 +2132,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001534", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001534.tgz", - "integrity": "sha512-vlPVrhsCS7XaSh2VvWluIQEzVhefrUQcEsQWSS5A5V+dM07uv1qHeQzAOTGIMy9i3e9bH15+muvI/UHojVgS/Q==", + "version": "1.0.30001529", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001529.tgz", + "integrity": "sha512-n2pUQYGAkrLG4QYj2desAh+NqsJpHbNmVZz87imptDdxLAtjxary7Df/psdfyDGmskJK/9Dt9cPnx5RZ3CU4Og==", "dev": true, "funding": [ { @@ -2409,27 +2409,6 @@ "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", "dev": true }, - "node_modules/create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -2496,27 +2475,12 @@ "node": ">=0.10.0" } }, - "node_modules/define-data-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.0.1.tgz", - "integrity": "sha512-22M+6zEspQHx10bfFQl2ET39IvfuQ7+rZIH7+ard8fCC4hPmkOSy+8JhKxBRLaWUziJ0O63NTYT97LR8zUfPTw==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", "dev": true, "dependencies": { - "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -2613,9 +2577,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.519", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.519.tgz", - "integrity": "sha512-kqs9oGYL4UFVkLKhqCTgBCYZv+wZ374yABDMqlDda9HvlkQxvSr7kgf4hfWVjMieDbX+1MwPHFBsOGCMIBaFKg==", + "version": "1.4.512", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.512.tgz", + "integrity": "sha512-1W8wRbYlQE4ph7eoj3TJ+uqwO6+xvAE/L+KGU7WTQQvX3tnSIGZAb90MTsMoJqzntamiwJhBAj4WZmygXhsOUg==", "dev": true }, "node_modules/emittery": { @@ -2773,16 +2737,16 @@ } }, "node_modules/eslint": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", - "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", + "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.49.0", - "@humanwhocodes/config-array": "^0.11.11", + "@eslint/js": "8.48.0", + "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", @@ -3124,16 +3088,16 @@ } }, "node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.4.tgz", + "integrity": "sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA==", "dev": true, "dependencies": { - "@jest/expect-utils": "^29.7.0", + "@jest/expect-utils": "^29.6.4", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" + "jest-matcher-utils": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -3189,9 +3153,9 @@ } }, "node_modules/express-rate-limit": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.2.tgz", - "integrity": "sha512-a7uwwfNTh1U60ssiIkuLFWHt4hAC5yxlLGU2VP0X4YNlyEDZAqF4tK3GD3NSitVBrCQmQ0++0uOyFOgC2y4DDw==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.0.tgz", + "integrity": "sha512-H9afltGTaEZcvenAB5LFgb/ysTMHUzMxoB3TJM6UHP5FtAP1p2+heMj1xwTei54Zm4I9I/2qsS5m+XrdKQp/Hw==", "engines": { "node": ">= 14" }, @@ -4291,13 +4255,13 @@ } }, "node_modules/jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.6.3.tgz", + "integrity": "sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg==", "dev": true, "dependencies": { "execa": "^5.0.0", - "jest-util": "^29.7.0", + "jest-util": "^29.6.3", "p-limit": "^3.1.0" }, "engines": { @@ -4305,28 +4269,28 @@ } }, "node_modules/jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.4.tgz", + "integrity": "sha512-YXNrRyntVUgDfZbjXWBMPslX1mQ8MrSG0oM/Y06j9EYubODIyHWP8hMUbjbZ19M3M+zamqEur7O80HODwACoJw==", "dev": true, "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", + "@jest/environment": "^29.6.4", + "@jest/expect": "^29.6.4", + "@jest/test-result": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", + "jest-each": "^29.6.3", + "jest-matcher-utils": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-runtime": "^29.6.4", + "jest-snapshot": "^29.6.4", + "jest-util": "^29.6.3", "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", + "pretty-format": "^29.6.3", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" @@ -4336,21 +4300,22 @@ } }, "node_modules/jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.4.tgz", + "integrity": "sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ==", "dev": true, "dependencies": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", + "@jest/core": "^29.6.4", + "@jest/test-result": "^29.6.4", "@jest/types": "^29.6.3", "chalk": "^4.0.0", - "create-jest": "^29.7.0", "exit": "^0.1.2", + "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", + "jest-config": "^29.6.4", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", + "prompts": "^2.0.1", "yargs": "^17.3.1" }, "bin": { @@ -4369,31 +4334,31 @@ } }, "node_modules/jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.4.tgz", + "integrity": "sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", + "@jest/test-sequencer": "^29.6.4", "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", + "babel-jest": "^29.6.4", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", + "jest-circus": "^29.6.4", + "jest-environment-node": "^29.6.4", "jest-get-type": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", + "jest-resolve": "^29.6.4", + "jest-runner": "^29.6.4", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", + "pretty-format": "^29.6.3", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -4414,24 +4379,24 @@ } }, "node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.4.tgz", + "integrity": "sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==", "dev": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.6.3.tgz", + "integrity": "sha512-2+H+GOTQBEm2+qFSQ7Ma+BvyV+waiIFxmZF5LdpBsAEjWX8QYjSCa4FrkIYtbfXUJJJnFCYrOtt6TZ+IAiTjBQ==", "dev": true, "dependencies": { "detect-newline": "^3.0.0" @@ -4441,33 +4406,33 @@ } }, "node_modules/jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.3.tgz", + "integrity": "sha512-KoXfJ42k8cqbkfshW7sSHcdfnv5agDdHCPA87ZBdmHP+zJstTJc0ttQaJ/x7zK6noAL76hOuTIJ6ZkQRS5dcyg==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" + "jest-util": "^29.6.3", + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.4.tgz", + "integrity": "sha512-i7SbpH2dEIFGNmxGCpSc2w9cA4qVD+wfvg2ZnfQ7XVrKL0NA5uDVBIiGH8SR4F0dKEv/0qI5r+aDomDf04DpEQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", + "@jest/environment": "^29.6.4", + "@jest/fake-timers": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" + "jest-mock": "^29.6.3", + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -4483,9 +4448,9 @@ } }, "node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz", + "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -4495,8 +4460,8 @@ "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", + "jest-util": "^29.6.3", + "jest-worker": "^29.6.4", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -4508,37 +4473,37 @@ } }, "node_modules/jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.3.tgz", + "integrity": "sha512-0kfbESIHXYdhAdpLsW7xdwmYhLf1BRu4AA118/OxFm0Ho1b2RcTmO4oF6aAMaxpxdxnJ3zve2rgwzNBD4Zbm7Q==", "dev": true, "dependencies": { "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.4.tgz", + "integrity": "sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.7.0", + "jest-diff": "^29.6.4", "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.3.tgz", + "integrity": "sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", @@ -4547,7 +4512,7 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", + "pretty-format": "^29.6.3", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -4556,14 +4521,14 @@ } }, "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.3.tgz", + "integrity": "sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", - "jest-util": "^29.7.0" + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -4596,17 +4561,17 @@ } }, "node_modules/jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.4.tgz", + "integrity": "sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q==", "dev": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", + "jest-haste-map": "^29.6.4", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" @@ -4616,43 +4581,43 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.4.tgz", + "integrity": "sha512-7+6eAmr1ZBF3vOAJVsfLj1QdqeXG+WYhidfLHBRZqGN24MFRIiKG20ItpLw2qRAsW/D2ZUUmCNf6irUr/v6KHA==", "dev": true, "dependencies": { "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" + "jest-snapshot": "^29.6.4" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.4.tgz", + "integrity": "sha512-SDaLrMmtVlQYDuG0iSPYLycG8P9jLI+fRm8AF/xPKhYDB2g6xDWjXBrR5M8gEWsK6KVFlebpZ4QsrxdyIX1Jaw==", "dev": true, "dependencies": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", + "@jest/console": "^29.6.4", + "@jest/environment": "^29.6.4", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", + "jest-docblock": "^29.6.3", + "jest-environment-node": "^29.6.4", + "jest-haste-map": "^29.6.4", + "jest-leak-detector": "^29.6.3", + "jest-message-util": "^29.6.3", + "jest-resolve": "^29.6.4", + "jest-runtime": "^29.6.4", + "jest-util": "^29.6.3", + "jest-watcher": "^29.6.4", + "jest-worker": "^29.6.4", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -4661,17 +4626,17 @@ } }, "node_modules/jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.4.tgz", + "integrity": "sha512-s/QxMBLvmwLdchKEjcLfwzP7h+jsHvNEtxGP5P+Fl1FMaJX2jMiIqe4rJw4tFprzCwuSvVUo9bn0uj4gNRXsbA==", "dev": true, "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", + "@jest/environment": "^29.6.4", + "@jest/fake-timers": "^29.6.4", + "@jest/globals": "^29.6.4", "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", @@ -4679,13 +4644,13 @@ "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", + "jest-haste-map": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-mock": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", + "jest-resolve": "^29.6.4", + "jest-snapshot": "^29.6.4", + "jest-util": "^29.6.3", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -4694,9 +4659,9 @@ } }, "node_modules/jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.4.tgz", + "integrity": "sha512-VC1N8ED7+4uboUKGIDsbvNAZb6LakgIPgAF4RSpF13dN6YaMokfRqO+BaqK4zIh6X3JffgwbzuGqDEjHm/MrvA==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -4704,20 +4669,20 @@ "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", + "@jest/expect-utils": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.7.0", + "expect": "^29.6.4", "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", + "jest-diff": "^29.6.4", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", + "jest-matcher-utils": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3", "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", + "pretty-format": "^29.6.3", "semver": "^7.5.3" }, "engines": { @@ -4758,9 +4723,9 @@ "dev": true }, "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", + "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -4775,9 +4740,9 @@ } }, "node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz", + "integrity": "sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -4785,7 +4750,7 @@ "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^29.7.0" + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -4804,18 +4769,18 @@ } }, "node_modules/jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.4.tgz", + "integrity": "sha512-oqUWvx6+On04ShsT00Ir9T4/FvBeEh2M9PTubgITPxDa739p4hoQweWPRGyYeaojgT0xTpZKF0Y/rSY1UgMxvQ==", "dev": true, "dependencies": { - "@jest/test-result": "^29.7.0", + "@jest/test-result": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.7.0", + "jest-util": "^29.6.3", "string-length": "^4.0.1" }, "engines": { @@ -4823,13 +4788,13 @@ } }, "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", + "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==", "dev": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.7.0", + "jest-util": "^29.6.3", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -5730,9 +5695,9 @@ } }, "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", + "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", @@ -5901,14 +5866,14 @@ "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" }, "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -6135,19 +6100,6 @@ "node": ">= 0.8.0" } }, - "node_modules/set-function-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.0.tgz", - "integrity": "sha512-WmS8UHojv5s1eSoRSmzO5zzgDq8PE1/X/ij0k+9fMYmINCc6+j+SF3Om8YyucKn2yjnK4ItNZOoQycNnHsZJTw==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", diff --git a/dtfs-central-api/package.json b/dtfs-central-api/package.json index 1b67bed4d4..805226f314 100644 --- a/dtfs-central-api/package.json +++ b/dtfs-central-api/package.json @@ -43,7 +43,7 @@ "dotenv": "16.0.3", "express": "4.18.2", "express-mongo-sanitize": "^2.2.0", - "express-rate-limit": "^6.11.2", + "express-rate-limit": "^6.11.0", "moment": "^2.29.4", "mongo-dot-notation": "3.1.0", "mongodb": "4.2.0", @@ -52,7 +52,7 @@ "swagger-ui-express": "^4.6.3" }, "devDependencies": { - "eslint": "^8.49.0", + "eslint": "^8.48.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.28.1", "jest": "29.5.0", diff --git a/external-api/package-lock.json b/external-api/package-lock.json index 9d2a38542c..eaf5440809 100644 --- a/external-api/package-lock.json +++ b/external-api/package-lock.json @@ -13,14 +13,14 @@ "@types/cors": "^2.8.14", "@types/express": "^4.17.17", "@types/jest": "^29.5.4", - "@types/node": "^18.17.15", + "@types/node": "^18.17.14", "@types/node-cron": "^3.0.8", "@types/supertest": "^2.0.12", "@types/swagger-jsdoc": "^6.0.1", "@types/swagger-ui-express": "^4.1.3", "@types/validator": "13.7.17", "axios": "^1.5.0", - "axios-mock-adapter": "^1.22.0", + "axios-mock-adapter": "^1.21.5", "compression": "^1.7.4", "cors": "^2.8.5", "cron-job-manager": "^2.3.1", @@ -28,7 +28,7 @@ "dotenv": "16.3.1", "express": "4.18.2", "express-mongo-sanitize": "^2.2.0", - "express-rate-limit": "^6.11.2", + "express-rate-limit": "^6.11.0", "joi": "^17.10.1", "mongodb": "4.2.0", "nodemon": "^3.0.1", @@ -43,7 +43,7 @@ "devDependencies": { "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", - "eslint": "^8.49.0", + "eslint": "^8.48.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-airbnb-typescript": "^17.1.0", "eslint-config-airbnb-typescript-prettier": "^5.0.0", @@ -210,21 +210,21 @@ } }, "node_modules/@babel/core": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.17.tgz", - "integrity": "sha512-2EENLmhpwplDux5PSsZnSbnSkB3tZ6QTksgO25xwEL7pIDcNOMhF5v/s6RzwjMZzZzw9Ofc30gHv5ChCC8pifQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.15.tgz", + "integrity": "sha512-PtZqMmgRrvj8ruoEOIwVA3yoF91O+Hgw9o7DAUTNBA6Mo2jpu31clx9a7Nz/9JznqetTR6zwfC4L3LAjKQXUwA==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.22.13", "@babel/generator": "^7.22.15", "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.22.17", + "@babel/helper-module-transforms": "^7.22.15", "@babel/helpers": "^7.22.15", - "@babel/parser": "^7.22.16", + "@babel/parser": "^7.22.15", "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.17", - "@babel/types": "^7.22.17", + "@babel/traverse": "^7.22.15", + "@babel/types": "^7.22.15", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -341,9 +341,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.17.tgz", - "integrity": "sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.15.tgz", + "integrity": "sha512-l1UiX4UyHSFsYt17iQ3Se5pQQZZHa22zyIXURmvkmLCD4t/aU+dvNWHatKac/D9Vm9UES7nvIqHs4jZqKviUmQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", @@ -724,9 +724,9 @@ } }, "node_modules/@babel/traverse": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.17.tgz", - "integrity": "sha512-xK4Uwm0JnAMvxYZxOVecss85WxTEIbTa7bnGyf/+EgCL5Zt3U7htUpEOWv9detPlamGKuRzCqw74xVglDWpPdg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.15.tgz", + "integrity": "sha512-DdHPwvJY0sEeN4xJU5uRLmZjgMMDIvMPniLuYzUVXj/GGzysPl0/fwt44JBkyUIzGJPV8QgHMcQdQ34XFuKTYQ==", "dev": true, "dependencies": { "@babel/code-frame": "^7.22.13", @@ -735,8 +735,8 @@ "@babel/helper-function-name": "^7.22.5", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.16", - "@babel/types": "^7.22.17", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -754,9 +754,9 @@ } }, "node_modules/@babel/types": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.17.tgz", - "integrity": "sha512-YSQPHLFtQNE5xN9tHuZnzu8vPr61wVTBZdfv1meex1NBosa4iT05k/Jw06ddJugi4bk7The/oSwQGFcksmEJQg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.15.tgz", + "integrity": "sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", @@ -809,9 +809,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", - "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", + "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -841,9 +841,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", - "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", + "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1004,16 +1004,16 @@ } }, "node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.4.tgz", + "integrity": "sha512-wNK6gC0Ha9QeEPSkeJedQuTQqxZYnDPuDcDhVuVatRvMkL4D0VTvFVZj+Yuh6caG2aOfzkUZ36KtCmLNtR02hw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3", "slash": "^3.0.0" }, "engines": { @@ -1021,15 +1021,15 @@ } }, "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.4.tgz", + "integrity": "sha512-U/vq5ccNTSVgYH7mHnodHmCffGWHJnz/E1BEWlLuK5pM4FZmGfBn/nrJGLjUsSmyx3otCeqc1T31F4y08AMDLg==", "dev": true, "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", + "@jest/console": "^29.6.4", + "@jest/reporters": "^29.6.4", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -1037,21 +1037,21 @@ "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", + "jest-changed-files": "^29.6.3", + "jest-config": "^29.6.4", + "jest-haste-map": "^29.6.4", + "jest-message-util": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", + "jest-resolve": "^29.6.4", + "jest-resolve-dependencies": "^29.6.4", + "jest-runner": "^29.6.4", + "jest-runtime": "^29.6.4", + "jest-snapshot": "^29.6.4", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", + "jest-watcher": "^29.6.4", "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", + "pretty-format": "^29.6.3", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -1068,37 +1068,37 @@ } }, "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.4.tgz", + "integrity": "sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ==", "dev": true, "dependencies": { - "@jest/fake-timers": "^29.7.0", + "@jest/fake-timers": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.7.0" + "jest-mock": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.4.tgz", + "integrity": "sha512-Warhsa7d23+3X5bLbrbYvaehcgX5TLYhI03JKoedTiI8uJU4IhqYBWF7OSSgUyz4IgLpUYPkK0AehA5/fRclAA==", "dev": true, "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" + "expect": "^29.6.4", + "jest-snapshot": "^29.6.4" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.4.tgz", + "integrity": "sha512-FEhkJhqtvBwgSpiTrocquJCdXPsyvNKcl/n7A3u7X4pVoF4bswm11c9d4AV+kfq2Gpv/mM8x7E7DsRvH+djkrg==", "dependencies": { "jest-get-type": "^29.6.3" }, @@ -1107,47 +1107,47 @@ } }, "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.4.tgz", + "integrity": "sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" + "jest-message-util": "^29.6.3", + "jest-mock": "^29.6.3", + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.4.tgz", + "integrity": "sha512-wVIn5bdtjlChhXAzVXavcY/3PEjf4VqM174BM3eGL5kMxLiZD5CLnbmkEyA1Dwh9q8XjP6E8RwjBsY/iCWrWsA==", "dev": true, "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", + "@jest/environment": "^29.6.4", + "@jest/expect": "^29.6.4", "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" + "jest-mock": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.4.tgz", + "integrity": "sha512-sxUjWxm7QdchdrD3NfWKrL8FBsortZeibSJv4XLjESOOjSUOkjQcb0ZHJwfhEGIvBvTluTzfG2yZWZhkrXJu8g==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", + "@jest/console": "^29.6.4", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", @@ -1161,9 +1161,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3", + "jest-worker": "^29.6.4", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -1207,12 +1207,12 @@ } }, "node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.4.tgz", + "integrity": "sha512-uQ1C0AUEN90/dsyEirgMLlouROgSY+Wc/JanVVk0OiUKa5UFh7sJpMEM3aoUBAz2BRNvUJ8j3d294WFuRxSyOQ==", "dev": true, "dependencies": { - "@jest/console": "^29.7.0", + "@jest/console": "^29.6.4", "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" @@ -1222,14 +1222,14 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.4.tgz", + "integrity": "sha512-E84M6LbpcRq3fT4ckfKs9ryVanwkaIB0Ws9bw3/yP4seRLg/VaCZ/LgW0MCq5wwk4/iP/qnilD41aj2fsw2RMg==", "dev": true, "dependencies": { - "@jest/test-result": "^29.7.0", + "@jest/test-result": "^29.6.4", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", + "jest-haste-map": "^29.6.4", "slash": "^3.0.0" }, "engines": { @@ -1237,9 +1237,9 @@ } }, "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz", + "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -1250,9 +1250,9 @@ "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", + "jest-haste-map": "^29.6.4", "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", + "jest-util": "^29.6.3", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -1587,9 +1587,9 @@ "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, "node_modules/@types/node": { - "version": "18.17.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.15.tgz", - "integrity": "sha512-2yrWpBk32tvV/JAd3HNHWuZn/VDN1P+72hWirHnvsvTGSqbANi+kSeuQR9yAHnbvaBvHDsoTdXV0Fe+iRtHLKA==" + "version": "18.17.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.14.tgz", + "integrity": "sha512-ZE/5aB73CyGqgQULkLG87N9GnyGe5TcQjv34pwS8tfBs1IkCh0ASM69mydb2znqd6v0eX+9Ytvk6oQRqu8T1Vw==" }, "node_modules/@types/node-cron": { "version": "3.0.8", @@ -2203,9 +2203,9 @@ } }, "node_modules/axe-core": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.8.1.tgz", - "integrity": "sha512-9l850jDDPnKq48nbad8SiEelCv4OrUWrKab/cPj0GScVg6cb6NbCCt/Ulk26QEq5jP9NnGr04Bit1BHyV6r5CQ==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.8.0.tgz", + "integrity": "sha512-ZtlVZobOeDQhb/y2lMK6mznDw7TJHDNcKx5/bbBkFvArIQ5CVFhSI6hWWQnMx9I8cNmNmZ30wpDyOC2E2nvgbQ==", "dev": true, "engines": { "node": ">=4" @@ -2222,9 +2222,9 @@ } }, "node_modules/axios-mock-adapter": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/axios-mock-adapter/-/axios-mock-adapter-1.22.0.tgz", - "integrity": "sha512-dmI0KbkyAhntUR05YY96qg2H6gg0XMl2+qTW0xmYg6Up+BFBAJYRLROMXRdDEL06/Wqwa0TJThAYvFtSFdRCZw==", + "version": "1.21.5", + "resolved": "https://registry.npmjs.org/axios-mock-adapter/-/axios-mock-adapter-1.21.5.tgz", + "integrity": "sha512-5NI1V/VK+8+JeTF8niqOowuysA4b8mGzdlMN/QnTnoXbYh4HZSNiopsDclN2g/m85+G++IrEtUdZaQ3GnaMsSA==", "dependencies": { "fast-deep-equal": "^3.1.3", "is-buffer": "^2.0.5" @@ -2243,12 +2243,12 @@ } }, "node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.4.tgz", + "integrity": "sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==", "dev": true, "dependencies": { - "@jest/transform": "^29.7.0", + "@jest/transform": "^29.6.4", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", @@ -2596,9 +2596,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001534", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001534.tgz", - "integrity": "sha512-vlPVrhsCS7XaSh2VvWluIQEzVhefrUQcEsQWSS5A5V+dM07uv1qHeQzAOTGIMy9i3e9bH15+muvI/UHojVgS/Q==", + "version": "1.0.30001529", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001529.tgz", + "integrity": "sha512-n2pUQYGAkrLG4QYj2desAh+NqsJpHbNmVZz87imptDdxLAtjxary7Df/psdfyDGmskJK/9Dt9cPnx5RZ3CU4Og==", "dev": true, "funding": [ { @@ -2894,27 +2894,6 @@ "node": ">= 0.10" } }, - "node_modules/create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -3017,27 +2996,12 @@ "node": ">=0.10.0" } }, - "node_modules/define-data-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.0.1.tgz", - "integrity": "sha512-22M+6zEspQHx10bfFQl2ET39IvfuQ7+rZIH7+ard8fCC4hPmkOSy+8JhKxBRLaWUziJ0O63NTYT97LR8zUfPTw==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", "dev": true, "dependencies": { - "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -3173,9 +3137,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.519", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.519.tgz", - "integrity": "sha512-kqs9oGYL4UFVkLKhqCTgBCYZv+wZ374yABDMqlDda9HvlkQxvSr7kgf4hfWVjMieDbX+1MwPHFBsOGCMIBaFKg==", + "version": "1.4.512", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.512.tgz", + "integrity": "sha512-1W8wRbYlQE4ph7eoj3TJ+uqwO6+xvAE/L+KGU7WTQQvX3tnSIGZAb90MTsMoJqzntamiwJhBAj4WZmygXhsOUg==", "dev": true }, "node_modules/emittery": { @@ -3368,16 +3332,16 @@ } }, "node_modules/eslint": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", - "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", + "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.49.0", - "@humanwhocodes/config-array": "^0.11.11", + "@eslint/js": "8.48.0", + "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", @@ -3992,15 +3956,15 @@ } }, "node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.4.tgz", + "integrity": "sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA==", "dependencies": { - "@jest/expect-utils": "^29.7.0", + "@jest/expect-utils": "^29.6.4", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" + "jest-matcher-utils": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -4056,9 +4020,9 @@ } }, "node_modules/express-rate-limit": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.2.tgz", - "integrity": "sha512-a7uwwfNTh1U60ssiIkuLFWHt4hAC5yxlLGU2VP0X4YNlyEDZAqF4tK3GD3NSitVBrCQmQ0++0uOyFOgC2y4DDw==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.0.tgz", + "integrity": "sha512-H9afltGTaEZcvenAB5LFgb/ysTMHUzMxoB3TJM6UHP5FtAP1p2+heMj1xwTei54Zm4I9I/2qsS5m+XrdKQp/Hw==", "engines": { "node": ">= 14" }, @@ -5316,13 +5280,13 @@ } }, "node_modules/jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.6.3.tgz", + "integrity": "sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg==", "dev": true, "dependencies": { "execa": "^5.0.0", - "jest-util": "^29.7.0", + "jest-util": "^29.6.3", "p-limit": "^3.1.0" }, "engines": { @@ -5330,28 +5294,28 @@ } }, "node_modules/jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.4.tgz", + "integrity": "sha512-YXNrRyntVUgDfZbjXWBMPslX1mQ8MrSG0oM/Y06j9EYubODIyHWP8hMUbjbZ19M3M+zamqEur7O80HODwACoJw==", "dev": true, "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", + "@jest/environment": "^29.6.4", + "@jest/expect": "^29.6.4", + "@jest/test-result": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", + "jest-each": "^29.6.3", + "jest-matcher-utils": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-runtime": "^29.6.4", + "jest-snapshot": "^29.6.4", + "jest-util": "^29.6.3", "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", + "pretty-format": "^29.6.3", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" @@ -5361,21 +5325,22 @@ } }, "node_modules/jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.4.tgz", + "integrity": "sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ==", "dev": true, "dependencies": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", + "@jest/core": "^29.6.4", + "@jest/test-result": "^29.6.4", "@jest/types": "^29.6.3", "chalk": "^4.0.0", - "create-jest": "^29.7.0", "exit": "^0.1.2", + "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", + "jest-config": "^29.6.4", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", + "prompts": "^2.0.1", "yargs": "^17.3.1" }, "bin": { @@ -5394,31 +5359,31 @@ } }, "node_modules/jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.4.tgz", + "integrity": "sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", + "@jest/test-sequencer": "^29.6.4", "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", + "babel-jest": "^29.6.4", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", + "jest-circus": "^29.6.4", + "jest-environment-node": "^29.6.4", "jest-get-type": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", + "jest-resolve": "^29.6.4", + "jest-runner": "^29.6.4", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", + "pretty-format": "^29.6.3", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -5439,23 +5404,23 @@ } }, "node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.4.tgz", + "integrity": "sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==", "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.6.3.tgz", + "integrity": "sha512-2+H+GOTQBEm2+qFSQ7Ma+BvyV+waiIFxmZF5LdpBsAEjWX8QYjSCa4FrkIYtbfXUJJJnFCYrOtt6TZ+IAiTjBQ==", "dev": true, "dependencies": { "detect-newline": "^3.0.0" @@ -5465,33 +5430,33 @@ } }, "node_modules/jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.3.tgz", + "integrity": "sha512-KoXfJ42k8cqbkfshW7sSHcdfnv5agDdHCPA87ZBdmHP+zJstTJc0ttQaJ/x7zK6noAL76hOuTIJ6ZkQRS5dcyg==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" + "jest-util": "^29.6.3", + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.4.tgz", + "integrity": "sha512-i7SbpH2dEIFGNmxGCpSc2w9cA4qVD+wfvg2ZnfQ7XVrKL0NA5uDVBIiGH8SR4F0dKEv/0qI5r+aDomDf04DpEQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", + "@jest/environment": "^29.6.4", + "@jest/fake-timers": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" + "jest-mock": "^29.6.3", + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -5506,9 +5471,9 @@ } }, "node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz", + "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -5518,8 +5483,8 @@ "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", + "jest-util": "^29.6.3", + "jest-worker": "^29.6.4", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -5531,36 +5496,36 @@ } }, "node_modules/jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.3.tgz", + "integrity": "sha512-0kfbESIHXYdhAdpLsW7xdwmYhLf1BRu4AA118/OxFm0Ho1b2RcTmO4oF6aAMaxpxdxnJ3zve2rgwzNBD4Zbm7Q==", "dev": true, "dependencies": { "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.4.tgz", + "integrity": "sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ==", "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.7.0", + "jest-diff": "^29.6.4", "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.3.tgz", + "integrity": "sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==", "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", @@ -5568,7 +5533,7 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", + "pretty-format": "^29.6.3", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -5577,14 +5542,14 @@ } }, "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.3.tgz", + "integrity": "sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", - "jest-util": "^29.7.0" + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -5617,17 +5582,17 @@ } }, "node_modules/jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.4.tgz", + "integrity": "sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q==", "dev": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", + "jest-haste-map": "^29.6.4", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" @@ -5637,43 +5602,43 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.4.tgz", + "integrity": "sha512-7+6eAmr1ZBF3vOAJVsfLj1QdqeXG+WYhidfLHBRZqGN24MFRIiKG20ItpLw2qRAsW/D2ZUUmCNf6irUr/v6KHA==", "dev": true, "dependencies": { "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" + "jest-snapshot": "^29.6.4" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.4.tgz", + "integrity": "sha512-SDaLrMmtVlQYDuG0iSPYLycG8P9jLI+fRm8AF/xPKhYDB2g6xDWjXBrR5M8gEWsK6KVFlebpZ4QsrxdyIX1Jaw==", "dev": true, "dependencies": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", + "@jest/console": "^29.6.4", + "@jest/environment": "^29.6.4", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", + "jest-docblock": "^29.6.3", + "jest-environment-node": "^29.6.4", + "jest-haste-map": "^29.6.4", + "jest-leak-detector": "^29.6.3", + "jest-message-util": "^29.6.3", + "jest-resolve": "^29.6.4", + "jest-runtime": "^29.6.4", + "jest-util": "^29.6.3", + "jest-watcher": "^29.6.4", + "jest-worker": "^29.6.4", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -5682,17 +5647,17 @@ } }, "node_modules/jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.4.tgz", + "integrity": "sha512-s/QxMBLvmwLdchKEjcLfwzP7h+jsHvNEtxGP5P+Fl1FMaJX2jMiIqe4rJw4tFprzCwuSvVUo9bn0uj4gNRXsbA==", "dev": true, "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", + "@jest/environment": "^29.6.4", + "@jest/fake-timers": "^29.6.4", + "@jest/globals": "^29.6.4", "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", @@ -5700,13 +5665,13 @@ "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", + "jest-haste-map": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-mock": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", + "jest-resolve": "^29.6.4", + "jest-snapshot": "^29.6.4", + "jest-util": "^29.6.3", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -5715,9 +5680,9 @@ } }, "node_modules/jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.4.tgz", + "integrity": "sha512-VC1N8ED7+4uboUKGIDsbvNAZb6LakgIPgAF4RSpF13dN6YaMokfRqO+BaqK4zIh6X3JffgwbzuGqDEjHm/MrvA==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -5725,20 +5690,20 @@ "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", + "@jest/expect-utils": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.7.0", + "expect": "^29.6.4", "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", + "jest-diff": "^29.6.4", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", + "jest-matcher-utils": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3", "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", + "pretty-format": "^29.6.3", "semver": "^7.5.3" }, "engines": { @@ -5746,9 +5711,9 @@ } }, "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", + "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -5762,9 +5727,9 @@ } }, "node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz", + "integrity": "sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -5772,7 +5737,7 @@ "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^29.7.0" + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -5791,18 +5756,18 @@ } }, "node_modules/jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.4.tgz", + "integrity": "sha512-oqUWvx6+On04ShsT00Ir9T4/FvBeEh2M9PTubgITPxDa739p4hoQweWPRGyYeaojgT0xTpZKF0Y/rSY1UgMxvQ==", "dev": true, "dependencies": { - "@jest/test-result": "^29.7.0", + "@jest/test-result": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.7.0", + "jest-util": "^29.6.3", "string-length": "^4.0.1" }, "engines": { @@ -5810,13 +5775,13 @@ } }, "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", + "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==", "dev": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.7.0", + "jest-util": "^29.6.3", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -6892,9 +6857,9 @@ } }, "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", + "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -7097,14 +7062,14 @@ "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" }, "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -7374,19 +7339,6 @@ "node": ">= 0.8.0" } }, - "node_modules/set-function-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.0.tgz", - "integrity": "sha512-WmS8UHojv5s1eSoRSmzO5zzgDq8PE1/X/ij0k+9fMYmINCc6+j+SF3Om8YyucKn2yjnK4ItNZOoQycNnHsZJTw==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -7552,9 +7504,9 @@ "dev": true }, "node_modules/string.prototype.matchall": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", - "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.9.tgz", + "integrity": "sha512-6i5hL3MqG/K2G43mWXWgP+qizFW/QH/7kCNN13JrJS5q48FN5IKksLDscexKP3dnmB6cdm9jlNgAsWNLpSykmA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", @@ -7564,7 +7516,6 @@ "has-symbols": "^1.0.3", "internal-slot": "^1.0.5", "regexp.prototype.flags": "^1.5.0", - "set-function-name": "^2.0.0", "side-channel": "^1.0.4" }, "funding": { diff --git a/external-api/package.json b/external-api/package.json index 3350702861..a0e667635c 100644 --- a/external-api/package.json +++ b/external-api/package.json @@ -39,14 +39,14 @@ "@types/cors": "^2.8.14", "@types/express": "^4.17.17", "@types/jest": "^29.5.4", - "@types/node": "^18.17.15", + "@types/node": "^18.17.14", "@types/node-cron": "^3.0.8", "@types/supertest": "^2.0.12", "@types/swagger-jsdoc": "^6.0.1", "@types/swagger-ui-express": "^4.1.3", "@types/validator": "13.7.17", "axios": "^1.5.0", - "axios-mock-adapter": "^1.22.0", + "axios-mock-adapter": "^1.21.5", "compression": "^1.7.4", "cors": "^2.8.5", "cron-job-manager": "^2.3.1", @@ -54,7 +54,7 @@ "dotenv": "16.3.1", "express": "4.18.2", "express-mongo-sanitize": "^2.2.0", - "express-rate-limit": "^6.11.2", + "express-rate-limit": "^6.11.0", "joi": "^17.10.1", "mongodb": "4.2.0", "nodemon": "^3.0.1", @@ -69,7 +69,7 @@ "devDependencies": { "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", - "eslint": "^8.49.0", + "eslint": "^8.48.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-airbnb-typescript": "^17.1.0", "eslint-config-airbnb-typescript-prettier": "^5.0.0", diff --git a/gef-ui/package-lock.json b/gef-ui/package-lock.json index b8ffaaf26b..3b567a2da0 100644 --- a/gef-ui/package-lock.json +++ b/gef-ui/package-lock.json @@ -26,7 +26,7 @@ "dotenv": "16.0.3", "express": "^4.18.2", "express-fileupload": "^1.4.0", - "express-rate-limit": "^6.11.2", + "express-rate-limit": "^6.11.0", "express-session": "1.17.3", "filesize": "9.0.11", "form-data": "4.0.0", @@ -57,12 +57,12 @@ "babel-jest": "29.5.0", "babel-loader": "9.1.2", "css-minimizer-webpack-plugin": "^5.0.1", - "eslint": "^8.49.0", + "eslint": "^8.48.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.28.1", "file-loader": "^6.2.0", "jest": "29.5.0", - "jest-environment-jsdom": "^29.7.0", + "jest-environment-jsdom": "^29.6.4", "rimraf": "^5.0.1", "sass": "^1.66.1", "sass-loader": "13.2.2", @@ -323,9 +323,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.17.tgz", - "integrity": "sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.15.tgz", + "integrity": "sha512-l1UiX4UyHSFsYt17iQ3Se5pQQZZHa22zyIXURmvkmLCD4t/aU+dvNWHatKac/D9Vm9UES7nvIqHs4jZqKviUmQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", @@ -363,14 +363,14 @@ } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.17.tgz", - "integrity": "sha512-bxH77R5gjH3Nkde6/LuncQoLaP16THYPscurp1S8z7S9ZgezCyV3G8Hc+TZiCmY8pz4fp8CvKSgtJMW0FkLAxA==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz", + "integrity": "sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-wrap-function": "^7.22.17" + "@babel/helper-wrap-function": "^7.22.9" }, "engines": { "node": ">=6.9.0" @@ -460,14 +460,14 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.17.tgz", - "integrity": "sha512-nAhoheCMlrqU41tAojw9GpVEKDlTS8r3lzFmF0lP52LwblCPbuFSO7nGIZoIcoU5NIm1ABrna0cJExE4Ay6l2Q==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.10.tgz", + "integrity": "sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ==", "dev": true, "dependencies": { "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.17" + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.10" }, "engines": { "node": ">=6.9.0" @@ -1737,9 +1737,9 @@ } }, "node_modules/@babel/traverse": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.17.tgz", - "integrity": "sha512-xK4Uwm0JnAMvxYZxOVecss85WxTEIbTa7bnGyf/+EgCL5Zt3U7htUpEOWv9detPlamGKuRzCqw74xVglDWpPdg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.15.tgz", + "integrity": "sha512-DdHPwvJY0sEeN4xJU5uRLmZjgMMDIvMPniLuYzUVXj/GGzysPl0/fwt44JBkyUIzGJPV8QgHMcQdQ34XFuKTYQ==", "dev": true, "dependencies": { "@babel/code-frame": "^7.22.13", @@ -1748,8 +1748,8 @@ "@babel/helper-function-name": "^7.22.5", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.16", - "@babel/types": "^7.22.17", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1758,9 +1758,9 @@ } }, "node_modules/@babel/types": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.17.tgz", - "integrity": "sha512-YSQPHLFtQNE5xN9tHuZnzu8vPr61wVTBZdfv1meex1NBosa4iT05k/Jw06ddJugi4bk7The/oSwQGFcksmEJQg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.15.tgz", + "integrity": "sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", @@ -1802,9 +1802,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", - "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", + "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -1901,9 +1901,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", - "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", + "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2077,16 +2077,16 @@ } }, "node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.4.tgz", + "integrity": "sha512-wNK6gC0Ha9QeEPSkeJedQuTQqxZYnDPuDcDhVuVatRvMkL4D0VTvFVZj+Yuh6caG2aOfzkUZ36KtCmLNtR02hw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3", "slash": "^3.0.0" }, "engines": { @@ -2164,15 +2164,15 @@ } }, "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.4.tgz", + "integrity": "sha512-U/vq5ccNTSVgYH7mHnodHmCffGWHJnz/E1BEWlLuK5pM4FZmGfBn/nrJGLjUsSmyx3otCeqc1T31F4y08AMDLg==", "dev": true, "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", + "@jest/console": "^29.6.4", + "@jest/reporters": "^29.6.4", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -2180,21 +2180,21 @@ "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", + "jest-changed-files": "^29.6.3", + "jest-config": "^29.6.4", + "jest-haste-map": "^29.6.4", + "jest-message-util": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", + "jest-resolve": "^29.6.4", + "jest-resolve-dependencies": "^29.6.4", + "jest-runner": "^29.6.4", + "jest-runtime": "^29.6.4", + "jest-snapshot": "^29.6.4", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", + "jest-watcher": "^29.6.4", "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", + "pretty-format": "^29.6.3", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -2281,37 +2281,37 @@ } }, "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.4.tgz", + "integrity": "sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ==", "dev": true, "dependencies": { - "@jest/fake-timers": "^29.7.0", + "@jest/fake-timers": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.7.0" + "jest-mock": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.4.tgz", + "integrity": "sha512-Warhsa7d23+3X5bLbrbYvaehcgX5TLYhI03JKoedTiI8uJU4IhqYBWF7OSSgUyz4IgLpUYPkK0AehA5/fRclAA==", "dev": true, "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" + "expect": "^29.6.4", + "jest-snapshot": "^29.6.4" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.4.tgz", + "integrity": "sha512-FEhkJhqtvBwgSpiTrocquJCdXPsyvNKcl/n7A3u7X4pVoF4bswm11c9d4AV+kfq2Gpv/mM8x7E7DsRvH+djkrg==", "dev": true, "dependencies": { "jest-get-type": "^29.6.3" @@ -2321,47 +2321,47 @@ } }, "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.4.tgz", + "integrity": "sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" + "jest-message-util": "^29.6.3", + "jest-mock": "^29.6.3", + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.4.tgz", + "integrity": "sha512-wVIn5bdtjlChhXAzVXavcY/3PEjf4VqM174BM3eGL5kMxLiZD5CLnbmkEyA1Dwh9q8XjP6E8RwjBsY/iCWrWsA==", "dev": true, "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", + "@jest/environment": "^29.6.4", + "@jest/expect": "^29.6.4", "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" + "jest-mock": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.4.tgz", + "integrity": "sha512-sxUjWxm7QdchdrD3NfWKrL8FBsortZeibSJv4XLjESOOjSUOkjQcb0ZHJwfhEGIvBvTluTzfG2yZWZhkrXJu8g==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", + "@jest/console": "^29.6.4", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", @@ -2375,9 +2375,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3", + "jest-worker": "^29.6.4", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -2541,12 +2541,12 @@ } }, "node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.4.tgz", + "integrity": "sha512-uQ1C0AUEN90/dsyEirgMLlouROgSY+Wc/JanVVk0OiUKa5UFh7sJpMEM3aoUBAz2BRNvUJ8j3d294WFuRxSyOQ==", "dev": true, "dependencies": { - "@jest/console": "^29.7.0", + "@jest/console": "^29.6.4", "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" @@ -2556,14 +2556,14 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.4.tgz", + "integrity": "sha512-E84M6LbpcRq3fT4ckfKs9ryVanwkaIB0Ws9bw3/yP4seRLg/VaCZ/LgW0MCq5wwk4/iP/qnilD41aj2fsw2RMg==", "dev": true, "dependencies": { - "@jest/test-result": "^29.7.0", + "@jest/test-result": "^29.6.4", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", + "jest-haste-map": "^29.6.4", "slash": "^3.0.0" }, "engines": { @@ -2571,9 +2571,9 @@ } }, "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz", + "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -2584,9 +2584,9 @@ "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", + "jest-haste-map": "^29.6.4", "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", + "jest-util": "^29.6.3", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -3071,9 +3071,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.6.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.0.tgz", - "integrity": "sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==", + "version": "20.5.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.9.tgz", + "integrity": "sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==", "dev": true }, "node_modules/@types/stack-utils": { @@ -3083,9 +3083,9 @@ "dev": true }, "node_modules/@types/tough-cookie": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.3.tgz", - "integrity": "sha512-THo502dA5PzG/sfQH+42Lw3fvmYkceefOspdCwpHRul8ik2Jv1K8I5OZz1AT3/rs46kwgMCe9bSBmDLYkkOMGg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", + "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==", "dev": true }, "node_modules/@types/yargs": { @@ -4072,9 +4072,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001534", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001534.tgz", - "integrity": "sha512-vlPVrhsCS7XaSh2VvWluIQEzVhefrUQcEsQWSS5A5V+dM07uv1qHeQzAOTGIMy9i3e9bH15+muvI/UHojVgS/Q==", + "version": "1.0.30001529", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001529.tgz", + "integrity": "sha512-n2pUQYGAkrLG4QYj2desAh+NqsJpHbNmVZz87imptDdxLAtjxary7Df/psdfyDGmskJK/9Dt9cPnx5RZ3CU4Og==", "dev": true, "funding": [ { @@ -4539,97 +4539,6 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, - "node_modules/create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/create-jest/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/create-jest/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/create-jest/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/create-jest/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/create-jest/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/create-jest/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -5043,27 +4952,12 @@ "node": ">=0.10.0" } }, - "node_modules/define-data-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.0.1.tgz", - "integrity": "sha512-22M+6zEspQHx10bfFQl2ET39IvfuQ7+rZIH7+ard8fCC4hPmkOSy+8JhKxBRLaWUziJ0O63NTYT97LR8zUfPTw==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", "dev": true, "dependencies": { - "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -5230,9 +5124,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.519", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.519.tgz", - "integrity": "sha512-kqs9oGYL4UFVkLKhqCTgBCYZv+wZ374yABDMqlDda9HvlkQxvSr7kgf4hfWVjMieDbX+1MwPHFBsOGCMIBaFKg==", + "version": "1.4.512", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.512.tgz", + "integrity": "sha512-1W8wRbYlQE4ph7eoj3TJ+uqwO6+xvAE/L+KGU7WTQQvX3tnSIGZAb90MTsMoJqzntamiwJhBAj4WZmygXhsOUg==", "dev": true }, "node_modules/emittery": { @@ -5369,9 +5263,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz", - "integrity": "sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", + "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", "dev": true }, "node_modules/es-set-tostringtag": { @@ -5459,16 +5353,16 @@ } }, "node_modules/eslint": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", - "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", + "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.49.0", - "@humanwhocodes/config-array": "^0.11.11", + "@eslint/js": "8.48.0", + "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", @@ -5974,16 +5868,16 @@ } }, "node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.4.tgz", + "integrity": "sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA==", "dev": true, "dependencies": { - "@jest/expect-utils": "^29.7.0", + "@jest/expect-utils": "^29.6.4", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" + "jest-matcher-utils": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -6042,9 +5936,9 @@ } }, "node_modules/express-rate-limit": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.2.tgz", - "integrity": "sha512-a7uwwfNTh1U60ssiIkuLFWHt4hAC5yxlLGU2VP0X4YNlyEDZAqF4tK3GD3NSitVBrCQmQ0++0uOyFOgC2y4DDw==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.0.tgz", + "integrity": "sha512-H9afltGTaEZcvenAB5LFgb/ysTMHUzMxoB3TJM6UHP5FtAP1p2+heMj1xwTei54Zm4I9I/2qsS5m+XrdKQp/Hw==", "engines": { "node": ">= 14" }, @@ -7510,13 +7404,13 @@ } }, "node_modules/jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.6.3.tgz", + "integrity": "sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg==", "dev": true, "dependencies": { "execa": "^5.0.0", - "jest-util": "^29.7.0", + "jest-util": "^29.6.3", "p-limit": "^3.1.0" }, "engines": { @@ -7524,28 +7418,28 @@ } }, "node_modules/jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.4.tgz", + "integrity": "sha512-YXNrRyntVUgDfZbjXWBMPslX1mQ8MrSG0oM/Y06j9EYubODIyHWP8hMUbjbZ19M3M+zamqEur7O80HODwACoJw==", "dev": true, "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", + "@jest/environment": "^29.6.4", + "@jest/expect": "^29.6.4", + "@jest/test-result": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", + "jest-each": "^29.6.3", + "jest-matcher-utils": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-runtime": "^29.6.4", + "jest-snapshot": "^29.6.4", + "jest-util": "^29.6.3", "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", + "pretty-format": "^29.6.3", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" @@ -7625,21 +7519,22 @@ } }, "node_modules/jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.4.tgz", + "integrity": "sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ==", "dev": true, "dependencies": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", + "@jest/core": "^29.6.4", + "@jest/test-result": "^29.6.4", "@jest/types": "^29.6.3", "chalk": "^4.0.0", - "create-jest": "^29.7.0", "exit": "^0.1.2", + "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", + "jest-config": "^29.6.4", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", + "prompts": "^2.0.1", "yargs": "^17.3.1" }, "bin": { @@ -7728,31 +7623,31 @@ } }, "node_modules/jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.4.tgz", + "integrity": "sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", + "@jest/test-sequencer": "^29.6.4", "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", + "babel-jest": "^29.6.4", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", + "jest-circus": "^29.6.4", + "jest-environment-node": "^29.6.4", "jest-get-type": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", + "jest-resolve": "^29.6.4", + "jest-runner": "^29.6.4", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", + "pretty-format": "^29.6.3", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -7788,12 +7683,12 @@ } }, "node_modules/jest-config/node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.4.tgz", + "integrity": "sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==", "dev": true, "dependencies": { - "@jest/transform": "^29.7.0", + "@jest/transform": "^29.6.4", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", @@ -7864,15 +7759,15 @@ } }, "node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.4.tgz", + "integrity": "sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==", "dev": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -7949,9 +7844,9 @@ } }, "node_modules/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.6.3.tgz", + "integrity": "sha512-2+H+GOTQBEm2+qFSQ7Ma+BvyV+waiIFxmZF5LdpBsAEjWX8QYjSCa4FrkIYtbfXUJJJnFCYrOtt6TZ+IAiTjBQ==", "dev": true, "dependencies": { "detect-newline": "^3.0.0" @@ -7961,16 +7856,16 @@ } }, "node_modules/jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.3.tgz", + "integrity": "sha512-KoXfJ42k8cqbkfshW7sSHcdfnv5agDdHCPA87ZBdmHP+zJstTJc0ttQaJ/x7zK6noAL76hOuTIJ6ZkQRS5dcyg==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" + "jest-util": "^29.6.3", + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -8047,18 +7942,18 @@ } }, "node_modules/jest-environment-jsdom": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", - "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.6.4.tgz", + "integrity": "sha512-K6wfgUJ16DoMs02JYFid9lOsqfpoVtyJxpRlnTxUHzvZWBnnh2VNGRB9EC1Cro96TQdq5TtSjb3qUjNaJP9IyA==", "dev": true, "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", + "@jest/environment": "^29.6.4", + "@jest/fake-timers": "^29.6.4", "@jest/types": "^29.6.3", "@types/jsdom": "^20.0.0", "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0", + "jest-mock": "^29.6.3", + "jest-util": "^29.6.3", "jsdom": "^20.0.0" }, "engines": { @@ -8074,17 +7969,17 @@ } }, "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.4.tgz", + "integrity": "sha512-i7SbpH2dEIFGNmxGCpSc2w9cA4qVD+wfvg2ZnfQ7XVrKL0NA5uDVBIiGH8SR4F0dKEv/0qI5r+aDomDf04DpEQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", + "@jest/environment": "^29.6.4", + "@jest/fake-timers": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" + "jest-mock": "^29.6.3", + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -8100,9 +7995,9 @@ } }, "node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz", + "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -8112,8 +8007,8 @@ "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", + "jest-util": "^29.6.3", + "jest-worker": "^29.6.4", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -8125,28 +8020,28 @@ } }, "node_modules/jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.3.tgz", + "integrity": "sha512-0kfbESIHXYdhAdpLsW7xdwmYhLf1BRu4AA118/OxFm0Ho1b2RcTmO4oF6aAMaxpxdxnJ3zve2rgwzNBD4Zbm7Q==", "dev": true, "dependencies": { "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.4.tgz", + "integrity": "sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.7.0", + "jest-diff": "^29.6.4", "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -8223,9 +8118,9 @@ } }, "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.3.tgz", + "integrity": "sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", @@ -8234,7 +8129,7 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", + "pretty-format": "^29.6.3", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -8313,14 +8208,14 @@ } }, "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.3.tgz", + "integrity": "sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", - "jest-util": "^29.7.0" + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -8353,17 +8248,17 @@ } }, "node_modules/jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.4.tgz", + "integrity": "sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q==", "dev": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", + "jest-haste-map": "^29.6.4", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" @@ -8373,13 +8268,13 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.4.tgz", + "integrity": "sha512-7+6eAmr1ZBF3vOAJVsfLj1QdqeXG+WYhidfLHBRZqGN24MFRIiKG20ItpLw2qRAsW/D2ZUUmCNf6irUr/v6KHA==", "dev": true, "dependencies": { "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" + "jest-snapshot": "^29.6.4" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -8456,30 +8351,30 @@ } }, "node_modules/jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.4.tgz", + "integrity": "sha512-SDaLrMmtVlQYDuG0iSPYLycG8P9jLI+fRm8AF/xPKhYDB2g6xDWjXBrR5M8gEWsK6KVFlebpZ4QsrxdyIX1Jaw==", "dev": true, "dependencies": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", + "@jest/console": "^29.6.4", + "@jest/environment": "^29.6.4", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", + "jest-docblock": "^29.6.3", + "jest-environment-node": "^29.6.4", + "jest-haste-map": "^29.6.4", + "jest-leak-detector": "^29.6.3", + "jest-message-util": "^29.6.3", + "jest-resolve": "^29.6.4", + "jest-runtime": "^29.6.4", + "jest-util": "^29.6.3", + "jest-watcher": "^29.6.4", + "jest-worker": "^29.6.4", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -8558,17 +8453,17 @@ } }, "node_modules/jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.4.tgz", + "integrity": "sha512-s/QxMBLvmwLdchKEjcLfwzP7h+jsHvNEtxGP5P+Fl1FMaJX2jMiIqe4rJw4tFprzCwuSvVUo9bn0uj4gNRXsbA==", "dev": true, "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", + "@jest/environment": "^29.6.4", + "@jest/fake-timers": "^29.6.4", + "@jest/globals": "^29.6.4", "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", @@ -8576,13 +8471,13 @@ "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", + "jest-haste-map": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-mock": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", + "jest-resolve": "^29.6.4", + "jest-snapshot": "^29.6.4", + "jest-util": "^29.6.3", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -8661,9 +8556,9 @@ } }, "node_modules/jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.4.tgz", + "integrity": "sha512-VC1N8ED7+4uboUKGIDsbvNAZb6LakgIPgAF4RSpF13dN6YaMokfRqO+BaqK4zIh6X3JffgwbzuGqDEjHm/MrvA==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -8671,20 +8566,20 @@ "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", + "@jest/expect-utils": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.7.0", + "expect": "^29.6.4", "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", + "jest-diff": "^29.6.4", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", + "jest-matcher-utils": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3", "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", + "pretty-format": "^29.6.3", "semver": "^7.5.3" }, "engines": { @@ -8795,9 +8690,9 @@ "dev": true }, "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", + "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -8882,9 +8777,9 @@ } }, "node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz", + "integrity": "sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -8892,7 +8787,7 @@ "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^29.7.0" + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -8981,18 +8876,18 @@ } }, "node_modules/jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.4.tgz", + "integrity": "sha512-oqUWvx6+On04ShsT00Ir9T4/FvBeEh2M9PTubgITPxDa739p4hoQweWPRGyYeaojgT0xTpZKF0Y/rSY1UgMxvQ==", "dev": true, "dependencies": { - "@jest/test-result": "^29.7.0", + "@jest/test-result": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.7.0", + "jest-util": "^29.6.3", "string-length": "^4.0.1" }, "engines": { @@ -9070,13 +8965,13 @@ } }, "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", + "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==", "dev": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.7.0", + "jest-util": "^29.6.3", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -10704,9 +10599,9 @@ } }, "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", + "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", @@ -11012,14 +10907,14 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -11469,19 +11364,6 @@ "node": ">= 0.8.0" } }, - "node_modules/set-function-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.0.tgz", - "integrity": "sha512-WmS8UHojv5s1eSoRSmzO5zzgDq8PE1/X/ij0k+9fMYmINCc6+j+SF3Om8YyucKn2yjnK4ItNZOoQycNnHsZJTw==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -13052,9 +12934,9 @@ } }, "node_modules/ws": { - "version": "8.14.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.1.tgz", - "integrity": "sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.0.tgz", + "integrity": "sha512-WR0RJE9Ehsio6U4TuM+LmunEsjQ5ncHlw4sn9ihD6RoJKZrVyH9FWV3dmnwu8B2aNib1OvG2X6adUCyFpQyWcg==", "dev": true, "engines": { "node": ">=10.0.0" diff --git a/gef-ui/package.json b/gef-ui/package.json index 122a7bfbdf..55d3026f1f 100644 --- a/gef-ui/package.json +++ b/gef-ui/package.json @@ -56,7 +56,7 @@ "dotenv": "16.0.3", "express": "^4.18.2", "express-fileupload": "^1.4.0", - "express-rate-limit": "^6.11.2", + "express-rate-limit": "^6.11.0", "express-session": "1.17.3", "filesize": "9.0.11", "form-data": "4.0.0", @@ -87,12 +87,12 @@ "babel-jest": "29.5.0", "babel-loader": "9.1.2", "css-minimizer-webpack-plugin": "^5.0.1", - "eslint": "^8.49.0", + "eslint": "^8.48.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.28.1", "file-loader": "^6.2.0", "jest": "29.5.0", - "jest-environment-jsdom": "^29.7.0", + "jest-environment-jsdom": "^29.6.4", "rimraf": "^5.0.1", "sass": "^1.66.1", "sass-loader": "13.2.2", diff --git a/package-lock.json b/package-lock.json index 1ec2b973d3..fad2e102ba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,14 +18,14 @@ "date-fns": "^2.30.0", "dotenv": "^16.3.1", "moment": "^2.29.4", - "npm-check-updates": "^16.14.0" + "npm-check-updates": "^16.13.3" }, "devDependencies": { "@commitlint/cli": "^17.7.1", "@commitlint/config-conventional": "^17.7.0", "@typescript-eslint/eslint-plugin": "^5.62.0", "cspell": "^6.31.3", - "eslint": "^8.49.0", + "eslint": "^8.48.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-cypress": "^2.14.0", "eslint-plugin-import": "^2.28.1", @@ -607,15 +607,15 @@ "dev": true }, "node_modules/@cspell/dict-companies": { - "version": "3.0.22", - "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.0.22.tgz", - "integrity": "sha512-hUN4polifWv1IIXb4NDNXctr/smJ7/1IrOy0rU6fOwPCY/u9DkQO+xeASzuFJasvs6v0Pub/y+NUQLaeXNRW6g==", + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.0.21.tgz", + "integrity": "sha512-u9b7qtCWYS728WqiJeAucJcjRs16Y1yGGwagS/w59SV25R0rXbXbPbQuX8wYDcaeIO8uRHGkbSWngx6O4qFoCQ==", "dev": true }, "node_modules/@cspell/dict-cpp": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-5.0.5.tgz", - "integrity": "sha512-ojCpQ4z+sHHLJYfvA3SApqQ1BjO/k3TUdDgqR3sVhFl5qjT9yz1/srBNzqCaBBSz/fiO5A8NKdSA9+IFrUHcig==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-5.0.4.tgz", + "integrity": "sha512-Vmz/CCb2d91ES5juaO8+CFWeTa2AFsbpR8bkCPJq+P8cRP16+37tY0zNXEBSK/1ur4MakaRf76jeQBijpZxw0Q==", "dev": true }, "node_modules/@cspell/dict-cryptocurrencies": { @@ -775,9 +775,9 @@ "dev": true }, "node_modules/@cspell/dict-node": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@cspell/dict-node/-/dict-node-4.0.3.tgz", - "integrity": "sha512-sFlUNI5kOogy49KtPg8SMQYirDGIAoKBO3+cDLIwD4MLdsWy1q0upc7pzGht3mrjuyMiPRUV14Bb0rkVLrxOhg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-node/-/dict-node-4.0.2.tgz", + "integrity": "sha512-FEQJ4TnMcXEFslqBQkXa5HposMoCGsiBv2ux4IZuIXgadXeHKHUHk60iarWpjhzNzQLyN2GD7NoRMd12bK3Llw==", "dev": true }, "node_modules/@cspell/dict-npm": { @@ -805,9 +805,9 @@ "dev": true }, "node_modules/@cspell/dict-python": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.1.8.tgz", - "integrity": "sha512-yFrO9gGI3KIbw0Y1odAEtagrzmthjJVank9B7qlsSQvN78RgD1JQQycTadNWpzdjCj+JuiiH8pJBFWflweZoxw==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.1.7.tgz", + "integrity": "sha512-8GkO7/w1QEpu4Y1GTHGYHrwfc/ZdiBRw7D/BGYCIiOoQPLi0YxMke7wzRC3j246yrzLt28ntDBjr4fB3+uFZtQ==", "dev": true, "dependencies": { "@cspell/dict-data-science": "^1.0.11" @@ -838,9 +838,9 @@ "dev": true }, "node_modules/@cspell/dict-software-terms": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-3.2.3.tgz", - "integrity": "sha512-L1Fjkt+Q5MnjEOGPXQxdT4+8ieDBcaHSjh1gHzxdqFXTOnnfvsLUa5ykuv/fG06b/G/yget1066ftKosMaPcXA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-3.2.2.tgz", + "integrity": "sha512-DmdS/qAyJVmKKku4ab89HVZhsvRIk84HoPUVIZ/zJhmuCO+LF45Ylzy1/7G32MYLjbG/o1Ze3UvbaE9HY4FKKA==", "dev": true }, "node_modules/@cspell/dict-sql": { @@ -967,9 +967,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", - "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", + "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -1021,9 +1021,9 @@ "dev": true }, "node_modules/@eslint/js": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", - "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", + "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2835,9 +2835,9 @@ "dev": true }, "node_modules/cosmiconfig": { - "version": "8.3.5", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.5.tgz", - "integrity": "sha512-A5Xry3xfS96wy2qbiLkQLAg4JUrR2wvfybxj6yqLmrUfMAvhS3MZxIP2oQn0grgYIvJqzpeTEWu4vK0t+12NNw==", + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.4.tgz", + "integrity": "sha512-SF+2P8+o/PTV05rgsAjDzL4OFdVXAulSfC/L19VaeVT7+tpOOSscCt2QLxDZ+CLxF2WOiq6y1K5asvs8qUJT/Q==", "dev": true, "dependencies": { "import-fresh": "^3.3.0", @@ -3163,9 +3163,9 @@ } }, "node_modules/cypress/node_modules/@types/node": { - "version": "16.18.50", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.50.tgz", - "integrity": "sha512-OiDU5xRgYTJ203v4cprTs0RwOCd5c5Zjv+K5P8KSqfiCsB1W3LcamTUMcnQarpq5kOYbhHfSOgIEJvdPyb5xyw==" + "version": "16.18.48", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.48.tgz", + "integrity": "sha512-mlaecDKQ7rIZrYD7iiKNdzFb6e/qD5I9U1rAhq+Fd+DWvYVs+G2kv74UFHmSOlg5+i/vF3XxuR522V4u8BqO+Q==" }, "node_modules/cypress/node_modules/commander": { "version": "6.2.1", @@ -3384,27 +3384,12 @@ "node": ">=10" } }, - "node_modules/define-data-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.0.1.tgz", - "integrity": "sha512-22M+6zEspQHx10bfFQl2ET39IvfuQ7+rZIH7+ard8fCC4hPmkOSy+8JhKxBRLaWUziJ0O63NTYT97LR8zUfPTw==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", "dev": true, "dependencies": { - "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -3700,16 +3685,16 @@ } }, "node_modules/eslint": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", - "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", + "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.49.0", - "@humanwhocodes/config-array": "^0.11.11", + "@eslint/js": "8.48.0", + "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", @@ -6880,9 +6865,9 @@ } }, "node_modules/npm-check-updates": { - "version": "16.14.0", - "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.14.0.tgz", - "integrity": "sha512-0R4S0qsx2FhuSiIYloHc7RQwfZpzO4jdL3rUoYwbOkx5fBc9u77GHHS0FlXYpczHR/kPYmmB/CRkFElOofVeSg==", + "version": "16.13.3", + "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.13.3.tgz", + "integrity": "sha512-l3FQtm+ZtDwqtK2r27vCuNdtnoDsXzk8D2WczvrAJy2bGPZJvRmuUa/Q9Gv+AbZV0IHSNJD2oHtQqUeqQRhEsw==", "dependencies": { "chalk": "^5.3.0", "cli-table3": "^0.6.3", @@ -6912,7 +6897,6 @@ "semver-utils": "^1.1.4", "source-map-support": "^0.5.21", "spawn-please": "^2.0.1", - "strip-ansi": "^7.1.0", "strip-json-comments": "^5.0.1", "untildify": "^4.0.0", "update-notifier": "^6.0.2" @@ -6925,17 +6909,6 @@ "node": ">=14.14" } }, - "node_modules/npm-check-updates/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/npm-check-updates/node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -7013,20 +6986,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/npm-check-updates/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/npm-check-updates/node_modules/strip-json-comments": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.1.tgz", @@ -8006,14 +7965,14 @@ "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" }, "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -8360,19 +8319,6 @@ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, - "node_modules/set-function-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.0.tgz", - "integrity": "sha512-WmS8UHojv5s1eSoRSmzO5zzgDq8PE1/X/ij0k+9fMYmINCc6+j+SF3Om8YyucKn2yjnK4ItNZOoQycNnHsZJTw==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", diff --git a/package.json b/package.json index ed4157eb33..4e998278d4 100644 --- a/package.json +++ b/package.json @@ -41,14 +41,14 @@ "date-fns": "^2.30.0", "dotenv": "^16.3.1", "moment": "^2.29.4", - "npm-check-updates": "^16.14.0" + "npm-check-updates": "^16.13.3" }, "devDependencies": { "@commitlint/cli": "^17.7.1", "@commitlint/config-conventional": "^17.7.0", "@typescript-eslint/eslint-plugin": "^5.62.0", "cspell": "^6.31.3", - "eslint": "^8.49.0", + "eslint": "^8.48.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-cypress": "^2.14.0", "eslint-plugin-import": "^2.28.1", diff --git a/portal-api/package-lock.json b/portal-api/package-lock.json index 95e3f07d5b..147e2626cd 100644 --- a/portal-api/package-lock.json +++ b/portal-api/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@azure/storage-file-share": "12.14.0", "axios": "^1.5.0", - "axios-mock-adapter": "^1.22.0", + "axios-mock-adapter": "^1.21.5", "comma-number": "^2.1.0", "compression": "^1.7.4", "cors": "2.8.5", @@ -19,7 +19,7 @@ "dotenv": "16.0.3", "express": "4.18.2", "express-mongo-sanitize": "^2.2.0", - "express-rate-limit": "^6.11.2", + "express-rate-limit": "^6.11.0", "filesize": "^8.0.7", "joi": "^17.10.1", "jsonwebtoken": "^9.0.2", @@ -37,10 +37,10 @@ "xss": "^1.0.14" }, "devDependencies": { - "eslint": "^8.49.0", + "eslint": "^8.48.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.28.1", - "jest": "^29.7.0", + "jest": "^29.6.4", "jest-when": "^3.6.0", "prettier": "^2.8.8", "supertest": "6.3.3" @@ -277,21 +277,21 @@ } }, "node_modules/@babel/core": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.17.tgz", - "integrity": "sha512-2EENLmhpwplDux5PSsZnSbnSkB3tZ6QTksgO25xwEL7pIDcNOMhF5v/s6RzwjMZzZzw9Ofc30gHv5ChCC8pifQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.15.tgz", + "integrity": "sha512-PtZqMmgRrvj8ruoEOIwVA3yoF91O+Hgw9o7DAUTNBA6Mo2jpu31clx9a7Nz/9JznqetTR6zwfC4L3LAjKQXUwA==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.22.13", "@babel/generator": "^7.22.15", "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.22.17", + "@babel/helper-module-transforms": "^7.22.15", "@babel/helpers": "^7.22.15", - "@babel/parser": "^7.22.16", + "@babel/parser": "^7.22.15", "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.17", - "@babel/types": "^7.22.17", + "@babel/traverse": "^7.22.15", + "@babel/types": "^7.22.15", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -413,9 +413,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.17.tgz", - "integrity": "sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.15.tgz", + "integrity": "sha512-l1UiX4UyHSFsYt17iQ3Se5pQQZZHa22zyIXURmvkmLCD4t/aU+dvNWHatKac/D9Vm9UES7nvIqHs4jZqKviUmQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", @@ -805,9 +805,9 @@ } }, "node_modules/@babel/traverse": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.17.tgz", - "integrity": "sha512-xK4Uwm0JnAMvxYZxOVecss85WxTEIbTa7bnGyf/+EgCL5Zt3U7htUpEOWv9detPlamGKuRzCqw74xVglDWpPdg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.15.tgz", + "integrity": "sha512-DdHPwvJY0sEeN4xJU5uRLmZjgMMDIvMPniLuYzUVXj/GGzysPl0/fwt44JBkyUIzGJPV8QgHMcQdQ34XFuKTYQ==", "dev": true, "dependencies": { "@babel/code-frame": "^7.22.13", @@ -816,8 +816,8 @@ "@babel/helper-function-name": "^7.22.5", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.16", - "@babel/types": "^7.22.17", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -858,9 +858,9 @@ "dev": true }, "node_modules/@babel/types": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.17.tgz", - "integrity": "sha512-YSQPHLFtQNE5xN9tHuZnzu8vPr61wVTBZdfv1meex1NBosa4iT05k/Jw06ddJugi4bk7The/oSwQGFcksmEJQg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.15.tgz", + "integrity": "sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", @@ -893,9 +893,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", - "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", + "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -948,9 +948,9 @@ "dev": true }, "node_modules/@eslint/js": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", - "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", + "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1134,16 +1134,16 @@ } }, "node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.4.tgz", + "integrity": "sha512-wNK6gC0Ha9QeEPSkeJedQuTQqxZYnDPuDcDhVuVatRvMkL4D0VTvFVZj+Yuh6caG2aOfzkUZ36KtCmLNtR02hw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3", "slash": "^3.0.0" }, "engines": { @@ -1151,15 +1151,15 @@ } }, "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.4.tgz", + "integrity": "sha512-U/vq5ccNTSVgYH7mHnodHmCffGWHJnz/E1BEWlLuK5pM4FZmGfBn/nrJGLjUsSmyx3otCeqc1T31F4y08AMDLg==", "dev": true, "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", + "@jest/console": "^29.6.4", + "@jest/reporters": "^29.6.4", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -1167,21 +1167,21 @@ "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", + "jest-changed-files": "^29.6.3", + "jest-config": "^29.6.4", + "jest-haste-map": "^29.6.4", + "jest-message-util": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", + "jest-resolve": "^29.6.4", + "jest-resolve-dependencies": "^29.6.4", + "jest-runner": "^29.6.4", + "jest-runtime": "^29.6.4", + "jest-snapshot": "^29.6.4", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", + "jest-watcher": "^29.6.4", "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", + "pretty-format": "^29.6.3", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -1198,37 +1198,37 @@ } }, "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.4.tgz", + "integrity": "sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ==", "dev": true, "dependencies": { - "@jest/fake-timers": "^29.7.0", + "@jest/fake-timers": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.7.0" + "jest-mock": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.4.tgz", + "integrity": "sha512-Warhsa7d23+3X5bLbrbYvaehcgX5TLYhI03JKoedTiI8uJU4IhqYBWF7OSSgUyz4IgLpUYPkK0AehA5/fRclAA==", "dev": true, "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" + "expect": "^29.6.4", + "jest-snapshot": "^29.6.4" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.4.tgz", + "integrity": "sha512-FEhkJhqtvBwgSpiTrocquJCdXPsyvNKcl/n7A3u7X4pVoF4bswm11c9d4AV+kfq2Gpv/mM8x7E7DsRvH+djkrg==", "dev": true, "dependencies": { "jest-get-type": "^29.6.3" @@ -1238,47 +1238,47 @@ } }, "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.4.tgz", + "integrity": "sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" + "jest-message-util": "^29.6.3", + "jest-mock": "^29.6.3", + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.4.tgz", + "integrity": "sha512-wVIn5bdtjlChhXAzVXavcY/3PEjf4VqM174BM3eGL5kMxLiZD5CLnbmkEyA1Dwh9q8XjP6E8RwjBsY/iCWrWsA==", "dev": true, "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", + "@jest/environment": "^29.6.4", + "@jest/expect": "^29.6.4", "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" + "jest-mock": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.4.tgz", + "integrity": "sha512-sxUjWxm7QdchdrD3NfWKrL8FBsortZeibSJv4XLjESOOjSUOkjQcb0ZHJwfhEGIvBvTluTzfG2yZWZhkrXJu8g==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", + "@jest/console": "^29.6.4", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", @@ -1292,9 +1292,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3", + "jest-worker": "^29.6.4", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -1339,12 +1339,12 @@ } }, "node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.4.tgz", + "integrity": "sha512-uQ1C0AUEN90/dsyEirgMLlouROgSY+Wc/JanVVk0OiUKa5UFh7sJpMEM3aoUBAz2BRNvUJ8j3d294WFuRxSyOQ==", "dev": true, "dependencies": { - "@jest/console": "^29.7.0", + "@jest/console": "^29.6.4", "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" @@ -1354,14 +1354,14 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.4.tgz", + "integrity": "sha512-E84M6LbpcRq3fT4ckfKs9ryVanwkaIB0Ws9bw3/yP4seRLg/VaCZ/LgW0MCq5wwk4/iP/qnilD41aj2fsw2RMg==", "dev": true, "dependencies": { - "@jest/test-result": "^29.7.0", + "@jest/test-result": "^29.6.4", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", + "jest-haste-map": "^29.6.4", "slash": "^3.0.0" }, "engines": { @@ -1369,9 +1369,9 @@ } }, "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz", + "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -1382,9 +1382,9 @@ "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", + "jest-haste-map": "^29.6.4", "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", + "jest-util": "^29.6.3", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -1495,9 +1495,9 @@ } }, "node_modules/@opentelemetry/api": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.6.0.tgz", - "integrity": "sha512-OWlrQAnWn9577PhVgqjUvMr1pg57Bc4jv0iL4w0PRuOSRvq67rvHW9Ie/dZVMvCzhSCB+UxhcY/PmCmFj33Q+g==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.4.1.tgz", + "integrity": "sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA==", "engines": { "node": ">=8.0.0" } @@ -1625,9 +1625,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.6.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.0.tgz", - "integrity": "sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==" + "version": "20.5.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.9.tgz", + "integrity": "sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==" }, "node_modules/@types/node-fetch": { "version": "2.6.4", @@ -1969,9 +1969,9 @@ } }, "node_modules/axios-mock-adapter": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/axios-mock-adapter/-/axios-mock-adapter-1.22.0.tgz", - "integrity": "sha512-dmI0KbkyAhntUR05YY96qg2H6gg0XMl2+qTW0xmYg6Up+BFBAJYRLROMXRdDEL06/Wqwa0TJThAYvFtSFdRCZw==", + "version": "1.21.5", + "resolved": "https://registry.npmjs.org/axios-mock-adapter/-/axios-mock-adapter-1.21.5.tgz", + "integrity": "sha512-5NI1V/VK+8+JeTF8niqOowuysA4b8mGzdlMN/QnTnoXbYh4HZSNiopsDclN2g/m85+G++IrEtUdZaQ3GnaMsSA==", "dependencies": { "fast-deep-equal": "^3.1.3", "is-buffer": "^2.0.5" @@ -1981,12 +1981,12 @@ } }, "node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.4.tgz", + "integrity": "sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==", "dev": true, "dependencies": { - "@jest/transform": "^29.7.0", + "@jest/transform": "^29.6.4", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", @@ -2305,9 +2305,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001534", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001534.tgz", - "integrity": "sha512-vlPVrhsCS7XaSh2VvWluIQEzVhefrUQcEsQWSS5A5V+dM07uv1qHeQzAOTGIMy9i3e9bH15+muvI/UHojVgS/Q==", + "version": "1.0.30001529", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001529.tgz", + "integrity": "sha512-n2pUQYGAkrLG4QYj2desAh+NqsJpHbNmVZz87imptDdxLAtjxary7Df/psdfyDGmskJK/9Dt9cPnx5RZ3CU4Og==", "dev": true, "funding": [ { @@ -2615,27 +2615,6 @@ "node": ">= 0.10" } }, - "node_modules/create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -2706,27 +2685,12 @@ "node": ">=0.10.0" } }, - "node_modules/define-data-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.0.1.tgz", - "integrity": "sha512-22M+6zEspQHx10bfFQl2ET39IvfuQ7+rZIH7+ard8fCC4hPmkOSy+8JhKxBRLaWUziJ0O63NTYT97LR8zUfPTw==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", "dev": true, "dependencies": { - "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -2883,9 +2847,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.519", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.519.tgz", - "integrity": "sha512-kqs9oGYL4UFVkLKhqCTgBCYZv+wZ374yABDMqlDda9HvlkQxvSr7kgf4hfWVjMieDbX+1MwPHFBsOGCMIBaFKg==", + "version": "1.4.512", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.512.tgz", + "integrity": "sha512-1W8wRbYlQE4ph7eoj3TJ+uqwO6+xvAE/L+KGU7WTQQvX3tnSIGZAb90MTsMoJqzntamiwJhBAj4WZmygXhsOUg==", "dev": true }, "node_modules/emittery": { @@ -3053,16 +3017,16 @@ } }, "node_modules/eslint": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", - "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", + "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.49.0", - "@humanwhocodes/config-array": "^0.11.11", + "@eslint/js": "8.48.0", + "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", @@ -3413,16 +3377,16 @@ } }, "node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.4.tgz", + "integrity": "sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA==", "dev": true, "dependencies": { - "@jest/expect-utils": "^29.7.0", + "@jest/expect-utils": "^29.6.4", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" + "jest-matcher-utils": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -3478,9 +3442,9 @@ } }, "node_modules/express-rate-limit": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.2.tgz", - "integrity": "sha512-a7uwwfNTh1U60ssiIkuLFWHt4hAC5yxlLGU2VP0X4YNlyEDZAqF4tK3GD3NSitVBrCQmQ0++0uOyFOgC2y4DDw==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.0.tgz", + "integrity": "sha512-H9afltGTaEZcvenAB5LFgb/ysTMHUzMxoB3TJM6UHP5FtAP1p2+heMj1xwTei54Zm4I9I/2qsS5m+XrdKQp/Hw==", "engines": { "node": ">= 14" }, @@ -4610,15 +4574,15 @@ } }, "node_modules/jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.4.tgz", + "integrity": "sha512-tEFhVQFF/bzoYV1YuGyzLPZ6vlPrdfvDmmAxudA1dLEuiztqg2Rkx20vkKY32xiDROcD2KXlgZ7Cu8RPeEHRKw==", "dev": true, "dependencies": { - "@jest/core": "^29.7.0", + "@jest/core": "^29.6.4", "@jest/types": "^29.6.3", "import-local": "^3.0.2", - "jest-cli": "^29.7.0" + "jest-cli": "^29.6.4" }, "bin": { "jest": "bin/jest.js" @@ -4636,13 +4600,13 @@ } }, "node_modules/jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.6.3.tgz", + "integrity": "sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg==", "dev": true, "dependencies": { "execa": "^5.0.0", - "jest-util": "^29.7.0", + "jest-util": "^29.6.3", "p-limit": "^3.1.0" }, "engines": { @@ -4650,28 +4614,28 @@ } }, "node_modules/jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.4.tgz", + "integrity": "sha512-YXNrRyntVUgDfZbjXWBMPslX1mQ8MrSG0oM/Y06j9EYubODIyHWP8hMUbjbZ19M3M+zamqEur7O80HODwACoJw==", "dev": true, "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", + "@jest/environment": "^29.6.4", + "@jest/expect": "^29.6.4", + "@jest/test-result": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", + "jest-each": "^29.6.3", + "jest-matcher-utils": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-runtime": "^29.6.4", + "jest-snapshot": "^29.6.4", + "jest-util": "^29.6.3", "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", + "pretty-format": "^29.6.3", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" @@ -4681,21 +4645,22 @@ } }, "node_modules/jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.4.tgz", + "integrity": "sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ==", "dev": true, "dependencies": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", + "@jest/core": "^29.6.4", + "@jest/test-result": "^29.6.4", "@jest/types": "^29.6.3", "chalk": "^4.0.0", - "create-jest": "^29.7.0", "exit": "^0.1.2", + "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", + "jest-config": "^29.6.4", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", + "prompts": "^2.0.1", "yargs": "^17.3.1" }, "bin": { @@ -4714,31 +4679,31 @@ } }, "node_modules/jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.4.tgz", + "integrity": "sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", + "@jest/test-sequencer": "^29.6.4", "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", + "babel-jest": "^29.6.4", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", + "jest-circus": "^29.6.4", + "jest-environment-node": "^29.6.4", "jest-get-type": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", + "jest-resolve": "^29.6.4", + "jest-runner": "^29.6.4", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", + "pretty-format": "^29.6.3", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -4759,24 +4724,24 @@ } }, "node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.4.tgz", + "integrity": "sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==", "dev": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.6.3.tgz", + "integrity": "sha512-2+H+GOTQBEm2+qFSQ7Ma+BvyV+waiIFxmZF5LdpBsAEjWX8QYjSCa4FrkIYtbfXUJJJnFCYrOtt6TZ+IAiTjBQ==", "dev": true, "dependencies": { "detect-newline": "^3.0.0" @@ -4786,33 +4751,33 @@ } }, "node_modules/jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.3.tgz", + "integrity": "sha512-KoXfJ42k8cqbkfshW7sSHcdfnv5agDdHCPA87ZBdmHP+zJstTJc0ttQaJ/x7zK6noAL76hOuTIJ6ZkQRS5dcyg==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" + "jest-util": "^29.6.3", + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.4.tgz", + "integrity": "sha512-i7SbpH2dEIFGNmxGCpSc2w9cA4qVD+wfvg2ZnfQ7XVrKL0NA5uDVBIiGH8SR4F0dKEv/0qI5r+aDomDf04DpEQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", + "@jest/environment": "^29.6.4", + "@jest/fake-timers": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" + "jest-mock": "^29.6.3", + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -4828,9 +4793,9 @@ } }, "node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz", + "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -4840,8 +4805,8 @@ "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", + "jest-util": "^29.6.3", + "jest-worker": "^29.6.4", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -4853,37 +4818,37 @@ } }, "node_modules/jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.3.tgz", + "integrity": "sha512-0kfbESIHXYdhAdpLsW7xdwmYhLf1BRu4AA118/OxFm0Ho1b2RcTmO4oF6aAMaxpxdxnJ3zve2rgwzNBD4Zbm7Q==", "dev": true, "dependencies": { "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.4.tgz", + "integrity": "sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.7.0", + "jest-diff": "^29.6.4", "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.3.tgz", + "integrity": "sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", @@ -4892,7 +4857,7 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", + "pretty-format": "^29.6.3", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -4901,14 +4866,14 @@ } }, "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.3.tgz", + "integrity": "sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", - "jest-util": "^29.7.0" + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -4941,17 +4906,17 @@ } }, "node_modules/jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.4.tgz", + "integrity": "sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q==", "dev": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", + "jest-haste-map": "^29.6.4", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" @@ -4961,43 +4926,43 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.4.tgz", + "integrity": "sha512-7+6eAmr1ZBF3vOAJVsfLj1QdqeXG+WYhidfLHBRZqGN24MFRIiKG20ItpLw2qRAsW/D2ZUUmCNf6irUr/v6KHA==", "dev": true, "dependencies": { "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" + "jest-snapshot": "^29.6.4" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.4.tgz", + "integrity": "sha512-SDaLrMmtVlQYDuG0iSPYLycG8P9jLI+fRm8AF/xPKhYDB2g6xDWjXBrR5M8gEWsK6KVFlebpZ4QsrxdyIX1Jaw==", "dev": true, "dependencies": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", + "@jest/console": "^29.6.4", + "@jest/environment": "^29.6.4", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", + "jest-docblock": "^29.6.3", + "jest-environment-node": "^29.6.4", + "jest-haste-map": "^29.6.4", + "jest-leak-detector": "^29.6.3", + "jest-message-util": "^29.6.3", + "jest-resolve": "^29.6.4", + "jest-runtime": "^29.6.4", + "jest-util": "^29.6.3", + "jest-watcher": "^29.6.4", + "jest-worker": "^29.6.4", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -5006,17 +4971,17 @@ } }, "node_modules/jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.4.tgz", + "integrity": "sha512-s/QxMBLvmwLdchKEjcLfwzP7h+jsHvNEtxGP5P+Fl1FMaJX2jMiIqe4rJw4tFprzCwuSvVUo9bn0uj4gNRXsbA==", "dev": true, "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", + "@jest/environment": "^29.6.4", + "@jest/fake-timers": "^29.6.4", + "@jest/globals": "^29.6.4", "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", @@ -5024,13 +4989,13 @@ "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", + "jest-haste-map": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-mock": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", + "jest-resolve": "^29.6.4", + "jest-snapshot": "^29.6.4", + "jest-util": "^29.6.3", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -5039,9 +5004,9 @@ } }, "node_modules/jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.4.tgz", + "integrity": "sha512-VC1N8ED7+4uboUKGIDsbvNAZb6LakgIPgAF4RSpF13dN6YaMokfRqO+BaqK4zIh6X3JffgwbzuGqDEjHm/MrvA==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -5049,20 +5014,20 @@ "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", + "@jest/expect-utils": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.7.0", + "expect": "^29.6.4", "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", + "jest-diff": "^29.6.4", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", + "jest-matcher-utils": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3", "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", + "pretty-format": "^29.6.3", "semver": "^7.5.3" }, "engines": { @@ -5103,9 +5068,9 @@ "dev": true }, "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", + "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -5120,9 +5085,9 @@ } }, "node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz", + "integrity": "sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -5130,7 +5095,7 @@ "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^29.7.0" + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -5149,18 +5114,18 @@ } }, "node_modules/jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.4.tgz", + "integrity": "sha512-oqUWvx6+On04ShsT00Ir9T4/FvBeEh2M9PTubgITPxDa739p4hoQweWPRGyYeaojgT0xTpZKF0Y/rSY1UgMxvQ==", "dev": true, "dependencies": { - "@jest/test-result": "^29.7.0", + "@jest/test-result": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.7.0", + "jest-util": "^29.6.3", "string-length": "^4.0.1" }, "engines": { @@ -5177,13 +5142,13 @@ } }, "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", + "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==", "dev": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.7.0", + "jest-util": "^29.6.3", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -6396,9 +6361,9 @@ } }, "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", + "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", @@ -6594,14 +6559,14 @@ "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" }, "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -6852,19 +6817,6 @@ "node": ">= 0.8.0" } }, - "node_modules/set-function-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.0.tgz", - "integrity": "sha512-WmS8UHojv5s1eSoRSmzO5zzgDq8PE1/X/ij0k+9fMYmINCc6+j+SF3Om8YyucKn2yjnK4ItNZOoQycNnHsZJTw==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", diff --git a/portal-api/package.json b/portal-api/package.json index 88b1329cb9..0720c51f40 100644 --- a/portal-api/package.json +++ b/portal-api/package.json @@ -38,7 +38,7 @@ "dependencies": { "@azure/storage-file-share": "12.14.0", "axios": "^1.5.0", - "axios-mock-adapter": "^1.22.0", + "axios-mock-adapter": "^1.21.5", "comma-number": "^2.1.0", "compression": "^1.7.4", "cors": "2.8.5", @@ -46,7 +46,7 @@ "dotenv": "16.0.3", "express": "4.18.2", "express-mongo-sanitize": "^2.2.0", - "express-rate-limit": "^6.11.2", + "express-rate-limit": "^6.11.0", "filesize": "^8.0.7", "joi": "^17.10.1", "jsonwebtoken": "^9.0.2", @@ -64,10 +64,10 @@ "xss": "^1.0.14" }, "devDependencies": { - "eslint": "^8.49.0", + "eslint": "^8.48.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.28.1", - "jest": "^29.7.0", + "jest": "^29.6.4", "jest-when": "^3.6.0", "prettier": "^2.8.8", "supertest": "6.3.3" diff --git a/portal/package-lock.json b/portal/package-lock.json index 705ffcd7a1..0888254583 100644 --- a/portal/package-lock.json +++ b/portal/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@ministryofjustice/frontend": "1.8.0", "axios": "^1.5.0", - "axios-mock-adapter": "^1.22.0", + "axios-mock-adapter": "^1.21.5", "cheerio": "^1.0.0-rc.12", "connect-flash": "0.1.1", "connect-redis": "5.2.0", @@ -20,7 +20,7 @@ "csurf": "^1.11.0", "dotenv": "16.0.3", "express": "^4.18.2", - "express-rate-limit": "^6.11.2", + "express-rate-limit": "^6.11.0", "express-session": "1.17.3", "form-data": "4.0.0", "govuk-frontend": "4.6.0", @@ -48,12 +48,12 @@ "babel-jest": "29.5.0", "babel-loader": "9.1.2", "css-minimizer-webpack-plugin": "^5.0.1", - "eslint": "^8.49.0", + "eslint": "^8.48.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.28.1", "file-loader": "^6.2.0", "jest": "29.5.0", - "jest-environment-jsdom": "^29.7.0", + "jest-environment-jsdom": "^29.6.4", "rimraf": "^5.0.1", "sass": "^1.66.1", "sass-loader": "13.2.2", @@ -313,9 +313,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.17.tgz", - "integrity": "sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.15.tgz", + "integrity": "sha512-l1UiX4UyHSFsYt17iQ3Se5pQQZZHa22zyIXURmvkmLCD4t/aU+dvNWHatKac/D9Vm9UES7nvIqHs4jZqKviUmQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", @@ -353,14 +353,14 @@ } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.17.tgz", - "integrity": "sha512-bxH77R5gjH3Nkde6/LuncQoLaP16THYPscurp1S8z7S9ZgezCyV3G8Hc+TZiCmY8pz4fp8CvKSgtJMW0FkLAxA==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz", + "integrity": "sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-wrap-function": "^7.22.17" + "@babel/helper-wrap-function": "^7.22.9" }, "engines": { "node": ">=6.9.0" @@ -450,14 +450,14 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.17.tgz", - "integrity": "sha512-nAhoheCMlrqU41tAojw9GpVEKDlTS8r3lzFmF0lP52LwblCPbuFSO7nGIZoIcoU5NIm1ABrna0cJExE4Ay6l2Q==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.10.tgz", + "integrity": "sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ==", "dev": true, "dependencies": { "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.17" + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.10" }, "engines": { "node": ">=6.9.0" @@ -1728,9 +1728,9 @@ } }, "node_modules/@babel/traverse": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.17.tgz", - "integrity": "sha512-xK4Uwm0JnAMvxYZxOVecss85WxTEIbTa7bnGyf/+EgCL5Zt3U7htUpEOWv9detPlamGKuRzCqw74xVglDWpPdg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.15.tgz", + "integrity": "sha512-DdHPwvJY0sEeN4xJU5uRLmZjgMMDIvMPniLuYzUVXj/GGzysPl0/fwt44JBkyUIzGJPV8QgHMcQdQ34XFuKTYQ==", "dev": true, "dependencies": { "@babel/code-frame": "^7.22.13", @@ -1739,8 +1739,8 @@ "@babel/helper-function-name": "^7.22.5", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.16", - "@babel/types": "^7.22.17", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1749,9 +1749,9 @@ } }, "node_modules/@babel/types": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.17.tgz", - "integrity": "sha512-YSQPHLFtQNE5xN9tHuZnzu8vPr61wVTBZdfv1meex1NBosa4iT05k/Jw06ddJugi4bk7The/oSwQGFcksmEJQg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.15.tgz", + "integrity": "sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", @@ -1793,9 +1793,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", - "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", + "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -1870,9 +1870,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", - "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", + "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2046,16 +2046,16 @@ } }, "node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.4.tgz", + "integrity": "sha512-wNK6gC0Ha9QeEPSkeJedQuTQqxZYnDPuDcDhVuVatRvMkL4D0VTvFVZj+Yuh6caG2aOfzkUZ36KtCmLNtR02hw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3", "slash": "^3.0.0" }, "engines": { @@ -2133,15 +2133,15 @@ } }, "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.4.tgz", + "integrity": "sha512-U/vq5ccNTSVgYH7mHnodHmCffGWHJnz/E1BEWlLuK5pM4FZmGfBn/nrJGLjUsSmyx3otCeqc1T31F4y08AMDLg==", "dev": true, "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", + "@jest/console": "^29.6.4", + "@jest/reporters": "^29.6.4", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -2149,21 +2149,21 @@ "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", + "jest-changed-files": "^29.6.3", + "jest-config": "^29.6.4", + "jest-haste-map": "^29.6.4", + "jest-message-util": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", + "jest-resolve": "^29.6.4", + "jest-resolve-dependencies": "^29.6.4", + "jest-runner": "^29.6.4", + "jest-runtime": "^29.6.4", + "jest-snapshot": "^29.6.4", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", + "jest-watcher": "^29.6.4", "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", + "pretty-format": "^29.6.3", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -2250,37 +2250,37 @@ } }, "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.4.tgz", + "integrity": "sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ==", "dev": true, "dependencies": { - "@jest/fake-timers": "^29.7.0", + "@jest/fake-timers": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.7.0" + "jest-mock": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.4.tgz", + "integrity": "sha512-Warhsa7d23+3X5bLbrbYvaehcgX5TLYhI03JKoedTiI8uJU4IhqYBWF7OSSgUyz4IgLpUYPkK0AehA5/fRclAA==", "dev": true, "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" + "expect": "^29.6.4", + "jest-snapshot": "^29.6.4" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.4.tgz", + "integrity": "sha512-FEhkJhqtvBwgSpiTrocquJCdXPsyvNKcl/n7A3u7X4pVoF4bswm11c9d4AV+kfq2Gpv/mM8x7E7DsRvH+djkrg==", "dev": true, "dependencies": { "jest-get-type": "^29.6.3" @@ -2290,47 +2290,47 @@ } }, "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.4.tgz", + "integrity": "sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" + "jest-message-util": "^29.6.3", + "jest-mock": "^29.6.3", + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.4.tgz", + "integrity": "sha512-wVIn5bdtjlChhXAzVXavcY/3PEjf4VqM174BM3eGL5kMxLiZD5CLnbmkEyA1Dwh9q8XjP6E8RwjBsY/iCWrWsA==", "dev": true, "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", + "@jest/environment": "^29.6.4", + "@jest/expect": "^29.6.4", "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" + "jest-mock": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.4.tgz", + "integrity": "sha512-sxUjWxm7QdchdrD3NfWKrL8FBsortZeibSJv4XLjESOOjSUOkjQcb0ZHJwfhEGIvBvTluTzfG2yZWZhkrXJu8g==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", + "@jest/console": "^29.6.4", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", @@ -2344,9 +2344,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3", + "jest-worker": "^29.6.4", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -2510,12 +2510,12 @@ } }, "node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.4.tgz", + "integrity": "sha512-uQ1C0AUEN90/dsyEirgMLlouROgSY+Wc/JanVVk0OiUKa5UFh7sJpMEM3aoUBAz2BRNvUJ8j3d294WFuRxSyOQ==", "dev": true, "dependencies": { - "@jest/console": "^29.7.0", + "@jest/console": "^29.6.4", "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" @@ -2525,14 +2525,14 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.4.tgz", + "integrity": "sha512-E84M6LbpcRq3fT4ckfKs9ryVanwkaIB0Ws9bw3/yP4seRLg/VaCZ/LgW0MCq5wwk4/iP/qnilD41aj2fsw2RMg==", "dev": true, "dependencies": { - "@jest/test-result": "^29.7.0", + "@jest/test-result": "^29.6.4", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", + "jest-haste-map": "^29.6.4", "slash": "^3.0.0" }, "engines": { @@ -2540,9 +2540,9 @@ } }, "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz", + "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -2553,9 +2553,9 @@ "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", + "jest-haste-map": "^29.6.4", "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", + "jest-util": "^29.6.3", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -3030,9 +3030,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.6.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.0.tgz", - "integrity": "sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==", + "version": "20.5.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.9.tgz", + "integrity": "sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==", "dev": true }, "node_modules/@types/stack-utils": { @@ -3042,9 +3042,9 @@ "dev": true }, "node_modules/@types/tough-cookie": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.3.tgz", - "integrity": "sha512-THo502dA5PzG/sfQH+42Lw3fvmYkceefOspdCwpHRul8ik2Jv1K8I5OZz1AT3/rs46kwgMCe9bSBmDLYkkOMGg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", + "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==", "dev": true }, "node_modules/@types/yargs": { @@ -3628,9 +3628,9 @@ } }, "node_modules/axios-mock-adapter": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/axios-mock-adapter/-/axios-mock-adapter-1.22.0.tgz", - "integrity": "sha512-dmI0KbkyAhntUR05YY96qg2H6gg0XMl2+qTW0xmYg6Up+BFBAJYRLROMXRdDEL06/Wqwa0TJThAYvFtSFdRCZw==", + "version": "1.21.5", + "resolved": "https://registry.npmjs.org/axios-mock-adapter/-/axios-mock-adapter-1.21.5.tgz", + "integrity": "sha512-5NI1V/VK+8+JeTF8niqOowuysA4b8mGzdlMN/QnTnoXbYh4HZSNiopsDclN2g/m85+G++IrEtUdZaQ3GnaMsSA==", "dependencies": { "fast-deep-equal": "^3.1.3", "is-buffer": "^2.0.5" @@ -4086,9 +4086,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001534", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001534.tgz", - "integrity": "sha512-vlPVrhsCS7XaSh2VvWluIQEzVhefrUQcEsQWSS5A5V+dM07uv1qHeQzAOTGIMy9i3e9bH15+muvI/UHojVgS/Q==", + "version": "1.0.30001529", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001529.tgz", + "integrity": "sha512-n2pUQYGAkrLG4QYj2desAh+NqsJpHbNmVZz87imptDdxLAtjxary7Df/psdfyDGmskJK/9Dt9cPnx5RZ3CU4Og==", "dev": true, "funding": [ { @@ -4456,97 +4456,6 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, - "node_modules/create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/create-jest/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/create-jest/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/create-jest/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/create-jest/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/create-jest/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/create-jest/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -4901,27 +4810,12 @@ "node": ">=0.10.0" } }, - "node_modules/define-data-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.0.1.tgz", - "integrity": "sha512-22M+6zEspQHx10bfFQl2ET39IvfuQ7+rZIH7+ard8fCC4hPmkOSy+8JhKxBRLaWUziJ0O63NTYT97LR8zUfPTw==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", "dev": true, "dependencies": { - "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -5087,9 +4981,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.519", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.519.tgz", - "integrity": "sha512-kqs9oGYL4UFVkLKhqCTgBCYZv+wZ374yABDMqlDda9HvlkQxvSr7kgf4hfWVjMieDbX+1MwPHFBsOGCMIBaFKg==", + "version": "1.4.512", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.512.tgz", + "integrity": "sha512-1W8wRbYlQE4ph7eoj3TJ+uqwO6+xvAE/L+KGU7WTQQvX3tnSIGZAb90MTsMoJqzntamiwJhBAj4WZmygXhsOUg==", "dev": true }, "node_modules/emittery": { @@ -5226,9 +5120,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz", - "integrity": "sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", + "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", "dev": true }, "node_modules/es-set-tostringtag": { @@ -5316,16 +5210,16 @@ } }, "node_modules/eslint": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", - "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", + "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.49.0", - "@humanwhocodes/config-array": "^0.11.11", + "@eslint/js": "8.48.0", + "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", @@ -5809,16 +5703,16 @@ } }, "node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.4.tgz", + "integrity": "sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA==", "dev": true, "dependencies": { - "@jest/expect-utils": "^29.7.0", + "@jest/expect-utils": "^29.6.4", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" + "jest-matcher-utils": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -5866,9 +5760,9 @@ } }, "node_modules/express-rate-limit": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.2.tgz", - "integrity": "sha512-a7uwwfNTh1U60ssiIkuLFWHt4hAC5yxlLGU2VP0X4YNlyEDZAqF4tK3GD3NSitVBrCQmQ0++0uOyFOgC2y4DDw==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.0.tgz", + "integrity": "sha512-H9afltGTaEZcvenAB5LFgb/ysTMHUzMxoB3TJM6UHP5FtAP1p2+heMj1xwTei54Zm4I9I/2qsS5m+XrdKQp/Hw==", "engines": { "node": ">= 14" }, @@ -7333,13 +7227,13 @@ } }, "node_modules/jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.6.3.tgz", + "integrity": "sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg==", "dev": true, "dependencies": { "execa": "^5.0.0", - "jest-util": "^29.7.0", + "jest-util": "^29.6.3", "p-limit": "^3.1.0" }, "engines": { @@ -7347,28 +7241,28 @@ } }, "node_modules/jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.4.tgz", + "integrity": "sha512-YXNrRyntVUgDfZbjXWBMPslX1mQ8MrSG0oM/Y06j9EYubODIyHWP8hMUbjbZ19M3M+zamqEur7O80HODwACoJw==", "dev": true, "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", + "@jest/environment": "^29.6.4", + "@jest/expect": "^29.6.4", + "@jest/test-result": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", + "jest-each": "^29.6.3", + "jest-matcher-utils": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-runtime": "^29.6.4", + "jest-snapshot": "^29.6.4", + "jest-util": "^29.6.3", "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", + "pretty-format": "^29.6.3", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" @@ -7448,21 +7342,22 @@ } }, "node_modules/jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.4.tgz", + "integrity": "sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ==", "dev": true, "dependencies": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", + "@jest/core": "^29.6.4", + "@jest/test-result": "^29.6.4", "@jest/types": "^29.6.3", "chalk": "^4.0.0", - "create-jest": "^29.7.0", "exit": "^0.1.2", + "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", + "jest-config": "^29.6.4", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", + "prompts": "^2.0.1", "yargs": "^17.3.1" }, "bin": { @@ -7551,31 +7446,31 @@ } }, "node_modules/jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.4.tgz", + "integrity": "sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", + "@jest/test-sequencer": "^29.6.4", "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", + "babel-jest": "^29.6.4", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", + "jest-circus": "^29.6.4", + "jest-environment-node": "^29.6.4", "jest-get-type": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", + "jest-resolve": "^29.6.4", + "jest-runner": "^29.6.4", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", + "pretty-format": "^29.6.3", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -7611,12 +7506,12 @@ } }, "node_modules/jest-config/node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.4.tgz", + "integrity": "sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==", "dev": true, "dependencies": { - "@jest/transform": "^29.7.0", + "@jest/transform": "^29.6.4", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", @@ -7687,15 +7582,15 @@ } }, "node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.4.tgz", + "integrity": "sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==", "dev": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -7772,9 +7667,9 @@ } }, "node_modules/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.6.3.tgz", + "integrity": "sha512-2+H+GOTQBEm2+qFSQ7Ma+BvyV+waiIFxmZF5LdpBsAEjWX8QYjSCa4FrkIYtbfXUJJJnFCYrOtt6TZ+IAiTjBQ==", "dev": true, "dependencies": { "detect-newline": "^3.0.0" @@ -7784,16 +7679,16 @@ } }, "node_modules/jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.3.tgz", + "integrity": "sha512-KoXfJ42k8cqbkfshW7sSHcdfnv5agDdHCPA87ZBdmHP+zJstTJc0ttQaJ/x7zK6noAL76hOuTIJ6ZkQRS5dcyg==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" + "jest-util": "^29.6.3", + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -7870,18 +7765,18 @@ } }, "node_modules/jest-environment-jsdom": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", - "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.6.4.tgz", + "integrity": "sha512-K6wfgUJ16DoMs02JYFid9lOsqfpoVtyJxpRlnTxUHzvZWBnnh2VNGRB9EC1Cro96TQdq5TtSjb3qUjNaJP9IyA==", "dev": true, "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", + "@jest/environment": "^29.6.4", + "@jest/fake-timers": "^29.6.4", "@jest/types": "^29.6.3", "@types/jsdom": "^20.0.0", "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0", + "jest-mock": "^29.6.3", + "jest-util": "^29.6.3", "jsdom": "^20.0.0" }, "engines": { @@ -7897,17 +7792,17 @@ } }, "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.4.tgz", + "integrity": "sha512-i7SbpH2dEIFGNmxGCpSc2w9cA4qVD+wfvg2ZnfQ7XVrKL0NA5uDVBIiGH8SR4F0dKEv/0qI5r+aDomDf04DpEQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", + "@jest/environment": "^29.6.4", + "@jest/fake-timers": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" + "jest-mock": "^29.6.3", + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -7923,9 +7818,9 @@ } }, "node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz", + "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -7935,8 +7830,8 @@ "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", + "jest-util": "^29.6.3", + "jest-worker": "^29.6.4", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -7948,28 +7843,28 @@ } }, "node_modules/jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.3.tgz", + "integrity": "sha512-0kfbESIHXYdhAdpLsW7xdwmYhLf1BRu4AA118/OxFm0Ho1b2RcTmO4oF6aAMaxpxdxnJ3zve2rgwzNBD4Zbm7Q==", "dev": true, "dependencies": { "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.4.tgz", + "integrity": "sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.7.0", + "jest-diff": "^29.6.4", "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -8046,9 +7941,9 @@ } }, "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.3.tgz", + "integrity": "sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", @@ -8057,7 +7952,7 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", + "pretty-format": "^29.6.3", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -8136,14 +8031,14 @@ } }, "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.3.tgz", + "integrity": "sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", - "jest-util": "^29.7.0" + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -8176,17 +8071,17 @@ } }, "node_modules/jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.4.tgz", + "integrity": "sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q==", "dev": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", + "jest-haste-map": "^29.6.4", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" @@ -8196,13 +8091,13 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.4.tgz", + "integrity": "sha512-7+6eAmr1ZBF3vOAJVsfLj1QdqeXG+WYhidfLHBRZqGN24MFRIiKG20ItpLw2qRAsW/D2ZUUmCNf6irUr/v6KHA==", "dev": true, "dependencies": { "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" + "jest-snapshot": "^29.6.4" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -8279,30 +8174,30 @@ } }, "node_modules/jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.4.tgz", + "integrity": "sha512-SDaLrMmtVlQYDuG0iSPYLycG8P9jLI+fRm8AF/xPKhYDB2g6xDWjXBrR5M8gEWsK6KVFlebpZ4QsrxdyIX1Jaw==", "dev": true, "dependencies": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", + "@jest/console": "^29.6.4", + "@jest/environment": "^29.6.4", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", + "jest-docblock": "^29.6.3", + "jest-environment-node": "^29.6.4", + "jest-haste-map": "^29.6.4", + "jest-leak-detector": "^29.6.3", + "jest-message-util": "^29.6.3", + "jest-resolve": "^29.6.4", + "jest-runtime": "^29.6.4", + "jest-util": "^29.6.3", + "jest-watcher": "^29.6.4", + "jest-worker": "^29.6.4", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -8381,17 +8276,17 @@ } }, "node_modules/jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.4.tgz", + "integrity": "sha512-s/QxMBLvmwLdchKEjcLfwzP7h+jsHvNEtxGP5P+Fl1FMaJX2jMiIqe4rJw4tFprzCwuSvVUo9bn0uj4gNRXsbA==", "dev": true, "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", + "@jest/environment": "^29.6.4", + "@jest/fake-timers": "^29.6.4", + "@jest/globals": "^29.6.4", "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", @@ -8399,13 +8294,13 @@ "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", + "jest-haste-map": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-mock": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", + "jest-resolve": "^29.6.4", + "jest-snapshot": "^29.6.4", + "jest-util": "^29.6.3", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -8484,9 +8379,9 @@ } }, "node_modules/jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.4.tgz", + "integrity": "sha512-VC1N8ED7+4uboUKGIDsbvNAZb6LakgIPgAF4RSpF13dN6YaMokfRqO+BaqK4zIh6X3JffgwbzuGqDEjHm/MrvA==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -8494,20 +8389,20 @@ "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", + "@jest/expect-utils": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.7.0", + "expect": "^29.6.4", "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", + "jest-diff": "^29.6.4", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", + "jest-matcher-utils": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3", "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", + "pretty-format": "^29.6.3", "semver": "^7.5.3" }, "engines": { @@ -8618,9 +8513,9 @@ "dev": true }, "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", + "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -8705,9 +8600,9 @@ } }, "node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz", + "integrity": "sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -8715,7 +8610,7 @@ "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^29.7.0" + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -8804,18 +8699,18 @@ } }, "node_modules/jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.4.tgz", + "integrity": "sha512-oqUWvx6+On04ShsT00Ir9T4/FvBeEh2M9PTubgITPxDa739p4hoQweWPRGyYeaojgT0xTpZKF0Y/rSY1UgMxvQ==", "dev": true, "dependencies": { - "@jest/test-result": "^29.7.0", + "@jest/test-result": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.7.0", + "jest-util": "^29.6.3", "string-length": "^4.0.1" }, "engines": { @@ -8893,13 +8788,13 @@ } }, "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", + "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==", "dev": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.7.0", + "jest-util": "^29.6.3", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -10549,9 +10444,9 @@ } }, "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", + "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", @@ -10879,14 +10774,14 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -11372,19 +11267,6 @@ "node": ">= 0.8.0" } }, - "node_modules/set-function-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.0.tgz", - "integrity": "sha512-WmS8UHojv5s1eSoRSmzO5zzgDq8PE1/X/ij0k+9fMYmINCc6+j+SF3Om8YyucKn2yjnK4ItNZOoQycNnHsZJTw==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -12911,9 +12793,9 @@ } }, "node_modules/ws": { - "version": "8.14.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.1.tgz", - "integrity": "sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.0.tgz", + "integrity": "sha512-WR0RJE9Ehsio6U4TuM+LmunEsjQ5ncHlw4sn9ihD6RoJKZrVyH9FWV3dmnwu8B2aNib1OvG2X6adUCyFpQyWcg==", "dev": true, "engines": { "node": ">=10.0.0" diff --git a/portal/package.json b/portal/package.json index 286c73066d..0764bb4d31 100644 --- a/portal/package.json +++ b/portal/package.json @@ -41,7 +41,7 @@ "dependencies": { "@ministryofjustice/frontend": "1.8.0", "axios": "^1.5.0", - "axios-mock-adapter": "^1.22.0", + "axios-mock-adapter": "^1.21.5", "cheerio": "^1.0.0-rc.12", "connect-flash": "0.1.1", "connect-redis": "5.2.0", @@ -50,7 +50,7 @@ "csurf": "^1.11.0", "dotenv": "16.0.3", "express": "^4.18.2", - "express-rate-limit": "^6.11.2", + "express-rate-limit": "^6.11.0", "express-session": "1.17.3", "form-data": "4.0.0", "govuk-frontend": "4.6.0", @@ -78,12 +78,12 @@ "babel-jest": "29.5.0", "babel-loader": "9.1.2", "css-minimizer-webpack-plugin": "^5.0.1", - "eslint": "^8.49.0", + "eslint": "^8.48.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.28.1", "file-loader": "^6.2.0", "jest": "29.5.0", - "jest-environment-jsdom": "^29.7.0", + "jest-environment-jsdom": "^29.6.4", "rimraf": "^5.0.1", "sass": "^1.66.1", "sass-loader": "13.2.2", diff --git a/trade-finance-manager-api/package-lock.json b/trade-finance-manager-api/package-lock.json index 3ab012b181..4539d4c897 100644 --- a/trade-finance-manager-api/package-lock.json +++ b/trade-finance-manager-api/package-lock.json @@ -21,7 +21,7 @@ "dotenv": "16.0.3", "express": "4.18.2", "express-mongo-sanitize": "^2.2.0", - "express-rate-limit": "^6.11.2", + "express-rate-limit": "^6.11.0", "express-validator": "7.0.1", "graphql": "^16.8.0", "graphql-middleware": "^6.1.35", @@ -49,8 +49,8 @@ "@types/jest": "^29.5.4", "@types/mongodb": "^4.0.7", "@types/swagger-ui-express": "^4.1.3", - "axios-mock-adapter": "^1.22.0", - "eslint": "^8.49.0", + "axios-mock-adapter": "^1.21.5", + "eslint": "^8.48.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.28.1", "jest": "29.5.0", @@ -368,21 +368,21 @@ } }, "node_modules/@babel/core": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.17.tgz", - "integrity": "sha512-2EENLmhpwplDux5PSsZnSbnSkB3tZ6QTksgO25xwEL7pIDcNOMhF5v/s6RzwjMZzZzw9Ofc30gHv5ChCC8pifQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.15.tgz", + "integrity": "sha512-PtZqMmgRrvj8ruoEOIwVA3yoF91O+Hgw9o7DAUTNBA6Mo2jpu31clx9a7Nz/9JznqetTR6zwfC4L3LAjKQXUwA==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.22.13", "@babel/generator": "^7.22.15", "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.22.17", + "@babel/helper-module-transforms": "^7.22.15", "@babel/helpers": "^7.22.15", - "@babel/parser": "^7.22.16", + "@babel/parser": "^7.22.15", "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.17", - "@babel/types": "^7.22.17", + "@babel/traverse": "^7.22.15", + "@babel/types": "^7.22.15", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -519,9 +519,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.17.tgz", - "integrity": "sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.15.tgz", + "integrity": "sha512-l1UiX4UyHSFsYt17iQ3Se5pQQZZHa22zyIXURmvkmLCD4t/aU+dvNWHatKac/D9Vm9UES7nvIqHs4jZqKviUmQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", @@ -911,9 +911,9 @@ } }, "node_modules/@babel/traverse": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.17.tgz", - "integrity": "sha512-xK4Uwm0JnAMvxYZxOVecss85WxTEIbTa7bnGyf/+EgCL5Zt3U7htUpEOWv9detPlamGKuRzCqw74xVglDWpPdg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.15.tgz", + "integrity": "sha512-DdHPwvJY0sEeN4xJU5uRLmZjgMMDIvMPniLuYzUVXj/GGzysPl0/fwt44JBkyUIzGJPV8QgHMcQdQ34XFuKTYQ==", "dev": true, "dependencies": { "@babel/code-frame": "^7.22.13", @@ -922,8 +922,8 @@ "@babel/helper-function-name": "^7.22.5", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.16", - "@babel/types": "^7.22.17", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -964,9 +964,9 @@ "dev": true }, "node_modules/@babel/types": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.17.tgz", - "integrity": "sha512-YSQPHLFtQNE5xN9tHuZnzu8vPr61wVTBZdfv1meex1NBosa4iT05k/Jw06ddJugi4bk7The/oSwQGFcksmEJQg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.15.tgz", + "integrity": "sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", @@ -999,9 +999,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", - "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", + "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -1054,9 +1054,9 @@ "dev": true }, "node_modules/@eslint/js": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", - "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", + "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1399,16 +1399,16 @@ } }, "node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.4.tgz", + "integrity": "sha512-wNK6gC0Ha9QeEPSkeJedQuTQqxZYnDPuDcDhVuVatRvMkL4D0VTvFVZj+Yuh6caG2aOfzkUZ36KtCmLNtR02hw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3", "slash": "^3.0.0" }, "engines": { @@ -1416,15 +1416,15 @@ } }, "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.4.tgz", + "integrity": "sha512-U/vq5ccNTSVgYH7mHnodHmCffGWHJnz/E1BEWlLuK5pM4FZmGfBn/nrJGLjUsSmyx3otCeqc1T31F4y08AMDLg==", "dev": true, "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", + "@jest/console": "^29.6.4", + "@jest/reporters": "^29.6.4", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -1432,21 +1432,21 @@ "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", + "jest-changed-files": "^29.6.3", + "jest-config": "^29.6.4", + "jest-haste-map": "^29.6.4", + "jest-message-util": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", + "jest-resolve": "^29.6.4", + "jest-resolve-dependencies": "^29.6.4", + "jest-runner": "^29.6.4", + "jest-runtime": "^29.6.4", + "jest-snapshot": "^29.6.4", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", + "jest-watcher": "^29.6.4", "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", + "pretty-format": "^29.6.3", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -1463,37 +1463,37 @@ } }, "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.4.tgz", + "integrity": "sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ==", "dev": true, "dependencies": { - "@jest/fake-timers": "^29.7.0", + "@jest/fake-timers": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.7.0" + "jest-mock": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.4.tgz", + "integrity": "sha512-Warhsa7d23+3X5bLbrbYvaehcgX5TLYhI03JKoedTiI8uJU4IhqYBWF7OSSgUyz4IgLpUYPkK0AehA5/fRclAA==", "dev": true, "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" + "expect": "^29.6.4", + "jest-snapshot": "^29.6.4" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.4.tgz", + "integrity": "sha512-FEhkJhqtvBwgSpiTrocquJCdXPsyvNKcl/n7A3u7X4pVoF4bswm11c9d4AV+kfq2Gpv/mM8x7E7DsRvH+djkrg==", "dev": true, "dependencies": { "jest-get-type": "^29.6.3" @@ -1503,47 +1503,47 @@ } }, "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.4.tgz", + "integrity": "sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" + "jest-message-util": "^29.6.3", + "jest-mock": "^29.6.3", + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.4.tgz", + "integrity": "sha512-wVIn5bdtjlChhXAzVXavcY/3PEjf4VqM174BM3eGL5kMxLiZD5CLnbmkEyA1Dwh9q8XjP6E8RwjBsY/iCWrWsA==", "dev": true, "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", + "@jest/environment": "^29.6.4", + "@jest/expect": "^29.6.4", "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" + "jest-mock": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.4.tgz", + "integrity": "sha512-sxUjWxm7QdchdrD3NfWKrL8FBsortZeibSJv4XLjESOOjSUOkjQcb0ZHJwfhEGIvBvTluTzfG2yZWZhkrXJu8g==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", + "@jest/console": "^29.6.4", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", @@ -1557,9 +1557,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3", + "jest-worker": "^29.6.4", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -1604,12 +1604,12 @@ } }, "node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.4.tgz", + "integrity": "sha512-uQ1C0AUEN90/dsyEirgMLlouROgSY+Wc/JanVVk0OiUKa5UFh7sJpMEM3aoUBAz2BRNvUJ8j3d294WFuRxSyOQ==", "dev": true, "dependencies": { - "@jest/console": "^29.7.0", + "@jest/console": "^29.6.4", "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" @@ -1619,14 +1619,14 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.4.tgz", + "integrity": "sha512-E84M6LbpcRq3fT4ckfKs9ryVanwkaIB0Ws9bw3/yP4seRLg/VaCZ/LgW0MCq5wwk4/iP/qnilD41aj2fsw2RMg==", "dev": true, "dependencies": { - "@jest/test-result": "^29.7.0", + "@jest/test-result": "^29.6.4", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", + "jest-haste-map": "^29.6.4", "slash": "^3.0.0" }, "engines": { @@ -1634,9 +1634,9 @@ } }, "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz", + "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -1647,9 +1647,9 @@ "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", + "jest-haste-map": "^29.6.4", "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", + "jest-util": "^29.6.3", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -2054,9 +2054,9 @@ } }, "node_modules/@types/node": { - "version": "20.6.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.0.tgz", - "integrity": "sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==" + "version": "20.5.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.9.tgz", + "integrity": "sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==" }, "node_modules/@types/qs": { "version": "6.9.8", @@ -2653,9 +2653,9 @@ } }, "node_modules/axios-mock-adapter": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/axios-mock-adapter/-/axios-mock-adapter-1.22.0.tgz", - "integrity": "sha512-dmI0KbkyAhntUR05YY96qg2H6gg0XMl2+qTW0xmYg6Up+BFBAJYRLROMXRdDEL06/Wqwa0TJThAYvFtSFdRCZw==", + "version": "1.21.5", + "resolved": "https://registry.npmjs.org/axios-mock-adapter/-/axios-mock-adapter-1.21.5.tgz", + "integrity": "sha512-5NI1V/VK+8+JeTF8niqOowuysA4b8mGzdlMN/QnTnoXbYh4HZSNiopsDclN2g/m85+G++IrEtUdZaQ3GnaMsSA==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.3", @@ -2666,12 +2666,12 @@ } }, "node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.4.tgz", + "integrity": "sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==", "dev": true, "dependencies": { - "@jest/transform": "^29.7.0", + "@jest/transform": "^29.6.4", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", @@ -2977,9 +2977,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001534", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001534.tgz", - "integrity": "sha512-vlPVrhsCS7XaSh2VvWluIQEzVhefrUQcEsQWSS5A5V+dM07uv1qHeQzAOTGIMy9i3e9bH15+muvI/UHojVgS/Q==", + "version": "1.0.30001529", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001529.tgz", + "integrity": "sha512-n2pUQYGAkrLG4QYj2desAh+NqsJpHbNmVZz87imptDdxLAtjxary7Df/psdfyDGmskJK/9Dt9cPnx5RZ3CU4Og==", "dev": true, "funding": [ { @@ -3279,27 +3279,6 @@ "node": ">= 0.10" } }, - "node_modules/create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -3381,27 +3360,12 @@ "node": ">=0.10.0" } }, - "node_modules/define-data-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.0.1.tgz", - "integrity": "sha512-22M+6zEspQHx10bfFQl2ET39IvfuQ7+rZIH7+ard8fCC4hPmkOSy+8JhKxBRLaWUziJ0O63NTYT97LR8zUfPTw==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", "dev": true, "dependencies": { - "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -3557,9 +3521,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.519", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.519.tgz", - "integrity": "sha512-kqs9oGYL4UFVkLKhqCTgBCYZv+wZ374yABDMqlDda9HvlkQxvSr7kgf4hfWVjMieDbX+1MwPHFBsOGCMIBaFKg==", + "version": "1.4.512", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.512.tgz", + "integrity": "sha512-1W8wRbYlQE4ph7eoj3TJ+uqwO6+xvAE/L+KGU7WTQQvX3tnSIGZAb90MTsMoJqzntamiwJhBAj4WZmygXhsOUg==", "dev": true }, "node_modules/emittery": { @@ -3727,16 +3691,16 @@ } }, "node_modules/eslint": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", - "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", + "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.49.0", - "@humanwhocodes/config-array": "^0.11.11", + "@eslint/js": "8.48.0", + "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", @@ -4078,16 +4042,16 @@ } }, "node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.4.tgz", + "integrity": "sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA==", "dev": true, "dependencies": { - "@jest/expect-utils": "^29.7.0", + "@jest/expect-utils": "^29.6.4", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" + "jest-matcher-utils": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -4143,9 +4107,9 @@ } }, "node_modules/express-rate-limit": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.2.tgz", - "integrity": "sha512-a7uwwfNTh1U60ssiIkuLFWHt4hAC5yxlLGU2VP0X4YNlyEDZAqF4tK3GD3NSitVBrCQmQ0++0uOyFOgC2y4DDw==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.0.tgz", + "integrity": "sha512-H9afltGTaEZcvenAB5LFgb/ysTMHUzMxoB3TJM6UHP5FtAP1p2+heMj1xwTei54Zm4I9I/2qsS5m+XrdKQp/Hw==", "engines": { "node": ">= 14" }, @@ -5426,13 +5390,13 @@ } }, "node_modules/jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.6.3.tgz", + "integrity": "sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg==", "dev": true, "dependencies": { "execa": "^5.0.0", - "jest-util": "^29.7.0", + "jest-util": "^29.6.3", "p-limit": "^3.1.0" }, "engines": { @@ -5440,28 +5404,28 @@ } }, "node_modules/jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.4.tgz", + "integrity": "sha512-YXNrRyntVUgDfZbjXWBMPslX1mQ8MrSG0oM/Y06j9EYubODIyHWP8hMUbjbZ19M3M+zamqEur7O80HODwACoJw==", "dev": true, "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", + "@jest/environment": "^29.6.4", + "@jest/expect": "^29.6.4", + "@jest/test-result": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", + "jest-each": "^29.6.3", + "jest-matcher-utils": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-runtime": "^29.6.4", + "jest-snapshot": "^29.6.4", + "jest-util": "^29.6.3", "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", + "pretty-format": "^29.6.3", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" @@ -5471,21 +5435,22 @@ } }, "node_modules/jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.4.tgz", + "integrity": "sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ==", "dev": true, "dependencies": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", + "@jest/core": "^29.6.4", + "@jest/test-result": "^29.6.4", "@jest/types": "^29.6.3", "chalk": "^4.0.0", - "create-jest": "^29.7.0", "exit": "^0.1.2", + "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", + "jest-config": "^29.6.4", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", + "prompts": "^2.0.1", "yargs": "^17.3.1" }, "bin": { @@ -5504,31 +5469,31 @@ } }, "node_modules/jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.4.tgz", + "integrity": "sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", + "@jest/test-sequencer": "^29.6.4", "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", + "babel-jest": "^29.6.4", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", + "jest-circus": "^29.6.4", + "jest-environment-node": "^29.6.4", "jest-get-type": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", + "jest-resolve": "^29.6.4", + "jest-runner": "^29.6.4", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", + "pretty-format": "^29.6.3", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -5549,24 +5514,24 @@ } }, "node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.4.tgz", + "integrity": "sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==", "dev": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.6.3.tgz", + "integrity": "sha512-2+H+GOTQBEm2+qFSQ7Ma+BvyV+waiIFxmZF5LdpBsAEjWX8QYjSCa4FrkIYtbfXUJJJnFCYrOtt6TZ+IAiTjBQ==", "dev": true, "dependencies": { "detect-newline": "^3.0.0" @@ -5576,33 +5541,33 @@ } }, "node_modules/jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.3.tgz", + "integrity": "sha512-KoXfJ42k8cqbkfshW7sSHcdfnv5agDdHCPA87ZBdmHP+zJstTJc0ttQaJ/x7zK6noAL76hOuTIJ6ZkQRS5dcyg==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" + "jest-util": "^29.6.3", + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.4.tgz", + "integrity": "sha512-i7SbpH2dEIFGNmxGCpSc2w9cA4qVD+wfvg2ZnfQ7XVrKL0NA5uDVBIiGH8SR4F0dKEv/0qI5r+aDomDf04DpEQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", + "@jest/environment": "^29.6.4", + "@jest/fake-timers": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" + "jest-mock": "^29.6.3", + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -5618,9 +5583,9 @@ } }, "node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz", + "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -5630,8 +5595,8 @@ "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", + "jest-util": "^29.6.3", + "jest-worker": "^29.6.4", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -5643,37 +5608,37 @@ } }, "node_modules/jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.3.tgz", + "integrity": "sha512-0kfbESIHXYdhAdpLsW7xdwmYhLf1BRu4AA118/OxFm0Ho1b2RcTmO4oF6aAMaxpxdxnJ3zve2rgwzNBD4Zbm7Q==", "dev": true, "dependencies": { "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.4.tgz", + "integrity": "sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.7.0", + "jest-diff": "^29.6.4", "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.3.tgz", + "integrity": "sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", @@ -5682,7 +5647,7 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", + "pretty-format": "^29.6.3", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -5691,14 +5656,14 @@ } }, "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.3.tgz", + "integrity": "sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", - "jest-util": "^29.7.0" + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -5731,17 +5696,17 @@ } }, "node_modules/jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.4.tgz", + "integrity": "sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q==", "dev": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", + "jest-haste-map": "^29.6.4", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" @@ -5751,43 +5716,43 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.4.tgz", + "integrity": "sha512-7+6eAmr1ZBF3vOAJVsfLj1QdqeXG+WYhidfLHBRZqGN24MFRIiKG20ItpLw2qRAsW/D2ZUUmCNf6irUr/v6KHA==", "dev": true, "dependencies": { "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" + "jest-snapshot": "^29.6.4" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.4.tgz", + "integrity": "sha512-SDaLrMmtVlQYDuG0iSPYLycG8P9jLI+fRm8AF/xPKhYDB2g6xDWjXBrR5M8gEWsK6KVFlebpZ4QsrxdyIX1Jaw==", "dev": true, "dependencies": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", + "@jest/console": "^29.6.4", + "@jest/environment": "^29.6.4", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", + "jest-docblock": "^29.6.3", + "jest-environment-node": "^29.6.4", + "jest-haste-map": "^29.6.4", + "jest-leak-detector": "^29.6.3", + "jest-message-util": "^29.6.3", + "jest-resolve": "^29.6.4", + "jest-runtime": "^29.6.4", + "jest-util": "^29.6.3", + "jest-watcher": "^29.6.4", + "jest-worker": "^29.6.4", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -5796,17 +5761,17 @@ } }, "node_modules/jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.4.tgz", + "integrity": "sha512-s/QxMBLvmwLdchKEjcLfwzP7h+jsHvNEtxGP5P+Fl1FMaJX2jMiIqe4rJw4tFprzCwuSvVUo9bn0uj4gNRXsbA==", "dev": true, "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", + "@jest/environment": "^29.6.4", + "@jest/fake-timers": "^29.6.4", + "@jest/globals": "^29.6.4", "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", @@ -5814,13 +5779,13 @@ "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", + "jest-haste-map": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-mock": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", + "jest-resolve": "^29.6.4", + "jest-snapshot": "^29.6.4", + "jest-util": "^29.6.3", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -5829,9 +5794,9 @@ } }, "node_modules/jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.4.tgz", + "integrity": "sha512-VC1N8ED7+4uboUKGIDsbvNAZb6LakgIPgAF4RSpF13dN6YaMokfRqO+BaqK4zIh6X3JffgwbzuGqDEjHm/MrvA==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -5839,20 +5804,20 @@ "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", + "@jest/expect-utils": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.7.0", + "expect": "^29.6.4", "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", + "jest-diff": "^29.6.4", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", + "jest-matcher-utils": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3", "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", + "pretty-format": "^29.6.3", "semver": "^7.5.3" }, "engines": { @@ -5875,9 +5840,9 @@ } }, "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", + "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -5892,9 +5857,9 @@ } }, "node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz", + "integrity": "sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -5902,7 +5867,7 @@ "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^29.7.0" + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -5921,18 +5886,18 @@ } }, "node_modules/jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.4.tgz", + "integrity": "sha512-oqUWvx6+On04ShsT00Ir9T4/FvBeEh2M9PTubgITPxDa739p4hoQweWPRGyYeaojgT0xTpZKF0Y/rSY1UgMxvQ==", "dev": true, "dependencies": { - "@jest/test-result": "^29.7.0", + "@jest/test-result": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.7.0", + "jest-util": "^29.6.3", "string-length": "^4.0.1" }, "engines": { @@ -5940,13 +5905,13 @@ } }, "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", + "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==", "dev": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.7.0", + "jest-util": "^29.6.3", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -7134,9 +7099,9 @@ } }, "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", + "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", @@ -7302,14 +7267,14 @@ "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" }, "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -7557,19 +7522,6 @@ "node": ">= 0.8.0" } }, - "node_modules/set-function-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.0.tgz", - "integrity": "sha512-WmS8UHojv5s1eSoRSmzO5zzgDq8PE1/X/ij0k+9fMYmINCc6+j+SF3Om8YyucKn2yjnK4ItNZOoQycNnHsZJTw==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -8333,13 +8285,9 @@ } }, "node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", "bin": { "uuid": "dist/bin/uuid" } diff --git a/trade-finance-manager-api/package.json b/trade-finance-manager-api/package.json index 2fd8ed395d..b0c18c0d76 100644 --- a/trade-finance-manager-api/package.json +++ b/trade-finance-manager-api/package.json @@ -48,7 +48,7 @@ "dotenv": "16.0.3", "express": "4.18.2", "express-mongo-sanitize": "^2.2.0", - "express-rate-limit": "^6.11.2", + "express-rate-limit": "^6.11.0", "express-validator": "7.0.1", "graphql": "^16.8.0", "graphql-middleware": "^6.1.35", @@ -76,8 +76,8 @@ "@types/jest": "^29.5.4", "@types/mongodb": "^4.0.7", "@types/swagger-ui-express": "^4.1.3", - "axios-mock-adapter": "^1.22.0", - "eslint": "^8.49.0", + "axios-mock-adapter": "^1.21.5", + "eslint": "^8.48.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.28.1", "jest": "29.5.0", diff --git a/trade-finance-manager-ui/package-lock.json b/trade-finance-manager-ui/package-lock.json index 8ed17dbd81..8906b240a3 100644 --- a/trade-finance-manager-ui/package-lock.json +++ b/trade-finance-manager-ui/package-lock.json @@ -28,7 +28,7 @@ "date-fns": "^2.30.0", "dotenv": "16.0.3", "express": "^4.18.2", - "express-rate-limit": "^6.11.2", + "express-rate-limit": "^6.11.0", "express-session": "1.17.3", "express-validator": "7.0.1", "express-xss-sanitizer": "^1.1.6", @@ -57,11 +57,11 @@ "@babel/preset-env": "7.21.5", "@babel/runtime": "7.21.5", "@types/jest": "^29.5.4", - "axios-mock-adapter": "^1.22.0", + "axios-mock-adapter": "^1.21.5", "babel-jest": "29.5.0", "babel-loader": "9.1.2", "copy-webpack-plugin": "^11.0.0", - "eslint": "^8.49.0", + "eslint": "^8.48.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.28.1", "file-loader": "^6.2.0", @@ -325,9 +325,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.17.tgz", - "integrity": "sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.15.tgz", + "integrity": "sha512-l1UiX4UyHSFsYt17iQ3Se5pQQZZHa22zyIXURmvkmLCD4t/aU+dvNWHatKac/D9Vm9UES7nvIqHs4jZqKviUmQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", @@ -365,14 +365,14 @@ } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.17.tgz", - "integrity": "sha512-bxH77R5gjH3Nkde6/LuncQoLaP16THYPscurp1S8z7S9ZgezCyV3G8Hc+TZiCmY8pz4fp8CvKSgtJMW0FkLAxA==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz", + "integrity": "sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-wrap-function": "^7.22.17" + "@babel/helper-wrap-function": "^7.22.9" }, "engines": { "node": ">=6.9.0" @@ -462,14 +462,14 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.17.tgz", - "integrity": "sha512-nAhoheCMlrqU41tAojw9GpVEKDlTS8r3lzFmF0lP52LwblCPbuFSO7nGIZoIcoU5NIm1ABrna0cJExE4Ay6l2Q==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.10.tgz", + "integrity": "sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ==", "dev": true, "dependencies": { "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.17" + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.10" }, "engines": { "node": ">=6.9.0" @@ -1756,9 +1756,9 @@ } }, "node_modules/@babel/traverse": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.17.tgz", - "integrity": "sha512-xK4Uwm0JnAMvxYZxOVecss85WxTEIbTa7bnGyf/+EgCL5Zt3U7htUpEOWv9detPlamGKuRzCqw74xVglDWpPdg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.15.tgz", + "integrity": "sha512-DdHPwvJY0sEeN4xJU5uRLmZjgMMDIvMPniLuYzUVXj/GGzysPl0/fwt44JBkyUIzGJPV8QgHMcQdQ34XFuKTYQ==", "dev": true, "dependencies": { "@babel/code-frame": "^7.22.13", @@ -1767,8 +1767,8 @@ "@babel/helper-function-name": "^7.22.5", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.16", - "@babel/types": "^7.22.17", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1777,9 +1777,9 @@ } }, "node_modules/@babel/types": { - "version": "7.22.17", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.17.tgz", - "integrity": "sha512-YSQPHLFtQNE5xN9tHuZnzu8vPr61wVTBZdfv1meex1NBosa4iT05k/Jw06ddJugi4bk7The/oSwQGFcksmEJQg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.15.tgz", + "integrity": "sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", @@ -1821,9 +1821,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", - "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", + "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -1920,9 +1920,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", - "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", + "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2000,16 +2000,16 @@ } }, "node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.4.tgz", + "integrity": "sha512-wNK6gC0Ha9QeEPSkeJedQuTQqxZYnDPuDcDhVuVatRvMkL4D0VTvFVZj+Yuh6caG2aOfzkUZ36KtCmLNtR02hw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3", "slash": "^3.0.0" }, "engines": { @@ -2087,15 +2087,15 @@ } }, "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.4.tgz", + "integrity": "sha512-U/vq5ccNTSVgYH7mHnodHmCffGWHJnz/E1BEWlLuK5pM4FZmGfBn/nrJGLjUsSmyx3otCeqc1T31F4y08AMDLg==", "dev": true, "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", + "@jest/console": "^29.6.4", + "@jest/reporters": "^29.6.4", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -2103,21 +2103,21 @@ "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", + "jest-changed-files": "^29.6.3", + "jest-config": "^29.6.4", + "jest-haste-map": "^29.6.4", + "jest-message-util": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", + "jest-resolve": "^29.6.4", + "jest-resolve-dependencies": "^29.6.4", + "jest-runner": "^29.6.4", + "jest-runtime": "^29.6.4", + "jest-snapshot": "^29.6.4", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", + "jest-watcher": "^29.6.4", "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", + "pretty-format": "^29.6.3", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -2204,37 +2204,37 @@ } }, "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.4.tgz", + "integrity": "sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ==", "dev": true, "dependencies": { - "@jest/fake-timers": "^29.7.0", + "@jest/fake-timers": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.7.0" + "jest-mock": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.4.tgz", + "integrity": "sha512-Warhsa7d23+3X5bLbrbYvaehcgX5TLYhI03JKoedTiI8uJU4IhqYBWF7OSSgUyz4IgLpUYPkK0AehA5/fRclAA==", "dev": true, "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" + "expect": "^29.6.4", + "jest-snapshot": "^29.6.4" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.4.tgz", + "integrity": "sha512-FEhkJhqtvBwgSpiTrocquJCdXPsyvNKcl/n7A3u7X4pVoF4bswm11c9d4AV+kfq2Gpv/mM8x7E7DsRvH+djkrg==", "dev": true, "dependencies": { "jest-get-type": "^29.6.3" @@ -2244,47 +2244,47 @@ } }, "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.4.tgz", + "integrity": "sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" + "jest-message-util": "^29.6.3", + "jest-mock": "^29.6.3", + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.4.tgz", + "integrity": "sha512-wVIn5bdtjlChhXAzVXavcY/3PEjf4VqM174BM3eGL5kMxLiZD5CLnbmkEyA1Dwh9q8XjP6E8RwjBsY/iCWrWsA==", "dev": true, "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", + "@jest/environment": "^29.6.4", + "@jest/expect": "^29.6.4", "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" + "jest-mock": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.4.tgz", + "integrity": "sha512-sxUjWxm7QdchdrD3NfWKrL8FBsortZeibSJv4XLjESOOjSUOkjQcb0ZHJwfhEGIvBvTluTzfG2yZWZhkrXJu8g==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", + "@jest/console": "^29.6.4", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", @@ -2298,9 +2298,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3", + "jest-worker": "^29.6.4", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -2464,12 +2464,12 @@ } }, "node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.4.tgz", + "integrity": "sha512-uQ1C0AUEN90/dsyEirgMLlouROgSY+Wc/JanVVk0OiUKa5UFh7sJpMEM3aoUBAz2BRNvUJ8j3d294WFuRxSyOQ==", "dev": true, "dependencies": { - "@jest/console": "^29.7.0", + "@jest/console": "^29.6.4", "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" @@ -2479,14 +2479,14 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.4.tgz", + "integrity": "sha512-E84M6LbpcRq3fT4ckfKs9ryVanwkaIB0Ws9bw3/yP4seRLg/VaCZ/LgW0MCq5wwk4/iP/qnilD41aj2fsw2RMg==", "dev": true, "dependencies": { - "@jest/test-result": "^29.7.0", + "@jest/test-result": "^29.6.4", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", + "jest-haste-map": "^29.6.4", "slash": "^3.0.0" }, "engines": { @@ -2494,9 +2494,9 @@ } }, "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz", + "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -2507,9 +2507,9 @@ "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", + "jest-haste-map": "^29.6.4", "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", + "jest-util": "^29.6.3", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -2964,9 +2964,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.6.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.0.tgz", - "integrity": "sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==" + "version": "20.5.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.9.tgz", + "integrity": "sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==" }, "node_modules/@types/stack-utils": { "version": "2.0.1", @@ -3611,9 +3611,9 @@ } }, "node_modules/axios-mock-adapter": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/axios-mock-adapter/-/axios-mock-adapter-1.22.0.tgz", - "integrity": "sha512-dmI0KbkyAhntUR05YY96qg2H6gg0XMl2+qTW0xmYg6Up+BFBAJYRLROMXRdDEL06/Wqwa0TJThAYvFtSFdRCZw==", + "version": "1.21.5", + "resolved": "https://registry.npmjs.org/axios-mock-adapter/-/axios-mock-adapter-1.21.5.tgz", + "integrity": "sha512-5NI1V/VK+8+JeTF8niqOowuysA4b8mGzdlMN/QnTnoXbYh4HZSNiopsDclN2g/m85+G++IrEtUdZaQ3GnaMsSA==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.3", @@ -4063,9 +4063,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001534", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001534.tgz", - "integrity": "sha512-vlPVrhsCS7XaSh2VvWluIQEzVhefrUQcEsQWSS5A5V+dM07uv1qHeQzAOTGIMy9i3e9bH15+muvI/UHojVgS/Q==", + "version": "1.0.30001529", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001529.tgz", + "integrity": "sha512-n2pUQYGAkrLG4QYj2desAh+NqsJpHbNmVZz87imptDdxLAtjxary7Df/psdfyDGmskJK/9Dt9cPnx5RZ3CU4Og==", "dev": true, "funding": [ { @@ -4516,97 +4516,6 @@ "url": "https://opencollective.com/core-js" } }, - "node_modules/create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/create-jest/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/create-jest/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/create-jest/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/create-jest/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/create-jest/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/create-jest/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -4867,27 +4776,12 @@ "node": ">=0.10.0" } }, - "node_modules/define-data-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.0.1.tgz", - "integrity": "sha512-22M+6zEspQHx10bfFQl2ET39IvfuQ7+rZIH7+ard8fCC4hPmkOSy+8JhKxBRLaWUziJ0O63NTYT97LR8zUfPTw==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", "dev": true, "dependencies": { - "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -5047,9 +4941,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.519", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.519.tgz", - "integrity": "sha512-kqs9oGYL4UFVkLKhqCTgBCYZv+wZ374yABDMqlDda9HvlkQxvSr7kgf4hfWVjMieDbX+1MwPHFBsOGCMIBaFKg==", + "version": "1.4.512", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.512.tgz", + "integrity": "sha512-1W8wRbYlQE4ph7eoj3TJ+uqwO6+xvAE/L+KGU7WTQQvX3tnSIGZAb90MTsMoJqzntamiwJhBAj4WZmygXhsOUg==", "dev": true }, "node_modules/emittery": { @@ -5186,9 +5080,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz", - "integrity": "sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", + "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", "dev": true }, "node_modules/es-set-tostringtag": { @@ -5255,16 +5149,16 @@ } }, "node_modules/eslint": { - "version": "8.49.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", - "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", + "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.49.0", - "@humanwhocodes/config-array": "^0.11.11", + "@eslint/js": "8.48.0", + "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", @@ -5782,16 +5676,16 @@ } }, "node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.4.tgz", + "integrity": "sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA==", "dev": true, "dependencies": { - "@jest/expect-utils": "^29.7.0", + "@jest/expect-utils": "^29.6.4", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" + "jest-matcher-utils": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -5839,9 +5733,9 @@ } }, "node_modules/express-rate-limit": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.2.tgz", - "integrity": "sha512-a7uwwfNTh1U60ssiIkuLFWHt4hAC5yxlLGU2VP0X4YNlyEDZAqF4tK3GD3NSitVBrCQmQ0++0uOyFOgC2y4DDw==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.0.tgz", + "integrity": "sha512-H9afltGTaEZcvenAB5LFgb/ysTMHUzMxoB3TJM6UHP5FtAP1p2+heMj1xwTei54Zm4I9I/2qsS5m+XrdKQp/Hw==", "engines": { "node": ">= 14" }, @@ -7440,13 +7334,13 @@ } }, "node_modules/jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.6.3.tgz", + "integrity": "sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg==", "dev": true, "dependencies": { "execa": "^5.0.0", - "jest-util": "^29.7.0", + "jest-util": "^29.6.3", "p-limit": "^3.1.0" }, "engines": { @@ -7454,28 +7348,28 @@ } }, "node_modules/jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.4.tgz", + "integrity": "sha512-YXNrRyntVUgDfZbjXWBMPslX1mQ8MrSG0oM/Y06j9EYubODIyHWP8hMUbjbZ19M3M+zamqEur7O80HODwACoJw==", "dev": true, "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", + "@jest/environment": "^29.6.4", + "@jest/expect": "^29.6.4", + "@jest/test-result": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", + "jest-each": "^29.6.3", + "jest-matcher-utils": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-runtime": "^29.6.4", + "jest-snapshot": "^29.6.4", + "jest-util": "^29.6.3", "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", + "pretty-format": "^29.6.3", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" @@ -7555,21 +7449,22 @@ } }, "node_modules/jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.4.tgz", + "integrity": "sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ==", "dev": true, "dependencies": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", + "@jest/core": "^29.6.4", + "@jest/test-result": "^29.6.4", "@jest/types": "^29.6.3", "chalk": "^4.0.0", - "create-jest": "^29.7.0", "exit": "^0.1.2", + "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", + "jest-config": "^29.6.4", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", + "prompts": "^2.0.1", "yargs": "^17.3.1" }, "bin": { @@ -7658,31 +7553,31 @@ } }, "node_modules/jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.4.tgz", + "integrity": "sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", + "@jest/test-sequencer": "^29.6.4", "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", + "babel-jest": "^29.6.4", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", + "jest-circus": "^29.6.4", + "jest-environment-node": "^29.6.4", "jest-get-type": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", + "jest-resolve": "^29.6.4", + "jest-runner": "^29.6.4", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", + "pretty-format": "^29.6.3", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -7718,12 +7613,12 @@ } }, "node_modules/jest-config/node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.4.tgz", + "integrity": "sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==", "dev": true, "dependencies": { - "@jest/transform": "^29.7.0", + "@jest/transform": "^29.6.4", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", @@ -7794,15 +7689,15 @@ } }, "node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.4.tgz", + "integrity": "sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==", "dev": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -7879,9 +7774,9 @@ } }, "node_modules/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.6.3.tgz", + "integrity": "sha512-2+H+GOTQBEm2+qFSQ7Ma+BvyV+waiIFxmZF5LdpBsAEjWX8QYjSCa4FrkIYtbfXUJJJnFCYrOtt6TZ+IAiTjBQ==", "dev": true, "dependencies": { "detect-newline": "^3.0.0" @@ -7891,16 +7786,16 @@ } }, "node_modules/jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.3.tgz", + "integrity": "sha512-KoXfJ42k8cqbkfshW7sSHcdfnv5agDdHCPA87ZBdmHP+zJstTJc0ttQaJ/x7zK6noAL76hOuTIJ6ZkQRS5dcyg==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" + "jest-util": "^29.6.3", + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -7977,17 +7872,17 @@ } }, "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.4.tgz", + "integrity": "sha512-i7SbpH2dEIFGNmxGCpSc2w9cA4qVD+wfvg2ZnfQ7XVrKL0NA5uDVBIiGH8SR4F0dKEv/0qI5r+aDomDf04DpEQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", + "@jest/environment": "^29.6.4", + "@jest/fake-timers": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" + "jest-mock": "^29.6.3", + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -8003,9 +7898,9 @@ } }, "node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz", + "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -8015,8 +7910,8 @@ "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", + "jest-util": "^29.6.3", + "jest-worker": "^29.6.4", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -8028,28 +7923,28 @@ } }, "node_modules/jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.3.tgz", + "integrity": "sha512-0kfbESIHXYdhAdpLsW7xdwmYhLf1BRu4AA118/OxFm0Ho1b2RcTmO4oF6aAMaxpxdxnJ3zve2rgwzNBD4Zbm7Q==", "dev": true, "dependencies": { "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.4.tgz", + "integrity": "sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.7.0", + "jest-diff": "^29.6.4", "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -8126,9 +8021,9 @@ } }, "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.3.tgz", + "integrity": "sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", @@ -8137,7 +8032,7 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", + "pretty-format": "^29.6.3", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -8216,14 +8111,14 @@ } }, "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.3.tgz", + "integrity": "sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", - "jest-util": "^29.7.0" + "jest-util": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -8256,17 +8151,17 @@ } }, "node_modules/jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.4.tgz", + "integrity": "sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q==", "dev": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", + "jest-haste-map": "^29.6.4", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", + "jest-util": "^29.6.3", + "jest-validate": "^29.6.3", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" @@ -8276,13 +8171,13 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.4.tgz", + "integrity": "sha512-7+6eAmr1ZBF3vOAJVsfLj1QdqeXG+WYhidfLHBRZqGN24MFRIiKG20ItpLw2qRAsW/D2ZUUmCNf6irUr/v6KHA==", "dev": true, "dependencies": { "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" + "jest-snapshot": "^29.6.4" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -8359,30 +8254,30 @@ } }, "node_modules/jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.4.tgz", + "integrity": "sha512-SDaLrMmtVlQYDuG0iSPYLycG8P9jLI+fRm8AF/xPKhYDB2g6xDWjXBrR5M8gEWsK6KVFlebpZ4QsrxdyIX1Jaw==", "dev": true, "dependencies": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", + "@jest/console": "^29.6.4", + "@jest/environment": "^29.6.4", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", + "jest-docblock": "^29.6.3", + "jest-environment-node": "^29.6.4", + "jest-haste-map": "^29.6.4", + "jest-leak-detector": "^29.6.3", + "jest-message-util": "^29.6.3", + "jest-resolve": "^29.6.4", + "jest-runtime": "^29.6.4", + "jest-util": "^29.6.3", + "jest-watcher": "^29.6.4", + "jest-worker": "^29.6.4", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -8461,17 +8356,17 @@ } }, "node_modules/jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.4.tgz", + "integrity": "sha512-s/QxMBLvmwLdchKEjcLfwzP7h+jsHvNEtxGP5P+Fl1FMaJX2jMiIqe4rJw4tFprzCwuSvVUo9bn0uj4gNRXsbA==", "dev": true, "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", + "@jest/environment": "^29.6.4", + "@jest/fake-timers": "^29.6.4", + "@jest/globals": "^29.6.4", "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", + "@jest/test-result": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", @@ -8479,13 +8374,13 @@ "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", + "jest-haste-map": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-mock": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", + "jest-resolve": "^29.6.4", + "jest-snapshot": "^29.6.4", + "jest-util": "^29.6.3", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -8564,9 +8459,9 @@ } }, "node_modules/jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.4.tgz", + "integrity": "sha512-VC1N8ED7+4uboUKGIDsbvNAZb6LakgIPgAF4RSpF13dN6YaMokfRqO+BaqK4zIh6X3JffgwbzuGqDEjHm/MrvA==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -8574,20 +8469,20 @@ "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", + "@jest/expect-utils": "^29.6.4", + "@jest/transform": "^29.6.4", "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.7.0", + "expect": "^29.6.4", "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", + "jest-diff": "^29.6.4", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", + "jest-matcher-utils": "^29.6.4", + "jest-message-util": "^29.6.3", + "jest-util": "^29.6.3", "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", + "pretty-format": "^29.6.3", "semver": "^7.5.3" }, "engines": { @@ -8698,9 +8593,9 @@ "dev": true }, "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", + "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -8785,9 +8680,9 @@ } }, "node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz", + "integrity": "sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -8795,7 +8690,7 @@ "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^29.7.0" + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -8884,18 +8779,18 @@ } }, "node_modules/jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.4.tgz", + "integrity": "sha512-oqUWvx6+On04ShsT00Ir9T4/FvBeEh2M9PTubgITPxDa739p4hoQweWPRGyYeaojgT0xTpZKF0Y/rSY1UgMxvQ==", "dev": true, "dependencies": { - "@jest/test-result": "^29.7.0", + "@jest/test-result": "^29.6.4", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.7.0", + "jest-util": "^29.6.3", "string-length": "^4.0.1" }, "engines": { @@ -8973,13 +8868,13 @@ } }, "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "version": "29.6.4", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", + "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==", "dev": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.7.0", + "jest-util": "^29.6.3", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -10517,9 +10412,9 @@ } }, "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", + "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", @@ -10817,14 +10712,14 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -11224,19 +11119,6 @@ "node": ">= 0.8.0" } }, - "node_modules/set-function-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.0.tgz", - "integrity": "sha512-WmS8UHojv5s1eSoRSmzO5zzgDq8PE1/X/ij0k+9fMYmINCc6+j+SF3Om8YyucKn2yjnK4ItNZOoQycNnHsZJTw==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", diff --git a/trade-finance-manager-ui/package.json b/trade-finance-manager-ui/package.json index 2b96a37e02..43c00685d0 100644 --- a/trade-finance-manager-ui/package.json +++ b/trade-finance-manager-ui/package.json @@ -59,7 +59,7 @@ "date-fns": "^2.30.0", "dotenv": "16.0.3", "express": "^4.18.2", - "express-rate-limit": "^6.11.2", + "express-rate-limit": "^6.11.0", "express-session": "1.17.3", "express-validator": "7.0.1", "express-xss-sanitizer": "^1.1.6", @@ -88,11 +88,11 @@ "@babel/preset-env": "7.21.5", "@babel/runtime": "7.21.5", "@types/jest": "^29.5.4", - "axios-mock-adapter": "^1.22.0", + "axios-mock-adapter": "^1.21.5", "babel-jest": "29.5.0", "babel-loader": "9.1.2", "copy-webpack-plugin": "^11.0.0", - "eslint": "^8.49.0", + "eslint": "^8.48.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.28.1", "file-loader": "^6.2.0", diff --git a/utils/data-migration/package-lock.json b/utils/data-migration/package-lock.json index 7dc04a6ee7..c695c81303 100644 --- a/utils/data-migration/package-lock.json +++ b/utils/data-migration/package-lock.json @@ -130,44 +130,44 @@ "optional": true }, "node_modules/@aws-sdk/client-cognito-identity": { - "version": "3.410.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.410.0.tgz", - "integrity": "sha512-J4iPhXswm66Fsk1x0Kly+PWzBizmms4kkkoAU1sk9n08XfWqNBTyf01mx6/t/X+Yh43p2zaeB/XvUwa0jSsWaQ==", + "version": "3.408.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.408.0.tgz", + "integrity": "sha512-SJfFXLvjnERmm9X4H/43J1Ax6lX3C5XwRn6eImBaBNwT4JQVMSG/kf9vG8dvLkvvnh4t1RM7p12bkc9AI41zBA==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.410.0", - "@aws-sdk/credential-provider-node": "3.410.0", - "@aws-sdk/middleware-host-header": "3.410.0", - "@aws-sdk/middleware-logger": "3.410.0", - "@aws-sdk/middleware-recursion-detection": "3.410.0", - "@aws-sdk/middleware-signing": "3.410.0", - "@aws-sdk/middleware-user-agent": "3.410.0", - "@aws-sdk/types": "3.410.0", - "@aws-sdk/util-endpoints": "3.410.0", - "@aws-sdk/util-user-agent-browser": "3.410.0", - "@aws-sdk/util-user-agent-node": "3.410.0", - "@smithy/config-resolver": "^2.0.7", - "@smithy/fetch-http-handler": "^2.1.2", - "@smithy/hash-node": "^2.0.6", - "@smithy/invalid-dependency": "^2.0.6", - "@smithy/middleware-content-length": "^2.0.8", - "@smithy/middleware-endpoint": "^2.0.6", - "@smithy/middleware-retry": "^2.0.9", - "@smithy/middleware-serde": "^2.0.6", + "@aws-sdk/client-sts": "3.408.0", + "@aws-sdk/credential-provider-node": "3.408.0", + "@aws-sdk/middleware-host-header": "3.408.0", + "@aws-sdk/middleware-logger": "3.408.0", + "@aws-sdk/middleware-recursion-detection": "3.408.0", + "@aws-sdk/middleware-signing": "3.408.0", + "@aws-sdk/middleware-user-agent": "3.408.0", + "@aws-sdk/types": "3.408.0", + "@aws-sdk/util-endpoints": "3.408.0", + "@aws-sdk/util-user-agent-browser": "3.408.0", + "@aws-sdk/util-user-agent-node": "3.408.0", + "@smithy/config-resolver": "^2.0.5", + "@smithy/fetch-http-handler": "^2.0.5", + "@smithy/hash-node": "^2.0.5", + "@smithy/invalid-dependency": "^2.0.5", + "@smithy/middleware-content-length": "^2.0.5", + "@smithy/middleware-endpoint": "^2.0.5", + "@smithy/middleware-retry": "^2.0.5", + "@smithy/middleware-serde": "^2.0.5", "@smithy/middleware-stack": "^2.0.0", - "@smithy/node-config-provider": "^2.0.9", - "@smithy/node-http-handler": "^2.1.2", - "@smithy/protocol-http": "^3.0.2", - "@smithy/smithy-client": "^2.1.3", - "@smithy/types": "^2.3.0", - "@smithy/url-parser": "^2.0.6", + "@smithy/node-config-provider": "^2.0.6", + "@smithy/node-http-handler": "^2.0.5", + "@smithy/protocol-http": "^2.0.5", + "@smithy/smithy-client": "^2.0.5", + "@smithy/types": "^2.2.2", + "@smithy/url-parser": "^2.0.5", "@smithy/util-base64": "^2.0.0", "@smithy/util-body-length-browser": "^2.0.0", "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.7", - "@smithy/util-defaults-mode-node": "^2.0.9", + "@smithy/util-defaults-mode-browser": "^2.0.6", + "@smithy/util-defaults-mode-node": "^2.0.6", "@smithy/util-retry": "^2.0.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" @@ -177,41 +177,41 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.410.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.410.0.tgz", - "integrity": "sha512-MC9GrgwtlOuSL2WS3DRM3dQ/5y+49KSMMJRH6JiEcU5vE0dX/OtEcX+VfEwpi73x5pSfIjm7xnzjzOFx+sQBIg==", + "version": "3.408.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.408.0.tgz", + "integrity": "sha512-g0Y904ghLTg9JLJnmbuvf10Hrzwqn2pko6aCAK10vCI5Y2nQ6BAUXuPonxhZIlp+JHsk0B2FUBqquc+bErUspA==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/middleware-host-header": "3.410.0", - "@aws-sdk/middleware-logger": "3.410.0", - "@aws-sdk/middleware-recursion-detection": "3.410.0", - "@aws-sdk/middleware-user-agent": "3.410.0", - "@aws-sdk/types": "3.410.0", - "@aws-sdk/util-endpoints": "3.410.0", - "@aws-sdk/util-user-agent-browser": "3.410.0", - "@aws-sdk/util-user-agent-node": "3.410.0", - "@smithy/config-resolver": "^2.0.7", - "@smithy/fetch-http-handler": "^2.1.2", - "@smithy/hash-node": "^2.0.6", - "@smithy/invalid-dependency": "^2.0.6", - "@smithy/middleware-content-length": "^2.0.8", - "@smithy/middleware-endpoint": "^2.0.6", - "@smithy/middleware-retry": "^2.0.9", - "@smithy/middleware-serde": "^2.0.6", + "@aws-sdk/middleware-host-header": "3.408.0", + "@aws-sdk/middleware-logger": "3.408.0", + "@aws-sdk/middleware-recursion-detection": "3.408.0", + "@aws-sdk/middleware-user-agent": "3.408.0", + "@aws-sdk/types": "3.408.0", + "@aws-sdk/util-endpoints": "3.408.0", + "@aws-sdk/util-user-agent-browser": "3.408.0", + "@aws-sdk/util-user-agent-node": "3.408.0", + "@smithy/config-resolver": "^2.0.5", + "@smithy/fetch-http-handler": "^2.0.5", + "@smithy/hash-node": "^2.0.5", + "@smithy/invalid-dependency": "^2.0.5", + "@smithy/middleware-content-length": "^2.0.5", + "@smithy/middleware-endpoint": "^2.0.5", + "@smithy/middleware-retry": "^2.0.5", + "@smithy/middleware-serde": "^2.0.5", "@smithy/middleware-stack": "^2.0.0", - "@smithy/node-config-provider": "^2.0.9", - "@smithy/node-http-handler": "^2.1.2", - "@smithy/protocol-http": "^3.0.2", - "@smithy/smithy-client": "^2.1.3", - "@smithy/types": "^2.3.0", - "@smithy/url-parser": "^2.0.6", + "@smithy/node-config-provider": "^2.0.6", + "@smithy/node-http-handler": "^2.0.5", + "@smithy/protocol-http": "^2.0.5", + "@smithy/smithy-client": "^2.0.5", + "@smithy/types": "^2.2.2", + "@smithy/url-parser": "^2.0.5", "@smithy/util-base64": "^2.0.0", "@smithy/util-body-length-browser": "^2.0.0", "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.7", - "@smithy/util-defaults-mode-node": "^2.0.9", + "@smithy/util-defaults-mode-browser": "^2.0.6", + "@smithy/util-defaults-mode-node": "^2.0.6", "@smithy/util-retry": "^2.0.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" @@ -221,44 +221,44 @@ } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.410.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.410.0.tgz", - "integrity": "sha512-e6VMrBJtnTxxUXwDmkADGIvyppmDMFf4+cGGA68tVCUm1cFNlCI6M/67bVSIPN/WVKAAfhEL5O2vVXCM7aatYg==", + "version": "3.408.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.408.0.tgz", + "integrity": "sha512-PpNmhCuFjVrgGBy00RVh3evBxzFfvUrALDqpBnPYhz489Qzg2I+T90FqdSUedPQPYe+qhq0YJMPKc9leYBEB/w==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/credential-provider-node": "3.410.0", - "@aws-sdk/middleware-host-header": "3.410.0", - "@aws-sdk/middleware-logger": "3.410.0", - "@aws-sdk/middleware-recursion-detection": "3.410.0", - "@aws-sdk/middleware-sdk-sts": "3.410.0", - "@aws-sdk/middleware-signing": "3.410.0", - "@aws-sdk/middleware-user-agent": "3.410.0", - "@aws-sdk/types": "3.410.0", - "@aws-sdk/util-endpoints": "3.410.0", - "@aws-sdk/util-user-agent-browser": "3.410.0", - "@aws-sdk/util-user-agent-node": "3.410.0", - "@smithy/config-resolver": "^2.0.7", - "@smithy/fetch-http-handler": "^2.1.2", - "@smithy/hash-node": "^2.0.6", - "@smithy/invalid-dependency": "^2.0.6", - "@smithy/middleware-content-length": "^2.0.8", - "@smithy/middleware-endpoint": "^2.0.6", - "@smithy/middleware-retry": "^2.0.9", - "@smithy/middleware-serde": "^2.0.6", + "@aws-sdk/credential-provider-node": "3.408.0", + "@aws-sdk/middleware-host-header": "3.408.0", + "@aws-sdk/middleware-logger": "3.408.0", + "@aws-sdk/middleware-recursion-detection": "3.408.0", + "@aws-sdk/middleware-sdk-sts": "3.408.0", + "@aws-sdk/middleware-signing": "3.408.0", + "@aws-sdk/middleware-user-agent": "3.408.0", + "@aws-sdk/types": "3.408.0", + "@aws-sdk/util-endpoints": "3.408.0", + "@aws-sdk/util-user-agent-browser": "3.408.0", + "@aws-sdk/util-user-agent-node": "3.408.0", + "@smithy/config-resolver": "^2.0.5", + "@smithy/fetch-http-handler": "^2.0.5", + "@smithy/hash-node": "^2.0.5", + "@smithy/invalid-dependency": "^2.0.5", + "@smithy/middleware-content-length": "^2.0.5", + "@smithy/middleware-endpoint": "^2.0.5", + "@smithy/middleware-retry": "^2.0.5", + "@smithy/middleware-serde": "^2.0.5", "@smithy/middleware-stack": "^2.0.0", - "@smithy/node-config-provider": "^2.0.9", - "@smithy/node-http-handler": "^2.1.2", - "@smithy/protocol-http": "^3.0.2", - "@smithy/smithy-client": "^2.1.3", - "@smithy/types": "^2.3.0", - "@smithy/url-parser": "^2.0.6", + "@smithy/node-config-provider": "^2.0.6", + "@smithy/node-http-handler": "^2.0.5", + "@smithy/protocol-http": "^2.0.5", + "@smithy/smithy-client": "^2.0.5", + "@smithy/types": "^2.2.2", + "@smithy/url-parser": "^2.0.5", "@smithy/util-base64": "^2.0.0", "@smithy/util-body-length-browser": "^2.0.0", "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.7", - "@smithy/util-defaults-mode-node": "^2.0.9", + "@smithy/util-defaults-mode-browser": "^2.0.6", + "@smithy/util-defaults-mode-node": "^2.0.6", "@smithy/util-retry": "^2.0.0", "@smithy/util-utf8": "^2.0.0", "fast-xml-parser": "4.2.5", @@ -269,15 +269,15 @@ } }, "node_modules/@aws-sdk/credential-provider-cognito-identity": { - "version": "3.410.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.410.0.tgz", - "integrity": "sha512-2QMvdnwnYsKnwy8O+o9ozKL80VFWI0skXVvKB3DFW4cr9IX5cBCx7xuhI7TXbCqiBxuz5SSiA1s19fVtq0sUmw==", + "version": "3.408.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.408.0.tgz", + "integrity": "sha512-P3Yj/u54oceD4CHzoHgvb2YAmrKTm/uqsgbJcWJ6RwEkJ7awF6aOzUYLRK1z1PCtfq6YdHUmrv2RkxcQnQeboA==", "optional": true, "dependencies": { - "@aws-sdk/client-cognito-identity": "3.410.0", - "@aws-sdk/types": "3.410.0", + "@aws-sdk/client-cognito-identity": "3.408.0", + "@aws-sdk/types": "3.408.0", "@smithy/property-provider": "^2.0.0", - "@smithy/types": "^2.3.0", + "@smithy/types": "^2.2.2", "tslib": "^2.5.0" }, "engines": { @@ -285,14 +285,14 @@ } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.410.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.410.0.tgz", - "integrity": "sha512-c7TB9LbN0PkFOsXI0lcRJnqPNOmc4VBvrHf8jP/BkTDg4YUoKQKOFd4d0SqzODmlZiAyoMQVZTR4ISZo95Zj4Q==", + "version": "3.408.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.408.0.tgz", + "integrity": "sha512-GCpgHEHxRTzKaMkwDC2gLb3xlD+ZxhKPUJ1DVcO7I9E3eCGJsYVedIi0/2XE+NP+HVoy8LyW2qH8QQWh64JKow==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.410.0", + "@aws-sdk/types": "3.408.0", "@smithy/property-provider": "^2.0.0", - "@smithy/types": "^2.3.0", + "@smithy/types": "^2.2.2", "tslib": "^2.5.0" }, "engines": { @@ -300,20 +300,20 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.410.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.410.0.tgz", - "integrity": "sha512-D8rcr5bRCFD0f42MPQ7K6TWZq5d3pfqrKINL1/bpfkK5BJbvq1BGYmR88UC6CLpTRtZ1LHY2HgYG0fp/2zjjww==", + "version": "3.408.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.408.0.tgz", + "integrity": "sha512-vXuayXiwHncd3Xush0jQYrnu2aPPlE+fpdnpEdZGgUJwdbv2vSeYZ73ldH1LzCd179BEDVT0J7nHc7fposo3kg==", "optional": true, "dependencies": { - "@aws-sdk/credential-provider-env": "3.410.0", - "@aws-sdk/credential-provider-process": "3.410.0", - "@aws-sdk/credential-provider-sso": "3.410.0", - "@aws-sdk/credential-provider-web-identity": "3.410.0", - "@aws-sdk/types": "3.410.0", + "@aws-sdk/credential-provider-env": "3.408.0", + "@aws-sdk/credential-provider-process": "3.408.0", + "@aws-sdk/credential-provider-sso": "3.408.0", + "@aws-sdk/credential-provider-web-identity": "3.408.0", + "@aws-sdk/types": "3.408.0", "@smithy/credential-provider-imds": "^2.0.0", "@smithy/property-provider": "^2.0.0", "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/types": "^2.3.0", + "@smithy/types": "^2.2.2", "tslib": "^2.5.0" }, "engines": { @@ -321,21 +321,21 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.410.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.410.0.tgz", - "integrity": "sha512-0wmVm33T/j1FS7MZ/j+WsPlgSc0YnCXnpbWSov1Mn6R86SHI2b2JhdIPRRE4XbGfyW2QGNUl2CwoZVaqhXeF5g==", + "version": "3.408.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.408.0.tgz", + "integrity": "sha512-AzDtlj2Mb01K5+AiDI14HsIs9I/pI4nM3kxeOZZvocaaThF5OFR+4wR2v2plhfGJ8QAPEE/KnqcJ3JlJ7orShg==", "optional": true, "dependencies": { - "@aws-sdk/credential-provider-env": "3.410.0", - "@aws-sdk/credential-provider-ini": "3.410.0", - "@aws-sdk/credential-provider-process": "3.410.0", - "@aws-sdk/credential-provider-sso": "3.410.0", - "@aws-sdk/credential-provider-web-identity": "3.410.0", - "@aws-sdk/types": "3.410.0", + "@aws-sdk/credential-provider-env": "3.408.0", + "@aws-sdk/credential-provider-ini": "3.408.0", + "@aws-sdk/credential-provider-process": "3.408.0", + "@aws-sdk/credential-provider-sso": "3.408.0", + "@aws-sdk/credential-provider-web-identity": "3.408.0", + "@aws-sdk/types": "3.408.0", "@smithy/credential-provider-imds": "^2.0.0", "@smithy/property-provider": "^2.0.0", "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/types": "^2.3.0", + "@smithy/types": "^2.2.2", "tslib": "^2.5.0" }, "engines": { @@ -343,15 +343,15 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.410.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.410.0.tgz", - "integrity": "sha512-BMju1hlDCDNkkSZpKF5SQ8G0WCLRj6/Jvw9QmudLHJuVwYJXEW1r2AsVMg98OZ3hB9G+MAvHruHZIbMiNmUMXQ==", + "version": "3.408.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.408.0.tgz", + "integrity": "sha512-qCTf9tr6+I2s3+v5zP4YRQQrGlYw/jyZ7u/k6bGshhlvgwGPfjNuHrM8uK/W1kv4ng1myxaL1/tAY6RVVdXz4Q==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.410.0", + "@aws-sdk/types": "3.408.0", "@smithy/property-provider": "^2.0.0", "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/types": "^2.3.0", + "@smithy/types": "^2.2.2", "tslib": "^2.5.0" }, "engines": { @@ -359,17 +359,17 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.410.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.410.0.tgz", - "integrity": "sha512-zEaoY/sY+KYTlQUkp9dvveAHf175b8RIt0DsQkDrRPtrg/RBHR00r5rFvz9+nrwsR8546RaBU7h/zzTaQGhmcA==", + "version": "3.408.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.408.0.tgz", + "integrity": "sha512-iKU91cxrttQyDhdhF7vJZd6XibvwGolFzuJBG4DD4jOdvmTcVq4L26AH8bjR1psnS6pvTa66FaYt6BGtbXgVeA==", "optional": true, "dependencies": { - "@aws-sdk/client-sso": "3.410.0", - "@aws-sdk/token-providers": "3.410.0", - "@aws-sdk/types": "3.410.0", + "@aws-sdk/client-sso": "3.408.0", + "@aws-sdk/token-providers": "3.408.0", + "@aws-sdk/types": "3.408.0", "@smithy/property-provider": "^2.0.0", "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/types": "^2.3.0", + "@smithy/types": "^2.2.2", "tslib": "^2.5.0" }, "engines": { @@ -377,14 +377,14 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.410.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.410.0.tgz", - "integrity": "sha512-cE0l8LmEHdWbDkdPNgrfdYSgp4/cIVXrjUKI1QCATA729CrHZ/OQjB/maOBOrMHO9YTiggko887NkslVvwVB7w==", + "version": "3.408.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.408.0.tgz", + "integrity": "sha512-5FbDPF/zY/1t6k1zRI/HnrxcH2v7SwsEYu2SThI2qbzaP/K7MTnTanV5vNFcdQOpuQ7x3PrzTlH3AWZueCr3Vw==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.410.0", + "@aws-sdk/types": "3.408.0", "@smithy/property-provider": "^2.0.0", - "@smithy/types": "^2.3.0", + "@smithy/types": "^2.2.2", "tslib": "^2.5.0" }, "engines": { @@ -392,25 +392,25 @@ } }, "node_modules/@aws-sdk/credential-providers": { - "version": "3.410.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.410.0.tgz", - "integrity": "sha512-QcunzQRNi9dJdAGdduST7itRW+QhDrb9zZHn+HhLKUoVwLrqk1iuH2R9SoEdZg8eV5jR04yoOPdjj1jzdIkFXQ==", - "optional": true, - "dependencies": { - "@aws-sdk/client-cognito-identity": "3.410.0", - "@aws-sdk/client-sso": "3.410.0", - "@aws-sdk/client-sts": "3.410.0", - "@aws-sdk/credential-provider-cognito-identity": "3.410.0", - "@aws-sdk/credential-provider-env": "3.410.0", - "@aws-sdk/credential-provider-ini": "3.410.0", - "@aws-sdk/credential-provider-node": "3.410.0", - "@aws-sdk/credential-provider-process": "3.410.0", - "@aws-sdk/credential-provider-sso": "3.410.0", - "@aws-sdk/credential-provider-web-identity": "3.410.0", - "@aws-sdk/types": "3.410.0", + "version": "3.408.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.408.0.tgz", + "integrity": "sha512-NVE5hDXlY4I4nRtaxf4vPTABWn2PoRUjCGW9HEOzD/oQx054OsXW0n1umviDncYCfiroCveRERM2htVIGiREng==", + "optional": true, + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.408.0", + "@aws-sdk/client-sso": "3.408.0", + "@aws-sdk/client-sts": "3.408.0", + "@aws-sdk/credential-provider-cognito-identity": "3.408.0", + "@aws-sdk/credential-provider-env": "3.408.0", + "@aws-sdk/credential-provider-ini": "3.408.0", + "@aws-sdk/credential-provider-node": "3.408.0", + "@aws-sdk/credential-provider-process": "3.408.0", + "@aws-sdk/credential-provider-sso": "3.408.0", + "@aws-sdk/credential-provider-web-identity": "3.408.0", + "@aws-sdk/types": "3.408.0", "@smithy/credential-provider-imds": "^2.0.0", "@smithy/property-provider": "^2.0.0", - "@smithy/types": "^2.3.0", + "@smithy/types": "^2.2.2", "tslib": "^2.5.0" }, "engines": { @@ -418,14 +418,14 @@ } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.410.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.410.0.tgz", - "integrity": "sha512-ED/OVcyITln5rrxnajZP+V0PN1nug+gSDHJDqdDo/oLy7eiDr/ZWn3nlWW7WcMplQ1/Jnb+hK0UetBp/25XooA==", + "version": "3.408.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.408.0.tgz", + "integrity": "sha512-eofCXuSZ+ntbLzeCRdHzraXzgWqAplXU7W2qFFVC4O9lZBhADwNPI8n8x98TH0mftnmvZxh5Bo5U8WvEolIDkw==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.410.0", - "@smithy/protocol-http": "^3.0.2", - "@smithy/types": "^2.3.0", + "@aws-sdk/types": "3.408.0", + "@smithy/protocol-http": "^2.0.5", + "@smithy/types": "^2.2.2", "tslib": "^2.5.0" }, "engines": { @@ -433,13 +433,13 @@ } }, "node_modules/@aws-sdk/middleware-logger": { - "version": "3.410.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.410.0.tgz", - "integrity": "sha512-YtmKYCVtBfScq3/UFJk+aSZOktKJBNZL9DaSc2aPcy/goCVsYDOkGwtHk0jIkC1JRSNCkVTqL7ya60sSr8zaQQ==", + "version": "3.408.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.408.0.tgz", + "integrity": "sha512-otwXPCubsGRFv8Hb6nKw6Vvnu4dC8CcPk05buStj42nF8QdjWrKGb2rDCvLph5lr576LF5HN+Y2moyOi7z/I7g==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.410.0", - "@smithy/types": "^2.3.0", + "@aws-sdk/types": "3.408.0", + "@smithy/types": "^2.2.2", "tslib": "^2.5.0" }, "engines": { @@ -447,14 +447,14 @@ } }, "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.410.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.410.0.tgz", - "integrity": "sha512-KWaes5FLzRqj28vaIEE4Bimpga2E596WdPF2HaH6zsVMJddoRDsc3ZX9ZhLOGrXzIO1RqBd0QxbLrM0S/B2aOQ==", + "version": "3.408.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.408.0.tgz", + "integrity": "sha512-QfZwmX5z0IRC2c8pBi9VozSqbJw19V5oxyykSTqdjGe3CG3yNujXObV6xQesK67CWSnPb9wDgVGKUoYuIXwOxw==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.410.0", - "@smithy/protocol-http": "^3.0.2", - "@smithy/types": "^2.3.0", + "@aws-sdk/types": "3.408.0", + "@smithy/protocol-http": "^2.0.5", + "@smithy/types": "^2.2.2", "tslib": "^2.5.0" }, "engines": { @@ -462,14 +462,14 @@ } }, "node_modules/@aws-sdk/middleware-sdk-sts": { - "version": "3.410.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.410.0.tgz", - "integrity": "sha512-YfBpctDocRR4CcROoDueJA7D+aMLBV8nTFfmVNdLLLgyuLZ/AUR11VQSu1lf9gQZKl8IpKE/BLf2fRE/qV1ZuA==", + "version": "3.408.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.408.0.tgz", + "integrity": "sha512-dIO9BTX049P2PwaeAK2lxJeA2rZi9/bWzMP1GIE60VrMDHmN5Ljvh1lLActECLAqNQIqN5Ub0bKV2tC/jMn+CA==", "optional": true, "dependencies": { - "@aws-sdk/middleware-signing": "3.410.0", - "@aws-sdk/types": "3.410.0", - "@smithy/types": "^2.3.0", + "@aws-sdk/middleware-signing": "3.408.0", + "@aws-sdk/types": "3.408.0", + "@smithy/types": "^2.2.2", "tslib": "^2.5.0" }, "engines": { @@ -477,16 +477,16 @@ } }, "node_modules/@aws-sdk/middleware-signing": { - "version": "3.410.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.410.0.tgz", - "integrity": "sha512-KBAZ/eoAJUSJv5us2HsKwK2OszG2s9FEyKpEhgnHLcbbKzW873zHBH5GcOGEQu4AWArTy2ndzJu3FF+9/J9hJQ==", + "version": "3.408.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.408.0.tgz", + "integrity": "sha512-flLiLKATJ4NLcLb7lPojyQ6NvLSyQ3axqIClqwMRnhSRxvREB7OgBKwmPecSl0I5JxsNEqo+mjARdMjUHadgWQ==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.410.0", + "@aws-sdk/types": "3.408.0", "@smithy/property-provider": "^2.0.0", - "@smithy/protocol-http": "^3.0.2", + "@smithy/protocol-http": "^2.0.5", "@smithy/signature-v4": "^2.0.0", - "@smithy/types": "^2.3.0", + "@smithy/types": "^2.2.2", "@smithy/util-middleware": "^2.0.0", "tslib": "^2.5.0" }, @@ -495,15 +495,15 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.410.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.410.0.tgz", - "integrity": "sha512-ZayDtLfvCZUohSxQc/49BfoU/y6bDHLfLdyyUJbJ54Sv8zQcrmdyKvCBFUZwE6tHQgAmv9/ZT18xECMl+xiONA==", + "version": "3.408.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.408.0.tgz", + "integrity": "sha512-UvlKri8/Mgf5W+tFU6ZJ65fC6HljcysIqfRFts/8Wurl322IS1I4j+pyjV2P6eK1054bzynfi3Trv+tRYHtVcA==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.410.0", - "@aws-sdk/util-endpoints": "3.410.0", - "@smithy/protocol-http": "^3.0.2", - "@smithy/types": "^2.3.0", + "@aws-sdk/types": "3.408.0", + "@aws-sdk/util-endpoints": "3.408.0", + "@smithy/protocol-http": "^2.0.5", + "@smithy/types": "^2.2.2", "tslib": "^2.5.0" }, "engines": { @@ -511,43 +511,43 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.410.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.410.0.tgz", - "integrity": "sha512-d5Nc0xydkH/X0LA1HDyhGY5sEv4LuADFk+QpDtT8ogLilcre+b1jpdY8Sih/gd1KoGS1H+d1tz2hSGwUHAbUbw==", + "version": "3.408.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.408.0.tgz", + "integrity": "sha512-D//BjUrVtDzDdCz1mRdZZSAc822fh75Ssq46smeS6S6NKq3vJeHhfrQJMyVU1GclXu1tn9AwykaQW5Jwb5im+g==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/middleware-host-header": "3.410.0", - "@aws-sdk/middleware-logger": "3.410.0", - "@aws-sdk/middleware-recursion-detection": "3.410.0", - "@aws-sdk/middleware-user-agent": "3.410.0", - "@aws-sdk/types": "3.410.0", - "@aws-sdk/util-endpoints": "3.410.0", - "@aws-sdk/util-user-agent-browser": "3.410.0", - "@aws-sdk/util-user-agent-node": "3.410.0", - "@smithy/config-resolver": "^2.0.7", - "@smithy/fetch-http-handler": "^2.1.2", - "@smithy/hash-node": "^2.0.6", - "@smithy/invalid-dependency": "^2.0.6", - "@smithy/middleware-content-length": "^2.0.8", - "@smithy/middleware-endpoint": "^2.0.6", - "@smithy/middleware-retry": "^2.0.9", - "@smithy/middleware-serde": "^2.0.6", + "@aws-sdk/middleware-host-header": "3.408.0", + "@aws-sdk/middleware-logger": "3.408.0", + "@aws-sdk/middleware-recursion-detection": "3.408.0", + "@aws-sdk/middleware-user-agent": "3.408.0", + "@aws-sdk/types": "3.408.0", + "@aws-sdk/util-endpoints": "3.408.0", + "@aws-sdk/util-user-agent-browser": "3.408.0", + "@aws-sdk/util-user-agent-node": "3.408.0", + "@smithy/config-resolver": "^2.0.5", + "@smithy/fetch-http-handler": "^2.0.5", + "@smithy/hash-node": "^2.0.5", + "@smithy/invalid-dependency": "^2.0.5", + "@smithy/middleware-content-length": "^2.0.5", + "@smithy/middleware-endpoint": "^2.0.5", + "@smithy/middleware-retry": "^2.0.5", + "@smithy/middleware-serde": "^2.0.5", "@smithy/middleware-stack": "^2.0.0", - "@smithy/node-config-provider": "^2.0.9", - "@smithy/node-http-handler": "^2.1.2", + "@smithy/node-config-provider": "^2.0.6", + "@smithy/node-http-handler": "^2.0.5", "@smithy/property-provider": "^2.0.0", - "@smithy/protocol-http": "^3.0.2", + "@smithy/protocol-http": "^2.0.5", "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/smithy-client": "^2.1.3", - "@smithy/types": "^2.3.0", - "@smithy/url-parser": "^2.0.6", + "@smithy/smithy-client": "^2.0.5", + "@smithy/types": "^2.2.2", + "@smithy/url-parser": "^2.0.5", "@smithy/util-base64": "^2.0.0", "@smithy/util-body-length-browser": "^2.0.0", "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.7", - "@smithy/util-defaults-mode-node": "^2.0.9", + "@smithy/util-defaults-mode-browser": "^2.0.6", + "@smithy/util-defaults-mode-node": "^2.0.6", "@smithy/util-retry": "^2.0.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" @@ -557,12 +557,12 @@ } }, "node_modules/@aws-sdk/types": { - "version": "3.410.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.410.0.tgz", - "integrity": "sha512-D7iaUCszv/v04NDaZUmCmekamy6VD/lKozm/3gS9+dkfU6cC2CsNoUfPV8BlV6dPdw0oWgF91am3I1stdvfVrQ==", + "version": "3.408.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.408.0.tgz", + "integrity": "sha512-sIsR5224xWQTW7O6h4V0S7DMWs4bK4DCunwOo7Avpq7ZVmH2YyLTs0n4NGL186j8xTosycF1ACQgpM48SLIvaA==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.0", + "@smithy/types": "^2.2.2", "tslib": "^2.5.0" }, "engines": { @@ -570,12 +570,12 @@ } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.410.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.410.0.tgz", - "integrity": "sha512-iNiqJyC7N3+8zFwnXUqcWSxrZecVZLToo1iTQQdeYL2af1IcOtRgb7n8jpAI/hmXhBSx2+3RI+Y7pxyFo1vu+w==", + "version": "3.408.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.408.0.tgz", + "integrity": "sha512-N1D5cKEkCqf5Q7IF/pI9kfcNrT+/5ctZ6cQo4Ex6xaOcnUzdOZcXdPqaMRZVZRn8enjK2SpoLlRpXGISOugPaw==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.410.0", + "@aws-sdk/types": "3.408.0", "tslib": "^2.5.0" }, "engines": { @@ -595,26 +595,26 @@ } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.410.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.410.0.tgz", - "integrity": "sha512-i1G/XGpXGMRT2zEiAhi1xucJsfCWk8nNYjk/LbC0sA+7B9Huri96YAzVib12wkHPsJQvZxZC6CpQDIHWm4lXMA==", + "version": "3.408.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.408.0.tgz", + "integrity": "sha512-wOVjDprG5h6kM8aJZk/tRX/RgxNxr73d6kIsUePlAgil13q62M9lcFMcIXduqtDsa1B6FfVB2wx/pyUuOZri5g==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.410.0", - "@smithy/types": "^2.3.0", + "@aws-sdk/types": "3.408.0", + "@smithy/types": "^2.2.2", "bowser": "^2.11.0", "tslib": "^2.5.0" } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.410.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.410.0.tgz", - "integrity": "sha512-bK70t1jHRl8HrJXd4hEIwc5PBZ7U0w+81AKFnanIVKZwZedd6nLibUXDTK14z/Jp2GFcBqd4zkt2YLGkRt/U4A==", + "version": "3.408.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.408.0.tgz", + "integrity": "sha512-BzMFV+cIXrtfcfJk3GpXnkANFkzZisvAtD306TMgIscn5FF26K1jD5DU+h5Q5WMq7gx+oXh9kJ3Lu3hi7hahKQ==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.410.0", - "@smithy/node-config-provider": "^2.0.9", - "@smithy/types": "^2.3.0", + "@aws-sdk/types": "3.408.0", + "@smithy/node-config-provider": "^2.0.6", + "@smithy/types": "^2.2.2", "tslib": "^2.5.0" }, "engines": { @@ -659,12 +659,12 @@ } }, "node_modules/@smithy/abort-controller": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.7.tgz", - "integrity": "sha512-rITz65zk8QA3GQ1OeoJ3/Q4+8j/HqubWU8TBqk57BMYTOX+P+LNMoVHPqzLHhE6qKot5muhThNCYvOKNt7ojJA==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.6.tgz", + "integrity": "sha512-4I7g0lyGUlW2onf8mD76IzU37oRWSHsQ5zlW5MjDzgg4I4J9bOK4500Gx6qOuoN7+GulAnGLe1YwyrIluzhakg==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.1", + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" }, "engines": { @@ -672,13 +672,13 @@ } }, "node_modules/@smithy/config-resolver": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.8.tgz", - "integrity": "sha512-e7mwQteHjo9S1GK+TfzP3o7ujE2ZK30d6wkv5brKtabrZF7MBflj9CwUP2XYuOYebdWirHOtv8ZfkMrpcbJfYw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.7.tgz", + "integrity": "sha512-J4J1AWiqaApC+3I9U++SuxAQ3BOoM5VoYnpFzCZcb63aLF80Zpc/nq2pFR1OsEIYyg2UYNdcBKKfHABmwo4WgQ==", "optional": true, "dependencies": { - "@smithy/node-config-provider": "^2.0.10", - "@smithy/types": "^2.3.1", + "@smithy/node-config-provider": "^2.0.9", + "@smithy/types": "^2.3.0", "@smithy/util-config-provider": "^2.0.0", "@smithy/util-middleware": "^2.0.0", "tslib": "^2.5.0" @@ -688,15 +688,15 @@ } }, "node_modules/@smithy/credential-provider-imds": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.0.10.tgz", - "integrity": "sha512-may2/gYlDip2rjlU1Z5fcCEWY0Fu3tSu/HykgZrLfb2/171P6OYuz7dGNKBOCS1W57vP4W5wmUhm0WGehrixig==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.0.9.tgz", + "integrity": "sha512-K7WZRkHS5HZofRgK+O8W4YXXyaVexU1K6hp9vlUL/8CsnrFbZS9quyH/6hTROrYh2PuJr24yii1kc83NJdxMGQ==", "optional": true, "dependencies": { - "@smithy/node-config-provider": "^2.0.10", - "@smithy/property-provider": "^2.0.8", - "@smithy/types": "^2.3.1", - "@smithy/url-parser": "^2.0.7", + "@smithy/node-config-provider": "^2.0.9", + "@smithy/property-provider": "^2.0.7", + "@smithy/types": "^2.3.0", + "@smithy/url-parser": "^2.0.6", "tslib": "^2.5.0" }, "engines": { @@ -704,37 +704,50 @@ } }, "node_modules/@smithy/eventstream-codec": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.7.tgz", - "integrity": "sha512-sW3AhXZhmmhh0f11EOotmNNa0rjrKwnMYNKfbp3B/qigdw6foKcmFGX+HF3XGN7w7fFeEFuXr97Ok24gRj92Xg==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.6.tgz", + "integrity": "sha512-J9xL82mlYRUMXFnB9VaThXkD7z2JLr52FIVZMoQQ1dxZG5ub+NOGmzaTTZC/cMmKXI/nwCoFuwDWCTjwQhYhQA==", "optional": true, "dependencies": { "@aws-crypto/crc32": "3.0.0", - "@smithy/types": "^2.3.1", + "@smithy/types": "^2.3.0", "@smithy/util-hex-encoding": "^2.0.0", "tslib": "^2.5.0" } }, "node_modules/@smithy/fetch-http-handler": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.1.3.tgz", - "integrity": "sha512-kUg+Ey4mJeR/3+Ponuhb1rsmsfZRwjCLvC+WcPgeI+ittretEzuWAPN+9anD0HJEoApVjHpndzxPtlncbCUJDQ==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.1.2.tgz", + "integrity": "sha512-3Gm3pQm4viUPU+e7KkRScS9t5phBxSNRS8rQSZ+HeCwK/busrX0/2HJZiwLvGblqPqi1laJB0lD18AdiOioJww==", "optional": true, "dependencies": { - "@smithy/protocol-http": "^3.0.3", - "@smithy/querystring-builder": "^2.0.7", - "@smithy/types": "^2.3.1", + "@smithy/protocol-http": "^3.0.2", + "@smithy/querystring-builder": "^2.0.6", + "@smithy/types": "^2.3.0", "@smithy/util-base64": "^2.0.0", "tslib": "^2.5.0" } }, + "node_modules/@smithy/fetch-http-handler/node_modules/@smithy/protocol-http": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.2.tgz", + "integrity": "sha512-LUOWCPRihvJBkdSs+ivK9m1f/rMfF3n9Zpzg8qdry2eIG4HQqqLBMWQyF9bgk7JhsrrOa3//jJKhXzvL7wL5Xw==", + "optional": true, + "dependencies": { + "@smithy/types": "^2.3.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@smithy/hash-node": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.7.tgz", - "integrity": "sha512-aB5lvIDP1v+ZUUS8ek3XW5xnZ6jUQ86JXqG7a5jMP6AbjAc3439mIbs6+f1EQ5MtYmrQCEtRRyvv5QofvotH0w==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.6.tgz", + "integrity": "sha512-xz7fzFxSzxohKGGyKPbLReRrY01JOZgRDHIXSks3PxQxG9c8PJMa5nUw0stH8UOySUgkofmMy0n7vTUsF5Mdqg==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.1", + "@smithy/types": "^2.3.0", "@smithy/util-buffer-from": "^2.0.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" @@ -744,12 +757,12 @@ } }, "node_modules/@smithy/invalid-dependency": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.7.tgz", - "integrity": "sha512-qVOZnHFPzQo4BS47/PANHX32Y69c0tJxKBkqTL795D/DKInqBwmBO/m1gS7v0ZQqmtCuoy2l87RflQfRY2xEIw==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.6.tgz", + "integrity": "sha512-L5MUyl9mzawIvBxr0Hg3J/Q5qZFXKcBgMk0PacfK3Mthp4WAR6h7iMxdSQ23Q7X/kxOrpZuoYEdh1BWLKbDc8Q==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.1", + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" } }, @@ -766,13 +779,26 @@ } }, "node_modules/@smithy/middleware-content-length": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.9.tgz", - "integrity": "sha512-2XVFsGqswxrIBi0w4Njwzb1zsbte26U513K+WPFm9z6SB/3WR5/VBVjTaTcamrXznTAqBjTwTL0Ysisv1dW0Rw==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.8.tgz", + "integrity": "sha512-fHJFsscHXrYhUSWMFJNXfsZW8KsyhWQfBgU3b0nvDfpm+NAeQLqKYNhywGrDwZQc1k+lt7Fw9faAquhNPxTZRA==", + "optional": true, + "dependencies": { + "@smithy/protocol-http": "^3.0.2", + "@smithy/types": "^2.3.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-content-length/node_modules/@smithy/protocol-http": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.2.tgz", + "integrity": "sha512-LUOWCPRihvJBkdSs+ivK9m1f/rMfF3n9Zpzg8qdry2eIG4HQqqLBMWQyF9bgk7JhsrrOa3//jJKhXzvL7wL5Xw==", "optional": true, "dependencies": { - "@smithy/protocol-http": "^3.0.3", - "@smithy/types": "^2.3.1", + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" }, "engines": { @@ -780,14 +806,14 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.0.7.tgz", - "integrity": "sha512-4/L0wV7PzHEprJB0gazSTIwlW/2cCfwC9EHavUMhoCyl1tLer6CJwDbAMit1IMvwbHkwuKopueb8dFPHfpS2Pw==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.0.6.tgz", + "integrity": "sha512-MuSPPtEHFal/M77tR3ffLsdOfX29IZpA990nGuoPj5zQnAYrA4PYBGoqqrASQKm8Xb3C0NwuYzOATT7WX4f5Pg==", "optional": true, "dependencies": { - "@smithy/middleware-serde": "^2.0.7", - "@smithy/types": "^2.3.1", - "@smithy/url-parser": "^2.0.7", + "@smithy/middleware-serde": "^2.0.6", + "@smithy/types": "^2.3.0", + "@smithy/url-parser": "^2.0.6", "@smithy/util-middleware": "^2.0.0", "tslib": "^2.5.0" }, @@ -796,15 +822,15 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.10.tgz", - "integrity": "sha512-VwAQOR5Rh/y9BzUgb5DzUk7qYBiMZu3pEQa5EwwAf/F7lpMuNildGrAxtDmsXk90490FJwa6LyFknXP3kO5BnA==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.9.tgz", + "integrity": "sha512-gneEqWj4l/ZjHdZPk0BFMXoTalRArdQ8i579/KqJgBAc6Ux5vnR/SSppkMCkj2kOQYwdypvzSPeqEW3ZrvIg6g==", "optional": true, "dependencies": { - "@smithy/node-config-provider": "^2.0.10", - "@smithy/protocol-http": "^3.0.3", + "@smithy/node-config-provider": "^2.0.9", + "@smithy/protocol-http": "^3.0.2", "@smithy/service-error-classification": "^2.0.0", - "@smithy/types": "^2.3.1", + "@smithy/types": "^2.3.0", "@smithy/util-middleware": "^2.0.0", "@smithy/util-retry": "^2.0.0", "tslib": "^2.5.0", @@ -814,13 +840,26 @@ "node": ">=14.0.0" } }, + "node_modules/@smithy/middleware-retry/node_modules/@smithy/protocol-http": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.2.tgz", + "integrity": "sha512-LUOWCPRihvJBkdSs+ivK9m1f/rMfF3n9Zpzg8qdry2eIG4HQqqLBMWQyF9bgk7JhsrrOa3//jJKhXzvL7wL5Xw==", + "optional": true, + "dependencies": { + "@smithy/types": "^2.3.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@smithy/middleware-serde": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.7.tgz", - "integrity": "sha512-tOldis4PUNafdGErLZ+33p9Pf3MmTlLa176X321Z6ZaCf1XNEow9m3T5vXrcHErVAvjPG0mp3l54J94HnPc+rQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.6.tgz", + "integrity": "sha512-8/GODBngYbrS28CMZtaHIL4R9rLNSQ/zgb+N1OAZ02NwBUawlnLDcatve9YRzhJC/IWz0/pt+WimJZaO1sGcig==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.1", + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" }, "engines": { @@ -840,14 +879,14 @@ } }, "node_modules/@smithy/node-config-provider": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.0.10.tgz", - "integrity": "sha512-e5MiLH5Eu+BbYsmhZIkvUKCzite6JCBPL75PNjlRK2TWvSpfp19hNf2SiJIQbPalcFj5zlyBvtcEkF1sfYIdhg==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.0.9.tgz", + "integrity": "sha512-TlSPbCwtT/jgNnmPQqKuCR5CFN8UIrCCHRrgUfs3NqRMuaLLeP8TPe1fSKq2J8h1M/jd4BF853gneles0gWevg==", "optional": true, "dependencies": { - "@smithy/property-provider": "^2.0.8", - "@smithy/shared-ini-file-loader": "^2.0.9", - "@smithy/types": "^2.3.1", + "@smithy/property-provider": "^2.0.7", + "@smithy/shared-ini-file-loader": "^2.0.8", + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" }, "engines": { @@ -855,15 +894,28 @@ } }, "node_modules/@smithy/node-http-handler": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.1.3.tgz", - "integrity": "sha512-TGkgpx68SqvbspVHaG3iwqP2mKYOT4whiq7Kv2X9v+InngL4MkpH3LQ0Dk7kbloahZr+hAOyb6s8D7T8TXRrzA==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.1.2.tgz", + "integrity": "sha512-PdEEDCShuM8zxGoaRxmGB/1ikB8oeqz+ZAF9VIA8FCP3E59j8zDTF+wCELoWd1Y6gtxr+RcTAg5sA8nvn5qH/w==", "optional": true, "dependencies": { - "@smithy/abort-controller": "^2.0.7", - "@smithy/protocol-http": "^3.0.3", - "@smithy/querystring-builder": "^2.0.7", - "@smithy/types": "^2.3.1", + "@smithy/abort-controller": "^2.0.6", + "@smithy/protocol-http": "^3.0.2", + "@smithy/querystring-builder": "^2.0.6", + "@smithy/types": "^2.3.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/node-http-handler/node_modules/@smithy/protocol-http": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.2.tgz", + "integrity": "sha512-LUOWCPRihvJBkdSs+ivK9m1f/rMfF3n9Zpzg8qdry2eIG4HQqqLBMWQyF9bgk7JhsrrOa3//jJKhXzvL7wL5Xw==", + "optional": true, + "dependencies": { + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" }, "engines": { @@ -871,12 +923,12 @@ } }, "node_modules/@smithy/property-provider": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.8.tgz", - "integrity": "sha512-oaaP/i7bGG8XbxG9Kx4PZh83iJ2jo/vt8RmJdi9hmc8APBaW1HGDperVXDCyPQdVYXmiqrtxc/rPImyBma1G3A==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.7.tgz", + "integrity": "sha512-XT8Tl7YNxM8tCtGqy7v7DSf6PxyXaPE9cdA/Yj4dEw2b05V3RrPqsP+t5XJiZu0yIsQ7pdeYZWv2sSEWVjNeAg==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.1", + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" }, "engines": { @@ -884,12 +936,12 @@ } }, "node_modules/@smithy/protocol-http": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.3.tgz", - "integrity": "sha512-UGfmQNdijlFV+UzgdRyfe05S5vLDdcdkvNcxhGvQ+Er7TjUkZSxjukQB9VXtT8oTHztgOMX74DDlPBsVzZR5Pg==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-2.0.5.tgz", + "integrity": "sha512-d2hhHj34mA2V86doiDfrsy2fNTnUOowGaf9hKb0hIPHqvcnShU4/OSc4Uf1FwHkAdYF3cFXTrj5VGUYbEuvMdw==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.1", + "@smithy/types": "^2.2.2", "tslib": "^2.5.0" }, "engines": { @@ -897,12 +949,12 @@ } }, "node_modules/@smithy/querystring-builder": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.7.tgz", - "integrity": "sha512-RPHnqt4iH1Kwp1Zbf4gJI88hZiynEZjE5hEWJNBmKqCe1Q6v7HBLtaovTaiuYaMEmPyb2KxOi3lISAdT6uuPqw==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.6.tgz", + "integrity": "sha512-HnU00shCGoV8vKJZTiNBkNvR9NogU3NIUaVMAGJPSqNGJj3psWo+TUrC0BVCDcwiCljXwXCFGJqIcsWtClrktQ==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.1", + "@smithy/types": "^2.3.0", "@smithy/util-uri-escape": "^2.0.0", "tslib": "^2.5.0" }, @@ -911,12 +963,12 @@ } }, "node_modules/@smithy/querystring-parser": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.7.tgz", - "integrity": "sha512-Cwi/Hgs73nbLKfgH7dXAxzvDxyTrK+BLrlAd0KXU7xcBR94V132nvxoq39BMWckYAPmnMwxCwq8uusNH4Dnagw==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.6.tgz", + "integrity": "sha512-i4LKoXHP7pTFAPjLIJyQXYOhWokbcFha3WWsX74sAKmuluv0XM2cxONZoFxwEzmWhsNyM6buSwJSZXyPiec0AQ==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.1", + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" }, "engines": { @@ -933,12 +985,12 @@ } }, "node_modules/@smithy/shared-ini-file-loader": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.0.9.tgz", - "integrity": "sha512-vBLgJI+Qpz1TZ0W2kUBOmG2Q+geVEhiXE99UX02+UFag2WzOQ6frvV6rpadwJu0uwF02GG620NbiKGboqZ19YA==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.0.8.tgz", + "integrity": "sha512-4u+V+Dv7JGpJ0tppB5rxCem7WhdFux950z4cGPhV0kHTPkKe8DDgINzOlVa2RBu5dI33D02OBJcxFjhW4FPORg==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.1", + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" }, "engines": { @@ -946,14 +998,14 @@ } }, "node_modules/@smithy/signature-v4": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.7.tgz", - "integrity": "sha512-qNCJpyhRWxT5RWmeSo/Zv+miQ60Y/D2JmPdFw7v2WpPVxVK7JDpqUbvq0QYE+dBGPX/uagAkE3NvJUcn0fTE3A==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.6.tgz", + "integrity": "sha512-4zNTi8w4sky07YKq7oYucZt4ogY00IEaS1NFDXxmCN5V/ywE0WiK+WMim+8wtYQmB0qy3oExZR4LoCAml6j/rA==", "optional": true, "dependencies": { - "@smithy/eventstream-codec": "^2.0.7", + "@smithy/eventstream-codec": "^2.0.6", "@smithy/is-array-buffer": "^2.0.0", - "@smithy/types": "^2.3.1", + "@smithy/types": "^2.3.0", "@smithy/util-hex-encoding": "^2.0.0", "@smithy/util-middleware": "^2.0.0", "@smithy/util-uri-escape": "^2.0.0", @@ -965,14 +1017,14 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.4.tgz", - "integrity": "sha512-KRQvYYjEGqvmwnKSAZ8EL0hZvPxGQMYbAKS/AMGq2fuRmwAlinSVJ/fkIs65bZp2oYjcskd1ZgKcP+2UDjNPTQ==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.2.tgz", + "integrity": "sha512-quUuJ0SsqgG7Flopvfd8iQJLhHfnMYtYPuvImVQzPHXtqUQImtVz5msudMxW3t3jl+L0w8RlR+IN2zT6UqCJ6g==", "optional": true, "dependencies": { "@smithy/middleware-stack": "^2.0.0", - "@smithy/types": "^2.3.1", - "@smithy/util-stream": "^2.0.10", + "@smithy/types": "^2.3.0", + "@smithy/util-stream": "^2.0.8", "tslib": "^2.5.0" }, "engines": { @@ -980,9 +1032,9 @@ } }, "node_modules/@smithy/types": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.3.1.tgz", - "integrity": "sha512-cS48e4Yawb6pGakj7DBJUIPFIkqnUWyXTe2ndPRNagD73b6kEJqTc8bhTyfUve0A+sijK256UKE0J1juAfCeDA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.3.0.tgz", + "integrity": "sha512-pJce3rd39MElkV57UTPAoSYAApjQLELUxjU5adHNLYk9gnPvyIGbJNJTZVVFu00BrgZH3W/cQe8QuFcknDyodQ==", "optional": true, "dependencies": { "tslib": "^2.5.0" @@ -992,13 +1044,13 @@ } }, "node_modules/@smithy/url-parser": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.7.tgz", - "integrity": "sha512-SwMl1Lq3yFR2hzhwWYKg04uJHpfcXWMBPycm4Z8GkLI6Dw7rJNDApEbMtujlYw6pVP2WKbrpaGHjQ9MdP92kMQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.6.tgz", + "integrity": "sha512-9i6j5QW6bapHZ4rtkXOAm0hOUG1+5IVdVJXNSUTcNskwJchZH5IQuDNPCbgUi/u2P8EZazKt4wXT51QxOXCz1A==", "optional": true, "dependencies": { - "@smithy/querystring-parser": "^2.0.7", - "@smithy/types": "^2.3.1", + "@smithy/querystring-parser": "^2.0.6", + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" } }, @@ -1062,13 +1114,13 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.8.tgz", - "integrity": "sha512-8znx01mkmfKxhiSB2bOF5eMutuCLMd8m2Kh0ulRp8vgzhwRLDJoU6aHSEUoNptbuTAtiFf4u0gpkYC2XfbWwuA==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.7.tgz", + "integrity": "sha512-s1caKxC7Y87Q72Goll//clZs2WNBfG9WtFDWVRS+Qgk147YPCOUYtkpuD0XZAh/vbayObFz5tQ1fiX4G19HSCA==", "optional": true, "dependencies": { - "@smithy/property-provider": "^2.0.8", - "@smithy/types": "^2.3.1", + "@smithy/property-provider": "^2.0.7", + "@smithy/types": "^2.3.0", "bowser": "^2.11.0", "tslib": "^2.5.0" }, @@ -1077,16 +1129,16 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.10.tgz", - "integrity": "sha512-QUcUckL4ZqDFVwLnh7zStRUnXtTC6hcJZ4FmMqnxlPcL33Rko0sMQwrMDnMdzF3rS3wvqugAaq3zzop1HCluvw==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.9.tgz", + "integrity": "sha512-HlV4iNL3/PgPpmDGs0+XrAKtwFQ8rOs5P2y5Dye8dUYaJauadlzHRrNKk7wH2aBYswvT2HM+PIgXamvrE7xbcw==", "optional": true, "dependencies": { - "@smithy/config-resolver": "^2.0.8", - "@smithy/credential-provider-imds": "^2.0.10", - "@smithy/node-config-provider": "^2.0.10", - "@smithy/property-provider": "^2.0.8", - "@smithy/types": "^2.3.1", + "@smithy/config-resolver": "^2.0.7", + "@smithy/credential-provider-imds": "^2.0.9", + "@smithy/node-config-provider": "^2.0.9", + "@smithy/property-provider": "^2.0.7", + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" }, "engines": { @@ -1131,14 +1183,14 @@ } }, "node_modules/@smithy/util-stream": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.10.tgz", - "integrity": "sha512-2EgK5cBiv9OaDmhSXmsZY8ZByBl1dg/Tbc51iBJ5GkLGVYhaA6/1l6vHHV41m4Im3D0XfZV1tmeLlQgmRnYsTQ==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.8.tgz", + "integrity": "sha512-1JoSHL/AOFRo/RVYdbOOGG5qSkU1IQN+F0f3HOZcwvGeGT5KnGwd4hLzmr0qkjKh4PW7nzuvPMdR7L8THV24Hw==", "optional": true, "dependencies": { - "@smithy/fetch-http-handler": "^2.1.3", - "@smithy/node-http-handler": "^2.1.3", - "@smithy/types": "^2.3.1", + "@smithy/fetch-http-handler": "^2.1.2", + "@smithy/node-http-handler": "^2.1.2", + "@smithy/types": "^2.3.0", "@smithy/util-base64": "^2.0.0", "@smithy/util-buffer-from": "^2.0.0", "@smithy/util-hex-encoding": "^2.0.0", @@ -1175,9 +1227,9 @@ } }, "node_modules/@types/node": { - "version": "20.6.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.0.tgz", - "integrity": "sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==" + "version": "20.5.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.9.tgz", + "integrity": "sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==" }, "node_modules/@types/webidl-conversions": { "version": "7.0.0", From cae7cd529513bb8cc83becae5d4ff7e865b3bf70 Mon Sep 17 00:00:00 2001 From: Abhi Markan <32125108+abhi-markan@users.noreply.github.com> Date: Wed, 13 Sep 2023 11:10:15 +0100 Subject: [PATCH 005/130] feat(docs): Documentation update (#2049) Co-authored-by: Abhi Markan --- .github/workflows/README.md | 68 +- README.md | 337 ++++---- azure-functions/README.md | 8 +- azure-functions/acbs-function/README.md | 30 +- .../acbs-function/package-lock.json | 605 +++++++------- azure-functions/acbs-function/package.json | 2 +- .../package-lock.json | 541 ++++++------ cspell.json | 6 +- dtfs-central-api/README.md | 100 ++- dtfs-central-api/api-tests/README.md | 1 - dtfs-central-api/package-lock.json | 618 +++++++------- dtfs-central-api/package.json | 4 +- e2e-tests/README.md | 58 +- external-api/README.md | 41 +- external-api/package-lock.json | 641 ++++++++------- external-api/package.json | 8 +- gef-ui/README.md | 96 +-- gef-ui/package-lock.json | 726 +++++++++------- gef-ui/package.json | 6 +- package-lock.json | 142 +++- package.json | 4 +- portal-api/.eslintrc.js | 5 +- portal-api/README.md | 63 +- portal-api/package-lock.json | 644 ++++++++------- portal-api/package.json | 8 +- portal/README.md | 78 +- portal/package-lock.json | 734 ++++++++++------- portal/package.json | 8 +- reverse-proxy/README.md | 21 +- service-unavailable/README.md | 3 - trade-finance-manager-api/README.md | 186 ++--- trade-finance-manager-api/api-tests/README.md | 1 - trade-finance-manager-api/package-lock.json | 636 +++++++------- trade-finance-manager-api/package.json | 6 +- trade-finance-manager-ui/README.md | 41 +- trade-finance-manager-ui/package-lock.json | 706 +++++++++------- trade-finance-manager-ui/package.json | 6 +- utils/README.md | 17 +- utils/data-migration/.eslintrc.js | 2 +- utils/data-migration/README.md | 53 +- utils/data-migration/package-lock.json | 774 ++++++++---------- utils/data-migration/tfm/export-tfm-users.js | 2 +- utils/data-migration/tfm/migrate-tfm-users.js | 4 +- 43 files changed, 4284 insertions(+), 3756 deletions(-) delete mode 100644 dtfs-central-api/api-tests/README.md delete mode 100644 service-unavailable/README.md delete mode 100644 trade-finance-manager-api/api-tests/README.md diff --git a/.github/workflows/README.md b/.github/workflows/README.md index 6611c83dc8..dcbf2e0b62 100644 --- a/.github/workflows/README.md +++ b/.github/workflows/README.md @@ -1,46 +1,50 @@ -# GHA - CI/CD Pipeline +# GHA - CI/CD Pipeline 🚀 +This information provides an overview of the CI/CD pipeline structure, naming conventions, workflow triggers, and secrets management practices in place for the deployment of services in different environments. 🛠️🔒🌐 +## Subscriptions 📑 -## Subscriptions There are two subscriptions, to manage costs: - * Dev/Test - * Prod +- Dev/Test 🧪 +- Prod 🌐 -## Environments -There are three environments, in order of pipeline deployment and testing. - * Dev - QA (P2V2) - * Staging - UAT + Pen tests (P3V2) - * Prod - Live (P3V2) +There are three environments, in order of pipeline deployment and testing: -Workflows for each environment are triggered when the corresponding branch is updated. -For the `dev` environment this happens on update of `dev`, after tests have passed. -Environment workflows ensure we've got the right infrastructure set up and correctly configured, plus any environment variables and secrets set as needed. +- Dev - QA (P2V2) 🛠️ +- Staging - UAT + Pen tests (P3V2) 🛡️ +- Prod - Live (P3V2) 🚀 -## Naming conventions -In general, naming conventions are: tfs-`environment`-`component` (in order of magnitude, so "service, environment, component"). -That means a list of things will sort alphabetically into blocks of items that work together (e.g. all items that are part of a given environment). +Workflows for each environment are triggered when the corresponding branch is updated. For the `dev` environment, this happens on an update of `dev`, after tests have passed. Environment workflows ensure we've got the right infrastructure set up and correctly configured, plus any environment variables and secrets set as needed. + +## Naming Conventions 🏷️ + +In general, naming conventions are: `tfs-environment-component` (in order of magnitude, so "service, environment, component"). That means a list of things will sort alphabetically into blocks of items that work together (e.g., all items that are part of a given environment). A couple of places this works are: - * GitHub secrets: you can scroll through the list and find out what secrets are set for a given environment - * Azure App Services: you can see the environments as blocks in the list and find the services deployed a given environment -## Pipeline overview -At a high-level, the pipeline works by building docker container images (repositories) with various tags associated to it (artifacts) -which then are saved under specific ACR (Azure container registry) account i.e. `tfsdev`, `tfsstaging` and `tfsprod`. +- GitHub secrets: you can scroll through the list and find out what secrets are set for a given environment. +- Azure App Services: you can see the environments as blocks in the list and find the services deployed in a given environment. + +## Pipeline Overview 📊 + +At a high-level, the pipeline works by building Docker container images (repositories) with various tags associated with them (artifacts), which are then saved under specific ACR (Azure Container Registry) accounts, i.e., `tfsdev`, `tfsstaging`, and `tfsprod`. + +1. Code is pushed to the `main` branch. +2. Infrastructure is set up (if any changes) `_infrastructure`, container images are built, pushed, and deployed `_deployment` with correct tags (artifacts). +3. Merging to the `infrastructure` branch triggers a refresh of supporting infrastructure (Service Plan, ACR) when a file change is detected in the `infrastructure.yml` file. + +## Deployment 🚚 +Deployments are initiated by a `push` to the respective branch i.e. `dev`, `staging` and `prod`. +When `main` is merged to either of the above deployment branch this will trigger the respective GitHub Action (GHA) YML pipeline. + +## Secrets 🔒 + +To add a new secret, set it in GitHub Secrets (under repository settings), then add it to each of the environment workflows. To manage secrets across multiple environments, an automation script has been created under `/secrets/GitHub`. - * Code is pushed to the `main` branch. - * Infrastructure is setup (if any changes) `_infrastructure`, container images are build, pushed and deployed `_deployment` with correct tags (artifacts). - * Merging to the `infrastructure` branch triggers a refresh of supporting infrastructure (Service Plan, ACR) when a file change is detected in `infrastructure.yml` file. +## Using AZ Command-Line Locally 🖥️ -## Deployment -Deployment is triggered by webhooks from the ACR to the web app Service instances. -When an image is pushed, a web app service restart is required, this is handled by the GitHub Actions workflows. +To run Azure CLI commands locally, you'll need to install the `az` CLI. Additionally, you'll need: -## Secrets -To add a new secret, set it in GitHub Secrets (under repository settings), then add it to each of the environment workflows. -To manage secrets across multiple environments, an automation script has been created under `/secrets/GitHub`. +- The Front Door extension: `az extension add --name front-door` -## Using AZ command-line locally -To run Azure CLI commands locally you'll need to install the az cli, additionally you'll need: - * The Front Door extension: `az extension add --name front-door` \ No newline at end of file +--- \ No newline at end of file diff --git a/README.md b/README.md index 6652fb9cb2..06f35cb882 100644 --- a/README.md +++ b/README.md @@ -1,43 +1,45 @@ -# UKEF Trade Finance Service - +# Digital Trade Finance Service :briefcase: This repository contains the code for the UK Export Finance Trade Finance Service. +This documentation provides a comprehensive overview of the UKEF Digital TradeFinance Service (DTFS), including prerequisites, technology stack, setup instructions, testing procedures, deployment guidelines, and other essential information for the developers. + +[![DTFS](https://img.shields.io/endpoint?url=https://cloud.cypress.io/badge/count/sefntb/main&style=for-the-badge&logo=cypress)](https://cloud.cypress.io/projects/sefntb/runs) -## Getting started +## Getting Started :rocket: -### Prerequisites +### Prerequisites :computer: -* Version 13 or later of `node` with a corresponding `npm` -* Docker and Docker Compose +- Node.js (Version 13 or later) with npm +- Docker and Docker Compose -### Tech stack +### Tech Stack :wrench: -* Node, NPM -* MongoDB -* Docker -* GraphQL -* Cypress (e2e tests) -* Webpack -* GovUK and MOJ design systems -* Nunjucks (UI templates) +- Node.js, NPM +- MongoDB +- Docker +- GraphQL +- Cypress (E2E tests) +- Webpack +- GovUK and MOJ design systems +- Nunjucks (UI templates) -### Setup +### Setup :gear: -* Clone this repo -* Run `nvm install` to ensure you are using the correct version of node -* Create `.env` files for each service. You can use `.env.sample` as a base. Some sensitive variables need to be shared from the team -* Generate JWT keypairs with `secrets/set_jwt_keypair.sh` (`bash secrets/set_jwt_keypair.sh` for Windows) -* Base64 encode the generated public and private keys and add to your portal-api .env file: - * `JWT_SIGNING_KEY=1234` - * `JWT_VALIDATING_KEY=5678` -* Set UKEF TFM environment variables in your terminal: `UKEF_TFM_API_SYSTEM_KEY` and `UKEF_TFM_API_REPORTS_KEY` -* Start up your local environment: `docker-compose up --build` -* Create mock data: navigate to `utils/mock-data-loader`, run `npm install` and then `node re-insert-mocks.js`. This should generate mocks in your DB. +1. Clone this repository. +2. Run `nvm install` to ensure you're using the correct Node.js version. +3. Create `.env` files for each service, using `.env.sample` as a base. Some sensitive variables may need to be shared within the team. +4. Generate JWT key pairs with `secrets/set_jwt_keypair.sh` (use `bash secrets/set_jwt_keypair.sh` for Windows). +5. Base64 encode the generated public and private keys and add them to your portal-api `.env` file as follows: + - `JWT_SIGNING_KEY=1234` + - `JWT_VALIDATING_KEY=5678` +6. Set UKEF TFM environment variables in your terminal: `UKEF_TFM_API_SYSTEM_KEY` and `UKEF_TFM_API_REPORTS_KEY`. +7. Start your local environment with `docker-compose up --build`. +8. Create mock data by navigating to `utils/mock-data-loader`, running `npm install`, and then `node re-insert-mocks.js`. This should generate mocks in your database. Recommended: Install a MongoDB client such as Compass or Robo 3T. -Note: If you're on Windows and having issues with MongoDB, install mongosh for command line debugging. +Note: If you're on Windows and experiencing issues with MongoDB, install mongosh for command-line debugging. -## Running the world locally +## Running the World Locally :earth_americas: ```shell docker-compose up @@ -45,286 +47,241 @@ docker-compose up Several services are built: -| Service | URL | -| ------- | --- | -| Portal UI | http://localhost:5000 | -| Portal API | http://localhost:5001 | -| External API | http://localhost:5002 | -| TFM UI | http://localhost:5003 | -| TFM API | http://localhost:5004 | -| Central API | http://localhost:5005 | -| GEF | http://localhost:5006 | -| Mongo DB | root:r00t@localhost:27017 | Connect via MongoDB client +| Service | URL | +| ---------------- | ------------------------------------ | +| Portal UI | [http://localhost:5000](http://localhost:5000) | +| Portal API | [http://localhost:5001](http://localhost:5001) | +| External API | [http://localhost:5002](http://localhost:5002) | +| TFM UI | [http://localhost:5003](http://localhost:5003) | +| TFM API | [http://localhost:5004](http://localhost:5004) | +| Central API | [http://localhost:5005](http://localhost:5005) | +| GEF | [http://localhost:5006](http://localhost:5006) | +| MongoDB | `root:r00t@localhost:27017` (Connect via MongoDB client) | -To access GEF locally, use http://localhost. +To access GEF locally, use [http://localhost](http://localhost). -## Stop running the world locally +## Stopping the Local Environment :stop_sign: -Simply escape the running terminal and run: +To stop the local environment, simply exit the running terminal and run: ```shell docker-compose down ``` -## Login credentials - -* For Portal (BSS & GEF) mock users: utils/mock-data-loader/portal/users.js -* For Trade Finance Manager (TFM) mock users: utils/mock-data-loader/tfm/users.js - -## Environment Variables +## Login Credentials :key: -As we interface with a number of 3rd party APIs, there are a range of environment variables required to manage this and to work with the repo locally. +- For Portal (BSS & GEF) mock users: [utils/mock-data-loader/portal/users.js](utils/mock-data-loader/portal/users.js) +- For Trade Finance Manager (TFM) mock users: [utils/mock-data-loader/tfm/users.js](utils/mock-data-loader/tfm/users.js) -All variables are listed in a private spreadsheet - this needs to be shared with new engineers and updated appropriately. +## Environment Variables :keycap_ten: -These variables are then stored as secrets in the GitHub repo. When deploying to an Azure environment, Azure picks up the GitHub secrets and updates accordingly. +As this project interfaces with various 3rd party APIs, it requires a range of environment variables to manage this and work with the repository locally. All variables are listed in a private spreadsheet, which should be shared with new engineers and updated as necessary. -To update a secret (Make sure to select the relevant environments, i.e dev, test): +These variables are stored as secrets in the GitHub repository. When deploying to an Azure environment, Azure automatically retrieves the GitHub secrets and updates the environment accordingly. To update a secret: -1) Update the secret in the spreadsheet -2) Update the secret in GitHub secrets -3) Deploy to development environment -4) Deploy to test environment +1. Update the secret in the spreadsheet. +2. Update the secret in GitHub secrets. +3. Deploy to the development environment. +4. Deploy to the test environment. -## Testing +## Testing :test_tube: -### **Run all tests (E2E, API and UI)** +### Run All Tests (E2E, API, and UI) :rocket: -With docker running, execute all tests with: +With Docker running, execute all tests using the following command: ```shell npm run pipeline ``` -### E2E tests +### E2E Tests :rocket: -From the respective folder (./e2e-tests/portal, ./e2e-tests/gef, ./e2e-tests/submit-to-trade-finance-manager, ./e2e-tests/trade-finance-manager) +From the respective folder (./e2e-tests/portal, ./e2e-tests/gef, ./e2e-tests/submit-to-trade-finance-manager, ./e2e-tests/trade-finance-manager): -#### **Run an E2E test suite** +#### Run an E2E Test Suite :heavy_check_mark: ```shell npx cypress run --config video=false ``` -#### **Run a single E2E test** +#### Run a Single E2E Test :heavy_check_mark: ```shell npx cypress run --spec "cypress/e2e/**/my-test.spec.js" --config video=false ``` -#### **For live debugging, open the GUI and select the test:** +#### For Live Debugging, Open the GUI and Select the Test :mag_right: ```shell npx cypress open . ``` -### API tests +### API Tests :rocket: -From the respective folder (./portal-api, ./dtfs-central-api, ./trade-finance-manager-api):) +From the respective folder (./portal-api, ./dtfs-central-api, ./trade-finance-manager-api): -#### **Run an API test suite** +#### Run an API Test Suite :heavy_check_mark: ```shell npm run api-test ``` -#### **Run a single API test** +#### Run a Single API Test :heavy_check_mark: ```shell npm run api-test-file "**/*/deals-party-db.api-test.js" ``` -### UI tests +### UI Tests :rocket: -From the respective folder (./portal, ./gef-ui, ./trade-finance-manager-ui) +From the respective folder (./portal, ./gef-ui, ./trade-finance-manager-ui): -#### **Run a UI test suite** +#### Run a UI Test Suite :heavy_check_mark: ```shell npm run test ``` -#### **Run a single UI test** +#### Run a Single UI Test :heavy_check_mark: ```shell npm run test /path/to/file.test.js ``` -## Linting +## Linting :mag_right: -In the root directory - or in any service, run: +In the root directory or any service, run: ```shell npm run lint ``` -## Git workflow - -1) Create a branch and PR clearly describing the change, along with Jira ticket number -2) PR will run tests for the affected services -3) PR tests are pass, another engineer reviews & approves the PR -4) PR is merged into main branch - -Github actions will then run a build and push of container images to Azure, which will be picked up and deployed automatically by the Dev environment. - -E2E tests for GHA have been setup to run in parallel. When these run you will see duplicates of each job with a number denoting the instance. - -## CI +## Git Workflow :octocat: -Several environments are used: -* http://tfs-dev-fd.azurefd.net/ -* http://tfs-test-fd.azurefd.net/ -* http://tfs-prod-fd.azurefd.net/ +1. Create a branch and PR clearly describing the change, along with the Jira ticket number. +2. The PR will run tests for the affected services. +3. Once the PR tests pass, another engineer reviews and approves the PR. +4. The PR is then merged into the main branch. -GEF test environment is hosted on the same URL as Portal v2. To access GEF: +GitHub Actions will automatically run a build and push of container images to Azure, where they will be picked up and deployed in the Dev environment. -* Login to Portal v2: https://tfs-test-fd.azurefd.net -* Manually navigate to this GEF URL, to create a new GEF application: https://tfs-test-fd.azurefd.net/gef/mandatory-criteria -* Alternatively, visit an existing GEF deal by ID: http://tfs-test-fd.azurefd.net/gef/deals/1 +E2E tests for GHA have been set up to run in parallel. When they run, you will see duplicates of each job with a number denoting the instance. -## Deployment +## Continuous Integration (CI) :arrows_counterclockwise: -All environments require a manual trigger. +### Environment -This ensures that the environments are stable, unaffected by CI/CD and the business can continue with QA and user testing. +Several environments are used for CI/CD: -### Deploying to dev +- [Dev Environment](http://tfs-xxx-fd.azurefd.net/) +- [Test Environment](http://tfs-xxx-fd.azurefd.net/) +- [Production Environment](http://tfs-xxx-fd.azurefd.net/) -The latest deployed commit can be checked by looking at the test/dev branch, or visiting the healthcheck endpoint. E.g: https://tfs-dev-fd.azurefd.net/healthcheck +### GEF +The GEF test environment is hosted on the same URL as Portal v2. Following steps would allow access to GEF portal. -### Deploying to test +- Log in to Portal v2: [https://tfs-xxx-fd.azurefd.net](https://tfs-xxx-fd.azurefd.net) +- Manually navigate to the GEF URL to create a new GEF application: [https://tfs-xxx-fd.azurefd.net/gef/mandatory-criteria](https://tfs-xxx-fd.azurefd.net/gef/mandatory-criteria) +- Alternatively, visit an existing GEF deal by ID: [http://tfs-xxx-fd.azurefd.net/gef/deals/1](http://tfs-xxx-fd.azurefd.net/gef/deals/1) -The latest deployed commit can be checked by looking at the test/dev branch, or visiting the healthcheck endpoint. E.g: +## Deployment :rocket: -### Deploying to prod +All environments require a manual trigger to ensure stability, free from CI/CD interference, and ready for QA and user testing. -The latest deployed commit can be checked by looking at the test/dev branch, or visiting the healthcheck endpoint. E.g: https://tfs-prod-fd.azurefd.net/healthcheck +### Deploying to Dev :construction_worker: -### Recommended +You can check the latest deployed commit by looking at the test/dev branch or visiting the health check endpoint, e.g., [https://tfs-xxx-fd.azurefd.net/healthcheck](https://tfs-xxx-fd.azurefd.net/healthcheck). -After deployment, manually check things are OK by submitting a deal to TFM and check that in TFM the deal has data populated. +### Deploying to Test :construction_worker: -:warning: There is currently an issue where after deployment, the Number Generator Azure Function App doesn't work correctly. +You can check the latest deployed commit by looking at the test/dev branch or visiting the health check endpoint, e.g., [https://tfs-xxx-fd.azurefd.net/healthcheck](https://tfs-xxx-fd.azurefd.net/healthcheck). -For a currently unknown reason - the URI's that the Number Generator Function App depends on, can generate incorrect URIs. After a deal is submitted, check the `durable-functions-log` collection Azure Portal. The URIs in any newly created document (created after a deal is submitted after deployment), should have URIs looking something like this: - -```shell -statusQueryGetUri" : "https://tfs-test-function-number-generator.azurewebsites.net/runtime..." -``` - -However after deployment, somehow, it gains what seems to be part of a git commit hash, e.g: - -```shell -https://tfs-test-function-number-generator-a1bc23cdfaBa1bc23cdfa.azurewebsites.net/runtim -``` +### Deploying to Prod :construction_worker: -This is invalid and all of the Number Generator tasks generated after deployment will have this. The tasks will be stuck with "Running" status and will never become completed. +You can check the latest deployed commit by looking at the test/dev branch or visiting the health check endpoint, e.g., [https://tfs-xxx-fd.azurefd.net/healthcheck](https://tfs-xxx-fd.azurefd.net/healthcheck). -Until the underlying issue is fixed, the workaround is to restart the Number Generator Function App in the Azure Portal. The Function app can be found [here](https://portal.azure.com/#@ukef.onmicrosoft.com/resource/subscriptions/8beaa40a-2fb6-49d1-b080-ff1871b6276f/resourceGroups/digital-test/providers/Microsoft.Web/sites/tfs-test-function-number-generator/appServices) +### Recommended :bulb: -After the restart, newly submitted deals will work. +After deployment, manually check if everything is working correctly by submitting a deal to TFM and verifying that the deal has data populated. Please note that there is currently an issue where the Number Generator Azure Function App may not work correctly after deployment. If you encounter this issue, restart the Number Generator Function App in the Azure Portal. This should resolve the problem, and newly submitted deals will work as expected. Make sure to wipe the `durable-functions-log` collection to remove any dead documents. -After this, worth wiping the `durable-functions-log` collection so that there are no dead documents in the collection. +## Updating/Refreshing the Database with Mock Data :floppy_disk: -## Updating/refreshing the database with mock data +Refer to the `/utils/mock-data-loader` README for instructions. -See /utils/mock-data-loader README. +## Azure Storage Account :file_folder: -## Azure storage account - -This is needed to work with file uploads and azure functions. You can create a storage account inside the Azure Portal GUI: +A Microsoft Azure storage account is required for working with file uploads and Azure functions. You can create a storage account within the Azure Portal GUI: Home > Services > Storage accounts > Create -Make sure that you select UK South region and the dev/test resource group. - -## Number Generator - -Each deal & facility submitted to TFM requires a unique ukefID. This is retrieved from the APIM MDM Number Generator API. As this can sometime fail or take too long a background process is started to fetch the ID. This is done in the Number Generator Azure Durable Function. - -The steps taken are: - -1. Deal is created in Portal/GEF and submitted to TFM -2. TFM calls the Number Generator Azure Function, stores the status endpoint for the function call in the Durable Functions log and returns a ukefID="PENDING" -3. The Number Generator Function tries the number generator a maximum of 5 times before delaring a failure -4. A scheduled job on tfm-api polls the status endpoint for each running job until a result is received -5. If the result is a success then the deal & facilities are updated with the generated IDs -6. If the result is an error, then the entry in the durable functions log collection is updated with the error - -## Deal submission to TFM - -When a deal is submitted to TFM, there are currently many external API calls made in the TFM submission controller. +Ensure that you select the UK South region and the dev/test resource group. -Not only does this takes a long time (hindering the user/dev experience), it eats up resources and can be flaky if for example one of the API calls fail. Retries are not setup. +## Number Generator :1234: -The solution is to move all of these API calls into background processes, with retries. +Each deal and facility submitted to TFM requires a unique ukefID, which is obtained from the APIM MDM Number Generator API. A background process is started to fetch the ID, and this process is managed by the Number Generator Azure Durable Function. The steps involved are as follows: -This will improve the user experience, make it fail safe, and improve the development lifecycle. +1. A deal is created in Portal/GEF and submitted to TFM. +2. TFM calls the Number Generator Azure Function, stores the status endpoint for the function call in the Durable Functions log, and returns a `ukefID` of "PENDING." +3. The Number Generator Function attempts to generate the number a maximum of 5 times before declaring a failure. +4. A scheduled job on `tfm-api` polls the status endpoint for each running job until a result is received. +5. If the result is successful, the deal and facilities are updated with the generated IDs. +6. If the result is an error, the entry in the Durable Functions log collection is updated with the error. -## Email notifications +## Deal Submission to TFM :briefcase: -We use [GOV.UK Notify](https://notifications.service.gov.uk) to trigger email notifications at various stages for example: +When a deal is submitted to TFM, many external API calls are currently made in the TFM submission controller. This process can be slow, resource-intensive, and prone to failures if one of the API calls encounters an issue. Retries are not currently configured. -* When a deal status changes in Portal -* When TFM acknowledges a deal submission -* When a deal is approved or declined in TFM -* When a TFM task is ready to start +To address these issues, the plan is to move all these API calls into background processes with automatic retries. This will enhance the user experience, make the process fail-safe, and improve the development workflow. -Each service that triggers an email has it's own "send email" function: +## Email Notifications :email: -* Portal (BSS): `sendEmail` (currently calls Notify directly) -* Portal (GEF): `sendEmail` (calls External API which then calls Notify) -* TFM: `sendTfmEmail` (calls External API which then calls Notify) +Email notifications are triggered using [GOV.UK Notify](https://notifications.service.gov.uk) at various stages, such as: -Each function is very similar - at the moment there is not a way to share between different services. Each function requires: +- When a deal status changes in Portal. +- When TFM acknowledges a deal submission. +- When a deal is approved or declined in TFM. +- When a TFM task is ready to start. -1) Template ID -2) Email address -3) Email variables (object of properties/values to display in the template) +Each service that triggers an email has its "send email" function, including Portal (BSS & GEF) and TFM. Each function requires the following: -### Notify team members +1. Template ID. +2. Email address. +3. Email variables (an object of properties/values to display in the template). -Only people/email addresses listed in the UKEF Notify 'team members' page, will be able to receive emails and edit templates. +Notify team members must be listed in the UKEF Notify "team members" page to receive emails and edit templates. -### How to test emails locally +### How to Test Emails Locally :mailbox: -Currently, all emails are sent to a bank's email address associated with the user(s) that have been involved with the deal creation and submission process. +To test emails locally, replace the bank's email address associated with the user(s) involved in the deal creation and submission process with your own email address, provided that it's listed in the Notify team members. Specifically, update the following: -Therefore, to test eamils we just need to change these emails to your own email that is listed in the Notify team members. To guarantee receiving all possible emails for all services, you should change the emails in the following places: +1. `banks` MongoDB collection > `emails` array (typically, use the bank with ID 9). +2. `users` MongoDB collection > `bank.emails` array (typically, use the user `BANK1_MAKER1`). +3. TFM Task emails are sent to the teams responsible for the tasks. To test these emails, replace the team's email in the `tfm-teams` MongoDB collection. -1) `banks` MongoDB collection > `emails` array. Typically the bank with ID 9 is used. -2) `users` MongoDB collection > `bank.emails` array. Typically the user `BANK1_MAKER1` is used +### Notify Template Limitations :page_facing_up: -If you want to test an already created BSS deal, you'll need to update `deal.bank.emails`. +Notify currently has limited support for complex, conditional content, and it does not support iteration. For emails with lists of facilities, a workaround is used to generate a single string with HTML/Notify encodings that render lists in the Notify template. This single string is passed as a single email variable to Notify, as implemented in `notify-template-formatters.js` within the TFM API. -The only exception to this is TFM Task emails - these emails are sent to the teams that own the tasks. To test the emails, simply replace the team's email in `tfm-teams` MongoDB collection. +## Docker :whale: -### Notify template limitations - -Currently Notify does not have much support for complex, conditional content - only simple true/false strings. It also doesn't support iteration. - -We have a requirement to render multiple lists of facilities, also seperated by facility types. It is not possible to do this out-of-the-box. Therefore, for emails that have lists of facilities, we generate a single string with HTMl/Notify encodings, that will render lists in the Notify template. The single string will be passed as a single email variable to Notify. You can see this in `notify-template-formatters.js`, in TFM API. - -We have contacted Notify about this asking for more support. - -## Docker - -After some time, docker eats up hard drive space. Clean it up by running +After some time, Docker can consume a significant amount of hard drive space. To clean it up, run the following command: ```shell docker system prune --volumes ``` -## Cookies +## Cookies :cookie: + +Cookies are used for persistent sessions (login) and CSRF protection. They are configured with the following flags and names: + +- Secure +- HTTP only +- SameSite as `Strict` +- `__Host-` prefix (for Session cookie only) -Cookies are used for persistent session (login) and CSRF. +Cookie Names: -Flags: -* Secure -* HTTP only -* SameSite as `Strict` -* `__Host-` prefix (Session cookie only) +- Session: `__Host-dtfs-session` +- CSRF: `_csrf` -Name: -* Session: `__Host-dtfs-session` -* CSRF: `_csrf` +--- diff --git a/azure-functions/README.md b/azure-functions/README.md index 595d31d6df..537c29d1d1 100644 --- a/azure-functions/README.md +++ b/azure-functions/README.md @@ -31,7 +31,7 @@ By running these as background tasks, we take the load off of deal submission ca ## Running locally 1. Run everything as normal (`docker-compose up` from the root directory) -2. In a seperate terminal tab, go to azure-functions directory and run `docker-compose up` +2. In a separate terminal tab, go to azure-functions directory and run `docker-compose up` Ideally, `azure-functions` would be run in the same root docker, but this caused memory issues in github actions. Number Generator Function is now run in root `docker-compose.yml`. @@ -43,11 +43,7 @@ Number Generator Function is now run in root `docker-compose.yml`. | Number Generator | Generates UKEF IDs required for other APIs | Also uses an ACBS function to 'double check' the IDs | ## Moving forwards -On submission to UKEF/TFM, there are _alot_ of calls to external APIM APIs. This eats up submission time and therefore causes some e2e tests to take a long time. - -It can also cause problems - for example if an API call fails and we don't get the required data, submission can fail. Some API calls rely on data from other APIs. - -Therefore, every API called on submission should be moved to azure-functions and run as a background task. The vision: +On submission to UKEF/TFM, there are a lot of calls to external APIM APIs. This eats up submission time and therefore causes some e2e tests to take a long time. It can also cause problems - for example if an API call fails and we don't get the required data, submission can fail. Some API calls rely on data from other APIs. Therefore, every API called on submission should be moved to azure-functions and run as a background task. The vision: - If any calls fail, keep retrying until successful - Block any calls that rely on previous API calls until the previous API call is successful diff --git a/azure-functions/acbs-function/README.md b/azure-functions/acbs-function/README.md index 77f649fb25..926c158846 100644 --- a/azure-functions/acbs-function/README.md +++ b/azure-functions/acbs-function/README.md @@ -1,3 +1,29 @@ -# ACBS Durable functions +# ACBS - Azure Function App ⚡️ +Azure Functions are not platform-agnostic and work exclusively within the Azure cloud ecosystem. They are accessed through Azure's serverless compute service. -Azure durable functions are required for ACBS payload execution. \ No newline at end of file +## Local Development :computer: + +Azure Functions can be run locally on port 7071 using the Azure Functions Core Tools. This local environment enables testing and debugging before deploying to Azure. + +## Orchestrating with HTTP Starter Function :electric_plug: + +Durable Functions are initiated by an HTTP starter function, often referred to as `acbs-http`. This starter function triggers the execution of durable orchestrator functions. + +## Durable Functions 🔄 + +Durable Functions are an extension of Azure Functions, allowing for stateful orchestrator functions within a serverless environment. These orchestrator functions enable the orchestration of various functions over extended time periods. Orchestrations can persist their state, even in the event of disruptions. + +## Application Pattern :rocket: + +As of October 7, 2021, two application patterns are primarily used for durable functions execution: + +* **Function Chaining (Linear)** 🔄 - This pattern involves executing functions sequentially, one after the other, in a linear fashion. +* **Fan Out - Fan In (Parallel)** ⚙️ - In this pattern, functions are executed in parallel (fan out) and their results are then aggregated (fan in) for further processing. + +## Queue Storage :file_folder: + +Orchestrator functions utilize Azure Storage Queues to store and manage their state. Cleaning up queues when necessary is important to prevent unnecessary executions. + +Azure Functions and Durable Functions play a critical role in orchestrating tasks, interfacing with external services (such as Mulesoft), and automating workflows within the Azure cloud ecosystem. + +If you have any specific questions or need further assistance with your development process, please don't hesitate to ask! :memo: \ No newline at end of file diff --git a/azure-functions/acbs-function/package-lock.json b/azure-functions/acbs-function/package-lock.json index 1075c33bad..87b46cc389 100644 --- a/azure-functions/acbs-function/package-lock.json +++ b/azure-functions/acbs-function/package-lock.json @@ -10,7 +10,7 @@ "date-fns": "^2.30.0", "dotenv": "^16.3.1", "durable-functions": "^1.5.4", - "eslint": "^8.48.0", + "eslint": "^8.49.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.28.1", "jest": "29.5.0", @@ -131,20 +131,20 @@ } }, "node_modules/@babel/core": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.15.tgz", - "integrity": "sha512-PtZqMmgRrvj8ruoEOIwVA3yoF91O+Hgw9o7DAUTNBA6Mo2jpu31clx9a7Nz/9JznqetTR6zwfC4L3LAjKQXUwA==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.17.tgz", + "integrity": "sha512-2EENLmhpwplDux5PSsZnSbnSkB3tZ6QTksgO25xwEL7pIDcNOMhF5v/s6RzwjMZzZzw9Ofc30gHv5ChCC8pifQ==", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.22.13", "@babel/generator": "^7.22.15", "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.22.15", + "@babel/helper-module-transforms": "^7.22.17", "@babel/helpers": "^7.22.15", - "@babel/parser": "^7.22.15", + "@babel/parser": "^7.22.16", "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.15", - "@babel/types": "^7.22.15", + "@babel/traverse": "^7.22.17", + "@babel/types": "^7.22.17", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -257,9 +257,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.15.tgz", - "integrity": "sha512-l1UiX4UyHSFsYt17iQ3Se5pQQZZHa22zyIXURmvkmLCD4t/aU+dvNWHatKac/D9Vm9UES7nvIqHs4jZqKviUmQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.17.tgz", + "integrity": "sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ==", "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-module-imports": "^7.22.15", @@ -617,9 +617,9 @@ } }, "node_modules/@babel/traverse": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.15.tgz", - "integrity": "sha512-DdHPwvJY0sEeN4xJU5uRLmZjgMMDIvMPniLuYzUVXj/GGzysPl0/fwt44JBkyUIzGJPV8QgHMcQdQ34XFuKTYQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.17.tgz", + "integrity": "sha512-xK4Uwm0JnAMvxYZxOVecss85WxTEIbTa7bnGyf/+EgCL5Zt3U7htUpEOWv9detPlamGKuRzCqw74xVglDWpPdg==", "dependencies": { "@babel/code-frame": "^7.22.13", "@babel/generator": "^7.22.15", @@ -627,8 +627,8 @@ "@babel/helper-function-name": "^7.22.5", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/types": "^7.22.17", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -666,9 +666,9 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/@babel/types": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.15.tgz", - "integrity": "sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.17.tgz", + "integrity": "sha512-YSQPHLFtQNE5xN9tHuZnzu8vPr61wVTBZdfv1meex1NBosa4iT05k/Jw06ddJugi4bk7The/oSwQGFcksmEJQg==", "dependencies": { "@babel/helper-string-parser": "^7.22.5", "@babel/helper-validator-identifier": "^7.22.15", @@ -698,9 +698,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", - "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", + "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -749,9 +749,9 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/@eslint/js": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", - "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", + "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -907,15 +907,15 @@ } }, "node_modules/@jest/console": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.4.tgz", - "integrity": "sha512-wNK6gC0Ha9QeEPSkeJedQuTQqxZYnDPuDcDhVuVatRvMkL4D0VTvFVZj+Yuh6caG2aOfzkUZ36KtCmLNtR02hw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -923,14 +923,14 @@ } }, "node_modules/@jest/core": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.4.tgz", - "integrity": "sha512-U/vq5ccNTSVgYH7mHnodHmCffGWHJnz/E1BEWlLuK5pM4FZmGfBn/nrJGLjUsSmyx3otCeqc1T31F4y08AMDLg==", - "dependencies": { - "@jest/console": "^29.6.4", - "@jest/reporters": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -938,21 +938,21 @@ "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.6.3", - "jest-config": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-resolve-dependencies": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "jest-watcher": "^29.6.4", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -969,35 +969,35 @@ } }, "node_modules/@jest/environment": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.4.tgz", - "integrity": "sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dependencies": { - "@jest/fake-timers": "^29.6.4", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.3" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.4.tgz", - "integrity": "sha512-Warhsa7d23+3X5bLbrbYvaehcgX5TLYhI03JKoedTiI8uJU4IhqYBWF7OSSgUyz4IgLpUYPkK0AehA5/fRclAA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dependencies": { - "expect": "^29.6.4", - "jest-snapshot": "^29.6.4" + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.4.tgz", - "integrity": "sha512-FEhkJhqtvBwgSpiTrocquJCdXPsyvNKcl/n7A3u7X4pVoF4bswm11c9d4AV+kfq2Gpv/mM8x7E7DsRvH+djkrg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dependencies": { "jest-get-type": "^29.6.3" }, @@ -1006,44 +1006,44 @@ } }, "node_modules/@jest/fake-timers": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.4.tgz", - "integrity": "sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.4.tgz", - "integrity": "sha512-wVIn5bdtjlChhXAzVXavcY/3PEjf4VqM174BM3eGL5kMxLiZD5CLnbmkEyA1Dwh9q8XjP6E8RwjBsY/iCWrWsA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", "@jest/types": "^29.6.3", - "jest-mock": "^29.6.3" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.4.tgz", - "integrity": "sha512-sxUjWxm7QdchdrD3NfWKrL8FBsortZeibSJv4XLjESOOjSUOkjQcb0ZHJwfhEGIvBvTluTzfG2yZWZhkrXJu8g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", @@ -1057,9 +1057,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -1102,11 +1102,11 @@ } }, "node_modules/@jest/test-result": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.4.tgz", - "integrity": "sha512-uQ1C0AUEN90/dsyEirgMLlouROgSY+Wc/JanVVk0OiUKa5UFh7sJpMEM3aoUBAz2BRNvUJ8j3d294WFuRxSyOQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dependencies": { - "@jest/console": "^29.6.4", + "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" @@ -1116,13 +1116,13 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.4.tgz", - "integrity": "sha512-E84M6LbpcRq3fT4ckfKs9ryVanwkaIB0Ws9bw3/yP4seRLg/VaCZ/LgW0MCq5wwk4/iP/qnilD41aj2fsw2RMg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dependencies": { - "@jest/test-result": "^29.6.4", + "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -1130,9 +1130,9 @@ } }, "node_modules/@jest/transform": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz", - "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", @@ -1142,9 +1142,9 @@ "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -1601,11 +1601,11 @@ } }, "node_modules/babel-jest": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.4.tgz", - "integrity": "sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dependencies": { - "@jest/transform": "^29.6.4", + "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", @@ -1799,9 +1799,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001529", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001529.tgz", - "integrity": "sha512-n2pUQYGAkrLG4QYj2desAh+NqsJpHbNmVZz87imptDdxLAtjxary7Df/psdfyDGmskJK/9Dt9cPnx5RZ3CU4Og==", + "version": "1.0.30001534", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001534.tgz", + "integrity": "sha512-vlPVrhsCS7XaSh2VvWluIQEzVhefrUQcEsQWSS5A5V+dM07uv1qHeQzAOTGIMy9i3e9bH15+muvI/UHojVgS/Q==", "funding": [ { "type": "opencollective", @@ -1939,6 +1939,26 @@ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -2001,11 +2021,25 @@ "node": ">=0.10.0" } }, + "node_modules/define-data-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.0.1.tgz", + "integrity": "sha512-22M+6zEspQHx10bfFQl2ET39IvfuQ7+rZIH7+ard8fCC4hPmkOSy+8JhKxBRLaWUziJ0O63NTYT97LR8zUfPTw==", + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -2093,9 +2127,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.512", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.512.tgz", - "integrity": "sha512-1W8wRbYlQE4ph7eoj3TJ+uqwO6+xvAE/L+KGU7WTQQvX3tnSIGZAb90MTsMoJqzntamiwJhBAj4WZmygXhsOUg==" + "version": "1.4.519", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.519.tgz", + "integrity": "sha512-kqs9oGYL4UFVkLKhqCTgBCYZv+wZ374yABDMqlDda9HvlkQxvSr7kgf4hfWVjMieDbX+1MwPHFBsOGCMIBaFKg==" }, "node_modules/emittery": { "version": "0.13.1", @@ -2230,15 +2264,15 @@ } }, "node_modules/eslint": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", - "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", + "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.48.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint/js": "8.49.0", + "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", @@ -2550,15 +2584,15 @@ } }, "node_modules/expect": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.4.tgz", - "integrity": "sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dependencies": { - "@jest/expect-utils": "^29.6.4", + "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3" + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -3457,12 +3491,12 @@ } }, "node_modules/jest-changed-files": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.6.3.tgz", - "integrity": "sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dependencies": { "execa": "^5.0.0", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "p-limit": "^3.1.0" }, "engines": { @@ -3470,27 +3504,27 @@ } }, "node_modules/jest-circus": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.4.tgz", - "integrity": "sha512-YXNrRyntVUgDfZbjXWBMPslX1mQ8MrSG0oM/Y06j9EYubODIyHWP8hMUbjbZ19M3M+zamqEur7O80HODwACoJw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", - "@jest/test-result": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "p-limit": "^3.1.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" @@ -3500,21 +3534,20 @@ } }, "node_modules/jest-cli": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.4.tgz", - "integrity": "sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dependencies": { - "@jest/core": "^29.6.4", - "@jest/test-result": "^29.6.4", + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "chalk": "^4.0.0", + "create-jest": "^29.7.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "prompts": "^2.0.1", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "yargs": "^17.3.1" }, "bin": { @@ -3533,30 +3566,30 @@ } }, "node_modules/jest-config": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.4.tgz", - "integrity": "sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.6.4", + "@jest/test-sequencer": "^29.7.0", "@jest/types": "^29.6.3", - "babel-jest": "^29.6.4", + "babel-jest": "^29.7.0", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.6.4", - "jest-environment-node": "^29.6.4", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", "jest-get-type": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -3577,23 +3610,23 @@ } }, "node_modules/jest-diff": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.4.tgz", - "integrity": "sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-docblock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.6.3.tgz", - "integrity": "sha512-2+H+GOTQBEm2+qFSQ7Ma+BvyV+waiIFxmZF5LdpBsAEjWX8QYjSCa4FrkIYtbfXUJJJnFCYrOtt6TZ+IAiTjBQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dependencies": { "detect-newline": "^3.0.0" }, @@ -3602,31 +3635,31 @@ } }, "node_modules/jest-each": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.3.tgz", - "integrity": "sha512-KoXfJ42k8cqbkfshW7sSHcdfnv5agDdHCPA87ZBdmHP+zJstTJc0ttQaJ/x7zK6noAL76hOuTIJ6ZkQRS5dcyg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", - "jest-util": "^29.6.3", - "pretty-format": "^29.6.3" + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-environment-node": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.4.tgz", - "integrity": "sha512-i7SbpH2dEIFGNmxGCpSc2w9cA4qVD+wfvg2ZnfQ7XVrKL0NA5uDVBIiGH8SR4F0dKEv/0qI5r+aDomDf04DpEQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -3641,9 +3674,9 @@ } }, "node_modules/jest-haste-map": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz", - "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", @@ -3652,8 +3685,8 @@ "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -3665,35 +3698,35 @@ } }, "node_modules/jest-leak-detector": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.3.tgz", - "integrity": "sha512-0kfbESIHXYdhAdpLsW7xdwmYhLf1BRu4AA118/OxFm0Ho1b2RcTmO4oF6aAMaxpxdxnJ3zve2rgwzNBD4Zbm7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dependencies": { "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.4.tgz", - "integrity": "sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.6.4", + "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-message-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.3.tgz", - "integrity": "sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", @@ -3701,7 +3734,7 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -3710,13 +3743,13 @@ } }, "node_modules/jest-mock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.3.tgz", - "integrity": "sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", - "jest-util": "^29.6.3" + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -3747,16 +3780,16 @@ } }, "node_modules/jest-resolve": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.4.tgz", - "integrity": "sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" @@ -3766,41 +3799,41 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.4.tgz", - "integrity": "sha512-7+6eAmr1ZBF3vOAJVsfLj1QdqeXG+WYhidfLHBRZqGN24MFRIiKG20ItpLw2qRAsW/D2ZUUmCNf6irUr/v6KHA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dependencies": { "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.6.4" + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.4.tgz", - "integrity": "sha512-SDaLrMmtVlQYDuG0iSPYLycG8P9jLI+fRm8AF/xPKhYDB2g6xDWjXBrR5M8gEWsK6KVFlebpZ4QsrxdyIX1Jaw==", - "dependencies": { - "@jest/console": "^29.6.4", - "@jest/environment": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.6.3", - "jest-environment-node": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-leak-detector": "^29.6.3", - "jest-message-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-util": "^29.6.3", - "jest-watcher": "^29.6.4", - "jest-worker": "^29.6.4", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -3809,16 +3842,16 @@ } }, "node_modules/jest-runtime": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.4.tgz", - "integrity": "sha512-s/QxMBLvmwLdchKEjcLfwzP7h+jsHvNEtxGP5P+Fl1FMaJX2jMiIqe4rJw4tFprzCwuSvVUo9bn0uj4gNRXsbA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", - "@jest/globals": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", @@ -3826,13 +3859,13 @@ "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -3841,29 +3874,29 @@ } }, "node_modules/jest-snapshot": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.4.tgz", - "integrity": "sha512-VC1N8ED7+4uboUKGIDsbvNAZb6LakgIPgAF4RSpF13dN6YaMokfRqO+BaqK4zIh6X3JffgwbzuGqDEjHm/MrvA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.6.4", + "expect": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-diff": "^29.6.4", + "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "natural-compare": "^1.4.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "semver": "^7.5.3" }, "engines": { @@ -3901,9 +3934,9 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/jest-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", - "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -3917,16 +3950,16 @@ } }, "node_modules/jest-validate": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz", - "integrity": "sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dependencies": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -3944,17 +3977,17 @@ } }, "node_modules/jest-watcher": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.4.tgz", - "integrity": "sha512-oqUWvx6+On04ShsT00Ir9T4/FvBeEh2M9PTubgITPxDa739p4hoQweWPRGyYeaojgT0xTpZKF0Y/rSY1UgMxvQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dependencies": { - "@jest/test-result": "^29.6.4", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "string-length": "^4.0.1" }, "engines": { @@ -3962,12 +3995,12 @@ } }, "node_modules/jest-worker": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", - "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dependencies": { "@types/node": "*", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -4594,9 +4627,9 @@ } }, "node_modules/pretty-format": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", - "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -4682,13 +4715,13 @@ "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" }, "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "set-function-name": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -4836,6 +4869,18 @@ "semver": "bin/semver.js" } }, + "node_modules/set-function-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.0.tgz", + "integrity": "sha512-WmS8UHojv5s1eSoRSmzO5zzgDq8PE1/X/ij0k+9fMYmINCc6+j+SF3Om8YyucKn2yjnK4ItNZOoQycNnHsZJTw==", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", diff --git a/azure-functions/acbs-function/package.json b/azure-functions/acbs-function/package.json index cc6828b3bb..41c7130c80 100644 --- a/azure-functions/acbs-function/package.json +++ b/azure-functions/acbs-function/package.json @@ -20,7 +20,7 @@ "date-fns": "^2.30.0", "dotenv": "^16.3.1", "durable-functions": "^1.5.4", - "eslint": "^8.48.0", + "eslint": "^8.49.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.28.1", "jest": "29.5.0", diff --git a/azure-functions/number-generator-function/package-lock.json b/azure-functions/number-generator-function/package-lock.json index b745765ab4..96581eb583 100644 --- a/azure-functions/number-generator-function/package-lock.json +++ b/azure-functions/number-generator-function/package-lock.json @@ -120,20 +120,20 @@ } }, "node_modules/@babel/core": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.15.tgz", - "integrity": "sha512-PtZqMmgRrvj8ruoEOIwVA3yoF91O+Hgw9o7DAUTNBA6Mo2jpu31clx9a7Nz/9JznqetTR6zwfC4L3LAjKQXUwA==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.17.tgz", + "integrity": "sha512-2EENLmhpwplDux5PSsZnSbnSkB3tZ6QTksgO25xwEL7pIDcNOMhF5v/s6RzwjMZzZzw9Ofc30gHv5ChCC8pifQ==", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.22.13", "@babel/generator": "^7.22.15", "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.22.15", + "@babel/helper-module-transforms": "^7.22.17", "@babel/helpers": "^7.22.15", - "@babel/parser": "^7.22.15", + "@babel/parser": "^7.22.16", "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.15", - "@babel/types": "^7.22.15", + "@babel/traverse": "^7.22.17", + "@babel/types": "^7.22.17", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -246,9 +246,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.15.tgz", - "integrity": "sha512-l1UiX4UyHSFsYt17iQ3Se5pQQZZHa22zyIXURmvkmLCD4t/aU+dvNWHatKac/D9Vm9UES7nvIqHs4jZqKviUmQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.17.tgz", + "integrity": "sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ==", "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-module-imports": "^7.22.15", @@ -595,9 +595,9 @@ } }, "node_modules/@babel/traverse": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.15.tgz", - "integrity": "sha512-DdHPwvJY0sEeN4xJU5uRLmZjgMMDIvMPniLuYzUVXj/GGzysPl0/fwt44JBkyUIzGJPV8QgHMcQdQ34XFuKTYQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.17.tgz", + "integrity": "sha512-xK4Uwm0JnAMvxYZxOVecss85WxTEIbTa7bnGyf/+EgCL5Zt3U7htUpEOWv9detPlamGKuRzCqw74xVglDWpPdg==", "dependencies": { "@babel/code-frame": "^7.22.13", "@babel/generator": "^7.22.15", @@ -605,8 +605,8 @@ "@babel/helper-function-name": "^7.22.5", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/types": "^7.22.17", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -636,9 +636,9 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/@babel/types": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.15.tgz", - "integrity": "sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.17.tgz", + "integrity": "sha512-YSQPHLFtQNE5xN9tHuZnzu8vPr61wVTBZdfv1meex1NBosa4iT05k/Jw06ddJugi4bk7The/oSwQGFcksmEJQg==", "dependencies": { "@babel/helper-string-parser": "^7.22.5", "@babel/helper-validator-identifier": "^7.22.15", @@ -677,15 +677,15 @@ } }, "node_modules/@jest/console": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.4.tgz", - "integrity": "sha512-wNK6gC0Ha9QeEPSkeJedQuTQqxZYnDPuDcDhVuVatRvMkL4D0VTvFVZj+Yuh6caG2aOfzkUZ36KtCmLNtR02hw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -693,14 +693,14 @@ } }, "node_modules/@jest/core": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.4.tgz", - "integrity": "sha512-U/vq5ccNTSVgYH7mHnodHmCffGWHJnz/E1BEWlLuK5pM4FZmGfBn/nrJGLjUsSmyx3otCeqc1T31F4y08AMDLg==", - "dependencies": { - "@jest/console": "^29.6.4", - "@jest/reporters": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -708,21 +708,21 @@ "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.6.3", - "jest-config": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-resolve-dependencies": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "jest-watcher": "^29.6.4", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -739,35 +739,35 @@ } }, "node_modules/@jest/environment": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.4.tgz", - "integrity": "sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dependencies": { - "@jest/fake-timers": "^29.6.4", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.3" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.4.tgz", - "integrity": "sha512-Warhsa7d23+3X5bLbrbYvaehcgX5TLYhI03JKoedTiI8uJU4IhqYBWF7OSSgUyz4IgLpUYPkK0AehA5/fRclAA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dependencies": { - "expect": "^29.6.4", - "jest-snapshot": "^29.6.4" + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.4.tgz", - "integrity": "sha512-FEhkJhqtvBwgSpiTrocquJCdXPsyvNKcl/n7A3u7X4pVoF4bswm11c9d4AV+kfq2Gpv/mM8x7E7DsRvH+djkrg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dependencies": { "jest-get-type": "^29.6.3" }, @@ -776,44 +776,44 @@ } }, "node_modules/@jest/fake-timers": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.4.tgz", - "integrity": "sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.4.tgz", - "integrity": "sha512-wVIn5bdtjlChhXAzVXavcY/3PEjf4VqM174BM3eGL5kMxLiZD5CLnbmkEyA1Dwh9q8XjP6E8RwjBsY/iCWrWsA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", "@jest/types": "^29.6.3", - "jest-mock": "^29.6.3" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.4.tgz", - "integrity": "sha512-sxUjWxm7QdchdrD3NfWKrL8FBsortZeibSJv4XLjESOOjSUOkjQcb0ZHJwfhEGIvBvTluTzfG2yZWZhkrXJu8g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", @@ -827,9 +827,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -872,11 +872,11 @@ } }, "node_modules/@jest/test-result": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.4.tgz", - "integrity": "sha512-uQ1C0AUEN90/dsyEirgMLlouROgSY+Wc/JanVVk0OiUKa5UFh7sJpMEM3aoUBAz2BRNvUJ8j3d294WFuRxSyOQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dependencies": { - "@jest/console": "^29.6.4", + "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" @@ -886,13 +886,13 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.4.tgz", - "integrity": "sha512-E84M6LbpcRq3fT4ckfKs9ryVanwkaIB0Ws9bw3/yP4seRLg/VaCZ/LgW0MCq5wwk4/iP/qnilD41aj2fsw2RMg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dependencies": { - "@jest/test-result": "^29.6.4", + "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -900,9 +900,9 @@ } }, "node_modules/@jest/transform": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz", - "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", @@ -912,9 +912,9 @@ "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -1180,11 +1180,11 @@ } }, "node_modules/babel-jest": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.4.tgz", - "integrity": "sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dependencies": { - "@jest/transform": "^29.6.4", + "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", @@ -1366,9 +1366,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001529", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001529.tgz", - "integrity": "sha512-n2pUQYGAkrLG4QYj2desAh+NqsJpHbNmVZz87imptDdxLAtjxary7Df/psdfyDGmskJK/9Dt9cPnx5RZ3CU4Og==", + "version": "1.0.30001534", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001534.tgz", + "integrity": "sha512-vlPVrhsCS7XaSh2VvWluIQEzVhefrUQcEsQWSS5A5V+dM07uv1qHeQzAOTGIMy9i3e9bH15+muvI/UHojVgS/Q==", "funding": [ { "type": "opencollective", @@ -1501,6 +1501,26 @@ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -1609,9 +1629,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.512", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.512.tgz", - "integrity": "sha512-1W8wRbYlQE4ph7eoj3TJ+uqwO6+xvAE/L+KGU7WTQQvX3tnSIGZAb90MTsMoJqzntamiwJhBAj4WZmygXhsOUg==" + "version": "1.4.519", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.519.tgz", + "integrity": "sha512-kqs9oGYL4UFVkLKhqCTgBCYZv+wZ374yABDMqlDda9HvlkQxvSr7kgf4hfWVjMieDbX+1MwPHFBsOGCMIBaFKg==" }, "node_modules/emittery": { "version": "0.13.1", @@ -1696,15 +1716,15 @@ } }, "node_modules/expect": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.4.tgz", - "integrity": "sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dependencies": { - "@jest/expect-utils": "^29.6.4", + "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3" + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -2139,12 +2159,12 @@ } }, "node_modules/jest-changed-files": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.6.3.tgz", - "integrity": "sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dependencies": { "execa": "^5.0.0", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "p-limit": "^3.1.0" }, "engines": { @@ -2152,27 +2172,27 @@ } }, "node_modules/jest-circus": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.4.tgz", - "integrity": "sha512-YXNrRyntVUgDfZbjXWBMPslX1mQ8MrSG0oM/Y06j9EYubODIyHWP8hMUbjbZ19M3M+zamqEur7O80HODwACoJw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", - "@jest/test-result": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "p-limit": "^3.1.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" @@ -2182,21 +2202,20 @@ } }, "node_modules/jest-cli": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.4.tgz", - "integrity": "sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dependencies": { - "@jest/core": "^29.6.4", - "@jest/test-result": "^29.6.4", + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "chalk": "^4.0.0", + "create-jest": "^29.7.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "prompts": "^2.0.1", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "yargs": "^17.3.1" }, "bin": { @@ -2215,30 +2234,30 @@ } }, "node_modules/jest-config": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.4.tgz", - "integrity": "sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.6.4", + "@jest/test-sequencer": "^29.7.0", "@jest/types": "^29.6.3", - "babel-jest": "^29.6.4", + "babel-jest": "^29.7.0", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.6.4", - "jest-environment-node": "^29.6.4", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", "jest-get-type": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -2259,23 +2278,23 @@ } }, "node_modules/jest-diff": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.4.tgz", - "integrity": "sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-docblock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.6.3.tgz", - "integrity": "sha512-2+H+GOTQBEm2+qFSQ7Ma+BvyV+waiIFxmZF5LdpBsAEjWX8QYjSCa4FrkIYtbfXUJJJnFCYrOtt6TZ+IAiTjBQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dependencies": { "detect-newline": "^3.0.0" }, @@ -2284,31 +2303,31 @@ } }, "node_modules/jest-each": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.3.tgz", - "integrity": "sha512-KoXfJ42k8cqbkfshW7sSHcdfnv5agDdHCPA87ZBdmHP+zJstTJc0ttQaJ/x7zK6noAL76hOuTIJ6ZkQRS5dcyg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", - "jest-util": "^29.6.3", - "pretty-format": "^29.6.3" + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-environment-node": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.4.tgz", - "integrity": "sha512-i7SbpH2dEIFGNmxGCpSc2w9cA4qVD+wfvg2ZnfQ7XVrKL0NA5uDVBIiGH8SR4F0dKEv/0qI5r+aDomDf04DpEQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -2323,9 +2342,9 @@ } }, "node_modules/jest-haste-map": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz", - "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", @@ -2334,8 +2353,8 @@ "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -2347,35 +2366,35 @@ } }, "node_modules/jest-leak-detector": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.3.tgz", - "integrity": "sha512-0kfbESIHXYdhAdpLsW7xdwmYhLf1BRu4AA118/OxFm0Ho1b2RcTmO4oF6aAMaxpxdxnJ3zve2rgwzNBD4Zbm7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dependencies": { "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.4.tgz", - "integrity": "sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.6.4", + "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-message-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.3.tgz", - "integrity": "sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", @@ -2383,7 +2402,7 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -2392,13 +2411,13 @@ } }, "node_modules/jest-mock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.3.tgz", - "integrity": "sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", - "jest-util": "^29.6.3" + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -2429,16 +2448,16 @@ } }, "node_modules/jest-resolve": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.4.tgz", - "integrity": "sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" @@ -2448,41 +2467,41 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.4.tgz", - "integrity": "sha512-7+6eAmr1ZBF3vOAJVsfLj1QdqeXG+WYhidfLHBRZqGN24MFRIiKG20ItpLw2qRAsW/D2ZUUmCNf6irUr/v6KHA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dependencies": { "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.6.4" + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.4.tgz", - "integrity": "sha512-SDaLrMmtVlQYDuG0iSPYLycG8P9jLI+fRm8AF/xPKhYDB2g6xDWjXBrR5M8gEWsK6KVFlebpZ4QsrxdyIX1Jaw==", - "dependencies": { - "@jest/console": "^29.6.4", - "@jest/environment": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.6.3", - "jest-environment-node": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-leak-detector": "^29.6.3", - "jest-message-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-util": "^29.6.3", - "jest-watcher": "^29.6.4", - "jest-worker": "^29.6.4", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -2491,16 +2510,16 @@ } }, "node_modules/jest-runtime": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.4.tgz", - "integrity": "sha512-s/QxMBLvmwLdchKEjcLfwzP7h+jsHvNEtxGP5P+Fl1FMaJX2jMiIqe4rJw4tFprzCwuSvVUo9bn0uj4gNRXsbA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", - "@jest/globals": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", @@ -2508,13 +2527,13 @@ "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -2523,29 +2542,29 @@ } }, "node_modules/jest-snapshot": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.4.tgz", - "integrity": "sha512-VC1N8ED7+4uboUKGIDsbvNAZb6LakgIPgAF4RSpF13dN6YaMokfRqO+BaqK4zIh6X3JffgwbzuGqDEjHm/MrvA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.6.4", + "expect": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-diff": "^29.6.4", + "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "natural-compare": "^1.4.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "semver": "^7.5.3" }, "engines": { @@ -2583,9 +2602,9 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/jest-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", - "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -2599,16 +2618,16 @@ } }, "node_modules/jest-validate": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz", - "integrity": "sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dependencies": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -2626,17 +2645,17 @@ } }, "node_modules/jest-watcher": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.4.tgz", - "integrity": "sha512-oqUWvx6+On04ShsT00Ir9T4/FvBeEh2M9PTubgITPxDa739p4hoQweWPRGyYeaojgT0xTpZKF0Y/rSY1UgMxvQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dependencies": { - "@jest/test-result": "^29.6.4", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "string-length": "^4.0.1" }, "engines": { @@ -2644,12 +2663,12 @@ } }, "node_modules/jest-worker": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", - "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dependencies": { "@types/node": "*", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -3057,9 +3076,9 @@ } }, "node_modules/pretty-format": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", - "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", diff --git a/cspell.json b/cspell.json index 6045d116c0..ee85046597 100644 --- a/cspell.json +++ b/cspell.json @@ -104,7 +104,11 @@ "XLXS", "Stringifying", "SSRF", - "TYPEA" + "TYPEA", + "tfsdev", + "tfsstaging", + "tfsprod", + "octocat" ], "dictionaries": [ "en-gb", diff --git a/dtfs-central-api/README.md b/dtfs-central-api/README.md index a763ac1585..bf2d3ea98f 100644 --- a/dtfs-central-api/README.md +++ b/dtfs-central-api/README.md @@ -1,62 +1,61 @@ -# dtfs-central-api +# DTFS Central API 📦️ -Central endpoints to handle submissions, getting and updating data from one API to another API. +**dtfs-central-api** is responsible for handling submissions and managing data between different APIs. It acts as an intermediary, facilitating communication between various systems. ## Why -- Avoid one API calling another API directly -- Act as a "middleman" to pass data (deals and facilities) from one system to another -- Have a single place to perform CRUD operations for deals and facilities with minimal business logic -- Create snapshots of submitted data that should not be edited from another API/system +- **Avoid Direct API Calls:** It prevents one API from directly calling another API, promoting a more organized and scalable architecture. -## High level overview of the flow between systems +- **Data Passing:** Serves as a middleman for passing data (deals and facilities) from one system to another. -There are currently 3 systems - each system has it's own UI, API and database collections: +- **Centralized CRUD Operations:** Provides a single point to perform CRUD operations for deals and facilities with minimal business logic. -- Portal (BSS/EWCS deals and facilities) -- GEF (GEF deals, Cash Contingent facilities) -- TFM (Internal UKEF system that consumes all deals and facilities) +- **Data Snapshots:** Creates snapshots of submitted data that should not be edited by another API/system. -Once a BSS or GEF deal is completed, the bank will submit to UKEF - technically meaning - submitting the deal and any associated facilities, to TFM (Trade Finance Manager). +## High-Level Overview -At this point, TFM _consumes and renders_ the deal and facilities so that UKEF can review and proceed with any actions to finalise the deal. +There are currently three systems, each with its own UI, API, and database collections: -:warning: TFM *should never* edit any deal or facility data - it purely consumes the submitted data for user review. +1. **Portal (BSS/EWCS):** Deals and facilities related to Bond Support Scheme and Export Working Capital Scheme. -## When/Where is Central API called? +2. **GEF (General Export Facility):** Deals and Cash Contingent facilities. -1) When Portal (BSS) performs any CRUD operation for a deal or facility +3. **TFM (Trade Finance Manager):** UKEF's internal system that consumes all deals and facilities. -2) When TFM receives a deal +When a BSS or GEF deal is completed, the bank submits it to UKEF, effectively passing the deal and any associated facilities to TFM (Trade Finance Manager). TFM consumes and renders the submitted data for UKEF's review, ensuring the deal's progress. -When a bank submits the deal to UKEF (from Portal/BSS), Portal calls the TFM API (submit endpoint). TFM then receives a deal and it calls the Central API several times to do the following: +:warning: **TFM should never edit any deal or facility data**; its primary role is to consume the submitted data for user review. -- Fetch the deal from the Portal (BSS) MongoDB collection (`deals`) -- Create a snapshot of the deal and add to the TFM MongoDB deals collection (`tfm-deals`) -- Fetch all facilities associated with the deal from the Portal (BSS) MongoDB collection (`facilities`) -- Create a snapshot for each facility and add to the TFM MongoDB facilities collection (`tfm-facilities`) -- Update the Portal (BSS) status of the deal from "Submitted" to "Acknowledged" (`deals`) +## When/Where is Central API Called? -Note: There is the scenario where a deal can be submitted to TFM for a second time. In this case, the TFM snapshots are updated rather than created again. +1. **Portal (BSS):** Central API is called whenever Portal (BSS) performs any CRUD operation for a deal or facility. -## Deal and facility snapshots +2. **TFM:** TFM receives a deal and calls the Central API multiple times to: -:warning: TFM *should never* edit any deal or facility data - it purely consumes the submitted data for user review. + - Fetch the deal from the Portal (BSS) MongoDB collection (`deals`). + - Create a snapshot of the deal and add it to the TFM MongoDB deals collection (`tfm-deals`). + - Fetch all facilities associated with the deal from the Portal (BSS) MongoDB collection (`facilities`). + - Create a snapshot for each facility and add it to the TFM MongoDB facilities collection (`tfm-facilities`). + - Update the Portal (BSS) status of the deal from "Submitted" to "Acknowledged" (`deals`). -Therefore, TFM should only copy and consume the data in a "locked down" state - this is why TFM calls central API to create snapshots. + Note: In case a deal is submitted to TFM for a second time, TFM updates the TFM snapshots rather than creating them again. -Imagine a deal that is submitted: +## Deal and Facility Snapshots -```js +:warning: **TFM should never edit any deal or facility data.** Therefore, TFM should only copy and consume the data in a "locked down" state, which is why TFM calls the Central API to create snapshots. + +Consider a deal submitted with this data: + +```javascript { submissionType: 'Automatic Inclusion Notice', dealType: 'BSS/EWCS', } ``` -In one Central API endpoint, it will create the following structure with an additional default TFM object: +The Central API creates the following structure, including a default TFM object: -```js +```javascript { dealSnapshot: { submissionType: 'Automatic Inclusion Notice', @@ -68,15 +67,13 @@ In one Central API endpoint, it will create the following structure with an addi } ``` -This is then added to `tfm-deals` MongoDB collection. - -With this structure in place, the `tfm` object becomes the only object that TFM can update - it is data specific to TFM and is not relevant in any other systems. +This structure is then added to the `tfm-deals` MongoDB collection. -The snapshot is also locked down in the Central API so it cannot be updated by TFM. +With this setup, the `tfm` object becomes the only part that TFM can update; it contains data specific to TFM and isn't relevant in any other systems. The snapshots are locked down in the Central API to prevent updates by TFM. -Facilities have exactly the same setup - except it goes to the `tfm-facilities` MongoDB collection and the data looks like this: +Facilities have a similar structure, but they are stored in the `tfm-facilities` MongoDB collection. The data looks like this: -```js +```javascript { facilitySnapshot: { value: 1234, @@ -88,15 +85,15 @@ Facilities have exactly the same setup - except it goes to the `tfm-facilities` ## Prerequisite -Make sure you have an `.env`. Use `.env.sample` as a base. Some sensitive variables need to be shared from the team. +Make sure you have an `.env` file. Use `.env.sample` as a base. Some sensitive variables need to be shared with the team. -## Running locally +## Running Locally ```shell docker-compose up ``` -Alternatively, every service can be started from the root directory (`docker-compose up`). +Alternatively, you can start every service from the root directory with `docker-compose up`. ## Testing @@ -106,26 +103,27 @@ In a second terminal, run: npm run api-test ``` -Test coverage will be generated. +This will generate test coverage. -### **Run a single API test** +### **Running a Single API Test** + +You can run a specific API test file using the following command: ```shell npm run api-test-file "**/*/deals-party-db.api-test.js" ``` -## Moving forwards - -Currently, BSS (portal-api) uses the Central API for deal and facility CRUD operations. GEF (gef endpoints in portal-api) does not do this. +## Moving Forwards -There are 2 potential approaches from here to make both products consistent: +Currently, BSS (portal-api) uses the Central API for deal and facility CRUD operations, while GEF (gef endpoints in portal-api) does not. -1) Update GEF API to use central API for deal and facility CRUD operations -2) Remove all deal and facility CRUD operations from Central API; do inside of BSS (portal-api). +Two potential approaches can align both products: -However it's important to note that currently, BSS and GEF are misaligned. Eventually, GEF and BSS will be aligned to use the same design and approach (see portal and gef-ui READMEs). When this happens, the deal and facility CRUD operations in Central API - that are currently consumed only by BSS (Portal), may become redundant. In which case they can just be deleted. +* Update GEF API to use the Central API for deal and facility CRUD operations. +* Remove all deal and facility CRUD operations from the Central API and handle them inside BSS (portal-api). -This has not been thought about as a team. What's the best, most scalable approach? +It's essential to note that BSS and GEF are currently misaligned. Eventually, GEF and BSS will be aligned to use the same design and approach (refer to portal and gef-ui READMEs). When this alignment occurs, the deal and facility CRUD operations in the Central API, which are currently consumed only by BSS (Portal), may become redundant and can be deleted. -Just to be clear - Both BSS and GEF submit to TFM directly. The TFM submission handling works the same for both product types (i.e TFM always calls Central API to create snapshots). +This decision should be made collaboratively as a team, considering the best, most scalable approach. +--- \ No newline at end of file diff --git a/dtfs-central-api/api-tests/README.md b/dtfs-central-api/api-tests/README.md deleted file mode 100644 index 2d7f45f103..0000000000 --- a/dtfs-central-api/api-tests/README.md +++ /dev/null @@ -1 +0,0 @@ -dtfs-central-api tests diff --git a/dtfs-central-api/package-lock.json b/dtfs-central-api/package-lock.json index e7c331ff2e..c55a806534 100644 --- a/dtfs-central-api/package-lock.json +++ b/dtfs-central-api/package-lock.json @@ -15,7 +15,7 @@ "dotenv": "16.0.3", "express": "4.18.2", "express-mongo-sanitize": "^2.2.0", - "express-rate-limit": "^6.11.0", + "express-rate-limit": "^6.11.2", "moment": "^2.29.4", "mongo-dot-notation": "3.1.0", "mongodb": "4.2.0", @@ -24,7 +24,7 @@ "swagger-ui-express": "^4.6.3" }, "devDependencies": { - "eslint": "^8.48.0", + "eslint": "^8.49.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.28.1", "jest": "29.5.0", @@ -191,21 +191,21 @@ } }, "node_modules/@babel/core": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.15.tgz", - "integrity": "sha512-PtZqMmgRrvj8ruoEOIwVA3yoF91O+Hgw9o7DAUTNBA6Mo2jpu31clx9a7Nz/9JznqetTR6zwfC4L3LAjKQXUwA==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.17.tgz", + "integrity": "sha512-2EENLmhpwplDux5PSsZnSbnSkB3tZ6QTksgO25xwEL7pIDcNOMhF5v/s6RzwjMZzZzw9Ofc30gHv5ChCC8pifQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.22.13", "@babel/generator": "^7.22.15", "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.22.15", + "@babel/helper-module-transforms": "^7.22.17", "@babel/helpers": "^7.22.15", - "@babel/parser": "^7.22.15", + "@babel/parser": "^7.22.16", "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.15", - "@babel/types": "^7.22.15", + "@babel/traverse": "^7.22.17", + "@babel/types": "^7.22.17", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -327,9 +327,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.15.tgz", - "integrity": "sha512-l1UiX4UyHSFsYt17iQ3Se5pQQZZHa22zyIXURmvkmLCD4t/aU+dvNWHatKac/D9Vm9UES7nvIqHs4jZqKviUmQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.17.tgz", + "integrity": "sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", @@ -719,9 +719,9 @@ } }, "node_modules/@babel/traverse": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.15.tgz", - "integrity": "sha512-DdHPwvJY0sEeN4xJU5uRLmZjgMMDIvMPniLuYzUVXj/GGzysPl0/fwt44JBkyUIzGJPV8QgHMcQdQ34XFuKTYQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.17.tgz", + "integrity": "sha512-xK4Uwm0JnAMvxYZxOVecss85WxTEIbTa7bnGyf/+EgCL5Zt3U7htUpEOWv9detPlamGKuRzCqw74xVglDWpPdg==", "dev": true, "dependencies": { "@babel/code-frame": "^7.22.13", @@ -730,8 +730,8 @@ "@babel/helper-function-name": "^7.22.5", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/types": "^7.22.17", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -772,9 +772,9 @@ "dev": true }, "node_modules/@babel/types": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.15.tgz", - "integrity": "sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.17.tgz", + "integrity": "sha512-YSQPHLFtQNE5xN9tHuZnzu8vPr61wVTBZdfv1meex1NBosa4iT05k/Jw06ddJugi4bk7The/oSwQGFcksmEJQg==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", @@ -807,9 +807,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", - "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", + "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -862,9 +862,9 @@ "dev": true }, "node_modules/@eslint/js": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", - "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", + "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1035,16 +1035,16 @@ } }, "node_modules/@jest/console": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.4.tgz", - "integrity": "sha512-wNK6gC0Ha9QeEPSkeJedQuTQqxZYnDPuDcDhVuVatRvMkL4D0VTvFVZj+Yuh6caG2aOfzkUZ36KtCmLNtR02hw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -1052,15 +1052,15 @@ } }, "node_modules/@jest/core": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.4.tgz", - "integrity": "sha512-U/vq5ccNTSVgYH7mHnodHmCffGWHJnz/E1BEWlLuK5pM4FZmGfBn/nrJGLjUsSmyx3otCeqc1T31F4y08AMDLg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, "dependencies": { - "@jest/console": "^29.6.4", - "@jest/reporters": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -1068,21 +1068,21 @@ "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.6.3", - "jest-config": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-resolve-dependencies": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "jest-watcher": "^29.6.4", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -1099,37 +1099,37 @@ } }, "node_modules/@jest/environment": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.4.tgz", - "integrity": "sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "dependencies": { - "@jest/fake-timers": "^29.6.4", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.3" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.4.tgz", - "integrity": "sha512-Warhsa7d23+3X5bLbrbYvaehcgX5TLYhI03JKoedTiI8uJU4IhqYBWF7OSSgUyz4IgLpUYPkK0AehA5/fRclAA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, "dependencies": { - "expect": "^29.6.4", - "jest-snapshot": "^29.6.4" + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.4.tgz", - "integrity": "sha512-FEhkJhqtvBwgSpiTrocquJCdXPsyvNKcl/n7A3u7X4pVoF4bswm11c9d4AV+kfq2Gpv/mM8x7E7DsRvH+djkrg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, "dependencies": { "jest-get-type": "^29.6.3" @@ -1139,47 +1139,47 @@ } }, "node_modules/@jest/fake-timers": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.4.tgz", - "integrity": "sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.4.tgz", - "integrity": "sha512-wVIn5bdtjlChhXAzVXavcY/3PEjf4VqM174BM3eGL5kMxLiZD5CLnbmkEyA1Dwh9q8XjP6E8RwjBsY/iCWrWsA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", "@jest/types": "^29.6.3", - "jest-mock": "^29.6.3" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.4.tgz", - "integrity": "sha512-sxUjWxm7QdchdrD3NfWKrL8FBsortZeibSJv4XLjESOOjSUOkjQcb0ZHJwfhEGIvBvTluTzfG2yZWZhkrXJu8g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", @@ -1193,9 +1193,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -1240,12 +1240,12 @@ } }, "node_modules/@jest/test-result": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.4.tgz", - "integrity": "sha512-uQ1C0AUEN90/dsyEirgMLlouROgSY+Wc/JanVVk0OiUKa5UFh7sJpMEM3aoUBAz2BRNvUJ8j3d294WFuRxSyOQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, "dependencies": { - "@jest/console": "^29.6.4", + "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" @@ -1255,14 +1255,14 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.4.tgz", - "integrity": "sha512-E84M6LbpcRq3fT4ckfKs9ryVanwkaIB0Ws9bw3/yP4seRLg/VaCZ/LgW0MCq5wwk4/iP/qnilD41aj2fsw2RMg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, "dependencies": { - "@jest/test-result": "^29.6.4", + "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -1270,9 +1270,9 @@ } }, "node_modules/@jest/transform": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz", - "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -1283,9 +1283,9 @@ "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -1510,9 +1510,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.5.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.9.tgz", - "integrity": "sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==" + "version": "20.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.0.tgz", + "integrity": "sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==" }, "node_modules/@types/stack-utils": { "version": "2.0.1", @@ -1818,12 +1818,12 @@ } }, "node_modules/babel-jest": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.4.tgz", - "integrity": "sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "dependencies": { - "@jest/transform": "^29.6.4", + "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", @@ -2132,9 +2132,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001529", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001529.tgz", - "integrity": "sha512-n2pUQYGAkrLG4QYj2desAh+NqsJpHbNmVZz87imptDdxLAtjxary7Df/psdfyDGmskJK/9Dt9cPnx5RZ3CU4Og==", + "version": "1.0.30001534", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001534.tgz", + "integrity": "sha512-vlPVrhsCS7XaSh2VvWluIQEzVhefrUQcEsQWSS5A5V+dM07uv1qHeQzAOTGIMy9i3e9bH15+muvI/UHojVgS/Q==", "dev": true, "funding": [ { @@ -2409,6 +2409,27 @@ "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", "dev": true }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -2475,12 +2496,27 @@ "node": ">=0.10.0" } }, + "node_modules/define-data-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.0.1.tgz", + "integrity": "sha512-22M+6zEspQHx10bfFQl2ET39IvfuQ7+rZIH7+ard8fCC4hPmkOSy+8JhKxBRLaWUziJ0O63NTYT97LR8zUfPTw==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -2577,9 +2613,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.512", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.512.tgz", - "integrity": "sha512-1W8wRbYlQE4ph7eoj3TJ+uqwO6+xvAE/L+KGU7WTQQvX3tnSIGZAb90MTsMoJqzntamiwJhBAj4WZmygXhsOUg==", + "version": "1.4.519", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.519.tgz", + "integrity": "sha512-kqs9oGYL4UFVkLKhqCTgBCYZv+wZ374yABDMqlDda9HvlkQxvSr7kgf4hfWVjMieDbX+1MwPHFBsOGCMIBaFKg==", "dev": true }, "node_modules/emittery": { @@ -2737,16 +2773,16 @@ } }, "node_modules/eslint": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", - "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", + "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.48.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint/js": "8.49.0", + "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", @@ -3088,16 +3124,16 @@ } }, "node_modules/expect": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.4.tgz", - "integrity": "sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, "dependencies": { - "@jest/expect-utils": "^29.6.4", + "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3" + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -3153,9 +3189,9 @@ } }, "node_modules/express-rate-limit": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.0.tgz", - "integrity": "sha512-H9afltGTaEZcvenAB5LFgb/ysTMHUzMxoB3TJM6UHP5FtAP1p2+heMj1xwTei54Zm4I9I/2qsS5m+XrdKQp/Hw==", + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.2.tgz", + "integrity": "sha512-a7uwwfNTh1U60ssiIkuLFWHt4hAC5yxlLGU2VP0X4YNlyEDZAqF4tK3GD3NSitVBrCQmQ0++0uOyFOgC2y4DDw==", "engines": { "node": ">= 14" }, @@ -4255,13 +4291,13 @@ } }, "node_modules/jest-changed-files": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.6.3.tgz", - "integrity": "sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, "dependencies": { "execa": "^5.0.0", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "p-limit": "^3.1.0" }, "engines": { @@ -4269,28 +4305,28 @@ } }, "node_modules/jest-circus": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.4.tgz", - "integrity": "sha512-YXNrRyntVUgDfZbjXWBMPslX1mQ8MrSG0oM/Y06j9EYubODIyHWP8hMUbjbZ19M3M+zamqEur7O80HODwACoJw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", - "@jest/test-result": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "p-limit": "^3.1.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" @@ -4300,22 +4336,21 @@ } }, "node_modules/jest-cli": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.4.tgz", - "integrity": "sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, "dependencies": { - "@jest/core": "^29.6.4", - "@jest/test-result": "^29.6.4", + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "chalk": "^4.0.0", + "create-jest": "^29.7.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "prompts": "^2.0.1", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "yargs": "^17.3.1" }, "bin": { @@ -4334,31 +4369,31 @@ } }, "node_modules/jest-config": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.4.tgz", - "integrity": "sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.6.4", + "@jest/test-sequencer": "^29.7.0", "@jest/types": "^29.6.3", - "babel-jest": "^29.6.4", + "babel-jest": "^29.7.0", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.6.4", - "jest-environment-node": "^29.6.4", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", "jest-get-type": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -4379,24 +4414,24 @@ } }, "node_modules/jest-diff": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.4.tgz", - "integrity": "sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-docblock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.6.3.tgz", - "integrity": "sha512-2+H+GOTQBEm2+qFSQ7Ma+BvyV+waiIFxmZF5LdpBsAEjWX8QYjSCa4FrkIYtbfXUJJJnFCYrOtt6TZ+IAiTjBQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, "dependencies": { "detect-newline": "^3.0.0" @@ -4406,33 +4441,33 @@ } }, "node_modules/jest-each": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.3.tgz", - "integrity": "sha512-KoXfJ42k8cqbkfshW7sSHcdfnv5agDdHCPA87ZBdmHP+zJstTJc0ttQaJ/x7zK6noAL76hOuTIJ6ZkQRS5dcyg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", - "jest-util": "^29.6.3", - "pretty-format": "^29.6.3" + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-environment-node": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.4.tgz", - "integrity": "sha512-i7SbpH2dEIFGNmxGCpSc2w9cA4qVD+wfvg2ZnfQ7XVrKL0NA5uDVBIiGH8SR4F0dKEv/0qI5r+aDomDf04DpEQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -4448,9 +4483,9 @@ } }, "node_modules/jest-haste-map": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz", - "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -4460,8 +4495,8 @@ "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -4473,37 +4508,37 @@ } }, "node_modules/jest-leak-detector": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.3.tgz", - "integrity": "sha512-0kfbESIHXYdhAdpLsW7xdwmYhLf1BRu4AA118/OxFm0Ho1b2RcTmO4oF6aAMaxpxdxnJ3zve2rgwzNBD4Zbm7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, "dependencies": { "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.4.tgz", - "integrity": "sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.6.4", + "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-message-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.3.tgz", - "integrity": "sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", @@ -4512,7 +4547,7 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -4521,14 +4556,14 @@ } }, "node_modules/jest-mock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.3.tgz", - "integrity": "sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", - "jest-util": "^29.6.3" + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -4561,17 +4596,17 @@ } }, "node_modules/jest-resolve": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.4.tgz", - "integrity": "sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" @@ -4581,43 +4616,43 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.4.tgz", - "integrity": "sha512-7+6eAmr1ZBF3vOAJVsfLj1QdqeXG+WYhidfLHBRZqGN24MFRIiKG20ItpLw2qRAsW/D2ZUUmCNf6irUr/v6KHA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, "dependencies": { "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.6.4" + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.4.tgz", - "integrity": "sha512-SDaLrMmtVlQYDuG0iSPYLycG8P9jLI+fRm8AF/xPKhYDB2g6xDWjXBrR5M8gEWsK6KVFlebpZ4QsrxdyIX1Jaw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, "dependencies": { - "@jest/console": "^29.6.4", - "@jest/environment": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.6.3", - "jest-environment-node": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-leak-detector": "^29.6.3", - "jest-message-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-util": "^29.6.3", - "jest-watcher": "^29.6.4", - "jest-worker": "^29.6.4", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -4626,17 +4661,17 @@ } }, "node_modules/jest-runtime": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.4.tgz", - "integrity": "sha512-s/QxMBLvmwLdchKEjcLfwzP7h+jsHvNEtxGP5P+Fl1FMaJX2jMiIqe4rJw4tFprzCwuSvVUo9bn0uj4gNRXsbA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", - "@jest/globals": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", @@ -4644,13 +4679,13 @@ "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -4659,9 +4694,9 @@ } }, "node_modules/jest-snapshot": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.4.tgz", - "integrity": "sha512-VC1N8ED7+4uboUKGIDsbvNAZb6LakgIPgAF4RSpF13dN6YaMokfRqO+BaqK4zIh6X3JffgwbzuGqDEjHm/MrvA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -4669,20 +4704,20 @@ "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.6.4", + "expect": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-diff": "^29.6.4", + "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "natural-compare": "^1.4.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "semver": "^7.5.3" }, "engines": { @@ -4723,9 +4758,9 @@ "dev": true }, "node_modules/jest-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", - "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -4740,9 +4775,9 @@ } }, "node_modules/jest-validate": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz", - "integrity": "sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -4750,7 +4785,7 @@ "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -4769,18 +4804,18 @@ } }, "node_modules/jest-watcher": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.4.tgz", - "integrity": "sha512-oqUWvx6+On04ShsT00Ir9T4/FvBeEh2M9PTubgITPxDa739p4hoQweWPRGyYeaojgT0xTpZKF0Y/rSY1UgMxvQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, "dependencies": { - "@jest/test-result": "^29.6.4", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "string-length": "^4.0.1" }, "engines": { @@ -4788,13 +4823,13 @@ } }, "node_modules/jest-worker": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", - "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -5695,9 +5730,9 @@ } }, "node_modules/pretty-format": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", - "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", @@ -5866,14 +5901,14 @@ "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" }, "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "set-function-name": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -6100,6 +6135,19 @@ "node": ">= 0.8.0" } }, + "node_modules/set-function-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.0.tgz", + "integrity": "sha512-WmS8UHojv5s1eSoRSmzO5zzgDq8PE1/X/ij0k+9fMYmINCc6+j+SF3Om8YyucKn2yjnK4ItNZOoQycNnHsZJTw==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", diff --git a/dtfs-central-api/package.json b/dtfs-central-api/package.json index 805226f314..1b67bed4d4 100644 --- a/dtfs-central-api/package.json +++ b/dtfs-central-api/package.json @@ -43,7 +43,7 @@ "dotenv": "16.0.3", "express": "4.18.2", "express-mongo-sanitize": "^2.2.0", - "express-rate-limit": "^6.11.0", + "express-rate-limit": "^6.11.2", "moment": "^2.29.4", "mongo-dot-notation": "3.1.0", "mongodb": "4.2.0", @@ -52,7 +52,7 @@ "swagger-ui-express": "^4.6.3" }, "devDependencies": { - "eslint": "^8.48.0", + "eslint": "^8.49.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.28.1", "jest": "29.5.0", diff --git a/e2e-tests/README.md b/e2e-tests/README.md index d5ff96cca4..3d75976078 100644 --- a/e2e-tests/README.md +++ b/e2e-tests/README.md @@ -1,27 +1,33 @@ -# e2e-tests +# End-to-End tests 🧪 -[Cypress](http://cypress.io) End to end test suites for all UI services and flows: +**Cypress** end-to-end test suites for all UI services and flows: -1) BSS (Portal - Bond Support Scheme) -2) GEF (General Export Facility) -3) TFM (Trade Finance Manager) -4) Submission to TFM from BSS/Portal +1) **BSS** (Portal - Bond Support Scheme) +2) **GEF** (General Export Facility) +3) **TFM** (Trade Finance Manager) +4) Submission to **TFM** from **BSS/Portal** + +## Coverage + +[![DTFS](https://img.shields.io/endpoint?url=https://cloud.cypress.io/badge/count/sefntb/main&style=for-the-badge&logo=cypress)](https://cloud.cypress.io/projects/sefntb/runs) ## Why -Without e2e tests, things could break without us knowing. +End-to-end tests are crucial for ensuring the stability and reliability of our applications. Without e2e tests, issues and regressions can go undetected, potentially causing problems for users. -## Running locally +## Running locally 🏃‍♂️ -1: Make sure that you have everything running from the main root: +To run the end-to-end tests locally, follow these steps: + +1. Ensure that all services are up and running from the main root by running: ```shell docker-compose up ``` -2: In a second terminal, navigate to the respective folder (./portal, ./gef, ./submit-to-trade-finance-manager, ./trade-finance-manager). +2. In a second terminal, navigate to the respective folder for the service you want to test (e.g., `./portal`, `./gef`, `./submit-to-trade-finance-manager`, `./trade-finance-manager`). -3: Run any of the following commands to start Cypress +3. Run one of the following commands to start Cypress: ### **Run an E2E test suite** @@ -31,6 +37,8 @@ npx cypress run --config video=false ### **Run a single E2E test** +If you want to run a specific E2E test file, you can use the following command by specifying the path to the test file: + ```shell npx cypress run --spec "cypress/e2e/**/my-test.spec.js" --config video=false ``` @@ -41,23 +49,25 @@ npx cypress run --spec "cypress/e2e/**/my-test.spec.js" --config video=false npx cypress open . ``` -## Cypress configuration +## Cypress configuration ⚙️ -Each test suite has a `cypress.json` in the route. This JSON contains URLs for the relevant UI and API. +Each test suite has its own `cypress.json` configuration file in its root directory. This JSON file contains URLs for the relevant UI and API endpoints. -There is also some values for handling timeouts and errors: `pageLoadTimeout` and `retries`. +Additionally, it includes values for handling timeouts and retries: `pageLoadTimeout` and `retries`. -:warning: `pageLoadTimeout` was added because sometimes deal submission can take some time (due to a large amount of external API calls). Eventually, these API calls will be moved to a background service which will not only reduce submission type, but make the e2e tests run quicker. +⚠️ The `pageLoadTimeout` was added because deal submissions can sometimes take time, especially if there are many external API calls involved. Eventually, these API calls will be optimized to reduce submission time and make the E2E tests run more efficiently. -## Directory structure +## Directory structure 📂 -Each test suite has the same root directory structure. +Each test suite shares a similar directory structure: | Directory | Description | How it's used | -| ------- | --- | --- | -| /fixtures | Mock deals | Submitted to API, then used to navigate and assert data in the UI. | -| /integration | Spec files and page/element selectors | - | -| /plugins | Unused. Cypress boilerplate | - | -| /support | Cypress commands | In each test, cypress commands are run to call APIs to e.g add a deal to the database. | -| /videos | Cypress video captures | Records tests. Disable to save speed. -| /screenshots | Cypress screenshots | Saves screenshots on failed tests. +| --------- | ----------- | ------------- | +| /fixtures | Mock deals | These mock deals are submitted to the API and then used for navigation and data assertion in the UI. | +| /integration | Spec files and page/element selectors | Spec files define the actual tests, and page/element selectors are used to locate UI elements. | +| /plugins | Unused. Cypress boilerplate | Not used in this context. | +| /support | Cypress commands | Cypress commands are run in each test to call APIs, add deals to the database, and perform other necessary actions. | +| /videos | Cypress video captures | These videos record the tests. You can disable video recording to save time. | +| /screenshots | Cypress screenshots | Screenshots are captured in case of test failures for further analysis. | + +--- \ No newline at end of file diff --git a/external-api/README.md b/external-api/README.md index ff86d0e349..fb374a5cfb 100644 --- a/external-api/README.md +++ b/external-api/README.md @@ -1,19 +1,16 @@ # EXTERNAL API MICRO-SERVICE 📦️ -EXTERNAL is predominately responsible for external API consumption and communication. +The **EXTERNAL** micro-service primarily handles the consumption and communication with external APIs. ## Endpoints 🌐 ### 1. APIM -APIM provides various crucial endpoints across varied services (MDM, TFS and ESTORE). -EXTERNAL has an high exposure to MDM endpoints. +**APIM** provides various essential endpoints for various services (MDM, TFS, and ESTORE). **EXTERNAL** primarily interacts with MDM endpoints. #### 1. MDM -Master data management endpoints are responsible for providing wide variety of imperative data. -They range from `/currencies` to `/interest-rates`, EXTERNAL `.env` requires following three variables -to be fulfilled before any consumption. +Master Data Management (MDM) endpoints are responsible for providing a wide variety of critical data, ranging from `/currencies` to `/interest-rates`. To use these MDM endpoints, the **EXTERNAL** service requires the following three environment variables to be properly configured: ```shell APIM_MDM_URL= @@ -21,7 +18,7 @@ APIM_MDM_KEY= APIM_MDM_VALUE= ``` -Please note `APIM_MDM_KEY` is the header name, whereas `APIM_MDM_VALUE` is the authentication code, since `value` is applied to a `key`. +Please note that `APIM_MDM_KEY` represents the header name, while `APIM_MDM_VALUE` contains the authentication code, as the "value" is applied to a "key" in the headers: ```javascript headers: { @@ -29,34 +26,42 @@ headers: { } ``` -### 2. Companies house +### 2. Companies House -CS entity fetch +This endpoint is used for fetching CS entity data. -### 3. OS +### 3. OS (Ordnance Survey) -Places API -The service also hosts some External API for countries, currencies and industry sectors. These need to be removed and obtained through APIM API calls. +This service interacts with the Places API from Ordnance Survey. + +The service also hosts some external APIs for countries, currencies, and industry sectors. However, these should be removed and obtained through APIM API calls for better organization and consistency. ## Why -Separation of concerns and reusability. -By having external API calls in it's own service, and external endpoint can be used from anywhere in the same way. It also allows us to gracefully wrap or map requests, responses and errors etc. +The primary reasons for creating the **EXTERNAL** micro-service are separation of concerns and reusability. By centralizing external API calls within this service, any external endpoint can be accessed uniformly from anywhere in the system. Additionally, it allows for consistent handling of requests, responses, errors, and other related concerns. + +## Prerequisite 🛠️ -## Prerequisite +Before using the **EXTERNAL** micro-service, ensure that you have an `.env` file properly configured. You can use the `.env.sample` file as a template. Some sensitive variables may need to be shared within the team. -Make sure you have an `.env`. Use `.env.sample` as a base. Some sensitive variables need to be shared from the team. +## Testing 🧪 -## Testing +To run tests for the **EXTERNAL** micro-service, use the following command: ```shell npm run api-test ``` -Test coverage will be generated. +This will generate test coverage as well. ### **Run a single API test** +If you want to run a specific API test file, you can use the following command by specifying the path to the test file: + ```shell npm run api-test-file "**/*/deals-party-db.api-test.js" ``` + +This allows you to focus on testing a particular aspect or functionality of the **EXTERNAL** service. + +--- \ No newline at end of file diff --git a/external-api/package-lock.json b/external-api/package-lock.json index eaf5440809..9d2a38542c 100644 --- a/external-api/package-lock.json +++ b/external-api/package-lock.json @@ -13,14 +13,14 @@ "@types/cors": "^2.8.14", "@types/express": "^4.17.17", "@types/jest": "^29.5.4", - "@types/node": "^18.17.14", + "@types/node": "^18.17.15", "@types/node-cron": "^3.0.8", "@types/supertest": "^2.0.12", "@types/swagger-jsdoc": "^6.0.1", "@types/swagger-ui-express": "^4.1.3", "@types/validator": "13.7.17", "axios": "^1.5.0", - "axios-mock-adapter": "^1.21.5", + "axios-mock-adapter": "^1.22.0", "compression": "^1.7.4", "cors": "^2.8.5", "cron-job-manager": "^2.3.1", @@ -28,7 +28,7 @@ "dotenv": "16.3.1", "express": "4.18.2", "express-mongo-sanitize": "^2.2.0", - "express-rate-limit": "^6.11.0", + "express-rate-limit": "^6.11.2", "joi": "^17.10.1", "mongodb": "4.2.0", "nodemon": "^3.0.1", @@ -43,7 +43,7 @@ "devDependencies": { "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", - "eslint": "^8.48.0", + "eslint": "^8.49.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-airbnb-typescript": "^17.1.0", "eslint-config-airbnb-typescript-prettier": "^5.0.0", @@ -210,21 +210,21 @@ } }, "node_modules/@babel/core": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.15.tgz", - "integrity": "sha512-PtZqMmgRrvj8ruoEOIwVA3yoF91O+Hgw9o7DAUTNBA6Mo2jpu31clx9a7Nz/9JznqetTR6zwfC4L3LAjKQXUwA==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.17.tgz", + "integrity": "sha512-2EENLmhpwplDux5PSsZnSbnSkB3tZ6QTksgO25xwEL7pIDcNOMhF5v/s6RzwjMZzZzw9Ofc30gHv5ChCC8pifQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.22.13", "@babel/generator": "^7.22.15", "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.22.15", + "@babel/helper-module-transforms": "^7.22.17", "@babel/helpers": "^7.22.15", - "@babel/parser": "^7.22.15", + "@babel/parser": "^7.22.16", "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.15", - "@babel/types": "^7.22.15", + "@babel/traverse": "^7.22.17", + "@babel/types": "^7.22.17", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -341,9 +341,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.15.tgz", - "integrity": "sha512-l1UiX4UyHSFsYt17iQ3Se5pQQZZHa22zyIXURmvkmLCD4t/aU+dvNWHatKac/D9Vm9UES7nvIqHs4jZqKviUmQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.17.tgz", + "integrity": "sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", @@ -724,9 +724,9 @@ } }, "node_modules/@babel/traverse": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.15.tgz", - "integrity": "sha512-DdHPwvJY0sEeN4xJU5uRLmZjgMMDIvMPniLuYzUVXj/GGzysPl0/fwt44JBkyUIzGJPV8QgHMcQdQ34XFuKTYQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.17.tgz", + "integrity": "sha512-xK4Uwm0JnAMvxYZxOVecss85WxTEIbTa7bnGyf/+EgCL5Zt3U7htUpEOWv9detPlamGKuRzCqw74xVglDWpPdg==", "dev": true, "dependencies": { "@babel/code-frame": "^7.22.13", @@ -735,8 +735,8 @@ "@babel/helper-function-name": "^7.22.5", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/types": "^7.22.17", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -754,9 +754,9 @@ } }, "node_modules/@babel/types": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.15.tgz", - "integrity": "sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.17.tgz", + "integrity": "sha512-YSQPHLFtQNE5xN9tHuZnzu8vPr61wVTBZdfv1meex1NBosa4iT05k/Jw06ddJugi4bk7The/oSwQGFcksmEJQg==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", @@ -809,9 +809,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", - "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", + "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -841,9 +841,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", - "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", + "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1004,16 +1004,16 @@ } }, "node_modules/@jest/console": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.4.tgz", - "integrity": "sha512-wNK6gC0Ha9QeEPSkeJedQuTQqxZYnDPuDcDhVuVatRvMkL4D0VTvFVZj+Yuh6caG2aOfzkUZ36KtCmLNtR02hw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -1021,15 +1021,15 @@ } }, "node_modules/@jest/core": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.4.tgz", - "integrity": "sha512-U/vq5ccNTSVgYH7mHnodHmCffGWHJnz/E1BEWlLuK5pM4FZmGfBn/nrJGLjUsSmyx3otCeqc1T31F4y08AMDLg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, "dependencies": { - "@jest/console": "^29.6.4", - "@jest/reporters": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -1037,21 +1037,21 @@ "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.6.3", - "jest-config": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-resolve-dependencies": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "jest-watcher": "^29.6.4", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -1068,37 +1068,37 @@ } }, "node_modules/@jest/environment": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.4.tgz", - "integrity": "sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "dependencies": { - "@jest/fake-timers": "^29.6.4", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.3" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.4.tgz", - "integrity": "sha512-Warhsa7d23+3X5bLbrbYvaehcgX5TLYhI03JKoedTiI8uJU4IhqYBWF7OSSgUyz4IgLpUYPkK0AehA5/fRclAA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, "dependencies": { - "expect": "^29.6.4", - "jest-snapshot": "^29.6.4" + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.4.tgz", - "integrity": "sha512-FEhkJhqtvBwgSpiTrocquJCdXPsyvNKcl/n7A3u7X4pVoF4bswm11c9d4AV+kfq2Gpv/mM8x7E7DsRvH+djkrg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dependencies": { "jest-get-type": "^29.6.3" }, @@ -1107,47 +1107,47 @@ } }, "node_modules/@jest/fake-timers": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.4.tgz", - "integrity": "sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.4.tgz", - "integrity": "sha512-wVIn5bdtjlChhXAzVXavcY/3PEjf4VqM174BM3eGL5kMxLiZD5CLnbmkEyA1Dwh9q8XjP6E8RwjBsY/iCWrWsA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", "@jest/types": "^29.6.3", - "jest-mock": "^29.6.3" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.4.tgz", - "integrity": "sha512-sxUjWxm7QdchdrD3NfWKrL8FBsortZeibSJv4XLjESOOjSUOkjQcb0ZHJwfhEGIvBvTluTzfG2yZWZhkrXJu8g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", @@ -1161,9 +1161,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -1207,12 +1207,12 @@ } }, "node_modules/@jest/test-result": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.4.tgz", - "integrity": "sha512-uQ1C0AUEN90/dsyEirgMLlouROgSY+Wc/JanVVk0OiUKa5UFh7sJpMEM3aoUBAz2BRNvUJ8j3d294WFuRxSyOQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, "dependencies": { - "@jest/console": "^29.6.4", + "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" @@ -1222,14 +1222,14 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.4.tgz", - "integrity": "sha512-E84M6LbpcRq3fT4ckfKs9ryVanwkaIB0Ws9bw3/yP4seRLg/VaCZ/LgW0MCq5wwk4/iP/qnilD41aj2fsw2RMg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, "dependencies": { - "@jest/test-result": "^29.6.4", + "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -1237,9 +1237,9 @@ } }, "node_modules/@jest/transform": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz", - "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -1250,9 +1250,9 @@ "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -1587,9 +1587,9 @@ "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, "node_modules/@types/node": { - "version": "18.17.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.14.tgz", - "integrity": "sha512-ZE/5aB73CyGqgQULkLG87N9GnyGe5TcQjv34pwS8tfBs1IkCh0ASM69mydb2znqd6v0eX+9Ytvk6oQRqu8T1Vw==" + "version": "18.17.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.15.tgz", + "integrity": "sha512-2yrWpBk32tvV/JAd3HNHWuZn/VDN1P+72hWirHnvsvTGSqbANi+kSeuQR9yAHnbvaBvHDsoTdXV0Fe+iRtHLKA==" }, "node_modules/@types/node-cron": { "version": "3.0.8", @@ -2203,9 +2203,9 @@ } }, "node_modules/axe-core": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.8.0.tgz", - "integrity": "sha512-ZtlVZobOeDQhb/y2lMK6mznDw7TJHDNcKx5/bbBkFvArIQ5CVFhSI6hWWQnMx9I8cNmNmZ30wpDyOC2E2nvgbQ==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.8.1.tgz", + "integrity": "sha512-9l850jDDPnKq48nbad8SiEelCv4OrUWrKab/cPj0GScVg6cb6NbCCt/Ulk26QEq5jP9NnGr04Bit1BHyV6r5CQ==", "dev": true, "engines": { "node": ">=4" @@ -2222,9 +2222,9 @@ } }, "node_modules/axios-mock-adapter": { - "version": "1.21.5", - "resolved": "https://registry.npmjs.org/axios-mock-adapter/-/axios-mock-adapter-1.21.5.tgz", - "integrity": "sha512-5NI1V/VK+8+JeTF8niqOowuysA4b8mGzdlMN/QnTnoXbYh4HZSNiopsDclN2g/m85+G++IrEtUdZaQ3GnaMsSA==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/axios-mock-adapter/-/axios-mock-adapter-1.22.0.tgz", + "integrity": "sha512-dmI0KbkyAhntUR05YY96qg2H6gg0XMl2+qTW0xmYg6Up+BFBAJYRLROMXRdDEL06/Wqwa0TJThAYvFtSFdRCZw==", "dependencies": { "fast-deep-equal": "^3.1.3", "is-buffer": "^2.0.5" @@ -2243,12 +2243,12 @@ } }, "node_modules/babel-jest": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.4.tgz", - "integrity": "sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "dependencies": { - "@jest/transform": "^29.6.4", + "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", @@ -2596,9 +2596,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001529", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001529.tgz", - "integrity": "sha512-n2pUQYGAkrLG4QYj2desAh+NqsJpHbNmVZz87imptDdxLAtjxary7Df/psdfyDGmskJK/9Dt9cPnx5RZ3CU4Og==", + "version": "1.0.30001534", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001534.tgz", + "integrity": "sha512-vlPVrhsCS7XaSh2VvWluIQEzVhefrUQcEsQWSS5A5V+dM07uv1qHeQzAOTGIMy9i3e9bH15+muvI/UHojVgS/Q==", "dev": true, "funding": [ { @@ -2894,6 +2894,27 @@ "node": ">= 0.10" } }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -2996,12 +3017,27 @@ "node": ">=0.10.0" } }, + "node_modules/define-data-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.0.1.tgz", + "integrity": "sha512-22M+6zEspQHx10bfFQl2ET39IvfuQ7+rZIH7+ard8fCC4hPmkOSy+8JhKxBRLaWUziJ0O63NTYT97LR8zUfPTw==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -3137,9 +3173,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.512", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.512.tgz", - "integrity": "sha512-1W8wRbYlQE4ph7eoj3TJ+uqwO6+xvAE/L+KGU7WTQQvX3tnSIGZAb90MTsMoJqzntamiwJhBAj4WZmygXhsOUg==", + "version": "1.4.519", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.519.tgz", + "integrity": "sha512-kqs9oGYL4UFVkLKhqCTgBCYZv+wZ374yABDMqlDda9HvlkQxvSr7kgf4hfWVjMieDbX+1MwPHFBsOGCMIBaFKg==", "dev": true }, "node_modules/emittery": { @@ -3332,16 +3368,16 @@ } }, "node_modules/eslint": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", - "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", + "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.48.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint/js": "8.49.0", + "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", @@ -3956,15 +3992,15 @@ } }, "node_modules/expect": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.4.tgz", - "integrity": "sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dependencies": { - "@jest/expect-utils": "^29.6.4", + "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3" + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -4020,9 +4056,9 @@ } }, "node_modules/express-rate-limit": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.0.tgz", - "integrity": "sha512-H9afltGTaEZcvenAB5LFgb/ysTMHUzMxoB3TJM6UHP5FtAP1p2+heMj1xwTei54Zm4I9I/2qsS5m+XrdKQp/Hw==", + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.2.tgz", + "integrity": "sha512-a7uwwfNTh1U60ssiIkuLFWHt4hAC5yxlLGU2VP0X4YNlyEDZAqF4tK3GD3NSitVBrCQmQ0++0uOyFOgC2y4DDw==", "engines": { "node": ">= 14" }, @@ -5280,13 +5316,13 @@ } }, "node_modules/jest-changed-files": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.6.3.tgz", - "integrity": "sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, "dependencies": { "execa": "^5.0.0", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "p-limit": "^3.1.0" }, "engines": { @@ -5294,28 +5330,28 @@ } }, "node_modules/jest-circus": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.4.tgz", - "integrity": "sha512-YXNrRyntVUgDfZbjXWBMPslX1mQ8MrSG0oM/Y06j9EYubODIyHWP8hMUbjbZ19M3M+zamqEur7O80HODwACoJw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", - "@jest/test-result": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "p-limit": "^3.1.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" @@ -5325,22 +5361,21 @@ } }, "node_modules/jest-cli": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.4.tgz", - "integrity": "sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, "dependencies": { - "@jest/core": "^29.6.4", - "@jest/test-result": "^29.6.4", + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "chalk": "^4.0.0", + "create-jest": "^29.7.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "prompts": "^2.0.1", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "yargs": "^17.3.1" }, "bin": { @@ -5359,31 +5394,31 @@ } }, "node_modules/jest-config": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.4.tgz", - "integrity": "sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.6.4", + "@jest/test-sequencer": "^29.7.0", "@jest/types": "^29.6.3", - "babel-jest": "^29.6.4", + "babel-jest": "^29.7.0", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.6.4", - "jest-environment-node": "^29.6.4", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", "jest-get-type": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -5404,23 +5439,23 @@ } }, "node_modules/jest-diff": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.4.tgz", - "integrity": "sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-docblock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.6.3.tgz", - "integrity": "sha512-2+H+GOTQBEm2+qFSQ7Ma+BvyV+waiIFxmZF5LdpBsAEjWX8QYjSCa4FrkIYtbfXUJJJnFCYrOtt6TZ+IAiTjBQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, "dependencies": { "detect-newline": "^3.0.0" @@ -5430,33 +5465,33 @@ } }, "node_modules/jest-each": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.3.tgz", - "integrity": "sha512-KoXfJ42k8cqbkfshW7sSHcdfnv5agDdHCPA87ZBdmHP+zJstTJc0ttQaJ/x7zK6noAL76hOuTIJ6ZkQRS5dcyg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", - "jest-util": "^29.6.3", - "pretty-format": "^29.6.3" + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-environment-node": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.4.tgz", - "integrity": "sha512-i7SbpH2dEIFGNmxGCpSc2w9cA4qVD+wfvg2ZnfQ7XVrKL0NA5uDVBIiGH8SR4F0dKEv/0qI5r+aDomDf04DpEQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -5471,9 +5506,9 @@ } }, "node_modules/jest-haste-map": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz", - "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -5483,8 +5518,8 @@ "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -5496,36 +5531,36 @@ } }, "node_modules/jest-leak-detector": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.3.tgz", - "integrity": "sha512-0kfbESIHXYdhAdpLsW7xdwmYhLf1BRu4AA118/OxFm0Ho1b2RcTmO4oF6aAMaxpxdxnJ3zve2rgwzNBD4Zbm7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, "dependencies": { "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.4.tgz", - "integrity": "sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.6.4", + "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-message-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.3.tgz", - "integrity": "sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", @@ -5533,7 +5568,7 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -5542,14 +5577,14 @@ } }, "node_modules/jest-mock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.3.tgz", - "integrity": "sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", - "jest-util": "^29.6.3" + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -5582,17 +5617,17 @@ } }, "node_modules/jest-resolve": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.4.tgz", - "integrity": "sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" @@ -5602,43 +5637,43 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.4.tgz", - "integrity": "sha512-7+6eAmr1ZBF3vOAJVsfLj1QdqeXG+WYhidfLHBRZqGN24MFRIiKG20ItpLw2qRAsW/D2ZUUmCNf6irUr/v6KHA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, "dependencies": { "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.6.4" + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.4.tgz", - "integrity": "sha512-SDaLrMmtVlQYDuG0iSPYLycG8P9jLI+fRm8AF/xPKhYDB2g6xDWjXBrR5M8gEWsK6KVFlebpZ4QsrxdyIX1Jaw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, "dependencies": { - "@jest/console": "^29.6.4", - "@jest/environment": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.6.3", - "jest-environment-node": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-leak-detector": "^29.6.3", - "jest-message-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-util": "^29.6.3", - "jest-watcher": "^29.6.4", - "jest-worker": "^29.6.4", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -5647,17 +5682,17 @@ } }, "node_modules/jest-runtime": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.4.tgz", - "integrity": "sha512-s/QxMBLvmwLdchKEjcLfwzP7h+jsHvNEtxGP5P+Fl1FMaJX2jMiIqe4rJw4tFprzCwuSvVUo9bn0uj4gNRXsbA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", - "@jest/globals": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", @@ -5665,13 +5700,13 @@ "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -5680,9 +5715,9 @@ } }, "node_modules/jest-snapshot": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.4.tgz", - "integrity": "sha512-VC1N8ED7+4uboUKGIDsbvNAZb6LakgIPgAF4RSpF13dN6YaMokfRqO+BaqK4zIh6X3JffgwbzuGqDEjHm/MrvA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -5690,20 +5725,20 @@ "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.6.4", + "expect": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-diff": "^29.6.4", + "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "natural-compare": "^1.4.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "semver": "^7.5.3" }, "engines": { @@ -5711,9 +5746,9 @@ } }, "node_modules/jest-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", - "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -5727,9 +5762,9 @@ } }, "node_modules/jest-validate": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz", - "integrity": "sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -5737,7 +5772,7 @@ "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -5756,18 +5791,18 @@ } }, "node_modules/jest-watcher": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.4.tgz", - "integrity": "sha512-oqUWvx6+On04ShsT00Ir9T4/FvBeEh2M9PTubgITPxDa739p4hoQweWPRGyYeaojgT0xTpZKF0Y/rSY1UgMxvQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, "dependencies": { - "@jest/test-result": "^29.6.4", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "string-length": "^4.0.1" }, "engines": { @@ -5775,13 +5810,13 @@ } }, "node_modules/jest-worker": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", - "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -6857,9 +6892,9 @@ } }, "node_modules/pretty-format": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", - "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -7062,14 +7097,14 @@ "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" }, "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "set-function-name": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -7339,6 +7374,19 @@ "node": ">= 0.8.0" } }, + "node_modules/set-function-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.0.tgz", + "integrity": "sha512-WmS8UHojv5s1eSoRSmzO5zzgDq8PE1/X/ij0k+9fMYmINCc6+j+SF3Om8YyucKn2yjnK4ItNZOoQycNnHsZJTw==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -7504,9 +7552,9 @@ "dev": true }, "node_modules/string.prototype.matchall": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.9.tgz", - "integrity": "sha512-6i5hL3MqG/K2G43mWXWgP+qizFW/QH/7kCNN13JrJS5q48FN5IKksLDscexKP3dnmB6cdm9jlNgAsWNLpSykmA==", + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", + "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", @@ -7516,6 +7564,7 @@ "has-symbols": "^1.0.3", "internal-slot": "^1.0.5", "regexp.prototype.flags": "^1.5.0", + "set-function-name": "^2.0.0", "side-channel": "^1.0.4" }, "funding": { diff --git a/external-api/package.json b/external-api/package.json index a0e667635c..3350702861 100644 --- a/external-api/package.json +++ b/external-api/package.json @@ -39,14 +39,14 @@ "@types/cors": "^2.8.14", "@types/express": "^4.17.17", "@types/jest": "^29.5.4", - "@types/node": "^18.17.14", + "@types/node": "^18.17.15", "@types/node-cron": "^3.0.8", "@types/supertest": "^2.0.12", "@types/swagger-jsdoc": "^6.0.1", "@types/swagger-ui-express": "^4.1.3", "@types/validator": "13.7.17", "axios": "^1.5.0", - "axios-mock-adapter": "^1.21.5", + "axios-mock-adapter": "^1.22.0", "compression": "^1.7.4", "cors": "^2.8.5", "cron-job-manager": "^2.3.1", @@ -54,7 +54,7 @@ "dotenv": "16.3.1", "express": "4.18.2", "express-mongo-sanitize": "^2.2.0", - "express-rate-limit": "^6.11.0", + "express-rate-limit": "^6.11.2", "joi": "^17.10.1", "mongodb": "4.2.0", "nodemon": "^3.0.1", @@ -69,7 +69,7 @@ "devDependencies": { "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", - "eslint": "^8.48.0", + "eslint": "^8.49.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-airbnb-typescript": "^17.1.0", "eslint-config-airbnb-typescript-prettier": "^5.0.0", diff --git a/gef-ui/README.md b/gef-ui/README.md index 5dc139323f..cefa15c1f4 100644 --- a/gef-ui/README.md +++ b/gef-ui/README.md @@ -1,33 +1,39 @@ -# gef-ui +# GEF-UI 🌐 -UI for GEF (General Export Facility). Uses the /gef endpoints in portal-api to send and receive data. +The **GEF-UI** is the user interface for the General Export Facility (GEF) product. It interacts with the `/gef` endpoints in the `portal-api` to send and receive data. -## Prerequisite +## Prerequisite 🛠️ -Make sure you have an `.env`. Use `.env.sample` as a base. Some sensitive variables need to be shared from the team. +Before running the GEF-UI locally, make sure you have an `.env` file. You can use the `.env.sample` as a base. Some sensitive variables may need to be shared within the team. -## Running locally +## Running locally 🏃 -1. `docker-compose up` -2. Visit http://localhost in your browser +To run the GEF-UI locally, follow these steps: -Note: no port number is used due to reverse-proxy. +1. Execute `docker-compose up`. +2. Visit http://localhost in your web browser. -Alternatively, every service can be started from the root directory (`docker-compose up`). +Note that no port number is specified in the URL due to the reverse proxy. -## Login credentials +Alternatively, you can start all services from the root directory using `docker-compose up`. -See mock users: utils/mock-data-loader/portal/users.js +## Login credentials 🔑 -## Testing +For testing purposes, you can find mock user credentials in the `utils/mock-data-loader/portal/users.js` file. + +## Testing 🧪 ### **Run a UI test suite** +To run the entire UI test suite, use the following command: + ```shell npm run test ``` -### **Run a single UI test ** +### **Run a single UI test** + +To run a specific UI test, specify the path to the test file like this: ```shell npm run test /path/to/file.test.js @@ -35,58 +41,44 @@ npm run test /path/to/file.test.js ### **End to end tests** -See e2e-tests README.md. - -## Basic happy flow behind the scenes - -1. User logs into Portal UI -2. User selects which product to apply for: BSS or GEF -3. Depending on the chosen product, the BSS or GEF UI will be served -4. User completes the deal/application and submits to the bank -5. Bank approves the deal and submits to UKEF. The deal is sent to Trade Finance Manager (TFM) - -## Moving forwards - aligning GEF and BSS - -### Design - -Before GEF was started, we only had the BSS product and UI. +Detailed information about running end-to-end tests can be found in the `e2e-tests` README.md. -The GEF and BSS products are very similar, but the designs are very different. GEF has a new, better design - whereas BSS UI has an old design. +## Basic Workflow 🔄 -The vision is that once GEF is completed, GEF can be reused in BSS; Bringing both products into a consistent, modern design. +Behind the scenes, the basic workflow for the GEF-UI is as follows: -### Data +1. A user logs into the Portal UI. +2. The user selects whether to apply for the Bond Support Scheme (BSS) or the General Export Facility (GEF). +3. Depending on the chosen product, either the BSS or GEF UI is served. +4. The user completes the deal/application and submits it to the bank. +5. The bank approves the deal and submits it to UKEF. The deal is then sent to Trade Finance Manager (TFM). -Whilst GEF and BSS are very similar in terms of functionality and what is submitted, the data structures are very different. +## Moving Forward - Aligning GEF and BSS 🚀 -GEF has a nice, simpler data structure; BSS is a more complicated. The current BSS data structure is due to the old design and lack of initial understanding. +### Design 🎨 -The vision is to use the same GEF data structure in BSS. +Before the development of GEF, the only product and UI available was BSS. While the GEF and BSS products have similar functionalities, their designs are quite different. GEF boasts a more modern design compared to the older design of the BSS UI. -### Summary +The vision is that once GEF is completed, its design can be reused in BSS. This would help bring both products in line with a consistent and modern design. -The GEF UI, API and data structure should be used for other products in order to: +### Data 📊 -- Deliver a nice, modern user experience -- Be consistent -- Reduce data mapping needs in other systems +While GEF and BSS have similar functionalities in terms of what is submitted, their data structures differ significantly. GEF has a simpler and more streamlined data structure, while BSS has a more complex structure. The complexity of the BSS data structure is partly due to the older design and initial lack of understanding. -This could also help the directory structure which can be confusing. +The vision is to unify the data structure and use the same structure as GEF in BSS. This would not only simplify data handling but also reduce the need for extensive data mapping in other systems. -Currently for BSS: +### Summary 📝 -1. User login (/portal) -2. Select product BSS (/portal) -3. Product pages served (/portal) +To summarize, the GEF UI, API, and data structure should be leveraged for other products to achieve the following goals: -Currently for GEF: +- Provide a modern and consistent user experience. +- Ensure consistency between products. +- Reduce the complexity of data mapping in other systems. -1. User login (/portal) -2. Select product GEF (/portal) -3. Product pages served (/gef-ui) +Additionally, it may be beneficial to separate BSS from the Portal, where the Portal's sole purpose would be to handle user login and product selection. This would result in the following simplified flow: -BSS could be seperated from Portal and the Portal UI's only purpose is to login and select a product. I.e: +1. User logs in (/portal). +2. User selects either BSS or GEF (/portal). +3. Product-specific pages are served (/bss-ui or /gef-ui). -1. User login (/portal) -2. Select product BSS or GEF (/portal) -3. Product pages served (/bss-ui or /gef-ui) \ No newline at end of file +--- \ No newline at end of file diff --git a/gef-ui/package-lock.json b/gef-ui/package-lock.json index 3b567a2da0..b8ffaaf26b 100644 --- a/gef-ui/package-lock.json +++ b/gef-ui/package-lock.json @@ -26,7 +26,7 @@ "dotenv": "16.0.3", "express": "^4.18.2", "express-fileupload": "^1.4.0", - "express-rate-limit": "^6.11.0", + "express-rate-limit": "^6.11.2", "express-session": "1.17.3", "filesize": "9.0.11", "form-data": "4.0.0", @@ -57,12 +57,12 @@ "babel-jest": "29.5.0", "babel-loader": "9.1.2", "css-minimizer-webpack-plugin": "^5.0.1", - "eslint": "^8.48.0", + "eslint": "^8.49.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.28.1", "file-loader": "^6.2.0", "jest": "29.5.0", - "jest-environment-jsdom": "^29.6.4", + "jest-environment-jsdom": "^29.7.0", "rimraf": "^5.0.1", "sass": "^1.66.1", "sass-loader": "13.2.2", @@ -323,9 +323,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.15.tgz", - "integrity": "sha512-l1UiX4UyHSFsYt17iQ3Se5pQQZZHa22zyIXURmvkmLCD4t/aU+dvNWHatKac/D9Vm9UES7nvIqHs4jZqKviUmQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.17.tgz", + "integrity": "sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", @@ -363,14 +363,14 @@ } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz", - "integrity": "sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.17.tgz", + "integrity": "sha512-bxH77R5gjH3Nkde6/LuncQoLaP16THYPscurp1S8z7S9ZgezCyV3G8Hc+TZiCmY8pz4fp8CvKSgtJMW0FkLAxA==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-wrap-function": "^7.22.9" + "@babel/helper-wrap-function": "^7.22.17" }, "engines": { "node": ">=6.9.0" @@ -460,14 +460,14 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.10.tgz", - "integrity": "sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.17.tgz", + "integrity": "sha512-nAhoheCMlrqU41tAojw9GpVEKDlTS8r3lzFmF0lP52LwblCPbuFSO7nGIZoIcoU5NIm1ABrna0cJExE4Ay6l2Q==", "dev": true, "dependencies": { "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.10" + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.17" }, "engines": { "node": ">=6.9.0" @@ -1737,9 +1737,9 @@ } }, "node_modules/@babel/traverse": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.15.tgz", - "integrity": "sha512-DdHPwvJY0sEeN4xJU5uRLmZjgMMDIvMPniLuYzUVXj/GGzysPl0/fwt44JBkyUIzGJPV8QgHMcQdQ34XFuKTYQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.17.tgz", + "integrity": "sha512-xK4Uwm0JnAMvxYZxOVecss85WxTEIbTa7bnGyf/+EgCL5Zt3U7htUpEOWv9detPlamGKuRzCqw74xVglDWpPdg==", "dev": true, "dependencies": { "@babel/code-frame": "^7.22.13", @@ -1748,8 +1748,8 @@ "@babel/helper-function-name": "^7.22.5", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/types": "^7.22.17", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1758,9 +1758,9 @@ } }, "node_modules/@babel/types": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.15.tgz", - "integrity": "sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.17.tgz", + "integrity": "sha512-YSQPHLFtQNE5xN9tHuZnzu8vPr61wVTBZdfv1meex1NBosa4iT05k/Jw06ddJugi4bk7The/oSwQGFcksmEJQg==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", @@ -1802,9 +1802,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", - "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", + "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -1901,9 +1901,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", - "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", + "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2077,16 +2077,16 @@ } }, "node_modules/@jest/console": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.4.tgz", - "integrity": "sha512-wNK6gC0Ha9QeEPSkeJedQuTQqxZYnDPuDcDhVuVatRvMkL4D0VTvFVZj+Yuh6caG2aOfzkUZ36KtCmLNtR02hw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -2164,15 +2164,15 @@ } }, "node_modules/@jest/core": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.4.tgz", - "integrity": "sha512-U/vq5ccNTSVgYH7mHnodHmCffGWHJnz/E1BEWlLuK5pM4FZmGfBn/nrJGLjUsSmyx3otCeqc1T31F4y08AMDLg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, "dependencies": { - "@jest/console": "^29.6.4", - "@jest/reporters": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -2180,21 +2180,21 @@ "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.6.3", - "jest-config": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-resolve-dependencies": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "jest-watcher": "^29.6.4", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -2281,37 +2281,37 @@ } }, "node_modules/@jest/environment": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.4.tgz", - "integrity": "sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "dependencies": { - "@jest/fake-timers": "^29.6.4", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.3" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.4.tgz", - "integrity": "sha512-Warhsa7d23+3X5bLbrbYvaehcgX5TLYhI03JKoedTiI8uJU4IhqYBWF7OSSgUyz4IgLpUYPkK0AehA5/fRclAA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, "dependencies": { - "expect": "^29.6.4", - "jest-snapshot": "^29.6.4" + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.4.tgz", - "integrity": "sha512-FEhkJhqtvBwgSpiTrocquJCdXPsyvNKcl/n7A3u7X4pVoF4bswm11c9d4AV+kfq2Gpv/mM8x7E7DsRvH+djkrg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, "dependencies": { "jest-get-type": "^29.6.3" @@ -2321,47 +2321,47 @@ } }, "node_modules/@jest/fake-timers": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.4.tgz", - "integrity": "sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.4.tgz", - "integrity": "sha512-wVIn5bdtjlChhXAzVXavcY/3PEjf4VqM174BM3eGL5kMxLiZD5CLnbmkEyA1Dwh9q8XjP6E8RwjBsY/iCWrWsA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", "@jest/types": "^29.6.3", - "jest-mock": "^29.6.3" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.4.tgz", - "integrity": "sha512-sxUjWxm7QdchdrD3NfWKrL8FBsortZeibSJv4XLjESOOjSUOkjQcb0ZHJwfhEGIvBvTluTzfG2yZWZhkrXJu8g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", @@ -2375,9 +2375,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -2541,12 +2541,12 @@ } }, "node_modules/@jest/test-result": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.4.tgz", - "integrity": "sha512-uQ1C0AUEN90/dsyEirgMLlouROgSY+Wc/JanVVk0OiUKa5UFh7sJpMEM3aoUBAz2BRNvUJ8j3d294WFuRxSyOQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, "dependencies": { - "@jest/console": "^29.6.4", + "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" @@ -2556,14 +2556,14 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.4.tgz", - "integrity": "sha512-E84M6LbpcRq3fT4ckfKs9ryVanwkaIB0Ws9bw3/yP4seRLg/VaCZ/LgW0MCq5wwk4/iP/qnilD41aj2fsw2RMg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, "dependencies": { - "@jest/test-result": "^29.6.4", + "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -2571,9 +2571,9 @@ } }, "node_modules/@jest/transform": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz", - "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -2584,9 +2584,9 @@ "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -3071,9 +3071,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.5.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.9.tgz", - "integrity": "sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==", + "version": "20.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.0.tgz", + "integrity": "sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==", "dev": true }, "node_modules/@types/stack-utils": { @@ -3083,9 +3083,9 @@ "dev": true }, "node_modules/@types/tough-cookie": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", - "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.3.tgz", + "integrity": "sha512-THo502dA5PzG/sfQH+42Lw3fvmYkceefOspdCwpHRul8ik2Jv1K8I5OZz1AT3/rs46kwgMCe9bSBmDLYkkOMGg==", "dev": true }, "node_modules/@types/yargs": { @@ -4072,9 +4072,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001529", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001529.tgz", - "integrity": "sha512-n2pUQYGAkrLG4QYj2desAh+NqsJpHbNmVZz87imptDdxLAtjxary7Df/psdfyDGmskJK/9Dt9cPnx5RZ3CU4Og==", + "version": "1.0.30001534", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001534.tgz", + "integrity": "sha512-vlPVrhsCS7XaSh2VvWluIQEzVhefrUQcEsQWSS5A5V+dM07uv1qHeQzAOTGIMy9i3e9bH15+muvI/UHojVgS/Q==", "dev": true, "funding": [ { @@ -4539,6 +4539,97 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/create-jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/create-jest/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/create-jest/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/create-jest/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/create-jest/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -4952,12 +5043,27 @@ "node": ">=0.10.0" } }, + "node_modules/define-data-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.0.1.tgz", + "integrity": "sha512-22M+6zEspQHx10bfFQl2ET39IvfuQ7+rZIH7+ard8fCC4hPmkOSy+8JhKxBRLaWUziJ0O63NTYT97LR8zUfPTw==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -5124,9 +5230,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.512", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.512.tgz", - "integrity": "sha512-1W8wRbYlQE4ph7eoj3TJ+uqwO6+xvAE/L+KGU7WTQQvX3tnSIGZAb90MTsMoJqzntamiwJhBAj4WZmygXhsOUg==", + "version": "1.4.519", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.519.tgz", + "integrity": "sha512-kqs9oGYL4UFVkLKhqCTgBCYZv+wZ374yABDMqlDda9HvlkQxvSr7kgf4hfWVjMieDbX+1MwPHFBsOGCMIBaFKg==", "dev": true }, "node_modules/emittery": { @@ -5263,9 +5369,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", - "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz", + "integrity": "sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==", "dev": true }, "node_modules/es-set-tostringtag": { @@ -5353,16 +5459,16 @@ } }, "node_modules/eslint": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", - "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", + "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.48.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint/js": "8.49.0", + "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", @@ -5868,16 +5974,16 @@ } }, "node_modules/expect": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.4.tgz", - "integrity": "sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, "dependencies": { - "@jest/expect-utils": "^29.6.4", + "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3" + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -5936,9 +6042,9 @@ } }, "node_modules/express-rate-limit": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.0.tgz", - "integrity": "sha512-H9afltGTaEZcvenAB5LFgb/ysTMHUzMxoB3TJM6UHP5FtAP1p2+heMj1xwTei54Zm4I9I/2qsS5m+XrdKQp/Hw==", + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.2.tgz", + "integrity": "sha512-a7uwwfNTh1U60ssiIkuLFWHt4hAC5yxlLGU2VP0X4YNlyEDZAqF4tK3GD3NSitVBrCQmQ0++0uOyFOgC2y4DDw==", "engines": { "node": ">= 14" }, @@ -7404,13 +7510,13 @@ } }, "node_modules/jest-changed-files": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.6.3.tgz", - "integrity": "sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, "dependencies": { "execa": "^5.0.0", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "p-limit": "^3.1.0" }, "engines": { @@ -7418,28 +7524,28 @@ } }, "node_modules/jest-circus": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.4.tgz", - "integrity": "sha512-YXNrRyntVUgDfZbjXWBMPslX1mQ8MrSG0oM/Y06j9EYubODIyHWP8hMUbjbZ19M3M+zamqEur7O80HODwACoJw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", - "@jest/test-result": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "p-limit": "^3.1.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" @@ -7519,22 +7625,21 @@ } }, "node_modules/jest-cli": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.4.tgz", - "integrity": "sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, "dependencies": { - "@jest/core": "^29.6.4", - "@jest/test-result": "^29.6.4", + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "chalk": "^4.0.0", + "create-jest": "^29.7.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "prompts": "^2.0.1", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "yargs": "^17.3.1" }, "bin": { @@ -7623,31 +7728,31 @@ } }, "node_modules/jest-config": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.4.tgz", - "integrity": "sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.6.4", + "@jest/test-sequencer": "^29.7.0", "@jest/types": "^29.6.3", - "babel-jest": "^29.6.4", + "babel-jest": "^29.7.0", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.6.4", - "jest-environment-node": "^29.6.4", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", "jest-get-type": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -7683,12 +7788,12 @@ } }, "node_modules/jest-config/node_modules/babel-jest": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.4.tgz", - "integrity": "sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "dependencies": { - "@jest/transform": "^29.6.4", + "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", @@ -7759,15 +7864,15 @@ } }, "node_modules/jest-diff": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.4.tgz", - "integrity": "sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -7844,9 +7949,9 @@ } }, "node_modules/jest-docblock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.6.3.tgz", - "integrity": "sha512-2+H+GOTQBEm2+qFSQ7Ma+BvyV+waiIFxmZF5LdpBsAEjWX8QYjSCa4FrkIYtbfXUJJJnFCYrOtt6TZ+IAiTjBQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, "dependencies": { "detect-newline": "^3.0.0" @@ -7856,16 +7961,16 @@ } }, "node_modules/jest-each": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.3.tgz", - "integrity": "sha512-KoXfJ42k8cqbkfshW7sSHcdfnv5agDdHCPA87ZBdmHP+zJstTJc0ttQaJ/x7zK6noAL76hOuTIJ6ZkQRS5dcyg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", - "jest-util": "^29.6.3", - "pretty-format": "^29.6.3" + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -7942,18 +8047,18 @@ } }, "node_modules/jest-environment-jsdom": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.6.4.tgz", - "integrity": "sha512-K6wfgUJ16DoMs02JYFid9lOsqfpoVtyJxpRlnTxUHzvZWBnnh2VNGRB9EC1Cro96TQdq5TtSjb3qUjNaJP9IyA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", + "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/jsdom": "^20.0.0", "@types/node": "*", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0", "jsdom": "^20.0.0" }, "engines": { @@ -7969,17 +8074,17 @@ } }, "node_modules/jest-environment-node": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.4.tgz", - "integrity": "sha512-i7SbpH2dEIFGNmxGCpSc2w9cA4qVD+wfvg2ZnfQ7XVrKL0NA5uDVBIiGH8SR4F0dKEv/0qI5r+aDomDf04DpEQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -7995,9 +8100,9 @@ } }, "node_modules/jest-haste-map": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz", - "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -8007,8 +8112,8 @@ "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -8020,28 +8125,28 @@ } }, "node_modules/jest-leak-detector": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.3.tgz", - "integrity": "sha512-0kfbESIHXYdhAdpLsW7xdwmYhLf1BRu4AA118/OxFm0Ho1b2RcTmO4oF6aAMaxpxdxnJ3zve2rgwzNBD4Zbm7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, "dependencies": { "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.4.tgz", - "integrity": "sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.6.4", + "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -8118,9 +8223,9 @@ } }, "node_modules/jest-message-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.3.tgz", - "integrity": "sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", @@ -8129,7 +8234,7 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -8208,14 +8313,14 @@ } }, "node_modules/jest-mock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.3.tgz", - "integrity": "sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", - "jest-util": "^29.6.3" + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -8248,17 +8353,17 @@ } }, "node_modules/jest-resolve": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.4.tgz", - "integrity": "sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" @@ -8268,13 +8373,13 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.4.tgz", - "integrity": "sha512-7+6eAmr1ZBF3vOAJVsfLj1QdqeXG+WYhidfLHBRZqGN24MFRIiKG20ItpLw2qRAsW/D2ZUUmCNf6irUr/v6KHA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, "dependencies": { "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.6.4" + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -8351,30 +8456,30 @@ } }, "node_modules/jest-runner": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.4.tgz", - "integrity": "sha512-SDaLrMmtVlQYDuG0iSPYLycG8P9jLI+fRm8AF/xPKhYDB2g6xDWjXBrR5M8gEWsK6KVFlebpZ4QsrxdyIX1Jaw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, "dependencies": { - "@jest/console": "^29.6.4", - "@jest/environment": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.6.3", - "jest-environment-node": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-leak-detector": "^29.6.3", - "jest-message-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-util": "^29.6.3", - "jest-watcher": "^29.6.4", - "jest-worker": "^29.6.4", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -8453,17 +8558,17 @@ } }, "node_modules/jest-runtime": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.4.tgz", - "integrity": "sha512-s/QxMBLvmwLdchKEjcLfwzP7h+jsHvNEtxGP5P+Fl1FMaJX2jMiIqe4rJw4tFprzCwuSvVUo9bn0uj4gNRXsbA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", - "@jest/globals": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", @@ -8471,13 +8576,13 @@ "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -8556,9 +8661,9 @@ } }, "node_modules/jest-snapshot": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.4.tgz", - "integrity": "sha512-VC1N8ED7+4uboUKGIDsbvNAZb6LakgIPgAF4RSpF13dN6YaMokfRqO+BaqK4zIh6X3JffgwbzuGqDEjHm/MrvA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -8566,20 +8671,20 @@ "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.6.4", + "expect": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-diff": "^29.6.4", + "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "natural-compare": "^1.4.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "semver": "^7.5.3" }, "engines": { @@ -8690,9 +8795,9 @@ "dev": true }, "node_modules/jest-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", - "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -8777,9 +8882,9 @@ } }, "node_modules/jest-validate": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz", - "integrity": "sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -8787,7 +8892,7 @@ "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -8876,18 +8981,18 @@ } }, "node_modules/jest-watcher": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.4.tgz", - "integrity": "sha512-oqUWvx6+On04ShsT00Ir9T4/FvBeEh2M9PTubgITPxDa739p4hoQweWPRGyYeaojgT0xTpZKF0Y/rSY1UgMxvQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, "dependencies": { - "@jest/test-result": "^29.6.4", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "string-length": "^4.0.1" }, "engines": { @@ -8965,13 +9070,13 @@ } }, "node_modules/jest-worker": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", - "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -10599,9 +10704,9 @@ } }, "node_modules/pretty-format": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", - "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", @@ -10907,14 +11012,14 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "set-function-name": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -11364,6 +11469,19 @@ "node": ">= 0.8.0" } }, + "node_modules/set-function-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.0.tgz", + "integrity": "sha512-WmS8UHojv5s1eSoRSmzO5zzgDq8PE1/X/ij0k+9fMYmINCc6+j+SF3Om8YyucKn2yjnK4ItNZOoQycNnHsZJTw==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -12934,9 +13052,9 @@ } }, "node_modules/ws": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.0.tgz", - "integrity": "sha512-WR0RJE9Ehsio6U4TuM+LmunEsjQ5ncHlw4sn9ihD6RoJKZrVyH9FWV3dmnwu8B2aNib1OvG2X6adUCyFpQyWcg==", + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.1.tgz", + "integrity": "sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A==", "dev": true, "engines": { "node": ">=10.0.0" diff --git a/gef-ui/package.json b/gef-ui/package.json index 55d3026f1f..122a7bfbdf 100644 --- a/gef-ui/package.json +++ b/gef-ui/package.json @@ -56,7 +56,7 @@ "dotenv": "16.0.3", "express": "^4.18.2", "express-fileupload": "^1.4.0", - "express-rate-limit": "^6.11.0", + "express-rate-limit": "^6.11.2", "express-session": "1.17.3", "filesize": "9.0.11", "form-data": "4.0.0", @@ -87,12 +87,12 @@ "babel-jest": "29.5.0", "babel-loader": "9.1.2", "css-minimizer-webpack-plugin": "^5.0.1", - "eslint": "^8.48.0", + "eslint": "^8.49.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.28.1", "file-loader": "^6.2.0", "jest": "29.5.0", - "jest-environment-jsdom": "^29.6.4", + "jest-environment-jsdom": "^29.7.0", "rimraf": "^5.0.1", "sass": "^1.66.1", "sass-loader": "13.2.2", diff --git a/package-lock.json b/package-lock.json index fad2e102ba..1ec2b973d3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,14 +18,14 @@ "date-fns": "^2.30.0", "dotenv": "^16.3.1", "moment": "^2.29.4", - "npm-check-updates": "^16.13.3" + "npm-check-updates": "^16.14.0" }, "devDependencies": { "@commitlint/cli": "^17.7.1", "@commitlint/config-conventional": "^17.7.0", "@typescript-eslint/eslint-plugin": "^5.62.0", "cspell": "^6.31.3", - "eslint": "^8.48.0", + "eslint": "^8.49.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-cypress": "^2.14.0", "eslint-plugin-import": "^2.28.1", @@ -607,15 +607,15 @@ "dev": true }, "node_modules/@cspell/dict-companies": { - "version": "3.0.21", - "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.0.21.tgz", - "integrity": "sha512-u9b7qtCWYS728WqiJeAucJcjRs16Y1yGGwagS/w59SV25R0rXbXbPbQuX8wYDcaeIO8uRHGkbSWngx6O4qFoCQ==", + "version": "3.0.22", + "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.0.22.tgz", + "integrity": "sha512-hUN4polifWv1IIXb4NDNXctr/smJ7/1IrOy0rU6fOwPCY/u9DkQO+xeASzuFJasvs6v0Pub/y+NUQLaeXNRW6g==", "dev": true }, "node_modules/@cspell/dict-cpp": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-5.0.4.tgz", - "integrity": "sha512-Vmz/CCb2d91ES5juaO8+CFWeTa2AFsbpR8bkCPJq+P8cRP16+37tY0zNXEBSK/1ur4MakaRf76jeQBijpZxw0Q==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-5.0.5.tgz", + "integrity": "sha512-ojCpQ4z+sHHLJYfvA3SApqQ1BjO/k3TUdDgqR3sVhFl5qjT9yz1/srBNzqCaBBSz/fiO5A8NKdSA9+IFrUHcig==", "dev": true }, "node_modules/@cspell/dict-cryptocurrencies": { @@ -775,9 +775,9 @@ "dev": true }, "node_modules/@cspell/dict-node": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-node/-/dict-node-4.0.2.tgz", - "integrity": "sha512-FEQJ4TnMcXEFslqBQkXa5HposMoCGsiBv2ux4IZuIXgadXeHKHUHk60iarWpjhzNzQLyN2GD7NoRMd12bK3Llw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-node/-/dict-node-4.0.3.tgz", + "integrity": "sha512-sFlUNI5kOogy49KtPg8SMQYirDGIAoKBO3+cDLIwD4MLdsWy1q0upc7pzGht3mrjuyMiPRUV14Bb0rkVLrxOhg==", "dev": true }, "node_modules/@cspell/dict-npm": { @@ -805,9 +805,9 @@ "dev": true }, "node_modules/@cspell/dict-python": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.1.7.tgz", - "integrity": "sha512-8GkO7/w1QEpu4Y1GTHGYHrwfc/ZdiBRw7D/BGYCIiOoQPLi0YxMke7wzRC3j246yrzLt28ntDBjr4fB3+uFZtQ==", + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.1.8.tgz", + "integrity": "sha512-yFrO9gGI3KIbw0Y1odAEtagrzmthjJVank9B7qlsSQvN78RgD1JQQycTadNWpzdjCj+JuiiH8pJBFWflweZoxw==", "dev": true, "dependencies": { "@cspell/dict-data-science": "^1.0.11" @@ -838,9 +838,9 @@ "dev": true }, "node_modules/@cspell/dict-software-terms": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-3.2.2.tgz", - "integrity": "sha512-DmdS/qAyJVmKKku4ab89HVZhsvRIk84HoPUVIZ/zJhmuCO+LF45Ylzy1/7G32MYLjbG/o1Ze3UvbaE9HY4FKKA==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-3.2.3.tgz", + "integrity": "sha512-L1Fjkt+Q5MnjEOGPXQxdT4+8ieDBcaHSjh1gHzxdqFXTOnnfvsLUa5ykuv/fG06b/G/yget1066ftKosMaPcXA==", "dev": true }, "node_modules/@cspell/dict-sql": { @@ -967,9 +967,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", - "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", + "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -1021,9 +1021,9 @@ "dev": true }, "node_modules/@eslint/js": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", - "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", + "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2835,9 +2835,9 @@ "dev": true }, "node_modules/cosmiconfig": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.4.tgz", - "integrity": "sha512-SF+2P8+o/PTV05rgsAjDzL4OFdVXAulSfC/L19VaeVT7+tpOOSscCt2QLxDZ+CLxF2WOiq6y1K5asvs8qUJT/Q==", + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.5.tgz", + "integrity": "sha512-A5Xry3xfS96wy2qbiLkQLAg4JUrR2wvfybxj6yqLmrUfMAvhS3MZxIP2oQn0grgYIvJqzpeTEWu4vK0t+12NNw==", "dev": true, "dependencies": { "import-fresh": "^3.3.0", @@ -3163,9 +3163,9 @@ } }, "node_modules/cypress/node_modules/@types/node": { - "version": "16.18.48", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.48.tgz", - "integrity": "sha512-mlaecDKQ7rIZrYD7iiKNdzFb6e/qD5I9U1rAhq+Fd+DWvYVs+G2kv74UFHmSOlg5+i/vF3XxuR522V4u8BqO+Q==" + "version": "16.18.50", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.50.tgz", + "integrity": "sha512-OiDU5xRgYTJ203v4cprTs0RwOCd5c5Zjv+K5P8KSqfiCsB1W3LcamTUMcnQarpq5kOYbhHfSOgIEJvdPyb5xyw==" }, "node_modules/cypress/node_modules/commander": { "version": "6.2.1", @@ -3384,12 +3384,27 @@ "node": ">=10" } }, + "node_modules/define-data-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.0.1.tgz", + "integrity": "sha512-22M+6zEspQHx10bfFQl2ET39IvfuQ7+rZIH7+ard8fCC4hPmkOSy+8JhKxBRLaWUziJ0O63NTYT97LR8zUfPTw==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -3685,16 +3700,16 @@ } }, "node_modules/eslint": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", - "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", + "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.48.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint/js": "8.49.0", + "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", @@ -6865,9 +6880,9 @@ } }, "node_modules/npm-check-updates": { - "version": "16.13.3", - "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.13.3.tgz", - "integrity": "sha512-l3FQtm+ZtDwqtK2r27vCuNdtnoDsXzk8D2WczvrAJy2bGPZJvRmuUa/Q9Gv+AbZV0IHSNJD2oHtQqUeqQRhEsw==", + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.14.0.tgz", + "integrity": "sha512-0R4S0qsx2FhuSiIYloHc7RQwfZpzO4jdL3rUoYwbOkx5fBc9u77GHHS0FlXYpczHR/kPYmmB/CRkFElOofVeSg==", "dependencies": { "chalk": "^5.3.0", "cli-table3": "^0.6.3", @@ -6897,6 +6912,7 @@ "semver-utils": "^1.1.4", "source-map-support": "^0.5.21", "spawn-please": "^2.0.1", + "strip-ansi": "^7.1.0", "strip-json-comments": "^5.0.1", "untildify": "^4.0.0", "update-notifier": "^6.0.2" @@ -6909,6 +6925,17 @@ "node": ">=14.14" } }, + "node_modules/npm-check-updates/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, "node_modules/npm-check-updates/node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -6986,6 +7013,20 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/npm-check-updates/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/npm-check-updates/node_modules/strip-json-comments": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.1.tgz", @@ -7965,14 +8006,14 @@ "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" }, "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "set-function-name": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -8319,6 +8360,19 @@ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, + "node_modules/set-function-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.0.tgz", + "integrity": "sha512-WmS8UHojv5s1eSoRSmzO5zzgDq8PE1/X/ij0k+9fMYmINCc6+j+SF3Om8YyucKn2yjnK4ItNZOoQycNnHsZJTw==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", diff --git a/package.json b/package.json index 4e998278d4..ed4157eb33 100644 --- a/package.json +++ b/package.json @@ -41,14 +41,14 @@ "date-fns": "^2.30.0", "dotenv": "^16.3.1", "moment": "^2.29.4", - "npm-check-updates": "^16.13.3" + "npm-check-updates": "^16.14.0" }, "devDependencies": { "@commitlint/cli": "^17.7.1", "@commitlint/config-conventional": "^17.7.0", "@typescript-eslint/eslint-plugin": "^5.62.0", "cspell": "^6.31.3", - "eslint": "^8.48.0", + "eslint": "^8.49.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-cypress": "^2.14.0", "eslint-plugin-import": "^2.28.1", diff --git a/portal-api/.eslintrc.js b/portal-api/.eslintrc.js index fc21923a4d..3dc3d9042c 100644 --- a/portal-api/.eslintrc.js +++ b/portal-api/.eslintrc.js @@ -13,10 +13,7 @@ module.exports = { ignoreStrings: true, ignoreTemplateLiterals: true, }], - 'import/no-unresolved': [ - 2, - { caseSensitive: false } - ], + 'import/no-unresolved': 'error', 'no-console': ['error', { allow: ['info', 'error'] }], 'no-underscore-dangle': ['error', { allow: ['_id', '_csrf'] }], 'import/no-named-as-default': 'off', diff --git a/portal-api/README.md b/portal-api/README.md index f87bf5993a..fee33475d9 100644 --- a/portal-api/README.md +++ b/portal-api/README.md @@ -1,69 +1,66 @@ -# portal-api +# portal-api 🏛️ -This API is used for the Portal UIs - BSS and GEF. +The **portal-api** is a crucial component of the Portal UIs, serving both BSS and GEF. -- BSS endpoints are in /src/v1 -- GEF endpoints are in /src/v1/gef +- BSS endpoints are located in `/src/v1`. +- GEF endpoints are found in `/src/v1/gef`. -It is also responsible for sending a deal to TFM (Trade Finance Manager). It simply calls a TFM endpoint on deal submission. +Additionally, it's responsible for sending deals to TFM (Trade Finance Manager) by making a call to a TFM endpoint upon deal submission. -## Prerequisite +## Prerequisite 🧩 -Make sure you have an `.env`. Use `.env.sample` as a base. Some sensitive variables need to be shared from the team. +Ensure you have an `.env` file configured. You can use `.env.sample` as a base. Some sensitive variables must be shared within the team. -## Running locally +## Running Locally 🏃‍♂️ ```shell docker-compose up ``` -Alternatively, every service can be started from the root directory (`docker-compose up`). +Alternatively, you can start all services from the root directory using `docker-compose up`. -## Testing +## Testing 🧪 -In a second terminal, run: +In a separate terminal, execute: ```shell npm run api-test ``` -Test coverage will be generated. +This will generate test coverage. -### **Run a single API test** +### **Run a Single API Test** + +To run a single API test, use: ```shell npm run api-test "**/*/deals-party-db.api-test.js" ``` -## The current shape of the API - -BSS was the first API developed. It was built to work for the (current), old BSS UI design. The UI/UX of the product was not fully understood until the project was roughly two thirds completed. - -Because of this, and the confusing UI/UX, a lot of the UI dictated how the API should work and what data needs to be stored. - -Further down the line, GEF was built with a new, clean, simpler UI/UX. This, coupled with the lessons we learnt from BSS (in terms of business logic), resulted in a much cleaner GEF API. +## The Current Shape of the API 📐 -There is additional information about the BSS/GEF differences in the portal/gef-ui READMEs. +Initially, the API was developed for BSS, designed to work with the old BSS UI. The UI/UX was not fully understood until around two-thirds of the project was completed. Consequently, much of the API's structure was influenced by the UI, and data requirements were based on this. -## Moving forwards - aligning GEF and BSS +Subsequently, the GEF API was created with a cleaner, simpler UI/UX. Lessons learned from the BSS project, especially in terms of business logic, resulted in a more streamlined GEF API. -BSS and GEF are now misaligned - GEF is cleaner, BSS is effectively becoming legacy. The vision is to use GEF for a new, cleaner BSS. +There are further details about the differences between BSS and GEF in the portal/gef-ui READMEs. -Therefore there should be no work for portal-api for BSS. Only the GEF endpoints are actively being worked on. +## Moving Forward - Aligning GEF and BSS 🚀 -The vision is to use the same GEF data structure in BSS. They are very similar products with some differences. +BSS and GEF are currently misaligned, with GEF being cleaner and BSS gradually becoming legacy. The vision is to utilize the GEF structure for a new, cleaner BSS. -The GEF UI, API and data structure should be used for other products in order to: +Therefore, there should be minimal work for portal-api regarding BSS. Active development efforts are focused primarily on the GEF endpoints. -- Deliver a nice, modern user experience -- Be consistent -- Reduce data mapping needs in other systems +The long-term goal is to use the same GEF data structure in BSS, as these products share many similarities. Using the GEF UI, API, and data structure as a foundation for other products offers several advantages: -This has not been thought about as a team. Maybe BSS and GEF could use exactly the same endpoints, but have some flags for any product differences? Maybe they should be separated? What's the best, most scalable approach? +- Delivering a modern user experience. +- Maintaining consistency. +- Reducing data mapping complexities in other systems. -Over time the differences between this and central API have become murkier. It is worth considering +The team should collectively consider how BSS and GEF should align. Perhaps both BSS and GEF could share the same endpoints with flags to accommodate product-specific differences. Alternatively, they could remain separate but with a well-defined strategy for managing the commonalities. -If the team like working with GraphQL, it is worth embracing it and planning to move to a complete schema, this eliminating the need for REST endpoints except for things like healthcheck etc. With other APIs doing the same, it is worth investigating [Apollo Federation](https://www.apollographql.com/docs/federation/) to simplify working with a range of services. +Over time, the distinctions between this and the central API have become less clear. It's worth considering adopting GraphQL more extensively, potentially even transitioning to a full schema. This could eliminate the need for REST endpoints, except for essential services like health checks. If other APIs follow suit, exploring solutions like [Apollo Federation](https://www.apollographql.com/docs/federation/) may simplify the management of a diverse set of services. -There is area for the GraphQL Schema to be simplified. Possible options are making use of GraphQL files, or by modularising the Schema currently in use. +Simplifying the GraphQL schema is also worth exploring. Options include making use of GraphQL files or modularizing the existing schema for better organization and maintainability. 🧩🚀 +--- \ No newline at end of file diff --git a/portal-api/package-lock.json b/portal-api/package-lock.json index 147e2626cd..95e3f07d5b 100644 --- a/portal-api/package-lock.json +++ b/portal-api/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@azure/storage-file-share": "12.14.0", "axios": "^1.5.0", - "axios-mock-adapter": "^1.21.5", + "axios-mock-adapter": "^1.22.0", "comma-number": "^2.1.0", "compression": "^1.7.4", "cors": "2.8.5", @@ -19,7 +19,7 @@ "dotenv": "16.0.3", "express": "4.18.2", "express-mongo-sanitize": "^2.2.0", - "express-rate-limit": "^6.11.0", + "express-rate-limit": "^6.11.2", "filesize": "^8.0.7", "joi": "^17.10.1", "jsonwebtoken": "^9.0.2", @@ -37,10 +37,10 @@ "xss": "^1.0.14" }, "devDependencies": { - "eslint": "^8.48.0", + "eslint": "^8.49.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.28.1", - "jest": "^29.6.4", + "jest": "^29.7.0", "jest-when": "^3.6.0", "prettier": "^2.8.8", "supertest": "6.3.3" @@ -277,21 +277,21 @@ } }, "node_modules/@babel/core": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.15.tgz", - "integrity": "sha512-PtZqMmgRrvj8ruoEOIwVA3yoF91O+Hgw9o7DAUTNBA6Mo2jpu31clx9a7Nz/9JznqetTR6zwfC4L3LAjKQXUwA==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.17.tgz", + "integrity": "sha512-2EENLmhpwplDux5PSsZnSbnSkB3tZ6QTksgO25xwEL7pIDcNOMhF5v/s6RzwjMZzZzw9Ofc30gHv5ChCC8pifQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.22.13", "@babel/generator": "^7.22.15", "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.22.15", + "@babel/helper-module-transforms": "^7.22.17", "@babel/helpers": "^7.22.15", - "@babel/parser": "^7.22.15", + "@babel/parser": "^7.22.16", "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.15", - "@babel/types": "^7.22.15", + "@babel/traverse": "^7.22.17", + "@babel/types": "^7.22.17", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -413,9 +413,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.15.tgz", - "integrity": "sha512-l1UiX4UyHSFsYt17iQ3Se5pQQZZHa22zyIXURmvkmLCD4t/aU+dvNWHatKac/D9Vm9UES7nvIqHs4jZqKviUmQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.17.tgz", + "integrity": "sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", @@ -805,9 +805,9 @@ } }, "node_modules/@babel/traverse": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.15.tgz", - "integrity": "sha512-DdHPwvJY0sEeN4xJU5uRLmZjgMMDIvMPniLuYzUVXj/GGzysPl0/fwt44JBkyUIzGJPV8QgHMcQdQ34XFuKTYQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.17.tgz", + "integrity": "sha512-xK4Uwm0JnAMvxYZxOVecss85WxTEIbTa7bnGyf/+EgCL5Zt3U7htUpEOWv9detPlamGKuRzCqw74xVglDWpPdg==", "dev": true, "dependencies": { "@babel/code-frame": "^7.22.13", @@ -816,8 +816,8 @@ "@babel/helper-function-name": "^7.22.5", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/types": "^7.22.17", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -858,9 +858,9 @@ "dev": true }, "node_modules/@babel/types": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.15.tgz", - "integrity": "sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.17.tgz", + "integrity": "sha512-YSQPHLFtQNE5xN9tHuZnzu8vPr61wVTBZdfv1meex1NBosa4iT05k/Jw06ddJugi4bk7The/oSwQGFcksmEJQg==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", @@ -893,9 +893,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", - "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", + "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -948,9 +948,9 @@ "dev": true }, "node_modules/@eslint/js": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", - "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", + "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1134,16 +1134,16 @@ } }, "node_modules/@jest/console": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.4.tgz", - "integrity": "sha512-wNK6gC0Ha9QeEPSkeJedQuTQqxZYnDPuDcDhVuVatRvMkL4D0VTvFVZj+Yuh6caG2aOfzkUZ36KtCmLNtR02hw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -1151,15 +1151,15 @@ } }, "node_modules/@jest/core": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.4.tgz", - "integrity": "sha512-U/vq5ccNTSVgYH7mHnodHmCffGWHJnz/E1BEWlLuK5pM4FZmGfBn/nrJGLjUsSmyx3otCeqc1T31F4y08AMDLg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, "dependencies": { - "@jest/console": "^29.6.4", - "@jest/reporters": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -1167,21 +1167,21 @@ "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.6.3", - "jest-config": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-resolve-dependencies": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "jest-watcher": "^29.6.4", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -1198,37 +1198,37 @@ } }, "node_modules/@jest/environment": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.4.tgz", - "integrity": "sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "dependencies": { - "@jest/fake-timers": "^29.6.4", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.3" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.4.tgz", - "integrity": "sha512-Warhsa7d23+3X5bLbrbYvaehcgX5TLYhI03JKoedTiI8uJU4IhqYBWF7OSSgUyz4IgLpUYPkK0AehA5/fRclAA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, "dependencies": { - "expect": "^29.6.4", - "jest-snapshot": "^29.6.4" + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.4.tgz", - "integrity": "sha512-FEhkJhqtvBwgSpiTrocquJCdXPsyvNKcl/n7A3u7X4pVoF4bswm11c9d4AV+kfq2Gpv/mM8x7E7DsRvH+djkrg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, "dependencies": { "jest-get-type": "^29.6.3" @@ -1238,47 +1238,47 @@ } }, "node_modules/@jest/fake-timers": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.4.tgz", - "integrity": "sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.4.tgz", - "integrity": "sha512-wVIn5bdtjlChhXAzVXavcY/3PEjf4VqM174BM3eGL5kMxLiZD5CLnbmkEyA1Dwh9q8XjP6E8RwjBsY/iCWrWsA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", "@jest/types": "^29.6.3", - "jest-mock": "^29.6.3" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.4.tgz", - "integrity": "sha512-sxUjWxm7QdchdrD3NfWKrL8FBsortZeibSJv4XLjESOOjSUOkjQcb0ZHJwfhEGIvBvTluTzfG2yZWZhkrXJu8g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", @@ -1292,9 +1292,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -1339,12 +1339,12 @@ } }, "node_modules/@jest/test-result": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.4.tgz", - "integrity": "sha512-uQ1C0AUEN90/dsyEirgMLlouROgSY+Wc/JanVVk0OiUKa5UFh7sJpMEM3aoUBAz2BRNvUJ8j3d294WFuRxSyOQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, "dependencies": { - "@jest/console": "^29.6.4", + "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" @@ -1354,14 +1354,14 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.4.tgz", - "integrity": "sha512-E84M6LbpcRq3fT4ckfKs9ryVanwkaIB0Ws9bw3/yP4seRLg/VaCZ/LgW0MCq5wwk4/iP/qnilD41aj2fsw2RMg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, "dependencies": { - "@jest/test-result": "^29.6.4", + "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -1369,9 +1369,9 @@ } }, "node_modules/@jest/transform": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz", - "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -1382,9 +1382,9 @@ "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -1495,9 +1495,9 @@ } }, "node_modules/@opentelemetry/api": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.4.1.tgz", - "integrity": "sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.6.0.tgz", + "integrity": "sha512-OWlrQAnWn9577PhVgqjUvMr1pg57Bc4jv0iL4w0PRuOSRvq67rvHW9Ie/dZVMvCzhSCB+UxhcY/PmCmFj33Q+g==", "engines": { "node": ">=8.0.0" } @@ -1625,9 +1625,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.5.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.9.tgz", - "integrity": "sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==" + "version": "20.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.0.tgz", + "integrity": "sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==" }, "node_modules/@types/node-fetch": { "version": "2.6.4", @@ -1969,9 +1969,9 @@ } }, "node_modules/axios-mock-adapter": { - "version": "1.21.5", - "resolved": "https://registry.npmjs.org/axios-mock-adapter/-/axios-mock-adapter-1.21.5.tgz", - "integrity": "sha512-5NI1V/VK+8+JeTF8niqOowuysA4b8mGzdlMN/QnTnoXbYh4HZSNiopsDclN2g/m85+G++IrEtUdZaQ3GnaMsSA==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/axios-mock-adapter/-/axios-mock-adapter-1.22.0.tgz", + "integrity": "sha512-dmI0KbkyAhntUR05YY96qg2H6gg0XMl2+qTW0xmYg6Up+BFBAJYRLROMXRdDEL06/Wqwa0TJThAYvFtSFdRCZw==", "dependencies": { "fast-deep-equal": "^3.1.3", "is-buffer": "^2.0.5" @@ -1981,12 +1981,12 @@ } }, "node_modules/babel-jest": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.4.tgz", - "integrity": "sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "dependencies": { - "@jest/transform": "^29.6.4", + "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", @@ -2305,9 +2305,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001529", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001529.tgz", - "integrity": "sha512-n2pUQYGAkrLG4QYj2desAh+NqsJpHbNmVZz87imptDdxLAtjxary7Df/psdfyDGmskJK/9Dt9cPnx5RZ3CU4Og==", + "version": "1.0.30001534", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001534.tgz", + "integrity": "sha512-vlPVrhsCS7XaSh2VvWluIQEzVhefrUQcEsQWSS5A5V+dM07uv1qHeQzAOTGIMy9i3e9bH15+muvI/UHojVgS/Q==", "dev": true, "funding": [ { @@ -2615,6 +2615,27 @@ "node": ">= 0.10" } }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -2685,12 +2706,27 @@ "node": ">=0.10.0" } }, + "node_modules/define-data-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.0.1.tgz", + "integrity": "sha512-22M+6zEspQHx10bfFQl2ET39IvfuQ7+rZIH7+ard8fCC4hPmkOSy+8JhKxBRLaWUziJ0O63NTYT97LR8zUfPTw==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -2847,9 +2883,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.512", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.512.tgz", - "integrity": "sha512-1W8wRbYlQE4ph7eoj3TJ+uqwO6+xvAE/L+KGU7WTQQvX3tnSIGZAb90MTsMoJqzntamiwJhBAj4WZmygXhsOUg==", + "version": "1.4.519", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.519.tgz", + "integrity": "sha512-kqs9oGYL4UFVkLKhqCTgBCYZv+wZ374yABDMqlDda9HvlkQxvSr7kgf4hfWVjMieDbX+1MwPHFBsOGCMIBaFKg==", "dev": true }, "node_modules/emittery": { @@ -3017,16 +3053,16 @@ } }, "node_modules/eslint": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", - "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", + "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.48.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint/js": "8.49.0", + "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", @@ -3377,16 +3413,16 @@ } }, "node_modules/expect": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.4.tgz", - "integrity": "sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, "dependencies": { - "@jest/expect-utils": "^29.6.4", + "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3" + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -3442,9 +3478,9 @@ } }, "node_modules/express-rate-limit": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.0.tgz", - "integrity": "sha512-H9afltGTaEZcvenAB5LFgb/ysTMHUzMxoB3TJM6UHP5FtAP1p2+heMj1xwTei54Zm4I9I/2qsS5m+XrdKQp/Hw==", + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.2.tgz", + "integrity": "sha512-a7uwwfNTh1U60ssiIkuLFWHt4hAC5yxlLGU2VP0X4YNlyEDZAqF4tK3GD3NSitVBrCQmQ0++0uOyFOgC2y4DDw==", "engines": { "node": ">= 14" }, @@ -4574,15 +4610,15 @@ } }, "node_modules/jest": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.4.tgz", - "integrity": "sha512-tEFhVQFF/bzoYV1YuGyzLPZ6vlPrdfvDmmAxudA1dLEuiztqg2Rkx20vkKY32xiDROcD2KXlgZ7Cu8RPeEHRKw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, "dependencies": { - "@jest/core": "^29.6.4", + "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", "import-local": "^3.0.2", - "jest-cli": "^29.6.4" + "jest-cli": "^29.7.0" }, "bin": { "jest": "bin/jest.js" @@ -4600,13 +4636,13 @@ } }, "node_modules/jest-changed-files": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.6.3.tgz", - "integrity": "sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, "dependencies": { "execa": "^5.0.0", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "p-limit": "^3.1.0" }, "engines": { @@ -4614,28 +4650,28 @@ } }, "node_modules/jest-circus": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.4.tgz", - "integrity": "sha512-YXNrRyntVUgDfZbjXWBMPslX1mQ8MrSG0oM/Y06j9EYubODIyHWP8hMUbjbZ19M3M+zamqEur7O80HODwACoJw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", - "@jest/test-result": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "p-limit": "^3.1.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" @@ -4645,22 +4681,21 @@ } }, "node_modules/jest-cli": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.4.tgz", - "integrity": "sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, "dependencies": { - "@jest/core": "^29.6.4", - "@jest/test-result": "^29.6.4", + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "chalk": "^4.0.0", + "create-jest": "^29.7.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "prompts": "^2.0.1", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "yargs": "^17.3.1" }, "bin": { @@ -4679,31 +4714,31 @@ } }, "node_modules/jest-config": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.4.tgz", - "integrity": "sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.6.4", + "@jest/test-sequencer": "^29.7.0", "@jest/types": "^29.6.3", - "babel-jest": "^29.6.4", + "babel-jest": "^29.7.0", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.6.4", - "jest-environment-node": "^29.6.4", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", "jest-get-type": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -4724,24 +4759,24 @@ } }, "node_modules/jest-diff": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.4.tgz", - "integrity": "sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-docblock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.6.3.tgz", - "integrity": "sha512-2+H+GOTQBEm2+qFSQ7Ma+BvyV+waiIFxmZF5LdpBsAEjWX8QYjSCa4FrkIYtbfXUJJJnFCYrOtt6TZ+IAiTjBQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, "dependencies": { "detect-newline": "^3.0.0" @@ -4751,33 +4786,33 @@ } }, "node_modules/jest-each": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.3.tgz", - "integrity": "sha512-KoXfJ42k8cqbkfshW7sSHcdfnv5agDdHCPA87ZBdmHP+zJstTJc0ttQaJ/x7zK6noAL76hOuTIJ6ZkQRS5dcyg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", - "jest-util": "^29.6.3", - "pretty-format": "^29.6.3" + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-environment-node": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.4.tgz", - "integrity": "sha512-i7SbpH2dEIFGNmxGCpSc2w9cA4qVD+wfvg2ZnfQ7XVrKL0NA5uDVBIiGH8SR4F0dKEv/0qI5r+aDomDf04DpEQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -4793,9 +4828,9 @@ } }, "node_modules/jest-haste-map": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz", - "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -4805,8 +4840,8 @@ "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -4818,37 +4853,37 @@ } }, "node_modules/jest-leak-detector": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.3.tgz", - "integrity": "sha512-0kfbESIHXYdhAdpLsW7xdwmYhLf1BRu4AA118/OxFm0Ho1b2RcTmO4oF6aAMaxpxdxnJ3zve2rgwzNBD4Zbm7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, "dependencies": { "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.4.tgz", - "integrity": "sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.6.4", + "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-message-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.3.tgz", - "integrity": "sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", @@ -4857,7 +4892,7 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -4866,14 +4901,14 @@ } }, "node_modules/jest-mock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.3.tgz", - "integrity": "sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", - "jest-util": "^29.6.3" + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -4906,17 +4941,17 @@ } }, "node_modules/jest-resolve": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.4.tgz", - "integrity": "sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" @@ -4926,43 +4961,43 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.4.tgz", - "integrity": "sha512-7+6eAmr1ZBF3vOAJVsfLj1QdqeXG+WYhidfLHBRZqGN24MFRIiKG20ItpLw2qRAsW/D2ZUUmCNf6irUr/v6KHA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, "dependencies": { "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.6.4" + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.4.tgz", - "integrity": "sha512-SDaLrMmtVlQYDuG0iSPYLycG8P9jLI+fRm8AF/xPKhYDB2g6xDWjXBrR5M8gEWsK6KVFlebpZ4QsrxdyIX1Jaw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, "dependencies": { - "@jest/console": "^29.6.4", - "@jest/environment": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.6.3", - "jest-environment-node": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-leak-detector": "^29.6.3", - "jest-message-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-util": "^29.6.3", - "jest-watcher": "^29.6.4", - "jest-worker": "^29.6.4", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -4971,17 +5006,17 @@ } }, "node_modules/jest-runtime": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.4.tgz", - "integrity": "sha512-s/QxMBLvmwLdchKEjcLfwzP7h+jsHvNEtxGP5P+Fl1FMaJX2jMiIqe4rJw4tFprzCwuSvVUo9bn0uj4gNRXsbA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", - "@jest/globals": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", @@ -4989,13 +5024,13 @@ "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -5004,9 +5039,9 @@ } }, "node_modules/jest-snapshot": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.4.tgz", - "integrity": "sha512-VC1N8ED7+4uboUKGIDsbvNAZb6LakgIPgAF4RSpF13dN6YaMokfRqO+BaqK4zIh6X3JffgwbzuGqDEjHm/MrvA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -5014,20 +5049,20 @@ "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.6.4", + "expect": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-diff": "^29.6.4", + "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "natural-compare": "^1.4.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "semver": "^7.5.3" }, "engines": { @@ -5068,9 +5103,9 @@ "dev": true }, "node_modules/jest-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", - "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -5085,9 +5120,9 @@ } }, "node_modules/jest-validate": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz", - "integrity": "sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -5095,7 +5130,7 @@ "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -5114,18 +5149,18 @@ } }, "node_modules/jest-watcher": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.4.tgz", - "integrity": "sha512-oqUWvx6+On04ShsT00Ir9T4/FvBeEh2M9PTubgITPxDa739p4hoQweWPRGyYeaojgT0xTpZKF0Y/rSY1UgMxvQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, "dependencies": { - "@jest/test-result": "^29.6.4", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "string-length": "^4.0.1" }, "engines": { @@ -5142,13 +5177,13 @@ } }, "node_modules/jest-worker": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", - "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -6361,9 +6396,9 @@ } }, "node_modules/pretty-format": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", - "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", @@ -6559,14 +6594,14 @@ "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" }, "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "set-function-name": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -6817,6 +6852,19 @@ "node": ">= 0.8.0" } }, + "node_modules/set-function-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.0.tgz", + "integrity": "sha512-WmS8UHojv5s1eSoRSmzO5zzgDq8PE1/X/ij0k+9fMYmINCc6+j+SF3Om8YyucKn2yjnK4ItNZOoQycNnHsZJTw==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", diff --git a/portal-api/package.json b/portal-api/package.json index 0720c51f40..88b1329cb9 100644 --- a/portal-api/package.json +++ b/portal-api/package.json @@ -38,7 +38,7 @@ "dependencies": { "@azure/storage-file-share": "12.14.0", "axios": "^1.5.0", - "axios-mock-adapter": "^1.21.5", + "axios-mock-adapter": "^1.22.0", "comma-number": "^2.1.0", "compression": "^1.7.4", "cors": "2.8.5", @@ -46,7 +46,7 @@ "dotenv": "16.0.3", "express": "4.18.2", "express-mongo-sanitize": "^2.2.0", - "express-rate-limit": "^6.11.0", + "express-rate-limit": "^6.11.2", "filesize": "^8.0.7", "joi": "^17.10.1", "jsonwebtoken": "^9.0.2", @@ -64,10 +64,10 @@ "xss": "^1.0.14" }, "devDependencies": { - "eslint": "^8.48.0", + "eslint": "^8.49.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.28.1", - "jest": "^29.6.4", + "jest": "^29.7.0", "jest-when": "^3.6.0", "prettier": "^2.8.8", "supertest": "6.3.3" diff --git a/portal/README.md b/portal/README.md index b828c717db..47949edeee 100644 --- a/portal/README.md +++ b/portal/README.md @@ -1,23 +1,23 @@ -# portal +# portal 🏛️ -UI for BSS/EWCS (Bond Support Scheme, Export Working Capital Scheme). Uses the portal-api to send and receive data. Also handles login. +**portal** is the user interface (UI) for BSS/EWCS (Bond Support Scheme, Export Working Capital Scheme). It relies on the portal-api for sending and receiving data and also handles user authentication. -## Prerequisite +## Prerequisite 🧩 -Make sure you have an `.env`. Use `.env.sample` as a base. Some sensitive variables need to be shared from the team. +Ensure you have an `.env` file set up. You can use `.env.sample` as a starting point. Some sensitive variables must be shared within the team. -## Running locally +## Running Locally 🏃‍♂️ -1. `docker-compose up` -2. Visit http://localhost:5000 in your browser +1. Run `docker-compose up`. +2. Visit http://localhost:5000 in your web browser. -Alternatively, every service can be started from the root directory (`docker-compose up`). +Alternatively, you can start all services from the root directory using `docker-compose up`. -## Login credentials +## Login Credentials 🔐 -See mock users: utils/mock-data-loader/portal/users.js +You can find mock login credentials in the `utils/mock-data-loader/portal/users.js` file. -## Testing +## Testing 🧪 ### **Run a UI test suite** @@ -37,27 +37,27 @@ npm run test /path/to/file.test.js npm run component-test ``` -### **Run a single UI component tests** +### **Run a single UI component test** ```shell npm run component-test ./component-tests/path/to/file.component-test.js ``` -### **End to end tests** +### **End-to-End Tests** -See e2e-tests README.md. +Please refer to the README.md in the `e2e-tests` directory for details on running end-to-end tests. -## Basic happy flow behind the scenes +## Basic Happy Flow Behind the Scenes 🌟 -1. User logs into Portal UI -2. User selects which product to apply for: BSS or GEF -3. Depending on the chosen product, the BSS or GEF UI will be served -4. User completes the deal/application and submits to the bank -5. Bank approves the deal and submits to UKEF. The deal is sent to Trade Finance Manager (TFM) +1. The user logs into the Portal UI. +2. The user selects which product to apply for: BSS or GEF. +3. Depending on the chosen product, the BSS or GEF UI will be served. +4. The user completes the deal/application and submits it to the bank. +5. The bank approves the deal and submits it to UKEF. The deal is then sent to Trade Finance Manager (TFM). -## Moving forwards - aligning Portal, BSS and GEF +## Moving Forward - Aligning Portal, BSS, and GEF 🔀 -### Design +### Design 🎨 Portal (also known as BSS/EWCS) was the first product and UI. @@ -65,38 +65,40 @@ Portal/BSS currently has an old design - the initial approach was to shift the o The vision is that once GEF is completed (with a new design), GEF can be reused in BSS; Bringing both products into a consistent, modern design. -### Data +### Data 📊 The current BSS data structure is not great - this is due to the old design and lack of initial understanding. The vision is to use the same GEF data structure in BSS. -### Summary +### Summary 📝 BSS and GEF products are very similar, but they currently have different designs and approaches. -Portal/BSS should be shifted to use the GEF UI, API and data structure in order to: +Portal/BSS should be shifted to use the GEF UI, API, and data structure in order to: -- Deliver a nice, modern user experience -- Be consistent -- Reduce data mapping needs in other systems +- Deliver a nice, modern user experience. +- Be consistent. +- Reduce data mapping needs in other systems. This could also help the directory structure which can be confusing. Currently for BSS: -1. User login (/portal) -2. Select product BSS (/portal) -3. Product pages served (/portal) +1. User login (/portal). +2. Select product BSS (/portal). +3. Product pages served (/portal). Currently for GEF: -1. User login (/portal) -2. Select product GEF (/portal) -3. Product pages served (/gef-ui) +1. User login (/portal). +2. Select product GEF (/portal). +3. Product pages served (/gef-ui). -BSS could be seperated from Portal and the Portal UI's only purpose is to login and select a product. I.e: +BSS could be separated from Portal, and the Portal UI's only purpose is to login and select a product. i.e., -1. User login (/portal) -2. Select product BSS or GEF (/portal) -3. Product pages served (/bss-ui or /gef-ui) +1. User login (/portal). +2. Select product BSS or GEF (/portal). +3. Product pages served (/bss-ui or /gef-ui). + +--- \ No newline at end of file diff --git a/portal/package-lock.json b/portal/package-lock.json index 0888254583..705ffcd7a1 100644 --- a/portal/package-lock.json +++ b/portal/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@ministryofjustice/frontend": "1.8.0", "axios": "^1.5.0", - "axios-mock-adapter": "^1.21.5", + "axios-mock-adapter": "^1.22.0", "cheerio": "^1.0.0-rc.12", "connect-flash": "0.1.1", "connect-redis": "5.2.0", @@ -20,7 +20,7 @@ "csurf": "^1.11.0", "dotenv": "16.0.3", "express": "^4.18.2", - "express-rate-limit": "^6.11.0", + "express-rate-limit": "^6.11.2", "express-session": "1.17.3", "form-data": "4.0.0", "govuk-frontend": "4.6.0", @@ -48,12 +48,12 @@ "babel-jest": "29.5.0", "babel-loader": "9.1.2", "css-minimizer-webpack-plugin": "^5.0.1", - "eslint": "^8.48.0", + "eslint": "^8.49.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.28.1", "file-loader": "^6.2.0", "jest": "29.5.0", - "jest-environment-jsdom": "^29.6.4", + "jest-environment-jsdom": "^29.7.0", "rimraf": "^5.0.1", "sass": "^1.66.1", "sass-loader": "13.2.2", @@ -313,9 +313,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.15.tgz", - "integrity": "sha512-l1UiX4UyHSFsYt17iQ3Se5pQQZZHa22zyIXURmvkmLCD4t/aU+dvNWHatKac/D9Vm9UES7nvIqHs4jZqKviUmQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.17.tgz", + "integrity": "sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", @@ -353,14 +353,14 @@ } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz", - "integrity": "sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.17.tgz", + "integrity": "sha512-bxH77R5gjH3Nkde6/LuncQoLaP16THYPscurp1S8z7S9ZgezCyV3G8Hc+TZiCmY8pz4fp8CvKSgtJMW0FkLAxA==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-wrap-function": "^7.22.9" + "@babel/helper-wrap-function": "^7.22.17" }, "engines": { "node": ">=6.9.0" @@ -450,14 +450,14 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.10.tgz", - "integrity": "sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.17.tgz", + "integrity": "sha512-nAhoheCMlrqU41tAojw9GpVEKDlTS8r3lzFmF0lP52LwblCPbuFSO7nGIZoIcoU5NIm1ABrna0cJExE4Ay6l2Q==", "dev": true, "dependencies": { "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.10" + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.17" }, "engines": { "node": ">=6.9.0" @@ -1728,9 +1728,9 @@ } }, "node_modules/@babel/traverse": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.15.tgz", - "integrity": "sha512-DdHPwvJY0sEeN4xJU5uRLmZjgMMDIvMPniLuYzUVXj/GGzysPl0/fwt44JBkyUIzGJPV8QgHMcQdQ34XFuKTYQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.17.tgz", + "integrity": "sha512-xK4Uwm0JnAMvxYZxOVecss85WxTEIbTa7bnGyf/+EgCL5Zt3U7htUpEOWv9detPlamGKuRzCqw74xVglDWpPdg==", "dev": true, "dependencies": { "@babel/code-frame": "^7.22.13", @@ -1739,8 +1739,8 @@ "@babel/helper-function-name": "^7.22.5", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/types": "^7.22.17", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1749,9 +1749,9 @@ } }, "node_modules/@babel/types": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.15.tgz", - "integrity": "sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.17.tgz", + "integrity": "sha512-YSQPHLFtQNE5xN9tHuZnzu8vPr61wVTBZdfv1meex1NBosa4iT05k/Jw06ddJugi4bk7The/oSwQGFcksmEJQg==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", @@ -1793,9 +1793,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", - "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", + "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -1870,9 +1870,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", - "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", + "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2046,16 +2046,16 @@ } }, "node_modules/@jest/console": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.4.tgz", - "integrity": "sha512-wNK6gC0Ha9QeEPSkeJedQuTQqxZYnDPuDcDhVuVatRvMkL4D0VTvFVZj+Yuh6caG2aOfzkUZ36KtCmLNtR02hw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -2133,15 +2133,15 @@ } }, "node_modules/@jest/core": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.4.tgz", - "integrity": "sha512-U/vq5ccNTSVgYH7mHnodHmCffGWHJnz/E1BEWlLuK5pM4FZmGfBn/nrJGLjUsSmyx3otCeqc1T31F4y08AMDLg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, "dependencies": { - "@jest/console": "^29.6.4", - "@jest/reporters": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -2149,21 +2149,21 @@ "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.6.3", - "jest-config": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-resolve-dependencies": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "jest-watcher": "^29.6.4", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -2250,37 +2250,37 @@ } }, "node_modules/@jest/environment": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.4.tgz", - "integrity": "sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "dependencies": { - "@jest/fake-timers": "^29.6.4", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.3" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.4.tgz", - "integrity": "sha512-Warhsa7d23+3X5bLbrbYvaehcgX5TLYhI03JKoedTiI8uJU4IhqYBWF7OSSgUyz4IgLpUYPkK0AehA5/fRclAA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, "dependencies": { - "expect": "^29.6.4", - "jest-snapshot": "^29.6.4" + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.4.tgz", - "integrity": "sha512-FEhkJhqtvBwgSpiTrocquJCdXPsyvNKcl/n7A3u7X4pVoF4bswm11c9d4AV+kfq2Gpv/mM8x7E7DsRvH+djkrg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, "dependencies": { "jest-get-type": "^29.6.3" @@ -2290,47 +2290,47 @@ } }, "node_modules/@jest/fake-timers": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.4.tgz", - "integrity": "sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.4.tgz", - "integrity": "sha512-wVIn5bdtjlChhXAzVXavcY/3PEjf4VqM174BM3eGL5kMxLiZD5CLnbmkEyA1Dwh9q8XjP6E8RwjBsY/iCWrWsA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", "@jest/types": "^29.6.3", - "jest-mock": "^29.6.3" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.4.tgz", - "integrity": "sha512-sxUjWxm7QdchdrD3NfWKrL8FBsortZeibSJv4XLjESOOjSUOkjQcb0ZHJwfhEGIvBvTluTzfG2yZWZhkrXJu8g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", @@ -2344,9 +2344,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -2510,12 +2510,12 @@ } }, "node_modules/@jest/test-result": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.4.tgz", - "integrity": "sha512-uQ1C0AUEN90/dsyEirgMLlouROgSY+Wc/JanVVk0OiUKa5UFh7sJpMEM3aoUBAz2BRNvUJ8j3d294WFuRxSyOQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, "dependencies": { - "@jest/console": "^29.6.4", + "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" @@ -2525,14 +2525,14 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.4.tgz", - "integrity": "sha512-E84M6LbpcRq3fT4ckfKs9ryVanwkaIB0Ws9bw3/yP4seRLg/VaCZ/LgW0MCq5wwk4/iP/qnilD41aj2fsw2RMg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, "dependencies": { - "@jest/test-result": "^29.6.4", + "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -2540,9 +2540,9 @@ } }, "node_modules/@jest/transform": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz", - "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -2553,9 +2553,9 @@ "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -3030,9 +3030,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.5.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.9.tgz", - "integrity": "sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==", + "version": "20.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.0.tgz", + "integrity": "sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==", "dev": true }, "node_modules/@types/stack-utils": { @@ -3042,9 +3042,9 @@ "dev": true }, "node_modules/@types/tough-cookie": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", - "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.3.tgz", + "integrity": "sha512-THo502dA5PzG/sfQH+42Lw3fvmYkceefOspdCwpHRul8ik2Jv1K8I5OZz1AT3/rs46kwgMCe9bSBmDLYkkOMGg==", "dev": true }, "node_modules/@types/yargs": { @@ -3628,9 +3628,9 @@ } }, "node_modules/axios-mock-adapter": { - "version": "1.21.5", - "resolved": "https://registry.npmjs.org/axios-mock-adapter/-/axios-mock-adapter-1.21.5.tgz", - "integrity": "sha512-5NI1V/VK+8+JeTF8niqOowuysA4b8mGzdlMN/QnTnoXbYh4HZSNiopsDclN2g/m85+G++IrEtUdZaQ3GnaMsSA==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/axios-mock-adapter/-/axios-mock-adapter-1.22.0.tgz", + "integrity": "sha512-dmI0KbkyAhntUR05YY96qg2H6gg0XMl2+qTW0xmYg6Up+BFBAJYRLROMXRdDEL06/Wqwa0TJThAYvFtSFdRCZw==", "dependencies": { "fast-deep-equal": "^3.1.3", "is-buffer": "^2.0.5" @@ -4086,9 +4086,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001529", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001529.tgz", - "integrity": "sha512-n2pUQYGAkrLG4QYj2desAh+NqsJpHbNmVZz87imptDdxLAtjxary7Df/psdfyDGmskJK/9Dt9cPnx5RZ3CU4Og==", + "version": "1.0.30001534", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001534.tgz", + "integrity": "sha512-vlPVrhsCS7XaSh2VvWluIQEzVhefrUQcEsQWSS5A5V+dM07uv1qHeQzAOTGIMy9i3e9bH15+muvI/UHojVgS/Q==", "dev": true, "funding": [ { @@ -4456,6 +4456,97 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/create-jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/create-jest/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/create-jest/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/create-jest/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/create-jest/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -4810,12 +4901,27 @@ "node": ">=0.10.0" } }, + "node_modules/define-data-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.0.1.tgz", + "integrity": "sha512-22M+6zEspQHx10bfFQl2ET39IvfuQ7+rZIH7+ard8fCC4hPmkOSy+8JhKxBRLaWUziJ0O63NTYT97LR8zUfPTw==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -4981,9 +5087,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.512", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.512.tgz", - "integrity": "sha512-1W8wRbYlQE4ph7eoj3TJ+uqwO6+xvAE/L+KGU7WTQQvX3tnSIGZAb90MTsMoJqzntamiwJhBAj4WZmygXhsOUg==", + "version": "1.4.519", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.519.tgz", + "integrity": "sha512-kqs9oGYL4UFVkLKhqCTgBCYZv+wZ374yABDMqlDda9HvlkQxvSr7kgf4hfWVjMieDbX+1MwPHFBsOGCMIBaFKg==", "dev": true }, "node_modules/emittery": { @@ -5120,9 +5226,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", - "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz", + "integrity": "sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==", "dev": true }, "node_modules/es-set-tostringtag": { @@ -5210,16 +5316,16 @@ } }, "node_modules/eslint": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", - "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", + "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.48.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint/js": "8.49.0", + "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", @@ -5703,16 +5809,16 @@ } }, "node_modules/expect": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.4.tgz", - "integrity": "sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, "dependencies": { - "@jest/expect-utils": "^29.6.4", + "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3" + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -5760,9 +5866,9 @@ } }, "node_modules/express-rate-limit": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.0.tgz", - "integrity": "sha512-H9afltGTaEZcvenAB5LFgb/ysTMHUzMxoB3TJM6UHP5FtAP1p2+heMj1xwTei54Zm4I9I/2qsS5m+XrdKQp/Hw==", + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.2.tgz", + "integrity": "sha512-a7uwwfNTh1U60ssiIkuLFWHt4hAC5yxlLGU2VP0X4YNlyEDZAqF4tK3GD3NSitVBrCQmQ0++0uOyFOgC2y4DDw==", "engines": { "node": ">= 14" }, @@ -7227,13 +7333,13 @@ } }, "node_modules/jest-changed-files": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.6.3.tgz", - "integrity": "sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, "dependencies": { "execa": "^5.0.0", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "p-limit": "^3.1.0" }, "engines": { @@ -7241,28 +7347,28 @@ } }, "node_modules/jest-circus": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.4.tgz", - "integrity": "sha512-YXNrRyntVUgDfZbjXWBMPslX1mQ8MrSG0oM/Y06j9EYubODIyHWP8hMUbjbZ19M3M+zamqEur7O80HODwACoJw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", - "@jest/test-result": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "p-limit": "^3.1.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" @@ -7342,22 +7448,21 @@ } }, "node_modules/jest-cli": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.4.tgz", - "integrity": "sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, "dependencies": { - "@jest/core": "^29.6.4", - "@jest/test-result": "^29.6.4", + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "chalk": "^4.0.0", + "create-jest": "^29.7.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "prompts": "^2.0.1", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "yargs": "^17.3.1" }, "bin": { @@ -7446,31 +7551,31 @@ } }, "node_modules/jest-config": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.4.tgz", - "integrity": "sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.6.4", + "@jest/test-sequencer": "^29.7.0", "@jest/types": "^29.6.3", - "babel-jest": "^29.6.4", + "babel-jest": "^29.7.0", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.6.4", - "jest-environment-node": "^29.6.4", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", "jest-get-type": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -7506,12 +7611,12 @@ } }, "node_modules/jest-config/node_modules/babel-jest": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.4.tgz", - "integrity": "sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "dependencies": { - "@jest/transform": "^29.6.4", + "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", @@ -7582,15 +7687,15 @@ } }, "node_modules/jest-diff": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.4.tgz", - "integrity": "sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -7667,9 +7772,9 @@ } }, "node_modules/jest-docblock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.6.3.tgz", - "integrity": "sha512-2+H+GOTQBEm2+qFSQ7Ma+BvyV+waiIFxmZF5LdpBsAEjWX8QYjSCa4FrkIYtbfXUJJJnFCYrOtt6TZ+IAiTjBQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, "dependencies": { "detect-newline": "^3.0.0" @@ -7679,16 +7784,16 @@ } }, "node_modules/jest-each": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.3.tgz", - "integrity": "sha512-KoXfJ42k8cqbkfshW7sSHcdfnv5agDdHCPA87ZBdmHP+zJstTJc0ttQaJ/x7zK6noAL76hOuTIJ6ZkQRS5dcyg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", - "jest-util": "^29.6.3", - "pretty-format": "^29.6.3" + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -7765,18 +7870,18 @@ } }, "node_modules/jest-environment-jsdom": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.6.4.tgz", - "integrity": "sha512-K6wfgUJ16DoMs02JYFid9lOsqfpoVtyJxpRlnTxUHzvZWBnnh2VNGRB9EC1Cro96TQdq5TtSjb3qUjNaJP9IyA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", + "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/jsdom": "^20.0.0", "@types/node": "*", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0", "jsdom": "^20.0.0" }, "engines": { @@ -7792,17 +7897,17 @@ } }, "node_modules/jest-environment-node": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.4.tgz", - "integrity": "sha512-i7SbpH2dEIFGNmxGCpSc2w9cA4qVD+wfvg2ZnfQ7XVrKL0NA5uDVBIiGH8SR4F0dKEv/0qI5r+aDomDf04DpEQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -7818,9 +7923,9 @@ } }, "node_modules/jest-haste-map": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz", - "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -7830,8 +7935,8 @@ "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -7843,28 +7948,28 @@ } }, "node_modules/jest-leak-detector": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.3.tgz", - "integrity": "sha512-0kfbESIHXYdhAdpLsW7xdwmYhLf1BRu4AA118/OxFm0Ho1b2RcTmO4oF6aAMaxpxdxnJ3zve2rgwzNBD4Zbm7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, "dependencies": { "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.4.tgz", - "integrity": "sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.6.4", + "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -7941,9 +8046,9 @@ } }, "node_modules/jest-message-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.3.tgz", - "integrity": "sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", @@ -7952,7 +8057,7 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -8031,14 +8136,14 @@ } }, "node_modules/jest-mock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.3.tgz", - "integrity": "sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", - "jest-util": "^29.6.3" + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -8071,17 +8176,17 @@ } }, "node_modules/jest-resolve": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.4.tgz", - "integrity": "sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" @@ -8091,13 +8196,13 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.4.tgz", - "integrity": "sha512-7+6eAmr1ZBF3vOAJVsfLj1QdqeXG+WYhidfLHBRZqGN24MFRIiKG20ItpLw2qRAsW/D2ZUUmCNf6irUr/v6KHA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, "dependencies": { "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.6.4" + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -8174,30 +8279,30 @@ } }, "node_modules/jest-runner": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.4.tgz", - "integrity": "sha512-SDaLrMmtVlQYDuG0iSPYLycG8P9jLI+fRm8AF/xPKhYDB2g6xDWjXBrR5M8gEWsK6KVFlebpZ4QsrxdyIX1Jaw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, "dependencies": { - "@jest/console": "^29.6.4", - "@jest/environment": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.6.3", - "jest-environment-node": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-leak-detector": "^29.6.3", - "jest-message-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-util": "^29.6.3", - "jest-watcher": "^29.6.4", - "jest-worker": "^29.6.4", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -8276,17 +8381,17 @@ } }, "node_modules/jest-runtime": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.4.tgz", - "integrity": "sha512-s/QxMBLvmwLdchKEjcLfwzP7h+jsHvNEtxGP5P+Fl1FMaJX2jMiIqe4rJw4tFprzCwuSvVUo9bn0uj4gNRXsbA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", - "@jest/globals": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", @@ -8294,13 +8399,13 @@ "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -8379,9 +8484,9 @@ } }, "node_modules/jest-snapshot": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.4.tgz", - "integrity": "sha512-VC1N8ED7+4uboUKGIDsbvNAZb6LakgIPgAF4RSpF13dN6YaMokfRqO+BaqK4zIh6X3JffgwbzuGqDEjHm/MrvA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -8389,20 +8494,20 @@ "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.6.4", + "expect": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-diff": "^29.6.4", + "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "natural-compare": "^1.4.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "semver": "^7.5.3" }, "engines": { @@ -8513,9 +8618,9 @@ "dev": true }, "node_modules/jest-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", - "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -8600,9 +8705,9 @@ } }, "node_modules/jest-validate": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz", - "integrity": "sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -8610,7 +8715,7 @@ "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -8699,18 +8804,18 @@ } }, "node_modules/jest-watcher": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.4.tgz", - "integrity": "sha512-oqUWvx6+On04ShsT00Ir9T4/FvBeEh2M9PTubgITPxDa739p4hoQweWPRGyYeaojgT0xTpZKF0Y/rSY1UgMxvQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, "dependencies": { - "@jest/test-result": "^29.6.4", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "string-length": "^4.0.1" }, "engines": { @@ -8788,13 +8893,13 @@ } }, "node_modules/jest-worker": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", - "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -10444,9 +10549,9 @@ } }, "node_modules/pretty-format": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", - "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", @@ -10774,14 +10879,14 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "set-function-name": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -11267,6 +11372,19 @@ "node": ">= 0.8.0" } }, + "node_modules/set-function-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.0.tgz", + "integrity": "sha512-WmS8UHojv5s1eSoRSmzO5zzgDq8PE1/X/ij0k+9fMYmINCc6+j+SF3Om8YyucKn2yjnK4ItNZOoQycNnHsZJTw==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -12793,9 +12911,9 @@ } }, "node_modules/ws": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.0.tgz", - "integrity": "sha512-WR0RJE9Ehsio6U4TuM+LmunEsjQ5ncHlw4sn9ihD6RoJKZrVyH9FWV3dmnwu8B2aNib1OvG2X6adUCyFpQyWcg==", + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.1.tgz", + "integrity": "sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A==", "dev": true, "engines": { "node": ">=10.0.0" diff --git a/portal/package.json b/portal/package.json index 0764bb4d31..286c73066d 100644 --- a/portal/package.json +++ b/portal/package.json @@ -41,7 +41,7 @@ "dependencies": { "@ministryofjustice/frontend": "1.8.0", "axios": "^1.5.0", - "axios-mock-adapter": "^1.21.5", + "axios-mock-adapter": "^1.22.0", "cheerio": "^1.0.0-rc.12", "connect-flash": "0.1.1", "connect-redis": "5.2.0", @@ -50,7 +50,7 @@ "csurf": "^1.11.0", "dotenv": "16.0.3", "express": "^4.18.2", - "express-rate-limit": "^6.11.0", + "express-rate-limit": "^6.11.2", "express-session": "1.17.3", "form-data": "4.0.0", "govuk-frontend": "4.6.0", @@ -78,12 +78,12 @@ "babel-jest": "29.5.0", "babel-loader": "9.1.2", "css-minimizer-webpack-plugin": "^5.0.1", - "eslint": "^8.48.0", + "eslint": "^8.49.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.28.1", "file-loader": "^6.2.0", "jest": "29.5.0", - "jest-environment-jsdom": "^29.6.4", + "jest-environment-jsdom": "^29.7.0", "rimraf": "^5.0.1", "sass": "^1.66.1", "sass-loader": "13.2.2", diff --git a/reverse-proxy/README.md b/reverse-proxy/README.md index 0e30311e76..eac75137aa 100644 --- a/reverse-proxy/README.md +++ b/reverse-proxy/README.md @@ -1,19 +1,24 @@ -# reverse-proxy +## Purpose -This services sets the nginx config to `./default.conf.template`. +The primary purpose of this reverse-proxy service is to serve two different user interfaces, the Portal (BSS) UI and the GEF UI, from the same location for end-users. Despite being distinct services with different port numbers, the reverse-proxy configuration is set up to route requests accordingly. -## Why +This service sets the Nginx configuration to use a specific template file (`./default.conf.template`) for routing requests. -For the end user, the Portal (BSS) UI and the GEF UI are served in the same place. +## Routing Logic -However, both the UI's are different services/servers with different port numbers. +The routing logic of the reverse-proxy is as follows: -This reverse-proxy config forwards anything with `/gef/` in the path, to the GEF UI. Otherwise, everything else is forwarded to the Portal (BSS) UI. +- Any request with `/gef/` in the path is forwarded to the GEF UI. +- All other requests are forwarded to the Portal (BSS) UI. -## Running locally +## Running Locally -1. Start all services from the root directory +To run this reverse-proxy service locally, you can follow these steps: + +1. Start all services from the root directory using Docker Compose: ```shell docker-compose up ``` + +This service seems to be an essential part of the overall architecture, enabling seamless access to both the Portal (BSS) and GEF user interfaces for end-users while ensuring that requests are directed to the appropriate service based on the path. \ No newline at end of file diff --git a/service-unavailable/README.md b/service-unavailable/README.md deleted file mode 100644 index 28152bca1b..0000000000 --- a/service-unavailable/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# service-unavailable - -This is a standalone HTML page that has no external dependencies. \ No newline at end of file diff --git a/trade-finance-manager-api/README.md b/trade-finance-manager-api/README.md index d3819206fe..cc1f040c9e 100644 --- a/trade-finance-manager-api/README.md +++ b/trade-finance-manager-api/README.md @@ -1,106 +1,101 @@ -# Trade Finance Manager API +# Trade Finance Manager API (TFM API) :gear: +TFM API, also known as Trade Finance Manager API, plays a pivotal role in handling deal submissions to UKEF (UK Export Finance). Once TFM successfully receives a deal, it leverages GraphQL to query and mutate TFM data. In TFM, a deal is an integral part of a 'case,' which encompasses the deal, facilities, and other TFM-specific components. This documentation provides an in-depth understanding of the Trade Finance Manager API (TFM API), its functionalities, data structure, and future considerations for handling different product types and data. -Also known as TFM, TFM API is primarily responsible for handling deal submission to UKEF. +## Prerequisite :key: -Once TFM has successfully received a deal, graphQL is used to query and mutate TFM data. +Before running the TFM API, make sure to have an `.env` file configured. You can use `.env.sample` as a base. Some sensitive variables may need to be shared among the team. -In TFM, a deal is part of a 'case'. A case contains the deal and facilities, amongst other TFM specific areas. +## Running Locally :computer: -## Prerequisite - -Make sure you have an `.env`. Use `.env.sample` as a base. Some sensitive variables need to be shared from the team. - -## Running locally +To run the TFM API locally, use the following command: ```shell docker-compose up ``` -Alternatively, every service can be started from the root directory (`docker-compose up`). +Alternatively, you can start all services from the project's root directory by running `docker-compose up`. -## Testing +## Testing :test_tube: -In a second terminal, run: +To run API tests and generate test coverage, open a second terminal and execute: ```shell npm run api-test ``` -Test coverage will be generated. +### Run a Single API Test :heavy_check_mark: -### **Run a single API test** +To run a specific API test, use the following command (replace the path accordingly): ```shell npm run api-test-file "**/*/deals-party-db.api-test.js" ``` -## GraphQL playground - -GraphQL playground is very useful for testing out GraphQL queries and mutations and exploring the schema. +## GraphQL Playground :rocket: -Once the API is running, access the playground on localhost port 5004. +The GraphQL playground is a valuable tool for testing GraphQL queries and mutations and exploring the schema. Access the playground on localhost, port 5004. -You will need to have an `authorization` http header for any query/mutation. This will be the `UKEF_TFM_API_SYSTEM_KEY` set in your .env. +Ensure that you have an `authorization` HTTP header for any query/mutation. This should be the `UKEF_TFM_API_SYSTEM_KEY` set in your `.env`. -Example for single deal query in GraphQL playground: +For example, when making a single deal query in the GraphQL playground, use the following: -- Query variables +- Query variables: ```shell { "_id": "1000192" } ``` -- HTTP headers +- HTTP headers: ```shell { "authorization": "abc-123-def-456" } ``` -## What this API does +## Functionality :gear: -When a deal is submitted to UKEF from the Portal, the deal is sent to TFM API. TFM API has 4 responsibilities: +The TFM API is responsible for several crucial tasks when a deal is submitted to UKEF: -- Accept submitted deals -- Trigger a status update for the Portal (from 'Submitted' to e.g 'Acknowledged') -- Call external UKEF APIs to populate more data (e.g currency conversions) -- Thereafter allowing TFM users to complete necessary updates to the deal (triggered by TFM UI) +1. Accept submitted deals. +2. Trigger a status update for the Portal (e.g., from 'Submitted' to 'Acknowledged'). +3. Call external UKEF APIs to populate more data (e.g., currency conversions). +4. Allow TFM users to complete necessary updates to the deal (triggered by TFM UI). -:warning: In TFM, a deal is known as a 'Case'. A Case will have one deal with facilities and tasks for the users's to complete in order to process the case. +:warning: In TFM, a deal is referred to as a 'Case', which includes one deal with facilities and tasks for users to complete in order to process the case. -## What happens when a deal is sent to TFM +## Deal Submission Workflow :briefcase: -In essence: +When a deal is sent to TFM, the following steps are taken: -1) Get the deal from the database by deal ID -2) Create a snapshot of the deal and facilities -3) Add the snapshots to TFM collections -4) Map all fields into a generic format -5) Update the deal status in Portal to 'Acknowledged' or 'In progress' -6) Make calls to external UKEF APIs. Add all data to tfm object in the deal and facilities -7) Generate a list of tasks for the deal -8) Send emails for acknowledgment and 'tasks are ready to start' +1. Retrieve the deal from the database by deal ID. +2. Create a snapshot of the deal and facilities. +3. Add the snapshots to TFM collections. +4. Map all fields into a generic format. +5. Update the deal status in Portal to 'Acknowledged' or 'In progress.' +6. Make calls to external UKEF APIs and add all data to the `tfm` object in the deal and facilities. +7. Generate a list of tasks for the deal. +8. Send emails for acknowledgment and notifying users that 'tasks are ready to start.' -All of this starts from the deal submission controller: `/src/v1/controllers/deal.submit.controller.js` +All of this starts from the deal submission controller: `/src/v1/controllers/deal.submit.controller.js`. -## Documentation +## Documentation :book: -This README is this most useful for understanding what happens with this API. There are only 2 endpoints - deal submission and get user. +This README serves as a primary source for understanding the TFM API's functionality. The API offers two endpoints: deal submission and get user. -Swagger docs can be found on the URL `/v1/api-docs` +Swagger documentation can be found at the following URL: `/v1/api-docs`. -## Snapshots and data structure +## Snapshots and Data Structure :file_folder: -When a deal is sent to TFM, the structure will be something like this (very simple example): +When a deal is sent to TFM, its structure initially looks like this (a simplified example): ```js { _id: '61f7a71ccf809301e78fbea3', submissionType: 'Automatic Inclusion Notice', - ... + // ... } ``` -When TFM creates a snapshot (and adds to the TFM collections) for it's own consumption, the deal structure becomes: +When TFM creates a snapshot (and adds it to the TFM collections) for its own consumption, the deal structure becomes: ```js { @@ -108,103 +103,28 @@ When TFM creates a snapshot (and adds to the TFM collections) for it's own consu dealSnapshot: { _id: '61f7a71ccf809301e78fbea3', submissionType: 'Automatic Inclusion Notice', - ... + // ... }, tfm: { dateReceived: '20-12-2021', - ... + // ... }, } ``` -:warning: **The snapshot should not be changed by TFM.** TFM updates are stored in the tfm object. - -This is exactly the same for facilities - just replace `dealSnapshot` with `facilitySnapshot`. - -The only exception for updating the snapshot is when TFM changes the `submissionType`. The alternative would be to send an update to Portal and then Portal re-submits to TFM; which is not performant. - -## Different product types and data - -There are currently 2 types of deals and 4 types of facilities that TFM receives: - -- BSS and EWCS (bond and loan facilities for a BSS deal) -- Cash and Contingent (facilities for a GEF deal) - -More info in the [glossary](https://ukef-dtfs.atlassian.net/wiki/spaces/DS/pages/7471490/DTFS+-+glossary) - -At the time of writing, BSS has a very different structure to GEF. GEF is a lot cleaner. +:warning: **The snapshot should not be changed by TFM.** TFM updates are stored in the `tfm` object. -Eventually, BSS will be redesigned and become aligned with the GEF data structure. Both products have a lot of similarities, but currently does not have a generic, shared structure. - -Therefore in TFM, we currently need to deal with 2 different data structures for BSS and GEF. - -### BSS deal structure example - -```js -{ - _id: '61f7a71ccf809301e78fbea6', - dealType: 'BSS/EWCS', - submissionType: 'Automatic Inclusion Notice', - updatedAt: 1639580324306.0 - details: { - submissionDate: '1606900616651', - }, - facilities: [ '61f7a71ccf809301e78fbea3', '61f7a71ccf809301e78fbea3' ], - ... -} -``` +This is the same for facilities, with the exception that 'dealSnapshot' is replaced with 'facilitySnapshot'. -### GEF deal structure example - -```js -{ - _id: '2', - dealType: 'GEF', - submissionType: 'Automatic Inclusion Notice', - submissionDate: '1606900616651', - updatedAt: 1639580324306.0 - ... -} -``` - -### BSS facility structure example - -```js -{ - _id: '61f7a71ccf809301e78fbea1', - type: 'Bond', - requestedCoverStartDate: '1606900616652', - coveredPercentage: '20', - ... -} -``` - -### GEF facility structure example - -```js -{ - _id: '200', - type: 'Cash', - coverStartDate: '2021-12-12T00:00:00.000Z', - coverPercentage: 12, - ... -} -``` +## Mapping Different Product Types and Data :earth_americas: -## Mapping different product types and data +TFM handles two types of deals and four types of facilities: -We map the data when: +- BSS and EWCS (bond and loan facilities for a BSS deal). +- Cash and Contingent (facilities for a GEF deal). -1) Deal is submitted to TFM - - Create a flat, generic structure for all deal and facility types. - - Use the generic structure to call external UKEF APIs. - - Only the fields required for API calls are mapped. - - This is only referenced locally in the submit controller: `/src/v1/controllers/deal.submit.controller.js`. It is not stored or referenced anywhere else. - - See map-submitted-deal: `/src/v1/mappings/map-submitted-deal` +At the time of writing, BSS has a different structure compared to GEF. GEF data is more straightforward. -2) The deal or facility is queried from the UI (after submission) - - Maps all deals and facilities into the BSS structure. - - A GEF deal/facility will get mapped into the BSS structure. - - See GraphQL reducer mappings: `/src/graphql/reducers` +In the future, BSS will be redesigned to align with the GEF data structure, creating a shared, generic structure. TFM will then be refactored to query and render data based on this generic structure, rather than the BSS structure. The submission mapping is a step towards this alignment. -When BSS is redesigned, it should share a generic data structure with GEF. TFM should then be refactored to query and render data based on the generic data structure, instead of BSS. The submission mapping is a step towards this. +--- diff --git a/trade-finance-manager-api/api-tests/README.md b/trade-finance-manager-api/api-tests/README.md deleted file mode 100644 index aabc722981..0000000000 --- a/trade-finance-manager-api/api-tests/README.md +++ /dev/null @@ -1 +0,0 @@ -TFM-API tests \ No newline at end of file diff --git a/trade-finance-manager-api/package-lock.json b/trade-finance-manager-api/package-lock.json index 4539d4c897..3ab012b181 100644 --- a/trade-finance-manager-api/package-lock.json +++ b/trade-finance-manager-api/package-lock.json @@ -21,7 +21,7 @@ "dotenv": "16.0.3", "express": "4.18.2", "express-mongo-sanitize": "^2.2.0", - "express-rate-limit": "^6.11.0", + "express-rate-limit": "^6.11.2", "express-validator": "7.0.1", "graphql": "^16.8.0", "graphql-middleware": "^6.1.35", @@ -49,8 +49,8 @@ "@types/jest": "^29.5.4", "@types/mongodb": "^4.0.7", "@types/swagger-ui-express": "^4.1.3", - "axios-mock-adapter": "^1.21.5", - "eslint": "^8.48.0", + "axios-mock-adapter": "^1.22.0", + "eslint": "^8.49.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.28.1", "jest": "29.5.0", @@ -368,21 +368,21 @@ } }, "node_modules/@babel/core": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.15.tgz", - "integrity": "sha512-PtZqMmgRrvj8ruoEOIwVA3yoF91O+Hgw9o7DAUTNBA6Mo2jpu31clx9a7Nz/9JznqetTR6zwfC4L3LAjKQXUwA==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.17.tgz", + "integrity": "sha512-2EENLmhpwplDux5PSsZnSbnSkB3tZ6QTksgO25xwEL7pIDcNOMhF5v/s6RzwjMZzZzw9Ofc30gHv5ChCC8pifQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.22.13", "@babel/generator": "^7.22.15", "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.22.15", + "@babel/helper-module-transforms": "^7.22.17", "@babel/helpers": "^7.22.15", - "@babel/parser": "^7.22.15", + "@babel/parser": "^7.22.16", "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.15", - "@babel/types": "^7.22.15", + "@babel/traverse": "^7.22.17", + "@babel/types": "^7.22.17", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -519,9 +519,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.15.tgz", - "integrity": "sha512-l1UiX4UyHSFsYt17iQ3Se5pQQZZHa22zyIXURmvkmLCD4t/aU+dvNWHatKac/D9Vm9UES7nvIqHs4jZqKviUmQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.17.tgz", + "integrity": "sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", @@ -911,9 +911,9 @@ } }, "node_modules/@babel/traverse": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.15.tgz", - "integrity": "sha512-DdHPwvJY0sEeN4xJU5uRLmZjgMMDIvMPniLuYzUVXj/GGzysPl0/fwt44JBkyUIzGJPV8QgHMcQdQ34XFuKTYQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.17.tgz", + "integrity": "sha512-xK4Uwm0JnAMvxYZxOVecss85WxTEIbTa7bnGyf/+EgCL5Zt3U7htUpEOWv9detPlamGKuRzCqw74xVglDWpPdg==", "dev": true, "dependencies": { "@babel/code-frame": "^7.22.13", @@ -922,8 +922,8 @@ "@babel/helper-function-name": "^7.22.5", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/types": "^7.22.17", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -964,9 +964,9 @@ "dev": true }, "node_modules/@babel/types": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.15.tgz", - "integrity": "sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.17.tgz", + "integrity": "sha512-YSQPHLFtQNE5xN9tHuZnzu8vPr61wVTBZdfv1meex1NBosa4iT05k/Jw06ddJugi4bk7The/oSwQGFcksmEJQg==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", @@ -999,9 +999,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", - "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", + "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -1054,9 +1054,9 @@ "dev": true }, "node_modules/@eslint/js": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", - "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", + "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1399,16 +1399,16 @@ } }, "node_modules/@jest/console": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.4.tgz", - "integrity": "sha512-wNK6gC0Ha9QeEPSkeJedQuTQqxZYnDPuDcDhVuVatRvMkL4D0VTvFVZj+Yuh6caG2aOfzkUZ36KtCmLNtR02hw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -1416,15 +1416,15 @@ } }, "node_modules/@jest/core": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.4.tgz", - "integrity": "sha512-U/vq5ccNTSVgYH7mHnodHmCffGWHJnz/E1BEWlLuK5pM4FZmGfBn/nrJGLjUsSmyx3otCeqc1T31F4y08AMDLg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, "dependencies": { - "@jest/console": "^29.6.4", - "@jest/reporters": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -1432,21 +1432,21 @@ "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.6.3", - "jest-config": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-resolve-dependencies": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "jest-watcher": "^29.6.4", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -1463,37 +1463,37 @@ } }, "node_modules/@jest/environment": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.4.tgz", - "integrity": "sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "dependencies": { - "@jest/fake-timers": "^29.6.4", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.3" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.4.tgz", - "integrity": "sha512-Warhsa7d23+3X5bLbrbYvaehcgX5TLYhI03JKoedTiI8uJU4IhqYBWF7OSSgUyz4IgLpUYPkK0AehA5/fRclAA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, "dependencies": { - "expect": "^29.6.4", - "jest-snapshot": "^29.6.4" + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.4.tgz", - "integrity": "sha512-FEhkJhqtvBwgSpiTrocquJCdXPsyvNKcl/n7A3u7X4pVoF4bswm11c9d4AV+kfq2Gpv/mM8x7E7DsRvH+djkrg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, "dependencies": { "jest-get-type": "^29.6.3" @@ -1503,47 +1503,47 @@ } }, "node_modules/@jest/fake-timers": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.4.tgz", - "integrity": "sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.4.tgz", - "integrity": "sha512-wVIn5bdtjlChhXAzVXavcY/3PEjf4VqM174BM3eGL5kMxLiZD5CLnbmkEyA1Dwh9q8XjP6E8RwjBsY/iCWrWsA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", "@jest/types": "^29.6.3", - "jest-mock": "^29.6.3" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.4.tgz", - "integrity": "sha512-sxUjWxm7QdchdrD3NfWKrL8FBsortZeibSJv4XLjESOOjSUOkjQcb0ZHJwfhEGIvBvTluTzfG2yZWZhkrXJu8g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", @@ -1557,9 +1557,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -1604,12 +1604,12 @@ } }, "node_modules/@jest/test-result": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.4.tgz", - "integrity": "sha512-uQ1C0AUEN90/dsyEirgMLlouROgSY+Wc/JanVVk0OiUKa5UFh7sJpMEM3aoUBAz2BRNvUJ8j3d294WFuRxSyOQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, "dependencies": { - "@jest/console": "^29.6.4", + "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" @@ -1619,14 +1619,14 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.4.tgz", - "integrity": "sha512-E84M6LbpcRq3fT4ckfKs9ryVanwkaIB0Ws9bw3/yP4seRLg/VaCZ/LgW0MCq5wwk4/iP/qnilD41aj2fsw2RMg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, "dependencies": { - "@jest/test-result": "^29.6.4", + "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -1634,9 +1634,9 @@ } }, "node_modules/@jest/transform": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz", - "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -1647,9 +1647,9 @@ "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -2054,9 +2054,9 @@ } }, "node_modules/@types/node": { - "version": "20.5.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.9.tgz", - "integrity": "sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==" + "version": "20.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.0.tgz", + "integrity": "sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==" }, "node_modules/@types/qs": { "version": "6.9.8", @@ -2653,9 +2653,9 @@ } }, "node_modules/axios-mock-adapter": { - "version": "1.21.5", - "resolved": "https://registry.npmjs.org/axios-mock-adapter/-/axios-mock-adapter-1.21.5.tgz", - "integrity": "sha512-5NI1V/VK+8+JeTF8niqOowuysA4b8mGzdlMN/QnTnoXbYh4HZSNiopsDclN2g/m85+G++IrEtUdZaQ3GnaMsSA==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/axios-mock-adapter/-/axios-mock-adapter-1.22.0.tgz", + "integrity": "sha512-dmI0KbkyAhntUR05YY96qg2H6gg0XMl2+qTW0xmYg6Up+BFBAJYRLROMXRdDEL06/Wqwa0TJThAYvFtSFdRCZw==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.3", @@ -2666,12 +2666,12 @@ } }, "node_modules/babel-jest": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.4.tgz", - "integrity": "sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "dependencies": { - "@jest/transform": "^29.6.4", + "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", @@ -2977,9 +2977,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001529", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001529.tgz", - "integrity": "sha512-n2pUQYGAkrLG4QYj2desAh+NqsJpHbNmVZz87imptDdxLAtjxary7Df/psdfyDGmskJK/9Dt9cPnx5RZ3CU4Og==", + "version": "1.0.30001534", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001534.tgz", + "integrity": "sha512-vlPVrhsCS7XaSh2VvWluIQEzVhefrUQcEsQWSS5A5V+dM07uv1qHeQzAOTGIMy9i3e9bH15+muvI/UHojVgS/Q==", "dev": true, "funding": [ { @@ -3279,6 +3279,27 @@ "node": ">= 0.10" } }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -3360,12 +3381,27 @@ "node": ">=0.10.0" } }, + "node_modules/define-data-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.0.1.tgz", + "integrity": "sha512-22M+6zEspQHx10bfFQl2ET39IvfuQ7+rZIH7+ard8fCC4hPmkOSy+8JhKxBRLaWUziJ0O63NTYT97LR8zUfPTw==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -3521,9 +3557,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.512", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.512.tgz", - "integrity": "sha512-1W8wRbYlQE4ph7eoj3TJ+uqwO6+xvAE/L+KGU7WTQQvX3tnSIGZAb90MTsMoJqzntamiwJhBAj4WZmygXhsOUg==", + "version": "1.4.519", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.519.tgz", + "integrity": "sha512-kqs9oGYL4UFVkLKhqCTgBCYZv+wZ374yABDMqlDda9HvlkQxvSr7kgf4hfWVjMieDbX+1MwPHFBsOGCMIBaFKg==", "dev": true }, "node_modules/emittery": { @@ -3691,16 +3727,16 @@ } }, "node_modules/eslint": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", - "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", + "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.48.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint/js": "8.49.0", + "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", @@ -4042,16 +4078,16 @@ } }, "node_modules/expect": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.4.tgz", - "integrity": "sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, "dependencies": { - "@jest/expect-utils": "^29.6.4", + "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3" + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -4107,9 +4143,9 @@ } }, "node_modules/express-rate-limit": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.0.tgz", - "integrity": "sha512-H9afltGTaEZcvenAB5LFgb/ysTMHUzMxoB3TJM6UHP5FtAP1p2+heMj1xwTei54Zm4I9I/2qsS5m+XrdKQp/Hw==", + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.2.tgz", + "integrity": "sha512-a7uwwfNTh1U60ssiIkuLFWHt4hAC5yxlLGU2VP0X4YNlyEDZAqF4tK3GD3NSitVBrCQmQ0++0uOyFOgC2y4DDw==", "engines": { "node": ">= 14" }, @@ -5390,13 +5426,13 @@ } }, "node_modules/jest-changed-files": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.6.3.tgz", - "integrity": "sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, "dependencies": { "execa": "^5.0.0", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "p-limit": "^3.1.0" }, "engines": { @@ -5404,28 +5440,28 @@ } }, "node_modules/jest-circus": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.4.tgz", - "integrity": "sha512-YXNrRyntVUgDfZbjXWBMPslX1mQ8MrSG0oM/Y06j9EYubODIyHWP8hMUbjbZ19M3M+zamqEur7O80HODwACoJw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", - "@jest/test-result": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "p-limit": "^3.1.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" @@ -5435,22 +5471,21 @@ } }, "node_modules/jest-cli": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.4.tgz", - "integrity": "sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, "dependencies": { - "@jest/core": "^29.6.4", - "@jest/test-result": "^29.6.4", + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "chalk": "^4.0.0", + "create-jest": "^29.7.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "prompts": "^2.0.1", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "yargs": "^17.3.1" }, "bin": { @@ -5469,31 +5504,31 @@ } }, "node_modules/jest-config": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.4.tgz", - "integrity": "sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.6.4", + "@jest/test-sequencer": "^29.7.0", "@jest/types": "^29.6.3", - "babel-jest": "^29.6.4", + "babel-jest": "^29.7.0", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.6.4", - "jest-environment-node": "^29.6.4", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", "jest-get-type": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -5514,24 +5549,24 @@ } }, "node_modules/jest-diff": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.4.tgz", - "integrity": "sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-docblock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.6.3.tgz", - "integrity": "sha512-2+H+GOTQBEm2+qFSQ7Ma+BvyV+waiIFxmZF5LdpBsAEjWX8QYjSCa4FrkIYtbfXUJJJnFCYrOtt6TZ+IAiTjBQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, "dependencies": { "detect-newline": "^3.0.0" @@ -5541,33 +5576,33 @@ } }, "node_modules/jest-each": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.3.tgz", - "integrity": "sha512-KoXfJ42k8cqbkfshW7sSHcdfnv5agDdHCPA87ZBdmHP+zJstTJc0ttQaJ/x7zK6noAL76hOuTIJ6ZkQRS5dcyg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", - "jest-util": "^29.6.3", - "pretty-format": "^29.6.3" + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-environment-node": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.4.tgz", - "integrity": "sha512-i7SbpH2dEIFGNmxGCpSc2w9cA4qVD+wfvg2ZnfQ7XVrKL0NA5uDVBIiGH8SR4F0dKEv/0qI5r+aDomDf04DpEQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -5583,9 +5618,9 @@ } }, "node_modules/jest-haste-map": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz", - "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -5595,8 +5630,8 @@ "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -5608,37 +5643,37 @@ } }, "node_modules/jest-leak-detector": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.3.tgz", - "integrity": "sha512-0kfbESIHXYdhAdpLsW7xdwmYhLf1BRu4AA118/OxFm0Ho1b2RcTmO4oF6aAMaxpxdxnJ3zve2rgwzNBD4Zbm7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, "dependencies": { "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.4.tgz", - "integrity": "sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.6.4", + "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-message-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.3.tgz", - "integrity": "sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", @@ -5647,7 +5682,7 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -5656,14 +5691,14 @@ } }, "node_modules/jest-mock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.3.tgz", - "integrity": "sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", - "jest-util": "^29.6.3" + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -5696,17 +5731,17 @@ } }, "node_modules/jest-resolve": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.4.tgz", - "integrity": "sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" @@ -5716,43 +5751,43 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.4.tgz", - "integrity": "sha512-7+6eAmr1ZBF3vOAJVsfLj1QdqeXG+WYhidfLHBRZqGN24MFRIiKG20ItpLw2qRAsW/D2ZUUmCNf6irUr/v6KHA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, "dependencies": { "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.6.4" + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.4.tgz", - "integrity": "sha512-SDaLrMmtVlQYDuG0iSPYLycG8P9jLI+fRm8AF/xPKhYDB2g6xDWjXBrR5M8gEWsK6KVFlebpZ4QsrxdyIX1Jaw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, "dependencies": { - "@jest/console": "^29.6.4", - "@jest/environment": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.6.3", - "jest-environment-node": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-leak-detector": "^29.6.3", - "jest-message-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-util": "^29.6.3", - "jest-watcher": "^29.6.4", - "jest-worker": "^29.6.4", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -5761,17 +5796,17 @@ } }, "node_modules/jest-runtime": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.4.tgz", - "integrity": "sha512-s/QxMBLvmwLdchKEjcLfwzP7h+jsHvNEtxGP5P+Fl1FMaJX2jMiIqe4rJw4tFprzCwuSvVUo9bn0uj4gNRXsbA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", - "@jest/globals": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", @@ -5779,13 +5814,13 @@ "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -5794,9 +5829,9 @@ } }, "node_modules/jest-snapshot": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.4.tgz", - "integrity": "sha512-VC1N8ED7+4uboUKGIDsbvNAZb6LakgIPgAF4RSpF13dN6YaMokfRqO+BaqK4zIh6X3JffgwbzuGqDEjHm/MrvA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -5804,20 +5839,20 @@ "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.6.4", + "expect": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-diff": "^29.6.4", + "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "natural-compare": "^1.4.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "semver": "^7.5.3" }, "engines": { @@ -5840,9 +5875,9 @@ } }, "node_modules/jest-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", - "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -5857,9 +5892,9 @@ } }, "node_modules/jest-validate": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz", - "integrity": "sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -5867,7 +5902,7 @@ "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -5886,18 +5921,18 @@ } }, "node_modules/jest-watcher": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.4.tgz", - "integrity": "sha512-oqUWvx6+On04ShsT00Ir9T4/FvBeEh2M9PTubgITPxDa739p4hoQweWPRGyYeaojgT0xTpZKF0Y/rSY1UgMxvQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, "dependencies": { - "@jest/test-result": "^29.6.4", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "string-length": "^4.0.1" }, "engines": { @@ -5905,13 +5940,13 @@ } }, "node_modules/jest-worker": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", - "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -7099,9 +7134,9 @@ } }, "node_modules/pretty-format": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", - "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", @@ -7267,14 +7302,14 @@ "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" }, "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "set-function-name": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -7522,6 +7557,19 @@ "node": ">= 0.8.0" } }, + "node_modules/set-function-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.0.tgz", + "integrity": "sha512-WmS8UHojv5s1eSoRSmzO5zzgDq8PE1/X/ij0k+9fMYmINCc6+j+SF3Om8YyucKn2yjnK4ItNZOoQycNnHsZJTw==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -8285,9 +8333,13 @@ } }, "node_modules/uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "bin": { "uuid": "dist/bin/uuid" } diff --git a/trade-finance-manager-api/package.json b/trade-finance-manager-api/package.json index b0c18c0d76..2fd8ed395d 100644 --- a/trade-finance-manager-api/package.json +++ b/trade-finance-manager-api/package.json @@ -48,7 +48,7 @@ "dotenv": "16.0.3", "express": "4.18.2", "express-mongo-sanitize": "^2.2.0", - "express-rate-limit": "^6.11.0", + "express-rate-limit": "^6.11.2", "express-validator": "7.0.1", "graphql": "^16.8.0", "graphql-middleware": "^6.1.35", @@ -76,8 +76,8 @@ "@types/jest": "^29.5.4", "@types/mongodb": "^4.0.7", "@types/swagger-ui-express": "^4.1.3", - "axios-mock-adapter": "^1.21.5", - "eslint": "^8.48.0", + "axios-mock-adapter": "^1.22.0", + "eslint": "^8.49.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.28.1", "jest": "29.5.0", diff --git a/trade-finance-manager-ui/README.md b/trade-finance-manager-ui/README.md index 57ea7dad89..3ac589bbce 100644 --- a/trade-finance-manager-ui/README.md +++ b/trade-finance-manager-ui/README.md @@ -1,53 +1,56 @@ -# Trade Finance Manager UI +# Trade Finance Manager UI (TFM) :computer: -Also known as TFM; This UI is an internal application used to review deals after they have been submitted to UKEF. +TFM, also known as Trade Finance Manager UI, is an internal application used for reviewing deals after they have been submitted to UKEF (UK Export Finance). It uses GraphQL to query the TFM API for deals and facilities, rendering the data using GovUK and MOJ (Ministry of Justice) design components, with some custom components as well. -The UI uses GraphQL to query [TFM API](trade-finance-manager-api) for deals and facilities, then renders the data with GovUK and MOJ design components. There are some custom components. +## Purpose :clipboard: -The only logic in the codebase is for page routes, controllers, form validation and user permissions. The UI should be kept as simple as possible - only adding logic or business rules when it absolutely needs to be in the UI. +The primary purpose of the TFM UI is to provide a user-friendly interface for reviewing trade finance deals and related information. The codebase of this UI should prioritize simplicity and clarity, minimizing the inclusion of complex logic or business rules whenever possible. -## Prerequisite +## Prerequisite :key: -Make sure you have an `.env`. Use `.env.sample` as a base. Some sensitive variables need to be shared from the team. +Before running the TFM UI locally, ensure that you have an `.env` file configured. You can use `.env.sample` as a template. Some sensitive variables may need to be shared among the team. -## Running locally +## Running Locally :computer: -1. `docker-compose up` -2. Visit http://localhost:5003 in your browser +To run the TFM UI locally, follow these steps: -Alternatively, every service can be started from the root directory (`docker-compose up`). +1. Execute `docker-compose up`. +2. Visit [http://localhost:5003](http://localhost:5003) in your web browser. -## Login credentials +Alternatively, you can start all services from the project's root directory using `docker-compose up`. -See mock users: utils/mock-data-loader/tfm/users.js +## Login Credentials :key: -## Testing +Login credentials can be found in the mock users data, specifically in the file: `utils/mock-data-loader/tfm/users.js`. -### **Run a UI test suite** +## Testing :test_tube: + +### Run a UI Test Suite :heavy_check_mark: ```shell npm run test ``` -### **Run a single UI test** +### Run a Single UI Test :heavy_check_mark: ```shell npm run test /path/to/file.test.js ``` -### **Run UI component tests** +### Run UI Component Tests :heavy_check_mark: ```shell npm run component-test ``` -### **Run a single UI component tests** +### Run a Single UI Component Test :heavy_check_mark: ```shell npm run component-test ./component-tests/path/to/file.component-test.js ``` -### **End to end tests** +### End-to-End Tests :arrows_counterclockwise: -See e2e-tests README.md +For information about end-to-end tests, please refer to the `e2e-tests` README.md file. +--- diff --git a/trade-finance-manager-ui/package-lock.json b/trade-finance-manager-ui/package-lock.json index 8906b240a3..8ed17dbd81 100644 --- a/trade-finance-manager-ui/package-lock.json +++ b/trade-finance-manager-ui/package-lock.json @@ -28,7 +28,7 @@ "date-fns": "^2.30.0", "dotenv": "16.0.3", "express": "^4.18.2", - "express-rate-limit": "^6.11.0", + "express-rate-limit": "^6.11.2", "express-session": "1.17.3", "express-validator": "7.0.1", "express-xss-sanitizer": "^1.1.6", @@ -57,11 +57,11 @@ "@babel/preset-env": "7.21.5", "@babel/runtime": "7.21.5", "@types/jest": "^29.5.4", - "axios-mock-adapter": "^1.21.5", + "axios-mock-adapter": "^1.22.0", "babel-jest": "29.5.0", "babel-loader": "9.1.2", "copy-webpack-plugin": "^11.0.0", - "eslint": "^8.48.0", + "eslint": "^8.49.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.28.1", "file-loader": "^6.2.0", @@ -325,9 +325,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.15.tgz", - "integrity": "sha512-l1UiX4UyHSFsYt17iQ3Se5pQQZZHa22zyIXURmvkmLCD4t/aU+dvNWHatKac/D9Vm9UES7nvIqHs4jZqKviUmQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.17.tgz", + "integrity": "sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", @@ -365,14 +365,14 @@ } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz", - "integrity": "sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.17.tgz", + "integrity": "sha512-bxH77R5gjH3Nkde6/LuncQoLaP16THYPscurp1S8z7S9ZgezCyV3G8Hc+TZiCmY8pz4fp8CvKSgtJMW0FkLAxA==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-wrap-function": "^7.22.9" + "@babel/helper-wrap-function": "^7.22.17" }, "engines": { "node": ">=6.9.0" @@ -462,14 +462,14 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.10.tgz", - "integrity": "sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.17.tgz", + "integrity": "sha512-nAhoheCMlrqU41tAojw9GpVEKDlTS8r3lzFmF0lP52LwblCPbuFSO7nGIZoIcoU5NIm1ABrna0cJExE4Ay6l2Q==", "dev": true, "dependencies": { "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.10" + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.17" }, "engines": { "node": ">=6.9.0" @@ -1756,9 +1756,9 @@ } }, "node_modules/@babel/traverse": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.15.tgz", - "integrity": "sha512-DdHPwvJY0sEeN4xJU5uRLmZjgMMDIvMPniLuYzUVXj/GGzysPl0/fwt44JBkyUIzGJPV8QgHMcQdQ34XFuKTYQ==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.17.tgz", + "integrity": "sha512-xK4Uwm0JnAMvxYZxOVecss85WxTEIbTa7bnGyf/+EgCL5Zt3U7htUpEOWv9detPlamGKuRzCqw74xVglDWpPdg==", "dev": true, "dependencies": { "@babel/code-frame": "^7.22.13", @@ -1767,8 +1767,8 @@ "@babel/helper-function-name": "^7.22.5", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/types": "^7.22.17", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1777,9 +1777,9 @@ } }, "node_modules/@babel/types": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.15.tgz", - "integrity": "sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.17.tgz", + "integrity": "sha512-YSQPHLFtQNE5xN9tHuZnzu8vPr61wVTBZdfv1meex1NBosa4iT05k/Jw06ddJugi4bk7The/oSwQGFcksmEJQg==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", @@ -1821,9 +1821,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", - "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", + "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -1920,9 +1920,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", - "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", + "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2000,16 +2000,16 @@ } }, "node_modules/@jest/console": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.4.tgz", - "integrity": "sha512-wNK6gC0Ha9QeEPSkeJedQuTQqxZYnDPuDcDhVuVatRvMkL4D0VTvFVZj+Yuh6caG2aOfzkUZ36KtCmLNtR02hw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -2087,15 +2087,15 @@ } }, "node_modules/@jest/core": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.4.tgz", - "integrity": "sha512-U/vq5ccNTSVgYH7mHnodHmCffGWHJnz/E1BEWlLuK5pM4FZmGfBn/nrJGLjUsSmyx3otCeqc1T31F4y08AMDLg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, "dependencies": { - "@jest/console": "^29.6.4", - "@jest/reporters": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -2103,21 +2103,21 @@ "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.6.3", - "jest-config": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-resolve-dependencies": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "jest-watcher": "^29.6.4", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -2204,37 +2204,37 @@ } }, "node_modules/@jest/environment": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.4.tgz", - "integrity": "sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "dependencies": { - "@jest/fake-timers": "^29.6.4", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.3" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.4.tgz", - "integrity": "sha512-Warhsa7d23+3X5bLbrbYvaehcgX5TLYhI03JKoedTiI8uJU4IhqYBWF7OSSgUyz4IgLpUYPkK0AehA5/fRclAA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, "dependencies": { - "expect": "^29.6.4", - "jest-snapshot": "^29.6.4" + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.4.tgz", - "integrity": "sha512-FEhkJhqtvBwgSpiTrocquJCdXPsyvNKcl/n7A3u7X4pVoF4bswm11c9d4AV+kfq2Gpv/mM8x7E7DsRvH+djkrg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, "dependencies": { "jest-get-type": "^29.6.3" @@ -2244,47 +2244,47 @@ } }, "node_modules/@jest/fake-timers": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.4.tgz", - "integrity": "sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.4.tgz", - "integrity": "sha512-wVIn5bdtjlChhXAzVXavcY/3PEjf4VqM174BM3eGL5kMxLiZD5CLnbmkEyA1Dwh9q8XjP6E8RwjBsY/iCWrWsA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", "@jest/types": "^29.6.3", - "jest-mock": "^29.6.3" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.4.tgz", - "integrity": "sha512-sxUjWxm7QdchdrD3NfWKrL8FBsortZeibSJv4XLjESOOjSUOkjQcb0ZHJwfhEGIvBvTluTzfG2yZWZhkrXJu8g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", @@ -2298,9 +2298,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -2464,12 +2464,12 @@ } }, "node_modules/@jest/test-result": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.4.tgz", - "integrity": "sha512-uQ1C0AUEN90/dsyEirgMLlouROgSY+Wc/JanVVk0OiUKa5UFh7sJpMEM3aoUBAz2BRNvUJ8j3d294WFuRxSyOQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, "dependencies": { - "@jest/console": "^29.6.4", + "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" @@ -2479,14 +2479,14 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.4.tgz", - "integrity": "sha512-E84M6LbpcRq3fT4ckfKs9ryVanwkaIB0Ws9bw3/yP4seRLg/VaCZ/LgW0MCq5wwk4/iP/qnilD41aj2fsw2RMg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, "dependencies": { - "@jest/test-result": "^29.6.4", + "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -2494,9 +2494,9 @@ } }, "node_modules/@jest/transform": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz", - "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -2507,9 +2507,9 @@ "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -2964,9 +2964,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.5.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.9.tgz", - "integrity": "sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==" + "version": "20.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.0.tgz", + "integrity": "sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==" }, "node_modules/@types/stack-utils": { "version": "2.0.1", @@ -3611,9 +3611,9 @@ } }, "node_modules/axios-mock-adapter": { - "version": "1.21.5", - "resolved": "https://registry.npmjs.org/axios-mock-adapter/-/axios-mock-adapter-1.21.5.tgz", - "integrity": "sha512-5NI1V/VK+8+JeTF8niqOowuysA4b8mGzdlMN/QnTnoXbYh4HZSNiopsDclN2g/m85+G++IrEtUdZaQ3GnaMsSA==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/axios-mock-adapter/-/axios-mock-adapter-1.22.0.tgz", + "integrity": "sha512-dmI0KbkyAhntUR05YY96qg2H6gg0XMl2+qTW0xmYg6Up+BFBAJYRLROMXRdDEL06/Wqwa0TJThAYvFtSFdRCZw==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.3", @@ -4063,9 +4063,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001529", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001529.tgz", - "integrity": "sha512-n2pUQYGAkrLG4QYj2desAh+NqsJpHbNmVZz87imptDdxLAtjxary7Df/psdfyDGmskJK/9Dt9cPnx5RZ3CU4Og==", + "version": "1.0.30001534", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001534.tgz", + "integrity": "sha512-vlPVrhsCS7XaSh2VvWluIQEzVhefrUQcEsQWSS5A5V+dM07uv1qHeQzAOTGIMy9i3e9bH15+muvI/UHojVgS/Q==", "dev": true, "funding": [ { @@ -4516,6 +4516,97 @@ "url": "https://opencollective.com/core-js" } }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/create-jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/create-jest/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/create-jest/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/create-jest/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/create-jest/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -4776,12 +4867,27 @@ "node": ">=0.10.0" } }, + "node_modules/define-data-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.0.1.tgz", + "integrity": "sha512-22M+6zEspQHx10bfFQl2ET39IvfuQ7+rZIH7+ard8fCC4hPmkOSy+8JhKxBRLaWUziJ0O63NTYT97LR8zUfPTw==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -4941,9 +5047,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.512", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.512.tgz", - "integrity": "sha512-1W8wRbYlQE4ph7eoj3TJ+uqwO6+xvAE/L+KGU7WTQQvX3tnSIGZAb90MTsMoJqzntamiwJhBAj4WZmygXhsOUg==", + "version": "1.4.519", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.519.tgz", + "integrity": "sha512-kqs9oGYL4UFVkLKhqCTgBCYZv+wZ374yABDMqlDda9HvlkQxvSr7kgf4hfWVjMieDbX+1MwPHFBsOGCMIBaFKg==", "dev": true }, "node_modules/emittery": { @@ -5080,9 +5186,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", - "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz", + "integrity": "sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==", "dev": true }, "node_modules/es-set-tostringtag": { @@ -5149,16 +5255,16 @@ } }, "node_modules/eslint": { - "version": "8.48.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", - "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", + "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.48.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint/js": "8.49.0", + "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", @@ -5676,16 +5782,16 @@ } }, "node_modules/expect": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.4.tgz", - "integrity": "sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, "dependencies": { - "@jest/expect-utils": "^29.6.4", + "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3" + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -5733,9 +5839,9 @@ } }, "node_modules/express-rate-limit": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.0.tgz", - "integrity": "sha512-H9afltGTaEZcvenAB5LFgb/ysTMHUzMxoB3TJM6UHP5FtAP1p2+heMj1xwTei54Zm4I9I/2qsS5m+XrdKQp/Hw==", + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.2.tgz", + "integrity": "sha512-a7uwwfNTh1U60ssiIkuLFWHt4hAC5yxlLGU2VP0X4YNlyEDZAqF4tK3GD3NSitVBrCQmQ0++0uOyFOgC2y4DDw==", "engines": { "node": ">= 14" }, @@ -7334,13 +7440,13 @@ } }, "node_modules/jest-changed-files": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.6.3.tgz", - "integrity": "sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, "dependencies": { "execa": "^5.0.0", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "p-limit": "^3.1.0" }, "engines": { @@ -7348,28 +7454,28 @@ } }, "node_modules/jest-circus": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.4.tgz", - "integrity": "sha512-YXNrRyntVUgDfZbjXWBMPslX1mQ8MrSG0oM/Y06j9EYubODIyHWP8hMUbjbZ19M3M+zamqEur7O80HODwACoJw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/expect": "^29.6.4", - "@jest/test-result": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-runtime": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "p-limit": "^3.1.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" @@ -7449,22 +7555,21 @@ } }, "node_modules/jest-cli": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.4.tgz", - "integrity": "sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, "dependencies": { - "@jest/core": "^29.6.4", - "@jest/test-result": "^29.6.4", + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "chalk": "^4.0.0", + "create-jest": "^29.7.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", - "prompts": "^2.0.1", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "yargs": "^17.3.1" }, "bin": { @@ -7553,31 +7658,31 @@ } }, "node_modules/jest-config": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.4.tgz", - "integrity": "sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.6.4", + "@jest/test-sequencer": "^29.7.0", "@jest/types": "^29.6.3", - "babel-jest": "^29.6.4", + "babel-jest": "^29.7.0", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.6.4", - "jest-environment-node": "^29.6.4", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", "jest-get-type": "^29.6.3", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runner": "^29.6.4", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -7613,12 +7718,12 @@ } }, "node_modules/jest-config/node_modules/babel-jest": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.4.tgz", - "integrity": "sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "dependencies": { - "@jest/transform": "^29.6.4", + "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", @@ -7689,15 +7794,15 @@ } }, "node_modules/jest-diff": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.4.tgz", - "integrity": "sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -7774,9 +7879,9 @@ } }, "node_modules/jest-docblock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.6.3.tgz", - "integrity": "sha512-2+H+GOTQBEm2+qFSQ7Ma+BvyV+waiIFxmZF5LdpBsAEjWX8QYjSCa4FrkIYtbfXUJJJnFCYrOtt6TZ+IAiTjBQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, "dependencies": { "detect-newline": "^3.0.0" @@ -7786,16 +7891,16 @@ } }, "node_modules/jest-each": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.3.tgz", - "integrity": "sha512-KoXfJ42k8cqbkfshW7sSHcdfnv5agDdHCPA87ZBdmHP+zJstTJc0ttQaJ/x7zK6noAL76hOuTIJ6ZkQRS5dcyg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", - "jest-util": "^29.6.3", - "pretty-format": "^29.6.3" + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -7872,17 +7977,17 @@ } }, "node_modules/jest-environment-node": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.4.tgz", - "integrity": "sha512-i7SbpH2dEIFGNmxGCpSc2w9cA4qVD+wfvg2ZnfQ7XVrKL0NA5uDVBIiGH8SR4F0dKEv/0qI5r+aDomDf04DpEQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.6.3", - "jest-util": "^29.6.3" + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -7898,9 +8003,9 @@ } }, "node_modules/jest-haste-map": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz", - "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -7910,8 +8015,8 @@ "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", - "jest-util": "^29.6.3", - "jest-worker": "^29.6.4", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -7923,28 +8028,28 @@ } }, "node_modules/jest-leak-detector": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.3.tgz", - "integrity": "sha512-0kfbESIHXYdhAdpLsW7xdwmYhLf1BRu4AA118/OxFm0Ho1b2RcTmO4oF6aAMaxpxdxnJ3zve2rgwzNBD4Zbm7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, "dependencies": { "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.4.tgz", - "integrity": "sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.6.4", + "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -8021,9 +8126,9 @@ } }, "node_modules/jest-message-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.3.tgz", - "integrity": "sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", @@ -8032,7 +8137,7 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -8111,14 +8216,14 @@ } }, "node_modules/jest-mock": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.3.tgz", - "integrity": "sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", - "jest-util": "^29.6.3" + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -8151,17 +8256,17 @@ } }, "node_modules/jest-resolve": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.4.tgz", - "integrity": "sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", + "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.6.3", - "jest-validate": "^29.6.3", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" @@ -8171,13 +8276,13 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.4.tgz", - "integrity": "sha512-7+6eAmr1ZBF3vOAJVsfLj1QdqeXG+WYhidfLHBRZqGN24MFRIiKG20ItpLw2qRAsW/D2ZUUmCNf6irUr/v6KHA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, "dependencies": { "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.6.4" + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -8254,30 +8359,30 @@ } }, "node_modules/jest-runner": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.4.tgz", - "integrity": "sha512-SDaLrMmtVlQYDuG0iSPYLycG8P9jLI+fRm8AF/xPKhYDB2g6xDWjXBrR5M8gEWsK6KVFlebpZ4QsrxdyIX1Jaw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, "dependencies": { - "@jest/console": "^29.6.4", - "@jest/environment": "^29.6.4", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.6.3", - "jest-environment-node": "^29.6.4", - "jest-haste-map": "^29.6.4", - "jest-leak-detector": "^29.6.3", - "jest-message-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-runtime": "^29.6.4", - "jest-util": "^29.6.3", - "jest-watcher": "^29.6.4", - "jest-worker": "^29.6.4", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -8356,17 +8461,17 @@ } }, "node_modules/jest-runtime": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.4.tgz", - "integrity": "sha512-s/QxMBLvmwLdchKEjcLfwzP7h+jsHvNEtxGP5P+Fl1FMaJX2jMiIqe4rJw4tFprzCwuSvVUo9bn0uj4gNRXsbA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.4", - "@jest/fake-timers": "^29.6.4", - "@jest/globals": "^29.6.4", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", @@ -8374,13 +8479,13 @@ "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-mock": "^29.6.3", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.6.4", - "jest-snapshot": "^29.6.4", - "jest-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -8459,9 +8564,9 @@ } }, "node_modules/jest-snapshot": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.4.tgz", - "integrity": "sha512-VC1N8ED7+4uboUKGIDsbvNAZb6LakgIPgAF4RSpF13dN6YaMokfRqO+BaqK4zIh6X3JffgwbzuGqDEjHm/MrvA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -8469,20 +8574,20 @@ "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.6.4", - "@jest/transform": "^29.6.4", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.6.4", + "expect": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-diff": "^29.6.4", + "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.6.4", - "jest-message-util": "^29.6.3", - "jest-util": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "natural-compare": "^1.4.0", - "pretty-format": "^29.6.3", + "pretty-format": "^29.7.0", "semver": "^7.5.3" }, "engines": { @@ -8593,9 +8698,9 @@ "dev": true }, "node_modules/jest-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz", - "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -8680,9 +8785,9 @@ } }, "node_modules/jest-validate": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz", - "integrity": "sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "dependencies": { "@jest/types": "^29.6.3", @@ -8690,7 +8795,7 @@ "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^29.6.3" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -8779,18 +8884,18 @@ } }, "node_modules/jest-watcher": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.4.tgz", - "integrity": "sha512-oqUWvx6+On04ShsT00Ir9T4/FvBeEh2M9PTubgITPxDa739p4hoQweWPRGyYeaojgT0xTpZKF0Y/rSY1UgMxvQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, "dependencies": { - "@jest/test-result": "^29.6.4", + "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "string-length": "^4.0.1" }, "engines": { @@ -8868,13 +8973,13 @@ } }, "node_modules/jest-worker": { - "version": "29.6.4", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz", - "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.6.3", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -10412,9 +10517,9 @@ } }, "node_modules/pretty-format": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", - "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", @@ -10712,14 +10817,14 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "set-function-name": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -11119,6 +11224,19 @@ "node": ">= 0.8.0" } }, + "node_modules/set-function-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.0.tgz", + "integrity": "sha512-WmS8UHojv5s1eSoRSmzO5zzgDq8PE1/X/ij0k+9fMYmINCc6+j+SF3Om8YyucKn2yjnK4ItNZOoQycNnHsZJTw==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", diff --git a/trade-finance-manager-ui/package.json b/trade-finance-manager-ui/package.json index 43c00685d0..2b96a37e02 100644 --- a/trade-finance-manager-ui/package.json +++ b/trade-finance-manager-ui/package.json @@ -59,7 +59,7 @@ "date-fns": "^2.30.0", "dotenv": "16.0.3", "express": "^4.18.2", - "express-rate-limit": "^6.11.0", + "express-rate-limit": "^6.11.2", "express-session": "1.17.3", "express-validator": "7.0.1", "express-xss-sanitizer": "^1.1.6", @@ -88,11 +88,11 @@ "@babel/preset-env": "7.21.5", "@babel/runtime": "7.21.5", "@types/jest": "^29.5.4", - "axios-mock-adapter": "^1.21.5", + "axios-mock-adapter": "^1.22.0", "babel-jest": "29.5.0", "babel-loader": "9.1.2", "copy-webpack-plugin": "^11.0.0", - "eslint": "^8.48.0", + "eslint": "^8.49.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-import": "^2.28.1", "file-loader": "^6.2.0", diff --git a/utils/README.md b/utils/README.md index f3e93be006..9dcfb7c717 100644 --- a/utils/README.md +++ b/utils/README.md @@ -1,15 +1,12 @@ -# utils +# Utilities :wrench: +This section contains utility scripts and data for various purposes. -Mock data loader and data migration scripts for all services/products. +## Data Migration :arrows_counterclockwise: -## data-migration +The `data-migration` directory contains scripts designed to facilitate the migration of data from Portal V1 to Portal V2. For detailed instructions and usage, please refer to the [data-migration/README.md](data-migration/README.md) file. -Scripts to migrate Portal V1 deals, facilities, users and banks (BSS/EWCS, GEF) to Portal V2. +## Mock Data Loader :page_with_curl: -See data-migration/README.md +The `mock-data-loader` directory contains mock data that can be used for local development and in non-production environments. To learn more about how to use this mock data, please refer to the [mock-data-loader/README.md](mock-data-loader/README.md) file. -## mock-data-loader - -Mock data for local development and all non-production environments. - -See mock-data-loader/README.md +--- \ No newline at end of file diff --git a/utils/data-migration/.eslintrc.js b/utils/data-migration/.eslintrc.js index 9207e2885e..c704ebb3d4 100644 --- a/utils/data-migration/.eslintrc.js +++ b/utils/data-migration/.eslintrc.js @@ -19,7 +19,7 @@ module.exports = { 'implicit-arrow-linebreak': 'off', 'comma-dangle': 'off', 'no-loop-func': 'off', - 'import/no-unresolved': 'off', + 'import/no-unresolved': 'error', 'no-await-in-loop': 'off', 'import/extensions': 'off', 'no-restricted-syntax': 'off', diff --git a/utils/data-migration/README.md b/utils/data-migration/README.md index 4f71c33503..9f2265f2a3 100644 --- a/utils/data-migration/README.md +++ b/utils/data-migration/README.md @@ -1,70 +1,73 @@ -# Data migration +# Data Migration :rocket: -Scripts to migrate Portal V1 deals, facilities, users and banks (BSS/EWCS, GEF) to Portal V2. +Scripts to migrate Portal V1 deals, facilities, users, and banks (BSS/EWCS, GEF) to Portal V2. -:warning: To import any deals (BSS/EWCS/GEF), the database must have all Mandatory Criteria and Eligibility Criteria versions. These are stored in mock-data-loader. +:warning: **Important**: To import any deals (BSS/EWCS/GEF), the database must have all Mandatory Criteria and Eligibility Criteria versions. These are stored in mock-data-loader. -## Setup +## Setup :gear: ```shell npm install ``` -Make sure docker is running in the root directory of the repo. +Make sure Docker is running in the root directory of the repo. :whale: -## Portal - generic scripts (BSS, EWCS, GEF) +## Portal - Generic Scripts (BSS, EWCS, GEF) :computer: -### Migrate a single user belonging to a certain bank +### Migrate a Single User Belonging to a Certain Bank :man_technologist: -Add a JSON file to a new directory, and pass the path to the script: +To migrate a single user from V1 to V2 who belongs to a specific bank, you should create a JSON file containing the user's data and then use the following command: ```shell node bss-ewcs/migrate-users.js --bankId=961 --file=./path/to/user.json ``` -The V1 user will be mapped to V2 structure and added to the users collection. The users's bank must already be in the banks collection. +This script will map the V1 user's data to the V2 structure and add it to the users collection. Ensure that the user's bank is already in the banks collection. -### Migrate all users/banks +### Migrate All Users/Banks :busts_in_silhouette: -Add a JSON file to a new directory, and pass the path to the script: +To migrate multiple users from V1 to V2 along with their associated banks, create a JSON file containing the users' data and use the following command: ```shell node bss-ewcs/migrate-users.js --file=./path/to/users.json ``` -V1 users will be mapped to V2 structure and added to the users collection. The user banks must already be in the banks collection. +This script will map the V1 users' data to the V2 structure and add them to the users collection. Make sure that the user banks are already in the banks collection. -## BSS/EWCS scripts +## BSS/EWCS Scripts :chart_with_upwards_trend: -### Migrate all BSS/EWCS deals +### Migrate All BSS/EWCS Deals :moneybag: -Grabs deals from an Azure fileshare (that would contain deals from Workflow) and add them to our Portal/BSS database. +To migrate all BSS/EWCS deals from V1 to V2, the script grabs deals from an Azure fileshare (containing deals from Workflow) and adds them to the Portal/BSS database. Use the following command: ```shell node bss-ewcs/migrate-deals.js ``` -V1 deals will be mapped to V2 structure and added to the deals collection. Facilities will be added to the facilities collection. +This script will map the V1 deals to the V2 structure and add them to the deals collection. Facilities associated with these deals will also be added to the facilities collection. +mar +## GEF Scripts :rocket: -## GEF scripts +### Migrate All GEF Deals :money_with_wings: -### Migrate all GEF deals - -Add JSON files to a new directory, and pass the path to the script: +To migrate all GEF deals from V1 to V2, create JSON files containing the GEF deals' data and use the following command: ```shell -node gef/migrate-deals.js --path=./gef/dump +node gef/migrate-deals.js --path=./gef/dump ``` -V1 deals will be mapped to V2 structure and added to the deals collection. Facilities will added to the facilities collection. +This script will map the V1 GEF deals' data to the V2 structure and add them to the deals collection. Facilities associated with these deals will also be added to the facilities collection. -### Migrate a single GEF deal +### Migrate a Single GEF Deal :page_facing_up: -Add a JSON file and pass the file to the script: +To migrate a single GEF deal from V1 to V2, create a JSON file containing the deal's data and use the following command: ```shell node gef/migrate-deal.js --file=./gef/dump/12345.json ``` -The V1 deal will be mapped to V2 structure and added to the deals collection. Facilities, will be added to the facilities collection. +This script will map the V1 GEF deal's data to the V2 structure and add it to the deals collection. Facilities associated with this deal will also be added to the facilities collection. + +Make sure to follow the instructions and provide the required input data in JSON files as needed for each migration script. +--- diff --git a/utils/data-migration/package-lock.json b/utils/data-migration/package-lock.json index c695c81303..7dc04a6ee7 100644 --- a/utils/data-migration/package-lock.json +++ b/utils/data-migration/package-lock.json @@ -130,44 +130,44 @@ "optional": true }, "node_modules/@aws-sdk/client-cognito-identity": { - "version": "3.408.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.408.0.tgz", - "integrity": "sha512-SJfFXLvjnERmm9X4H/43J1Ax6lX3C5XwRn6eImBaBNwT4JQVMSG/kf9vG8dvLkvvnh4t1RM7p12bkc9AI41zBA==", + "version": "3.410.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.410.0.tgz", + "integrity": "sha512-J4iPhXswm66Fsk1x0Kly+PWzBizmms4kkkoAU1sk9n08XfWqNBTyf01mx6/t/X+Yh43p2zaeB/XvUwa0jSsWaQ==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.408.0", - "@aws-sdk/credential-provider-node": "3.408.0", - "@aws-sdk/middleware-host-header": "3.408.0", - "@aws-sdk/middleware-logger": "3.408.0", - "@aws-sdk/middleware-recursion-detection": "3.408.0", - "@aws-sdk/middleware-signing": "3.408.0", - "@aws-sdk/middleware-user-agent": "3.408.0", - "@aws-sdk/types": "3.408.0", - "@aws-sdk/util-endpoints": "3.408.0", - "@aws-sdk/util-user-agent-browser": "3.408.0", - "@aws-sdk/util-user-agent-node": "3.408.0", - "@smithy/config-resolver": "^2.0.5", - "@smithy/fetch-http-handler": "^2.0.5", - "@smithy/hash-node": "^2.0.5", - "@smithy/invalid-dependency": "^2.0.5", - "@smithy/middleware-content-length": "^2.0.5", - "@smithy/middleware-endpoint": "^2.0.5", - "@smithy/middleware-retry": "^2.0.5", - "@smithy/middleware-serde": "^2.0.5", + "@aws-sdk/client-sts": "3.410.0", + "@aws-sdk/credential-provider-node": "3.410.0", + "@aws-sdk/middleware-host-header": "3.410.0", + "@aws-sdk/middleware-logger": "3.410.0", + "@aws-sdk/middleware-recursion-detection": "3.410.0", + "@aws-sdk/middleware-signing": "3.410.0", + "@aws-sdk/middleware-user-agent": "3.410.0", + "@aws-sdk/types": "3.410.0", + "@aws-sdk/util-endpoints": "3.410.0", + "@aws-sdk/util-user-agent-browser": "3.410.0", + "@aws-sdk/util-user-agent-node": "3.410.0", + "@smithy/config-resolver": "^2.0.7", + "@smithy/fetch-http-handler": "^2.1.2", + "@smithy/hash-node": "^2.0.6", + "@smithy/invalid-dependency": "^2.0.6", + "@smithy/middleware-content-length": "^2.0.8", + "@smithy/middleware-endpoint": "^2.0.6", + "@smithy/middleware-retry": "^2.0.9", + "@smithy/middleware-serde": "^2.0.6", "@smithy/middleware-stack": "^2.0.0", - "@smithy/node-config-provider": "^2.0.6", - "@smithy/node-http-handler": "^2.0.5", - "@smithy/protocol-http": "^2.0.5", - "@smithy/smithy-client": "^2.0.5", - "@smithy/types": "^2.2.2", - "@smithy/url-parser": "^2.0.5", + "@smithy/node-config-provider": "^2.0.9", + "@smithy/node-http-handler": "^2.1.2", + "@smithy/protocol-http": "^3.0.2", + "@smithy/smithy-client": "^2.1.3", + "@smithy/types": "^2.3.0", + "@smithy/url-parser": "^2.0.6", "@smithy/util-base64": "^2.0.0", "@smithy/util-body-length-browser": "^2.0.0", "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.6", - "@smithy/util-defaults-mode-node": "^2.0.6", + "@smithy/util-defaults-mode-browser": "^2.0.7", + "@smithy/util-defaults-mode-node": "^2.0.9", "@smithy/util-retry": "^2.0.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" @@ -177,41 +177,41 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.408.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.408.0.tgz", - "integrity": "sha512-g0Y904ghLTg9JLJnmbuvf10Hrzwqn2pko6aCAK10vCI5Y2nQ6BAUXuPonxhZIlp+JHsk0B2FUBqquc+bErUspA==", + "version": "3.410.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.410.0.tgz", + "integrity": "sha512-MC9GrgwtlOuSL2WS3DRM3dQ/5y+49KSMMJRH6JiEcU5vE0dX/OtEcX+VfEwpi73x5pSfIjm7xnzjzOFx+sQBIg==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/middleware-host-header": "3.408.0", - "@aws-sdk/middleware-logger": "3.408.0", - "@aws-sdk/middleware-recursion-detection": "3.408.0", - "@aws-sdk/middleware-user-agent": "3.408.0", - "@aws-sdk/types": "3.408.0", - "@aws-sdk/util-endpoints": "3.408.0", - "@aws-sdk/util-user-agent-browser": "3.408.0", - "@aws-sdk/util-user-agent-node": "3.408.0", - "@smithy/config-resolver": "^2.0.5", - "@smithy/fetch-http-handler": "^2.0.5", - "@smithy/hash-node": "^2.0.5", - "@smithy/invalid-dependency": "^2.0.5", - "@smithy/middleware-content-length": "^2.0.5", - "@smithy/middleware-endpoint": "^2.0.5", - "@smithy/middleware-retry": "^2.0.5", - "@smithy/middleware-serde": "^2.0.5", + "@aws-sdk/middleware-host-header": "3.410.0", + "@aws-sdk/middleware-logger": "3.410.0", + "@aws-sdk/middleware-recursion-detection": "3.410.0", + "@aws-sdk/middleware-user-agent": "3.410.0", + "@aws-sdk/types": "3.410.0", + "@aws-sdk/util-endpoints": "3.410.0", + "@aws-sdk/util-user-agent-browser": "3.410.0", + "@aws-sdk/util-user-agent-node": "3.410.0", + "@smithy/config-resolver": "^2.0.7", + "@smithy/fetch-http-handler": "^2.1.2", + "@smithy/hash-node": "^2.0.6", + "@smithy/invalid-dependency": "^2.0.6", + "@smithy/middleware-content-length": "^2.0.8", + "@smithy/middleware-endpoint": "^2.0.6", + "@smithy/middleware-retry": "^2.0.9", + "@smithy/middleware-serde": "^2.0.6", "@smithy/middleware-stack": "^2.0.0", - "@smithy/node-config-provider": "^2.0.6", - "@smithy/node-http-handler": "^2.0.5", - "@smithy/protocol-http": "^2.0.5", - "@smithy/smithy-client": "^2.0.5", - "@smithy/types": "^2.2.2", - "@smithy/url-parser": "^2.0.5", + "@smithy/node-config-provider": "^2.0.9", + "@smithy/node-http-handler": "^2.1.2", + "@smithy/protocol-http": "^3.0.2", + "@smithy/smithy-client": "^2.1.3", + "@smithy/types": "^2.3.0", + "@smithy/url-parser": "^2.0.6", "@smithy/util-base64": "^2.0.0", "@smithy/util-body-length-browser": "^2.0.0", "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.6", - "@smithy/util-defaults-mode-node": "^2.0.6", + "@smithy/util-defaults-mode-browser": "^2.0.7", + "@smithy/util-defaults-mode-node": "^2.0.9", "@smithy/util-retry": "^2.0.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" @@ -221,44 +221,44 @@ } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.408.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.408.0.tgz", - "integrity": "sha512-PpNmhCuFjVrgGBy00RVh3evBxzFfvUrALDqpBnPYhz489Qzg2I+T90FqdSUedPQPYe+qhq0YJMPKc9leYBEB/w==", + "version": "3.410.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.410.0.tgz", + "integrity": "sha512-e6VMrBJtnTxxUXwDmkADGIvyppmDMFf4+cGGA68tVCUm1cFNlCI6M/67bVSIPN/WVKAAfhEL5O2vVXCM7aatYg==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/credential-provider-node": "3.408.0", - "@aws-sdk/middleware-host-header": "3.408.0", - "@aws-sdk/middleware-logger": "3.408.0", - "@aws-sdk/middleware-recursion-detection": "3.408.0", - "@aws-sdk/middleware-sdk-sts": "3.408.0", - "@aws-sdk/middleware-signing": "3.408.0", - "@aws-sdk/middleware-user-agent": "3.408.0", - "@aws-sdk/types": "3.408.0", - "@aws-sdk/util-endpoints": "3.408.0", - "@aws-sdk/util-user-agent-browser": "3.408.0", - "@aws-sdk/util-user-agent-node": "3.408.0", - "@smithy/config-resolver": "^2.0.5", - "@smithy/fetch-http-handler": "^2.0.5", - "@smithy/hash-node": "^2.0.5", - "@smithy/invalid-dependency": "^2.0.5", - "@smithy/middleware-content-length": "^2.0.5", - "@smithy/middleware-endpoint": "^2.0.5", - "@smithy/middleware-retry": "^2.0.5", - "@smithy/middleware-serde": "^2.0.5", + "@aws-sdk/credential-provider-node": "3.410.0", + "@aws-sdk/middleware-host-header": "3.410.0", + "@aws-sdk/middleware-logger": "3.410.0", + "@aws-sdk/middleware-recursion-detection": "3.410.0", + "@aws-sdk/middleware-sdk-sts": "3.410.0", + "@aws-sdk/middleware-signing": "3.410.0", + "@aws-sdk/middleware-user-agent": "3.410.0", + "@aws-sdk/types": "3.410.0", + "@aws-sdk/util-endpoints": "3.410.0", + "@aws-sdk/util-user-agent-browser": "3.410.0", + "@aws-sdk/util-user-agent-node": "3.410.0", + "@smithy/config-resolver": "^2.0.7", + "@smithy/fetch-http-handler": "^2.1.2", + "@smithy/hash-node": "^2.0.6", + "@smithy/invalid-dependency": "^2.0.6", + "@smithy/middleware-content-length": "^2.0.8", + "@smithy/middleware-endpoint": "^2.0.6", + "@smithy/middleware-retry": "^2.0.9", + "@smithy/middleware-serde": "^2.0.6", "@smithy/middleware-stack": "^2.0.0", - "@smithy/node-config-provider": "^2.0.6", - "@smithy/node-http-handler": "^2.0.5", - "@smithy/protocol-http": "^2.0.5", - "@smithy/smithy-client": "^2.0.5", - "@smithy/types": "^2.2.2", - "@smithy/url-parser": "^2.0.5", + "@smithy/node-config-provider": "^2.0.9", + "@smithy/node-http-handler": "^2.1.2", + "@smithy/protocol-http": "^3.0.2", + "@smithy/smithy-client": "^2.1.3", + "@smithy/types": "^2.3.0", + "@smithy/url-parser": "^2.0.6", "@smithy/util-base64": "^2.0.0", "@smithy/util-body-length-browser": "^2.0.0", "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.6", - "@smithy/util-defaults-mode-node": "^2.0.6", + "@smithy/util-defaults-mode-browser": "^2.0.7", + "@smithy/util-defaults-mode-node": "^2.0.9", "@smithy/util-retry": "^2.0.0", "@smithy/util-utf8": "^2.0.0", "fast-xml-parser": "4.2.5", @@ -269,15 +269,15 @@ } }, "node_modules/@aws-sdk/credential-provider-cognito-identity": { - "version": "3.408.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.408.0.tgz", - "integrity": "sha512-P3Yj/u54oceD4CHzoHgvb2YAmrKTm/uqsgbJcWJ6RwEkJ7awF6aOzUYLRK1z1PCtfq6YdHUmrv2RkxcQnQeboA==", + "version": "3.410.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.410.0.tgz", + "integrity": "sha512-2QMvdnwnYsKnwy8O+o9ozKL80VFWI0skXVvKB3DFW4cr9IX5cBCx7xuhI7TXbCqiBxuz5SSiA1s19fVtq0sUmw==", "optional": true, "dependencies": { - "@aws-sdk/client-cognito-identity": "3.408.0", - "@aws-sdk/types": "3.408.0", + "@aws-sdk/client-cognito-identity": "3.410.0", + "@aws-sdk/types": "3.410.0", "@smithy/property-provider": "^2.0.0", - "@smithy/types": "^2.2.2", + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" }, "engines": { @@ -285,14 +285,14 @@ } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.408.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.408.0.tgz", - "integrity": "sha512-GCpgHEHxRTzKaMkwDC2gLb3xlD+ZxhKPUJ1DVcO7I9E3eCGJsYVedIi0/2XE+NP+HVoy8LyW2qH8QQWh64JKow==", + "version": "3.410.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.410.0.tgz", + "integrity": "sha512-c7TB9LbN0PkFOsXI0lcRJnqPNOmc4VBvrHf8jP/BkTDg4YUoKQKOFd4d0SqzODmlZiAyoMQVZTR4ISZo95Zj4Q==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.408.0", + "@aws-sdk/types": "3.410.0", "@smithy/property-provider": "^2.0.0", - "@smithy/types": "^2.2.2", + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" }, "engines": { @@ -300,20 +300,20 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.408.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.408.0.tgz", - "integrity": "sha512-vXuayXiwHncd3Xush0jQYrnu2aPPlE+fpdnpEdZGgUJwdbv2vSeYZ73ldH1LzCd179BEDVT0J7nHc7fposo3kg==", + "version": "3.410.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.410.0.tgz", + "integrity": "sha512-D8rcr5bRCFD0f42MPQ7K6TWZq5d3pfqrKINL1/bpfkK5BJbvq1BGYmR88UC6CLpTRtZ1LHY2HgYG0fp/2zjjww==", "optional": true, "dependencies": { - "@aws-sdk/credential-provider-env": "3.408.0", - "@aws-sdk/credential-provider-process": "3.408.0", - "@aws-sdk/credential-provider-sso": "3.408.0", - "@aws-sdk/credential-provider-web-identity": "3.408.0", - "@aws-sdk/types": "3.408.0", + "@aws-sdk/credential-provider-env": "3.410.0", + "@aws-sdk/credential-provider-process": "3.410.0", + "@aws-sdk/credential-provider-sso": "3.410.0", + "@aws-sdk/credential-provider-web-identity": "3.410.0", + "@aws-sdk/types": "3.410.0", "@smithy/credential-provider-imds": "^2.0.0", "@smithy/property-provider": "^2.0.0", "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/types": "^2.2.2", + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" }, "engines": { @@ -321,21 +321,21 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.408.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.408.0.tgz", - "integrity": "sha512-AzDtlj2Mb01K5+AiDI14HsIs9I/pI4nM3kxeOZZvocaaThF5OFR+4wR2v2plhfGJ8QAPEE/KnqcJ3JlJ7orShg==", + "version": "3.410.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.410.0.tgz", + "integrity": "sha512-0wmVm33T/j1FS7MZ/j+WsPlgSc0YnCXnpbWSov1Mn6R86SHI2b2JhdIPRRE4XbGfyW2QGNUl2CwoZVaqhXeF5g==", "optional": true, "dependencies": { - "@aws-sdk/credential-provider-env": "3.408.0", - "@aws-sdk/credential-provider-ini": "3.408.0", - "@aws-sdk/credential-provider-process": "3.408.0", - "@aws-sdk/credential-provider-sso": "3.408.0", - "@aws-sdk/credential-provider-web-identity": "3.408.0", - "@aws-sdk/types": "3.408.0", + "@aws-sdk/credential-provider-env": "3.410.0", + "@aws-sdk/credential-provider-ini": "3.410.0", + "@aws-sdk/credential-provider-process": "3.410.0", + "@aws-sdk/credential-provider-sso": "3.410.0", + "@aws-sdk/credential-provider-web-identity": "3.410.0", + "@aws-sdk/types": "3.410.0", "@smithy/credential-provider-imds": "^2.0.0", "@smithy/property-provider": "^2.0.0", "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/types": "^2.2.2", + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" }, "engines": { @@ -343,15 +343,15 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.408.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.408.0.tgz", - "integrity": "sha512-qCTf9tr6+I2s3+v5zP4YRQQrGlYw/jyZ7u/k6bGshhlvgwGPfjNuHrM8uK/W1kv4ng1myxaL1/tAY6RVVdXz4Q==", + "version": "3.410.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.410.0.tgz", + "integrity": "sha512-BMju1hlDCDNkkSZpKF5SQ8G0WCLRj6/Jvw9QmudLHJuVwYJXEW1r2AsVMg98OZ3hB9G+MAvHruHZIbMiNmUMXQ==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.408.0", + "@aws-sdk/types": "3.410.0", "@smithy/property-provider": "^2.0.0", "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/types": "^2.2.2", + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" }, "engines": { @@ -359,17 +359,17 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.408.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.408.0.tgz", - "integrity": "sha512-iKU91cxrttQyDhdhF7vJZd6XibvwGolFzuJBG4DD4jOdvmTcVq4L26AH8bjR1psnS6pvTa66FaYt6BGtbXgVeA==", + "version": "3.410.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.410.0.tgz", + "integrity": "sha512-zEaoY/sY+KYTlQUkp9dvveAHf175b8RIt0DsQkDrRPtrg/RBHR00r5rFvz9+nrwsR8546RaBU7h/zzTaQGhmcA==", "optional": true, "dependencies": { - "@aws-sdk/client-sso": "3.408.0", - "@aws-sdk/token-providers": "3.408.0", - "@aws-sdk/types": "3.408.0", + "@aws-sdk/client-sso": "3.410.0", + "@aws-sdk/token-providers": "3.410.0", + "@aws-sdk/types": "3.410.0", "@smithy/property-provider": "^2.0.0", "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/types": "^2.2.2", + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" }, "engines": { @@ -377,14 +377,14 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.408.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.408.0.tgz", - "integrity": "sha512-5FbDPF/zY/1t6k1zRI/HnrxcH2v7SwsEYu2SThI2qbzaP/K7MTnTanV5vNFcdQOpuQ7x3PrzTlH3AWZueCr3Vw==", + "version": "3.410.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.410.0.tgz", + "integrity": "sha512-cE0l8LmEHdWbDkdPNgrfdYSgp4/cIVXrjUKI1QCATA729CrHZ/OQjB/maOBOrMHO9YTiggko887NkslVvwVB7w==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.408.0", + "@aws-sdk/types": "3.410.0", "@smithy/property-provider": "^2.0.0", - "@smithy/types": "^2.2.2", + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" }, "engines": { @@ -392,25 +392,25 @@ } }, "node_modules/@aws-sdk/credential-providers": { - "version": "3.408.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.408.0.tgz", - "integrity": "sha512-NVE5hDXlY4I4nRtaxf4vPTABWn2PoRUjCGW9HEOzD/oQx054OsXW0n1umviDncYCfiroCveRERM2htVIGiREng==", - "optional": true, - "dependencies": { - "@aws-sdk/client-cognito-identity": "3.408.0", - "@aws-sdk/client-sso": "3.408.0", - "@aws-sdk/client-sts": "3.408.0", - "@aws-sdk/credential-provider-cognito-identity": "3.408.0", - "@aws-sdk/credential-provider-env": "3.408.0", - "@aws-sdk/credential-provider-ini": "3.408.0", - "@aws-sdk/credential-provider-node": "3.408.0", - "@aws-sdk/credential-provider-process": "3.408.0", - "@aws-sdk/credential-provider-sso": "3.408.0", - "@aws-sdk/credential-provider-web-identity": "3.408.0", - "@aws-sdk/types": "3.408.0", + "version": "3.410.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.410.0.tgz", + "integrity": "sha512-QcunzQRNi9dJdAGdduST7itRW+QhDrb9zZHn+HhLKUoVwLrqk1iuH2R9SoEdZg8eV5jR04yoOPdjj1jzdIkFXQ==", + "optional": true, + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.410.0", + "@aws-sdk/client-sso": "3.410.0", + "@aws-sdk/client-sts": "3.410.0", + "@aws-sdk/credential-provider-cognito-identity": "3.410.0", + "@aws-sdk/credential-provider-env": "3.410.0", + "@aws-sdk/credential-provider-ini": "3.410.0", + "@aws-sdk/credential-provider-node": "3.410.0", + "@aws-sdk/credential-provider-process": "3.410.0", + "@aws-sdk/credential-provider-sso": "3.410.0", + "@aws-sdk/credential-provider-web-identity": "3.410.0", + "@aws-sdk/types": "3.410.0", "@smithy/credential-provider-imds": "^2.0.0", "@smithy/property-provider": "^2.0.0", - "@smithy/types": "^2.2.2", + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" }, "engines": { @@ -418,14 +418,14 @@ } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.408.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.408.0.tgz", - "integrity": "sha512-eofCXuSZ+ntbLzeCRdHzraXzgWqAplXU7W2qFFVC4O9lZBhADwNPI8n8x98TH0mftnmvZxh5Bo5U8WvEolIDkw==", + "version": "3.410.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.410.0.tgz", + "integrity": "sha512-ED/OVcyITln5rrxnajZP+V0PN1nug+gSDHJDqdDo/oLy7eiDr/ZWn3nlWW7WcMplQ1/Jnb+hK0UetBp/25XooA==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.408.0", - "@smithy/protocol-http": "^2.0.5", - "@smithy/types": "^2.2.2", + "@aws-sdk/types": "3.410.0", + "@smithy/protocol-http": "^3.0.2", + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" }, "engines": { @@ -433,13 +433,13 @@ } }, "node_modules/@aws-sdk/middleware-logger": { - "version": "3.408.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.408.0.tgz", - "integrity": "sha512-otwXPCubsGRFv8Hb6nKw6Vvnu4dC8CcPk05buStj42nF8QdjWrKGb2rDCvLph5lr576LF5HN+Y2moyOi7z/I7g==", + "version": "3.410.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.410.0.tgz", + "integrity": "sha512-YtmKYCVtBfScq3/UFJk+aSZOktKJBNZL9DaSc2aPcy/goCVsYDOkGwtHk0jIkC1JRSNCkVTqL7ya60sSr8zaQQ==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.408.0", - "@smithy/types": "^2.2.2", + "@aws-sdk/types": "3.410.0", + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" }, "engines": { @@ -447,14 +447,14 @@ } }, "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.408.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.408.0.tgz", - "integrity": "sha512-QfZwmX5z0IRC2c8pBi9VozSqbJw19V5oxyykSTqdjGe3CG3yNujXObV6xQesK67CWSnPb9wDgVGKUoYuIXwOxw==", + "version": "3.410.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.410.0.tgz", + "integrity": "sha512-KWaes5FLzRqj28vaIEE4Bimpga2E596WdPF2HaH6zsVMJddoRDsc3ZX9ZhLOGrXzIO1RqBd0QxbLrM0S/B2aOQ==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.408.0", - "@smithy/protocol-http": "^2.0.5", - "@smithy/types": "^2.2.2", + "@aws-sdk/types": "3.410.0", + "@smithy/protocol-http": "^3.0.2", + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" }, "engines": { @@ -462,14 +462,14 @@ } }, "node_modules/@aws-sdk/middleware-sdk-sts": { - "version": "3.408.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.408.0.tgz", - "integrity": "sha512-dIO9BTX049P2PwaeAK2lxJeA2rZi9/bWzMP1GIE60VrMDHmN5Ljvh1lLActECLAqNQIqN5Ub0bKV2tC/jMn+CA==", + "version": "3.410.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.410.0.tgz", + "integrity": "sha512-YfBpctDocRR4CcROoDueJA7D+aMLBV8nTFfmVNdLLLgyuLZ/AUR11VQSu1lf9gQZKl8IpKE/BLf2fRE/qV1ZuA==", "optional": true, "dependencies": { - "@aws-sdk/middleware-signing": "3.408.0", - "@aws-sdk/types": "3.408.0", - "@smithy/types": "^2.2.2", + "@aws-sdk/middleware-signing": "3.410.0", + "@aws-sdk/types": "3.410.0", + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" }, "engines": { @@ -477,16 +477,16 @@ } }, "node_modules/@aws-sdk/middleware-signing": { - "version": "3.408.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.408.0.tgz", - "integrity": "sha512-flLiLKATJ4NLcLb7lPojyQ6NvLSyQ3axqIClqwMRnhSRxvREB7OgBKwmPecSl0I5JxsNEqo+mjARdMjUHadgWQ==", + "version": "3.410.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.410.0.tgz", + "integrity": "sha512-KBAZ/eoAJUSJv5us2HsKwK2OszG2s9FEyKpEhgnHLcbbKzW873zHBH5GcOGEQu4AWArTy2ndzJu3FF+9/J9hJQ==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.408.0", + "@aws-sdk/types": "3.410.0", "@smithy/property-provider": "^2.0.0", - "@smithy/protocol-http": "^2.0.5", + "@smithy/protocol-http": "^3.0.2", "@smithy/signature-v4": "^2.0.0", - "@smithy/types": "^2.2.2", + "@smithy/types": "^2.3.0", "@smithy/util-middleware": "^2.0.0", "tslib": "^2.5.0" }, @@ -495,15 +495,15 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.408.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.408.0.tgz", - "integrity": "sha512-UvlKri8/Mgf5W+tFU6ZJ65fC6HljcysIqfRFts/8Wurl322IS1I4j+pyjV2P6eK1054bzynfi3Trv+tRYHtVcA==", + "version": "3.410.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.410.0.tgz", + "integrity": "sha512-ZayDtLfvCZUohSxQc/49BfoU/y6bDHLfLdyyUJbJ54Sv8zQcrmdyKvCBFUZwE6tHQgAmv9/ZT18xECMl+xiONA==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.408.0", - "@aws-sdk/util-endpoints": "3.408.0", - "@smithy/protocol-http": "^2.0.5", - "@smithy/types": "^2.2.2", + "@aws-sdk/types": "3.410.0", + "@aws-sdk/util-endpoints": "3.410.0", + "@smithy/protocol-http": "^3.0.2", + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" }, "engines": { @@ -511,43 +511,43 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.408.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.408.0.tgz", - "integrity": "sha512-D//BjUrVtDzDdCz1mRdZZSAc822fh75Ssq46smeS6S6NKq3vJeHhfrQJMyVU1GclXu1tn9AwykaQW5Jwb5im+g==", + "version": "3.410.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.410.0.tgz", + "integrity": "sha512-d5Nc0xydkH/X0LA1HDyhGY5sEv4LuADFk+QpDtT8ogLilcre+b1jpdY8Sih/gd1KoGS1H+d1tz2hSGwUHAbUbw==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/middleware-host-header": "3.408.0", - "@aws-sdk/middleware-logger": "3.408.0", - "@aws-sdk/middleware-recursion-detection": "3.408.0", - "@aws-sdk/middleware-user-agent": "3.408.0", - "@aws-sdk/types": "3.408.0", - "@aws-sdk/util-endpoints": "3.408.0", - "@aws-sdk/util-user-agent-browser": "3.408.0", - "@aws-sdk/util-user-agent-node": "3.408.0", - "@smithy/config-resolver": "^2.0.5", - "@smithy/fetch-http-handler": "^2.0.5", - "@smithy/hash-node": "^2.0.5", - "@smithy/invalid-dependency": "^2.0.5", - "@smithy/middleware-content-length": "^2.0.5", - "@smithy/middleware-endpoint": "^2.0.5", - "@smithy/middleware-retry": "^2.0.5", - "@smithy/middleware-serde": "^2.0.5", + "@aws-sdk/middleware-host-header": "3.410.0", + "@aws-sdk/middleware-logger": "3.410.0", + "@aws-sdk/middleware-recursion-detection": "3.410.0", + "@aws-sdk/middleware-user-agent": "3.410.0", + "@aws-sdk/types": "3.410.0", + "@aws-sdk/util-endpoints": "3.410.0", + "@aws-sdk/util-user-agent-browser": "3.410.0", + "@aws-sdk/util-user-agent-node": "3.410.0", + "@smithy/config-resolver": "^2.0.7", + "@smithy/fetch-http-handler": "^2.1.2", + "@smithy/hash-node": "^2.0.6", + "@smithy/invalid-dependency": "^2.0.6", + "@smithy/middleware-content-length": "^2.0.8", + "@smithy/middleware-endpoint": "^2.0.6", + "@smithy/middleware-retry": "^2.0.9", + "@smithy/middleware-serde": "^2.0.6", "@smithy/middleware-stack": "^2.0.0", - "@smithy/node-config-provider": "^2.0.6", - "@smithy/node-http-handler": "^2.0.5", + "@smithy/node-config-provider": "^2.0.9", + "@smithy/node-http-handler": "^2.1.2", "@smithy/property-provider": "^2.0.0", - "@smithy/protocol-http": "^2.0.5", + "@smithy/protocol-http": "^3.0.2", "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/smithy-client": "^2.0.5", - "@smithy/types": "^2.2.2", - "@smithy/url-parser": "^2.0.5", + "@smithy/smithy-client": "^2.1.3", + "@smithy/types": "^2.3.0", + "@smithy/url-parser": "^2.0.6", "@smithy/util-base64": "^2.0.0", "@smithy/util-body-length-browser": "^2.0.0", "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.6", - "@smithy/util-defaults-mode-node": "^2.0.6", + "@smithy/util-defaults-mode-browser": "^2.0.7", + "@smithy/util-defaults-mode-node": "^2.0.9", "@smithy/util-retry": "^2.0.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" @@ -557,12 +557,12 @@ } }, "node_modules/@aws-sdk/types": { - "version": "3.408.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.408.0.tgz", - "integrity": "sha512-sIsR5224xWQTW7O6h4V0S7DMWs4bK4DCunwOo7Avpq7ZVmH2YyLTs0n4NGL186j8xTosycF1ACQgpM48SLIvaA==", + "version": "3.410.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.410.0.tgz", + "integrity": "sha512-D7iaUCszv/v04NDaZUmCmekamy6VD/lKozm/3gS9+dkfU6cC2CsNoUfPV8BlV6dPdw0oWgF91am3I1stdvfVrQ==", "optional": true, "dependencies": { - "@smithy/types": "^2.2.2", + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" }, "engines": { @@ -570,12 +570,12 @@ } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.408.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.408.0.tgz", - "integrity": "sha512-N1D5cKEkCqf5Q7IF/pI9kfcNrT+/5ctZ6cQo4Ex6xaOcnUzdOZcXdPqaMRZVZRn8enjK2SpoLlRpXGISOugPaw==", + "version": "3.410.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.410.0.tgz", + "integrity": "sha512-iNiqJyC7N3+8zFwnXUqcWSxrZecVZLToo1iTQQdeYL2af1IcOtRgb7n8jpAI/hmXhBSx2+3RI+Y7pxyFo1vu+w==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.408.0", + "@aws-sdk/types": "3.410.0", "tslib": "^2.5.0" }, "engines": { @@ -595,26 +595,26 @@ } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.408.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.408.0.tgz", - "integrity": "sha512-wOVjDprG5h6kM8aJZk/tRX/RgxNxr73d6kIsUePlAgil13q62M9lcFMcIXduqtDsa1B6FfVB2wx/pyUuOZri5g==", + "version": "3.410.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.410.0.tgz", + "integrity": "sha512-i1G/XGpXGMRT2zEiAhi1xucJsfCWk8nNYjk/LbC0sA+7B9Huri96YAzVib12wkHPsJQvZxZC6CpQDIHWm4lXMA==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.408.0", - "@smithy/types": "^2.2.2", + "@aws-sdk/types": "3.410.0", + "@smithy/types": "^2.3.0", "bowser": "^2.11.0", "tslib": "^2.5.0" } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.408.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.408.0.tgz", - "integrity": "sha512-BzMFV+cIXrtfcfJk3GpXnkANFkzZisvAtD306TMgIscn5FF26K1jD5DU+h5Q5WMq7gx+oXh9kJ3Lu3hi7hahKQ==", + "version": "3.410.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.410.0.tgz", + "integrity": "sha512-bK70t1jHRl8HrJXd4hEIwc5PBZ7U0w+81AKFnanIVKZwZedd6nLibUXDTK14z/Jp2GFcBqd4zkt2YLGkRt/U4A==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.408.0", - "@smithy/node-config-provider": "^2.0.6", - "@smithy/types": "^2.2.2", + "@aws-sdk/types": "3.410.0", + "@smithy/node-config-provider": "^2.0.9", + "@smithy/types": "^2.3.0", "tslib": "^2.5.0" }, "engines": { @@ -659,12 +659,12 @@ } }, "node_modules/@smithy/abort-controller": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.6.tgz", - "integrity": "sha512-4I7g0lyGUlW2onf8mD76IzU37oRWSHsQ5zlW5MjDzgg4I4J9bOK4500Gx6qOuoN7+GulAnGLe1YwyrIluzhakg==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.7.tgz", + "integrity": "sha512-rITz65zk8QA3GQ1OeoJ3/Q4+8j/HqubWU8TBqk57BMYTOX+P+LNMoVHPqzLHhE6qKot5muhThNCYvOKNt7ojJA==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.0", + "@smithy/types": "^2.3.1", "tslib": "^2.5.0" }, "engines": { @@ -672,13 +672,13 @@ } }, "node_modules/@smithy/config-resolver": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.7.tgz", - "integrity": "sha512-J4J1AWiqaApC+3I9U++SuxAQ3BOoM5VoYnpFzCZcb63aLF80Zpc/nq2pFR1OsEIYyg2UYNdcBKKfHABmwo4WgQ==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.8.tgz", + "integrity": "sha512-e7mwQteHjo9S1GK+TfzP3o7ujE2ZK30d6wkv5brKtabrZF7MBflj9CwUP2XYuOYebdWirHOtv8ZfkMrpcbJfYw==", "optional": true, "dependencies": { - "@smithy/node-config-provider": "^2.0.9", - "@smithy/types": "^2.3.0", + "@smithy/node-config-provider": "^2.0.10", + "@smithy/types": "^2.3.1", "@smithy/util-config-provider": "^2.0.0", "@smithy/util-middleware": "^2.0.0", "tslib": "^2.5.0" @@ -688,15 +688,15 @@ } }, "node_modules/@smithy/credential-provider-imds": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.0.9.tgz", - "integrity": "sha512-K7WZRkHS5HZofRgK+O8W4YXXyaVexU1K6hp9vlUL/8CsnrFbZS9quyH/6hTROrYh2PuJr24yii1kc83NJdxMGQ==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.0.10.tgz", + "integrity": "sha512-may2/gYlDip2rjlU1Z5fcCEWY0Fu3tSu/HykgZrLfb2/171P6OYuz7dGNKBOCS1W57vP4W5wmUhm0WGehrixig==", "optional": true, "dependencies": { - "@smithy/node-config-provider": "^2.0.9", - "@smithy/property-provider": "^2.0.7", - "@smithy/types": "^2.3.0", - "@smithy/url-parser": "^2.0.6", + "@smithy/node-config-provider": "^2.0.10", + "@smithy/property-provider": "^2.0.8", + "@smithy/types": "^2.3.1", + "@smithy/url-parser": "^2.0.7", "tslib": "^2.5.0" }, "engines": { @@ -704,50 +704,37 @@ } }, "node_modules/@smithy/eventstream-codec": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.6.tgz", - "integrity": "sha512-J9xL82mlYRUMXFnB9VaThXkD7z2JLr52FIVZMoQQ1dxZG5ub+NOGmzaTTZC/cMmKXI/nwCoFuwDWCTjwQhYhQA==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.7.tgz", + "integrity": "sha512-sW3AhXZhmmhh0f11EOotmNNa0rjrKwnMYNKfbp3B/qigdw6foKcmFGX+HF3XGN7w7fFeEFuXr97Ok24gRj92Xg==", "optional": true, "dependencies": { "@aws-crypto/crc32": "3.0.0", - "@smithy/types": "^2.3.0", + "@smithy/types": "^2.3.1", "@smithy/util-hex-encoding": "^2.0.0", "tslib": "^2.5.0" } }, "node_modules/@smithy/fetch-http-handler": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.1.2.tgz", - "integrity": "sha512-3Gm3pQm4viUPU+e7KkRScS9t5phBxSNRS8rQSZ+HeCwK/busrX0/2HJZiwLvGblqPqi1laJB0lD18AdiOioJww==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.1.3.tgz", + "integrity": "sha512-kUg+Ey4mJeR/3+Ponuhb1rsmsfZRwjCLvC+WcPgeI+ittretEzuWAPN+9anD0HJEoApVjHpndzxPtlncbCUJDQ==", "optional": true, "dependencies": { - "@smithy/protocol-http": "^3.0.2", - "@smithy/querystring-builder": "^2.0.6", - "@smithy/types": "^2.3.0", + "@smithy/protocol-http": "^3.0.3", + "@smithy/querystring-builder": "^2.0.7", + "@smithy/types": "^2.3.1", "@smithy/util-base64": "^2.0.0", "tslib": "^2.5.0" } }, - "node_modules/@smithy/fetch-http-handler/node_modules/@smithy/protocol-http": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.2.tgz", - "integrity": "sha512-LUOWCPRihvJBkdSs+ivK9m1f/rMfF3n9Zpzg8qdry2eIG4HQqqLBMWQyF9bgk7JhsrrOa3//jJKhXzvL7wL5Xw==", - "optional": true, - "dependencies": { - "@smithy/types": "^2.3.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/@smithy/hash-node": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.6.tgz", - "integrity": "sha512-xz7fzFxSzxohKGGyKPbLReRrY01JOZgRDHIXSks3PxQxG9c8PJMa5nUw0stH8UOySUgkofmMy0n7vTUsF5Mdqg==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.7.tgz", + "integrity": "sha512-aB5lvIDP1v+ZUUS8ek3XW5xnZ6jUQ86JXqG7a5jMP6AbjAc3439mIbs6+f1EQ5MtYmrQCEtRRyvv5QofvotH0w==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.0", + "@smithy/types": "^2.3.1", "@smithy/util-buffer-from": "^2.0.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" @@ -757,12 +744,12 @@ } }, "node_modules/@smithy/invalid-dependency": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.6.tgz", - "integrity": "sha512-L5MUyl9mzawIvBxr0Hg3J/Q5qZFXKcBgMk0PacfK3Mthp4WAR6h7iMxdSQ23Q7X/kxOrpZuoYEdh1BWLKbDc8Q==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.7.tgz", + "integrity": "sha512-qVOZnHFPzQo4BS47/PANHX32Y69c0tJxKBkqTL795D/DKInqBwmBO/m1gS7v0ZQqmtCuoy2l87RflQfRY2xEIw==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.0", + "@smithy/types": "^2.3.1", "tslib": "^2.5.0" } }, @@ -779,26 +766,13 @@ } }, "node_modules/@smithy/middleware-content-length": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.8.tgz", - "integrity": "sha512-fHJFsscHXrYhUSWMFJNXfsZW8KsyhWQfBgU3b0nvDfpm+NAeQLqKYNhywGrDwZQc1k+lt7Fw9faAquhNPxTZRA==", - "optional": true, - "dependencies": { - "@smithy/protocol-http": "^3.0.2", - "@smithy/types": "^2.3.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/middleware-content-length/node_modules/@smithy/protocol-http": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.2.tgz", - "integrity": "sha512-LUOWCPRihvJBkdSs+ivK9m1f/rMfF3n9Zpzg8qdry2eIG4HQqqLBMWQyF9bgk7JhsrrOa3//jJKhXzvL7wL5Xw==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.9.tgz", + "integrity": "sha512-2XVFsGqswxrIBi0w4Njwzb1zsbte26U513K+WPFm9z6SB/3WR5/VBVjTaTcamrXznTAqBjTwTL0Ysisv1dW0Rw==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.0", + "@smithy/protocol-http": "^3.0.3", + "@smithy/types": "^2.3.1", "tslib": "^2.5.0" }, "engines": { @@ -806,14 +780,14 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.0.6.tgz", - "integrity": "sha512-MuSPPtEHFal/M77tR3ffLsdOfX29IZpA990nGuoPj5zQnAYrA4PYBGoqqrASQKm8Xb3C0NwuYzOATT7WX4f5Pg==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.0.7.tgz", + "integrity": "sha512-4/L0wV7PzHEprJB0gazSTIwlW/2cCfwC9EHavUMhoCyl1tLer6CJwDbAMit1IMvwbHkwuKopueb8dFPHfpS2Pw==", "optional": true, "dependencies": { - "@smithy/middleware-serde": "^2.0.6", - "@smithy/types": "^2.3.0", - "@smithy/url-parser": "^2.0.6", + "@smithy/middleware-serde": "^2.0.7", + "@smithy/types": "^2.3.1", + "@smithy/url-parser": "^2.0.7", "@smithy/util-middleware": "^2.0.0", "tslib": "^2.5.0" }, @@ -822,15 +796,15 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.9.tgz", - "integrity": "sha512-gneEqWj4l/ZjHdZPk0BFMXoTalRArdQ8i579/KqJgBAc6Ux5vnR/SSppkMCkj2kOQYwdypvzSPeqEW3ZrvIg6g==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.10.tgz", + "integrity": "sha512-VwAQOR5Rh/y9BzUgb5DzUk7qYBiMZu3pEQa5EwwAf/F7lpMuNildGrAxtDmsXk90490FJwa6LyFknXP3kO5BnA==", "optional": true, "dependencies": { - "@smithy/node-config-provider": "^2.0.9", - "@smithy/protocol-http": "^3.0.2", + "@smithy/node-config-provider": "^2.0.10", + "@smithy/protocol-http": "^3.0.3", "@smithy/service-error-classification": "^2.0.0", - "@smithy/types": "^2.3.0", + "@smithy/types": "^2.3.1", "@smithy/util-middleware": "^2.0.0", "@smithy/util-retry": "^2.0.0", "tslib": "^2.5.0", @@ -840,26 +814,13 @@ "node": ">=14.0.0" } }, - "node_modules/@smithy/middleware-retry/node_modules/@smithy/protocol-http": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.2.tgz", - "integrity": "sha512-LUOWCPRihvJBkdSs+ivK9m1f/rMfF3n9Zpzg8qdry2eIG4HQqqLBMWQyF9bgk7JhsrrOa3//jJKhXzvL7wL5Xw==", - "optional": true, - "dependencies": { - "@smithy/types": "^2.3.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/@smithy/middleware-serde": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.6.tgz", - "integrity": "sha512-8/GODBngYbrS28CMZtaHIL4R9rLNSQ/zgb+N1OAZ02NwBUawlnLDcatve9YRzhJC/IWz0/pt+WimJZaO1sGcig==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.7.tgz", + "integrity": "sha512-tOldis4PUNafdGErLZ+33p9Pf3MmTlLa176X321Z6ZaCf1XNEow9m3T5vXrcHErVAvjPG0mp3l54J94HnPc+rQ==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.0", + "@smithy/types": "^2.3.1", "tslib": "^2.5.0" }, "engines": { @@ -879,14 +840,14 @@ } }, "node_modules/@smithy/node-config-provider": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.0.9.tgz", - "integrity": "sha512-TlSPbCwtT/jgNnmPQqKuCR5CFN8UIrCCHRrgUfs3NqRMuaLLeP8TPe1fSKq2J8h1M/jd4BF853gneles0gWevg==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.0.10.tgz", + "integrity": "sha512-e5MiLH5Eu+BbYsmhZIkvUKCzite6JCBPL75PNjlRK2TWvSpfp19hNf2SiJIQbPalcFj5zlyBvtcEkF1sfYIdhg==", "optional": true, "dependencies": { - "@smithy/property-provider": "^2.0.7", - "@smithy/shared-ini-file-loader": "^2.0.8", - "@smithy/types": "^2.3.0", + "@smithy/property-provider": "^2.0.8", + "@smithy/shared-ini-file-loader": "^2.0.9", + "@smithy/types": "^2.3.1", "tslib": "^2.5.0" }, "engines": { @@ -894,28 +855,15 @@ } }, "node_modules/@smithy/node-http-handler": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.1.2.tgz", - "integrity": "sha512-PdEEDCShuM8zxGoaRxmGB/1ikB8oeqz+ZAF9VIA8FCP3E59j8zDTF+wCELoWd1Y6gtxr+RcTAg5sA8nvn5qH/w==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.1.3.tgz", + "integrity": "sha512-TGkgpx68SqvbspVHaG3iwqP2mKYOT4whiq7Kv2X9v+InngL4MkpH3LQ0Dk7kbloahZr+hAOyb6s8D7T8TXRrzA==", "optional": true, "dependencies": { - "@smithy/abort-controller": "^2.0.6", - "@smithy/protocol-http": "^3.0.2", - "@smithy/querystring-builder": "^2.0.6", - "@smithy/types": "^2.3.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/node-http-handler/node_modules/@smithy/protocol-http": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.2.tgz", - "integrity": "sha512-LUOWCPRihvJBkdSs+ivK9m1f/rMfF3n9Zpzg8qdry2eIG4HQqqLBMWQyF9bgk7JhsrrOa3//jJKhXzvL7wL5Xw==", - "optional": true, - "dependencies": { - "@smithy/types": "^2.3.0", + "@smithy/abort-controller": "^2.0.7", + "@smithy/protocol-http": "^3.0.3", + "@smithy/querystring-builder": "^2.0.7", + "@smithy/types": "^2.3.1", "tslib": "^2.5.0" }, "engines": { @@ -923,12 +871,12 @@ } }, "node_modules/@smithy/property-provider": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.7.tgz", - "integrity": "sha512-XT8Tl7YNxM8tCtGqy7v7DSf6PxyXaPE9cdA/Yj4dEw2b05V3RrPqsP+t5XJiZu0yIsQ7pdeYZWv2sSEWVjNeAg==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.8.tgz", + "integrity": "sha512-oaaP/i7bGG8XbxG9Kx4PZh83iJ2jo/vt8RmJdi9hmc8APBaW1HGDperVXDCyPQdVYXmiqrtxc/rPImyBma1G3A==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.0", + "@smithy/types": "^2.3.1", "tslib": "^2.5.0" }, "engines": { @@ -936,12 +884,12 @@ } }, "node_modules/@smithy/protocol-http": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-2.0.5.tgz", - "integrity": "sha512-d2hhHj34mA2V86doiDfrsy2fNTnUOowGaf9hKb0hIPHqvcnShU4/OSc4Uf1FwHkAdYF3cFXTrj5VGUYbEuvMdw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.3.tgz", + "integrity": "sha512-UGfmQNdijlFV+UzgdRyfe05S5vLDdcdkvNcxhGvQ+Er7TjUkZSxjukQB9VXtT8oTHztgOMX74DDlPBsVzZR5Pg==", "optional": true, "dependencies": { - "@smithy/types": "^2.2.2", + "@smithy/types": "^2.3.1", "tslib": "^2.5.0" }, "engines": { @@ -949,12 +897,12 @@ } }, "node_modules/@smithy/querystring-builder": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.6.tgz", - "integrity": "sha512-HnU00shCGoV8vKJZTiNBkNvR9NogU3NIUaVMAGJPSqNGJj3psWo+TUrC0BVCDcwiCljXwXCFGJqIcsWtClrktQ==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.7.tgz", + "integrity": "sha512-RPHnqt4iH1Kwp1Zbf4gJI88hZiynEZjE5hEWJNBmKqCe1Q6v7HBLtaovTaiuYaMEmPyb2KxOi3lISAdT6uuPqw==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.0", + "@smithy/types": "^2.3.1", "@smithy/util-uri-escape": "^2.0.0", "tslib": "^2.5.0" }, @@ -963,12 +911,12 @@ } }, "node_modules/@smithy/querystring-parser": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.6.tgz", - "integrity": "sha512-i4LKoXHP7pTFAPjLIJyQXYOhWokbcFha3WWsX74sAKmuluv0XM2cxONZoFxwEzmWhsNyM6buSwJSZXyPiec0AQ==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.7.tgz", + "integrity": "sha512-Cwi/Hgs73nbLKfgH7dXAxzvDxyTrK+BLrlAd0KXU7xcBR94V132nvxoq39BMWckYAPmnMwxCwq8uusNH4Dnagw==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.0", + "@smithy/types": "^2.3.1", "tslib": "^2.5.0" }, "engines": { @@ -985,12 +933,12 @@ } }, "node_modules/@smithy/shared-ini-file-loader": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.0.8.tgz", - "integrity": "sha512-4u+V+Dv7JGpJ0tppB5rxCem7WhdFux950z4cGPhV0kHTPkKe8DDgINzOlVa2RBu5dI33D02OBJcxFjhW4FPORg==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.0.9.tgz", + "integrity": "sha512-vBLgJI+Qpz1TZ0W2kUBOmG2Q+geVEhiXE99UX02+UFag2WzOQ6frvV6rpadwJu0uwF02GG620NbiKGboqZ19YA==", "optional": true, "dependencies": { - "@smithy/types": "^2.3.0", + "@smithy/types": "^2.3.1", "tslib": "^2.5.0" }, "engines": { @@ -998,14 +946,14 @@ } }, "node_modules/@smithy/signature-v4": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.6.tgz", - "integrity": "sha512-4zNTi8w4sky07YKq7oYucZt4ogY00IEaS1NFDXxmCN5V/ywE0WiK+WMim+8wtYQmB0qy3oExZR4LoCAml6j/rA==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.7.tgz", + "integrity": "sha512-qNCJpyhRWxT5RWmeSo/Zv+miQ60Y/D2JmPdFw7v2WpPVxVK7JDpqUbvq0QYE+dBGPX/uagAkE3NvJUcn0fTE3A==", "optional": true, "dependencies": { - "@smithy/eventstream-codec": "^2.0.6", + "@smithy/eventstream-codec": "^2.0.7", "@smithy/is-array-buffer": "^2.0.0", - "@smithy/types": "^2.3.0", + "@smithy/types": "^2.3.1", "@smithy/util-hex-encoding": "^2.0.0", "@smithy/util-middleware": "^2.0.0", "@smithy/util-uri-escape": "^2.0.0", @@ -1017,14 +965,14 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.2.tgz", - "integrity": "sha512-quUuJ0SsqgG7Flopvfd8iQJLhHfnMYtYPuvImVQzPHXtqUQImtVz5msudMxW3t3jl+L0w8RlR+IN2zT6UqCJ6g==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.4.tgz", + "integrity": "sha512-KRQvYYjEGqvmwnKSAZ8EL0hZvPxGQMYbAKS/AMGq2fuRmwAlinSVJ/fkIs65bZp2oYjcskd1ZgKcP+2UDjNPTQ==", "optional": true, "dependencies": { "@smithy/middleware-stack": "^2.0.0", - "@smithy/types": "^2.3.0", - "@smithy/util-stream": "^2.0.8", + "@smithy/types": "^2.3.1", + "@smithy/util-stream": "^2.0.10", "tslib": "^2.5.0" }, "engines": { @@ -1032,9 +980,9 @@ } }, "node_modules/@smithy/types": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.3.0.tgz", - "integrity": "sha512-pJce3rd39MElkV57UTPAoSYAApjQLELUxjU5adHNLYk9gnPvyIGbJNJTZVVFu00BrgZH3W/cQe8QuFcknDyodQ==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.3.1.tgz", + "integrity": "sha512-cS48e4Yawb6pGakj7DBJUIPFIkqnUWyXTe2ndPRNagD73b6kEJqTc8bhTyfUve0A+sijK256UKE0J1juAfCeDA==", "optional": true, "dependencies": { "tslib": "^2.5.0" @@ -1044,13 +992,13 @@ } }, "node_modules/@smithy/url-parser": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.6.tgz", - "integrity": "sha512-9i6j5QW6bapHZ4rtkXOAm0hOUG1+5IVdVJXNSUTcNskwJchZH5IQuDNPCbgUi/u2P8EZazKt4wXT51QxOXCz1A==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.7.tgz", + "integrity": "sha512-SwMl1Lq3yFR2hzhwWYKg04uJHpfcXWMBPycm4Z8GkLI6Dw7rJNDApEbMtujlYw6pVP2WKbrpaGHjQ9MdP92kMQ==", "optional": true, "dependencies": { - "@smithy/querystring-parser": "^2.0.6", - "@smithy/types": "^2.3.0", + "@smithy/querystring-parser": "^2.0.7", + "@smithy/types": "^2.3.1", "tslib": "^2.5.0" } }, @@ -1114,13 +1062,13 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.7.tgz", - "integrity": "sha512-s1caKxC7Y87Q72Goll//clZs2WNBfG9WtFDWVRS+Qgk147YPCOUYtkpuD0XZAh/vbayObFz5tQ1fiX4G19HSCA==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.8.tgz", + "integrity": "sha512-8znx01mkmfKxhiSB2bOF5eMutuCLMd8m2Kh0ulRp8vgzhwRLDJoU6aHSEUoNptbuTAtiFf4u0gpkYC2XfbWwuA==", "optional": true, "dependencies": { - "@smithy/property-provider": "^2.0.7", - "@smithy/types": "^2.3.0", + "@smithy/property-provider": "^2.0.8", + "@smithy/types": "^2.3.1", "bowser": "^2.11.0", "tslib": "^2.5.0" }, @@ -1129,16 +1077,16 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.9.tgz", - "integrity": "sha512-HlV4iNL3/PgPpmDGs0+XrAKtwFQ8rOs5P2y5Dye8dUYaJauadlzHRrNKk7wH2aBYswvT2HM+PIgXamvrE7xbcw==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.10.tgz", + "integrity": "sha512-QUcUckL4ZqDFVwLnh7zStRUnXtTC6hcJZ4FmMqnxlPcL33Rko0sMQwrMDnMdzF3rS3wvqugAaq3zzop1HCluvw==", "optional": true, "dependencies": { - "@smithy/config-resolver": "^2.0.7", - "@smithy/credential-provider-imds": "^2.0.9", - "@smithy/node-config-provider": "^2.0.9", - "@smithy/property-provider": "^2.0.7", - "@smithy/types": "^2.3.0", + "@smithy/config-resolver": "^2.0.8", + "@smithy/credential-provider-imds": "^2.0.10", + "@smithy/node-config-provider": "^2.0.10", + "@smithy/property-provider": "^2.0.8", + "@smithy/types": "^2.3.1", "tslib": "^2.5.0" }, "engines": { @@ -1183,14 +1131,14 @@ } }, "node_modules/@smithy/util-stream": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.8.tgz", - "integrity": "sha512-1JoSHL/AOFRo/RVYdbOOGG5qSkU1IQN+F0f3HOZcwvGeGT5KnGwd4hLzmr0qkjKh4PW7nzuvPMdR7L8THV24Hw==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.10.tgz", + "integrity": "sha512-2EgK5cBiv9OaDmhSXmsZY8ZByBl1dg/Tbc51iBJ5GkLGVYhaA6/1l6vHHV41m4Im3D0XfZV1tmeLlQgmRnYsTQ==", "optional": true, "dependencies": { - "@smithy/fetch-http-handler": "^2.1.2", - "@smithy/node-http-handler": "^2.1.2", - "@smithy/types": "^2.3.0", + "@smithy/fetch-http-handler": "^2.1.3", + "@smithy/node-http-handler": "^2.1.3", + "@smithy/types": "^2.3.1", "@smithy/util-base64": "^2.0.0", "@smithy/util-buffer-from": "^2.0.0", "@smithy/util-hex-encoding": "^2.0.0", @@ -1227,9 +1175,9 @@ } }, "node_modules/@types/node": { - "version": "20.5.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.9.tgz", - "integrity": "sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==" + "version": "20.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.0.tgz", + "integrity": "sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==" }, "node_modules/@types/webidl-conversions": { "version": "7.0.0", diff --git a/utils/data-migration/tfm/export-tfm-users.js b/utils/data-migration/tfm/export-tfm-users.js index e2bca3974e..2c29deaac5 100644 --- a/utils/data-migration/tfm/export-tfm-users.js +++ b/utils/data-migration/tfm/export-tfm-users.js @@ -1,7 +1,7 @@ const fs = require('fs'); const generator = require('generate-password'); const { Parser, transforms: { unwind } } = require('json2csv'); -const TFM_USERS = require('./tfm-users'); +const TFM_USERS = require('../../mock-data-loader/tfm/mocks/users'); // iterate over users array and override the password property TFM_USERS.forEach((u) => { diff --git a/utils/data-migration/tfm/migrate-tfm-users.js b/utils/data-migration/tfm/migrate-tfm-users.js index fb977db3b9..60e5ffedcd 100644 --- a/utils/data-migration/tfm/migrate-tfm-users.js +++ b/utils/data-migration/tfm/migrate-tfm-users.js @@ -1,7 +1,7 @@ const api = require('../../mock-data-loader/tfm/api'); const tokenFor = require('../../mock-data-loader/temporary-token-handler'); -const USERS = require('./users_with_passwords.json'); -const TEAMS = require('./tfm-teams'); +const USERS = require('../../mock-data-loader/tfm/mocks/users'); +const TEAMS = require('../../mock-data-loader/tfm/mocks/teams'); const insertTfmUsersAndTeams = async () => { const token = await tokenFor({ From a9480711bc39077f6508598ad76fd6f4c44b9591 Mon Sep 17 00:00:00 2001 From: Abhi Markan <32125108+abhi-markan@users.noreply.github.com> Date: Wed, 13 Sep 2023 15:58:37 +0100 Subject: [PATCH 006/130] fix(ukefid): UKEF ID validation (#2054) Co-authored-by: Abhi Markan --- .../acbs-function/acbs-amend-facility/index.js | 14 ++++++++++---- .../acbs-function/acbs-facility/index.js | 4 ++++ .../acbs-function/acbs-issue-facility/index.js | 4 ++++ azure-functions/acbs-function/acbs/index.js | 4 ++++ azure-functions/acbs-function/constants/deal.js | 6 ++++++ .../src/constants/number-generator.constant.ts | 1 + .../src/v1/controllers/estore/eStore.controller.ts | 4 ++-- 7 files changed, 31 insertions(+), 6 deletions(-) diff --git a/azure-functions/acbs-function/acbs-amend-facility/index.js b/azure-functions/acbs-function/acbs-amend-facility/index.js index 8e63c0d345..b0f36b0368 100644 --- a/azure-functions/acbs-function/acbs-amend-facility/index.js +++ b/azure-functions/acbs-function/acbs-amend-facility/index.js @@ -24,7 +24,7 @@ const df = require('durable-functions'); const retryOptions = require('../helpers/retryOptions'); -const { FACILITY } = require('../constants'); +const { DEAL, FACILITY } = require('../constants'); const acceptableFacilityStage = ['07']; @@ -32,10 +32,12 @@ module.exports = df.orchestrator(function* amendACBSFacility(context) { try { const { amendment } = context.df.getInput(); if (amendment) { + const { facilityId, amount, coverEndDate } = amendment; + // UKEF Facility ID exists in the payload - const hasFacilityId = Boolean(amendment.facilityId); + const hasFacilityId = Boolean(facilityId); // At least one of the amendment exists in the payload - const hasAmendment = Boolean(amendment.amount) || Boolean(amendment.coverEndDate); + const hasAmendment = Boolean(amount) || Boolean(coverEndDate); // Facility object existence check const hasFacility = amendment.facility; // Deal properties existence check @@ -43,10 +45,14 @@ module.exports = df.orchestrator(function* amendACBSFacility(context) { // Payload verification if (hasFacilityId && hasAmendment && hasFacility && hasDeal) { - const { facility, deal, facilityId } = amendment; + const { facility, deal } = amendment; const { facilitySnapshot } = facility; let facilityLoanRecord; + if (facilityId.includes(DEAL.UKEF_ID.PENDING) || facilityId.includes(DEAL.UKEF_ID.TEST)) { + throw new Error('Invalid facility ID %s', facilityId); + } + // 1. DAF : activity-get-facility-master: Retrieve ACBS `Facility Master Record` with eTag const { acbsFacility: fmr, etag } = yield context.df.callActivityWithRetry('activity-get-facility-master', retryOptions, { facilityId }); diff --git a/azure-functions/acbs-function/acbs-facility/index.js b/azure-functions/acbs-function/acbs-facility/index.js index 76745576d4..d7d91a96d2 100644 --- a/azure-functions/acbs-function/acbs-facility/index.js +++ b/azure-functions/acbs-function/acbs-facility/index.js @@ -25,6 +25,10 @@ module.exports = df.orchestrator(function* createACBSfacility(context) { const acbsFacilityMasterInput = mappings.facility.facilityMaster(deal, facility, dealAcbsData, acbsReference); const { facilityIdentifier } = acbsFacilityMasterInput; + if (facilityIdentifier.includes(CONSTANTS.DEAL.UKEF_ID.PENDING) || facilityIdentifier.includes(CONSTANTS.DEAL.UKEF_ID.TEST)) { + throw new Error('Invalid facility ID %s', facilityIdentifier); + } + const facilityMaster = yield context.df.callActivityWithRetry('activity-create-facility-master', retryOptions, { acbsFacilityMasterInput }); // 2. Facility Investor diff --git a/azure-functions/acbs-function/acbs-issue-facility/index.js b/azure-functions/acbs-function/acbs-issue-facility/index.js index 15d631506a..ee3e31bc35 100644 --- a/azure-functions/acbs-function/acbs-issue-facility/index.js +++ b/azure-functions/acbs-function/acbs-issue-facility/index.js @@ -18,6 +18,10 @@ module.exports = df.orchestrator(function* updateACBSfacility(context) { try { const { facilityId, facility, deal } = context.df.getInput(); + if (facilityId.includes(CONSTANTS.DEAL.UKEF_ID.PENDING) || facilityId.includes(CONSTANTS.DEAL.UKEF_ID.TEST)) { + throw new Error('Invalid facility ID %s', facilityId); + } + let facilityFee; // Constants declaration for mapping functions const acbsParties = { diff --git a/azure-functions/acbs-function/acbs/index.js b/azure-functions/acbs-function/acbs/index.js index 80e4ee09cf..c19a282c8a 100644 --- a/azure-functions/acbs-function/acbs/index.js +++ b/azure-functions/acbs-function/acbs/index.js @@ -137,6 +137,10 @@ module.exports = df.orchestrator(function* HDeal(context) { ); const { dealIdentifier } = acbsDealInput; + if (dealIdentifier.includes(CONSTANTS.DEAL.UKEF_ID.PENDING) || dealIdentifier.includes(CONSTANTS.DEAL.UKEF_ID.TEST)) { + throw new Error('Invalid deal ID %s', dealIdentifier); + } + const dealRecord = yield context.df.callActivityWithRetry( 'activity-create-deal', retryOptions, diff --git a/azure-functions/acbs-function/constants/deal.js b/azure-functions/acbs-function/constants/deal.js index 129c0b2951..53a1b5e7d0 100644 --- a/azure-functions/acbs-function/constants/deal.js +++ b/azure-functions/acbs-function/constants/deal.js @@ -42,6 +42,11 @@ const EXPORTER_CREDIT_RATING = { BB_MINUS: 'Good (BB-)', }; +const UKEF_ID = { + PENDING: 'PENDING', + TEST: '100000', +}; + module.exports = { SME_TYPE, SUBMISSION_TYPE, @@ -51,4 +56,5 @@ module.exports = { COUNTRY, UNITED_KINGDOM, EXPORTER_CREDIT_RATING, + UKEF_ID, }; diff --git a/external-api/src/constants/number-generator.constant.ts b/external-api/src/constants/number-generator.constant.ts index 6c5f049366..a24ae21f8b 100644 --- a/external-api/src/constants/number-generator.constant.ts +++ b/external-api/src/constants/number-generator.constant.ts @@ -12,4 +12,5 @@ export const ENTITY_TYPE = { export const UKEF_ID = { PENDING: 'PENDING', + TEST: '100000', }; diff --git a/external-api/src/v1/controllers/estore/eStore.controller.ts b/external-api/src/v1/controllers/estore/eStore.controller.ts index 0107a9dcc9..3b7c82a594 100644 --- a/external-api/src/v1/controllers/estore/eStore.controller.ts +++ b/external-api/src/v1/controllers/estore/eStore.controller.ts @@ -9,11 +9,11 @@ import { objectIsEmpty } from '../../../utils'; const validateEstoreInput = (eStoreData: any) => { const { dealIdentifier, facilityIdentifiers } = eStoreData; - if (dealIdentifier.includes('100000') || dealIdentifier.includes(UKEF_ID.PENDING)) { + if (dealIdentifier.includes(UKEF_ID.TEST) || dealIdentifier.includes(UKEF_ID.PENDING)) { return false; } - if (facilityIdentifiers.includes(100000) || facilityIdentifiers.includes(UKEF_ID.PENDING)) { + if (facilityIdentifiers.includes(Number(UKEF_ID.TEST)) || facilityIdentifiers.includes(UKEF_ID.PENDING)) { return false; } return true; From a8b30f8e52b03eab845a066b425468d43d4f67b6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 13 Sep 2023 18:32:30 +0100 Subject: [PATCH 007/130] chore(main): release 1.0.0 (#1992) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- CHANGELOG.md | 366 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 366 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000000..a28ef20214 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,366 @@ +# Changelog + +## 1.0.0 (2023-09-13) + + +### ⚠ BREAKING CHANGES + +* **csp:** TFM `CSP` fix ([#1950](https://github.com/UK-Export-Finance/dtfs2/issues/1950)) + +### Features + +* added Mend Bolt for GitHub ([#1282](https://github.com/UK-Export-Finance/dtfs2/issues/1282)) ([69dcbed](https://github.com/UK-Export-Finance/dtfs2/commit/69dcbed4349df33feda1d85066d81b99a09cd491)) +* **apim:** facility amendment ([#1849](https://github.com/UK-Export-Finance/dtfs2/issues/1849)) ([5545c3a](https://github.com/UK-Export-Finance/dtfs2/commit/5545c3a9ba03613140c27259f5ca4be4e38fa567)) +* **apim:** mulesoft to apim tfs migration ([#1767](https://github.com/UK-Export-Finance/dtfs2/issues/1767)) ([2e35e6f](https://github.com/UK-Export-Finance/dtfs2/commit/2e35e6fef1a6bf90e2e22084bc8b5876742f480d)) +* **auto-release:** auto release based on conventional commit messages ([#1967](https://github.com/UK-Export-Finance/dtfs2/issues/1967)) ([7342502](https://github.com/UK-Export-Finance/dtfs2/commit/7342502a15ffff0dad14a295ab8123e08818e3d7)) +* **avoid-duplicate-clicks:** preventDoubleClicks set to false ([#1329](https://github.com/UK-Export-Finance/dtfs2/issues/1329)) ([5a0d44f](https://github.com/UK-Export-Finance/dtfs2/commit/5a0d44f7f80f10948ade297647de0d125058d632)) +* **codecov:** `CodeCov` introduction ([#1973](https://github.com/UK-Export-Finance/dtfs2/issues/1973)) ([0d338f2](https://github.com/UK-Export-Finance/dtfs2/commit/0d338f2edde58d987e10d5bb3c9ee07ada931110)) +* **countries:** Disabled countries ([#1972](https://github.com/UK-Export-Finance/dtfs2/issues/1972)) ([17d02e9](https://github.com/UK-Export-Finance/dtfs2/commit/17d02e9c8be7e3b6bd9a6e7dd3546692d6f82067)) +* **cspell:** Cspell addition ([#1938](https://github.com/UK-Export-Finance/dtfs2/issues/1938)) ([3e03a80](https://github.com/UK-Export-Finance/dtfs2/commit/3e03a8024649a3ddefc0a30b9132171ed7aece92)) +* **dependabot:** added dependabot.yml ([#1342](https://github.com/UK-Export-Finance/dtfs2/issues/1342)) ([dcee055](https://github.com/UK-Export-Finance/dtfs2/commit/dcee055dd4f78ef668350388dc83511ee1a8be21)) +* destructure feedback form on TFM API ([#1697](https://github.com/UK-Export-Finance/dtfs2/issues/1697)) ([52d36de](https://github.com/UK-Export-Finance/dtfs2/commit/52d36de3f9705b31b2f6a90a87dabbd621823829)) +* disabled additional countries from Portal ([#1293](https://github.com/UK-Export-Finance/dtfs2/issues/1293)) ([62b7c5b](https://github.com/UK-Export-Finance/dtfs2/commit/62b7c5b58ca92a4a247813385e83d79d3ec8ab4f)) +* **docs:** Documentation update ([#2049](https://github.com/UK-Export-Finance/dtfs2/issues/2049)) ([cae7cd5](https://github.com/UK-Export-Finance/dtfs2/commit/cae7cd529513bb8cc83becae5d4ff7e865b3bf70)) +* **DTFS-6424:** add api input validation ([#1639](https://github.com/UK-Export-Finance/dtfs2/issues/1639)) ([724b15e](https://github.com/UK-Export-Finance/dtfs2/commit/724b15ea40250d9f1b56c6502da5cc16dd204a6c)) +* **DTFS-6441:** rename amendment apis ([#1647](https://github.com/UK-Export-Finance/dtfs2/issues/1647)) ([33308e2](https://github.com/UK-Export-Finance/dtfs2/commit/33308e2295116ee2863d3976427e516de84a27ec)) +* **DTFS2-6169:** Amendments email to PIM ([c23f2a5](https://github.com/UK-Export-Finance/dtfs2/commit/c23f2a50dea3891ea43215573d8267e65b5cacf1)) +* **DTFS2-6169:** Amendments email to PIM ([029fd38](https://github.com/UK-Export-Finance/dtfs2/commit/029fd38f9ceeb4292c84960937c8e8bd14bfa33c)) +* **DTFS2-6169:** Updated unit test cases ([09fefbb](https://github.com/UK-Export-Finance/dtfs2/commit/09fefbb890fdd04f177eba595de82fdc088570e9)) +* **DTFS2-6169:** Updated unit test cases ([98a71c8](https://github.com/UK-Export-Finance/dtfs2/commit/98a71c89758f93770c696a0a7f0b9f33a913a392)) +* **DTFS2-6199:** NDB deal page TFM ([#1255](https://github.com/UK-Export-Finance/dtfs2/issues/1255)) ([a83af15](https://github.com/UK-Export-Finance/dtfs2/commit/a83af15c53bfb657b1b53a9b109d629ea2968f46)) +* **DTFS2-6199:** NDB deal page TFM ([#1255](https://github.com/UK-Export-Finance/dtfs2/issues/1255)) ([3d4d3c8](https://github.com/UK-Export-Finance/dtfs2/commit/3d4d3c8b47778c625ebfdc53631169ea297b5561)) +* **DTFS2-6213:** NDB EC mapping ([6986c1b](https://github.com/UK-Export-Finance/dtfs2/commit/6986c1b66271827cc069532e9897aa29b69d2797)) +* **DTFS2-6213:** NDB EC mapping ([#1272](https://github.com/UK-Export-Finance/dtfs2/issues/1272)) ([60ea5ad](https://github.com/UK-Export-Finance/dtfs2/commit/60ea5ad16a7f3995f525a507ae8b3245aac01c69)) +* **DTFS2-6224:** Added Emirates NBD Bank ([aad0099](https://github.com/UK-Export-Finance/dtfs2/commit/aad0099b8553d60ee26546e83246879523211ec8)) +* **DTFS2-6224:** Added Emirates NBD Bank ([78093b7](https://github.com/UK-Export-Finance/dtfs2/commit/78093b746dd04756bd9df6686f09585d6f0b3b74)) +* **DTFS2-6225:** ACBS Exceptional handling ([d451370](https://github.com/UK-Export-Finance/dtfs2/commit/d45137097155b7e21a03bbc295e46678bd691b1d)) +* **DTFS2-6225:** ACBS Exceptional handling ([#1294](https://github.com/UK-Export-Finance/dtfs2/issues/1294)) ([1e3f9f1](https://github.com/UK-Export-Finance/dtfs2/commit/1e3f9f11c00adc55ae287ac64294f3a0f067e2f7)) +* **DTFS2-6225:** Axios downgraded, Removed console.log ([60545cd](https://github.com/UK-Export-Finance/dtfs2/commit/60545cd2f174bfe69830a3d01f2bce6b9162710e)) +* **DTFS2-6225:** Exceptional handling and stage check ([0392958](https://github.com/UK-Export-Finance/dtfs2/commit/039295813d76db324ea65231eda90f7dbab791c0)) +* **DTFS2-6225:** Indent fix ([642f074](https://github.com/UK-Export-Finance/dtfs2/commit/642f074d04396592e6fec617a037b49099908f91)) +* **DTFS2-6236:** Return tenor across products for all facilities ([f107eec](https://github.com/UK-Export-Finance/dtfs2/commit/f107eeca418893d25415c8c286c4f3600ae103e8)) +* **DTFS2-6236:** Return tenor across products for all facilities ([1cfb521](https://github.com/UK-Export-Finance/dtfs2/commit/1cfb521a95778cca14ba3ce589be6eb455a13465)) +* **DTFS2-6236:** Return tenor across products for all facilities ([#1254](https://github.com/UK-Export-Finance/dtfs2/issues/1254)) ([cc60d69](https://github.com/UK-Export-Finance/dtfs2/commit/cc60d6933c060407856cf4db73690959a346a672)) +* **DTFS2-6236:** Return tenor across products for all facilities ([#1254](https://github.com/UK-Export-Finance/dtfs2/issues/1254)) ([5502d84](https://github.com/UK-Export-Finance/dtfs2/commit/5502d84afc079794904ee1ef7bba13d83a4e69c6)) +* **DTFS2-6236:** Variable name updated ([5931889](https://github.com/UK-Export-Finance/dtfs2/commit/5931889d910f70f8e132893cf518ae14463a1451)) +* **DTFS2-6236:** Variable name updated ([c57d054](https://github.com/UK-Export-Finance/dtfs2/commit/c57d0549ee71ff0cadb45ee1b22ff61a33e58731)) +* **DTFS2-6237:** TFM Non Delegated Banks amendment tasks ([#1261](https://github.com/UK-Export-Finance/dtfs2/issues/1261)) ([8fdd5b1](https://github.com/UK-Export-Finance/dtfs2/commit/8fdd5b1a623a4152ec5cba30d1fd6a970048869c)) +* **DTFS2-6237:** TFM Non Delegated Banks amendment tasks ([#1261](https://github.com/UK-Export-Finance/dtfs2/issues/1261)) ([0f8706f](https://github.com/UK-Export-Finance/dtfs2/commit/0f8706f1497db69fe34b2d97a82dee0c2183bf68)) +* **DTFS2-6283:** Bond - Facility loan record amendment ([34946d5](https://github.com/UK-Export-Finance/dtfs2/commit/34946d575458dbbfc532574cfe6cc6b3b49df402)) +* **DTFS2-6283:** Bond - Facility loan record amendment ([bc193eb](https://github.com/UK-Export-Finance/dtfs2/commit/bc193eb46f0725fbe73daa101341d9aaaf64bec4)) +* **DTFS2-6283:** Bond - Facility loan record amendment ([#1297](https://github.com/UK-Export-Finance/dtfs2/issues/1297)) ([ad18538](https://github.com/UK-Export-Finance/dtfs2/commit/ad185389b2d2895713fab1a47a66d4d314028c7c)) +* **DTFS2-6283:** FLR amendment for Bond only ([81408f1](https://github.com/UK-Export-Finance/dtfs2/commit/81408f149ffb25562c3448b94cea9795be082853)) +* **DTFS2-6284:** Coding imporvement ([d27367d](https://github.com/UK-Export-Finance/dtfs2/commit/d27367d1781bed326cfbf8c6393ae33505001b96)) +* **DTFS2-6284:** Facility issuance date updates ([3bdf21b](https://github.com/UK-Export-Finance/dtfs2/commit/3bdf21b1c60c3047fc03ade61ef1c8cd6f64d3e8)) +* **DTFS2-6284:** Fixed API test ([55d9de2](https://github.com/UK-Export-Finance/dtfs2/commit/55d9de20dca85d296451e325978cc38c7c4cc836)) +* **DTFS2-6284:** GCD and GED for TCM and ACBS ([65bc8e3](https://github.com/UK-Export-Finance/dtfs2/commit/65bc8e36c2923d0983e38e2b365bae5fd6bcc959)) +* **DTFS2-6284:** GCD and GED for TCM and ACBS ([#1300](https://github.com/UK-Export-Finance/dtfs2/issues/1300)) ([d263588](https://github.com/UK-Export-Finance/dtfs2/commit/d26358844aacd8288949de2d74c58a0c4c26192d)) +* **DTFS2-6293:** __Secure prefix replaced with __Host ([736088c](https://github.com/UK-Export-Finance/dtfs2/commit/736088c2b9fe43f6406fd62f2ca32fab095c4a00)) +* **DTFS2-6293:** CSP rule update + Fixed E2E tests ([78e08f4](https://github.com/UK-Export-Finance/dtfs2/commit/78e08f44baf36c854cf0e429a62944c995cd414e)) +* **DTFS2-6293:** saveSession Cypress custom command ([568576d](https://github.com/UK-Export-Finance/dtfs2/commit/568576d7b028779cccd42e908b4ec5fc097e1f3b)) +* **DTFS2-6293:** Scripts introduction ([25fa1b9](https://github.com/UK-Export-Finance/dtfs2/commit/25fa1b975c374e0c2f212287d087935390701cd2)) +* **DTFS2-6306:** Added back links to all parties page ([5c60bbd](https://github.com/UK-Export-Finance/dtfs2/commit/5c60bbd04b1d1d58dad56b56a74789a1cdb0dad9)) +* **DTFS2-6306:** Dev party URN ([a6d31ae](https://github.com/UK-Export-Finance/dtfs2/commit/a6d31ae0dd2fbaa80130f463f54b04bd6e34bd36)) +* **DTFS2-6306:** E2E tests ([3b75e2d](https://github.com/UK-Export-Finance/dtfs2/commit/3b75e2d6c2fb635558cd5522396a50799873db05)) +* **DTFS2-6306:** Enhanced unit tests, code simplification and njk indentation ([71a9eff](https://github.com/UK-Export-Finance/dtfs2/commit/71a9eff2ce101b7d4c57b91c87eabf6e790e5ab2)) +* **DTFS2-6306:** Fixed API test ([8810bd3](https://github.com/UK-Export-Finance/dtfs2/commit/8810bd3162be1b491218d70d21ab210fb3f33694)) +* **DTFS2-6306:** Fixed API tests ([0c1bd2d](https://github.com/UK-Export-Finance/dtfs2/commit/0c1bd2dd693001f0b45565bf0e1b645eafaa13b2)) +* **DTFS2-6306:** Fixed API tests ([46f514a](https://github.com/UK-Export-Finance/dtfs2/commit/46f514a7e6ddc02fa002b509620e0dc2f07fb770)) +* **DTFS2-6306:** fixed E2E tests ([50061a9](https://github.com/UK-Export-Finance/dtfs2/commit/50061a9dec0c2fcf1e961784fc93fe3a6f460a11)) +* **DTFS2-6306:** Fixed failing tests ([7aad925](https://github.com/UK-Export-Finance/dtfs2/commit/7aad9253a3005e1691b13dd0f0f8a23de8c7d5b0)) +* **DTFS2-6306:** Fixed tests ([848e504](https://github.com/UK-Export-Finance/dtfs2/commit/848e50468428639b3b5a7908a9c245fd99ab0394)) +* **DTFS2-6306:** fixed typos ([53de796](https://github.com/UK-Export-Finance/dtfs2/commit/53de7967a6f053b2e2711a4081b6f9fb7d75268c)) +* **DTFS2-6306:** Lint fixes, code simplification ([f22b0e1](https://github.com/UK-Export-Finance/dtfs2/commit/f22b0e14ecfb169657dfb64ef8a42a4e7d575ee3)) +* **DTFS2-6306:** PartyURN confirmation page ([2f3c23b](https://github.com/UK-Export-Finance/dtfs2/commit/2f3c23b520fff29a8a161fc8c8effee4b32a0ba1)) +* **DTFS2-6306:** PartyURN MCD lookup + Non-existent page ([147fb47](https://github.com/UK-Export-Finance/dtfs2/commit/147fb47ffb7cf9614b3501bb46f06e4d28aeb8e3)) +* **DTFS2-6306:** Path renamed to /summary and comissionRate property ([c000ab5](https://github.com/UK-Export-Finance/dtfs2/commit/c000ab504ff4dff6dae6e1bb563e3cd78dcc308c)) +* **DTFS2-6307:** Bond issuer and beneficairy ([#1333](https://github.com/UK-Export-Finance/dtfs2/issues/1333)) ([fe4b060](https://github.com/UK-Export-Finance/dtfs2/commit/fe4b060651b74a1ee66a1565404683fbc3a7fc36)) +* **DTFS2-6307:** Bond Party URN tests ([#1335](https://github.com/UK-Export-Finance/dtfs2/issues/1335)) ([188d404](https://github.com/UK-Export-Finance/dtfs2/commit/188d4047c77256f1e886bda82f5f47a1387d92b5)) +* **DTFS2-6310:** .husky pre-commit lint check ([f0f9e04](https://github.com/UK-Export-Finance/dtfs2/commit/f0f9e04b8d4d3609a7e098d5bcdaae5e7d78c86b)) +* **DTFS2-6310:** .husky pre-commit lint check ([#1330](https://github.com/UK-Export-Finance/dtfs2/issues/1330)) ([a162683](https://github.com/UK-Export-Finance/dtfs2/commit/a1626832a2f9c84437dbcd1a5d1b12e58d7410db)) +* **DTFS2-6404:** underwriter decision validation ([#1649](https://github.com/UK-Export-Finance/dtfs2/issues/1649)) ([17999ab](https://github.com/UK-Export-Finance/dtfs2/commit/17999ab2e59021de04c5af7700625e7156d51bcf)) +* **DTFS2-6419:** MDM APIM migration ([#1634](https://github.com/UK-Export-Finance/dtfs2/issues/1634)) ([78f0d7b](https://github.com/UK-Export-Finance/dtfs2/commit/78f0d7bd0035bc1e2829e2666f3914978a44b32b)) +* **DTFS2-6439:** countries disabled ([#1641](https://github.com/UK-Export-Finance/dtfs2/issues/1641)) ([2aa01ce](https://github.com/UK-Export-Finance/dtfs2/commit/2aa01ce54feb2a950b45fb6d4d55c18fece563e5)) +* **DTFS2-6493:** TFM UI - updated accessibility statement content ([#1947](https://github.com/UK-Export-Finance/dtfs2/issues/1947)) ([5696c5e](https://github.com/UK-Export-Finance/dtfs2/commit/5696c5e8d0926fa6d10add8543ff01d0f781e16b)) +* **DTFS2-6505:** Fix vulnerable forms/endpoints on GEF UI ([#1707](https://github.com/UK-Export-Finance/dtfs2/issues/1707)) ([9e70d3f](https://github.com/UK-Export-Finance/dtfs2/commit/9e70d3fecca7b50ce3cb5609c28ccf0257743152)) +* **DTFS2-6506:** sanitize user input for vulnerable forms ([#1702](https://github.com/UK-Export-Finance/dtfs2/issues/1702)) ([cbbc36a](https://github.com/UK-Export-Finance/dtfs2/commit/cbbc36a7fb289bb2ac257cf93b2c2746b3c2dcbb)) +* **DTFS2-6556:** rename bank ([#2046](https://github.com/UK-Export-Finance/dtfs2/issues/2046)) ([3bf5c59](https://github.com/UK-Export-Finance/dtfs2/commit/3bf5c599ae01181340ebf95dc5ed05e7badb965f)) +* **DTFS2-6566:** added virgin money bank to the portal ([#1987](https://github.com/UK-Export-Finance/dtfs2/issues/1987)) ([2328416](https://github.com/UK-Export-Finance/dtfs2/commit/2328416d9be11576a60d8e467e9a1096e7814924)) +* **DTFS2:** Update interface with correct types ([8c76aca](https://github.com/UK-Export-Finance/dtfs2/commit/8c76acaaf54b00048700a9d6dccb9daa92f8e6ab)) +* **gha:** Added CRLF to README.md ([f03a2d2](https://github.com/UK-Export-Finance/dtfs2/commit/f03a2d252571fc0a27c0e20e7093f94681068564)) +* **gha:** Code improvement ([76b2708](https://github.com/UK-Export-Finance/dtfs2/commit/76b2708841721cb58d46612f9664f06fcb220698)) +* **gha:** Enhanced SCA GHA ([c49e32e](https://github.com/UK-Export-Finance/dtfs2/commit/c49e32e8fbc2eb501506749d0c7c67c6c8ad50ac)) +* **gha:** Enhanced SCA GHA ([#1324](https://github.com/UK-Export-Finance/dtfs2/issues/1324)) ([38da0cc](https://github.com/UK-Export-Finance/dtfs2/commit/38da0cc874656ed7c82cd56130ee847dabdf4433)) +* migrated eStore to APIM ([#1824](https://github.com/UK-Export-Finance/dtfs2/issues/1824)) ([c369922](https://github.com/UK-Export-Finance/dtfs2/commit/c369922db47f5f56a260925fe9cc50d32331bf31)) +* migrated the `/customers` APIs to APIM ([#1845](https://github.com/UK-Export-Finance/dtfs2/issues/1845)) ([8f9ac5a](https://github.com/UK-Export-Finance/dtfs2/commit/8f9ac5a7997c8fdcd948ec994e4385478d39d406)) +* **mongodb:** mongodb-serilisation-express dependency introduction ([#1698](https://github.com/UK-Export-Finance/dtfs2/issues/1698)) ([20ea80b](https://github.com/UK-Export-Finance/dtfs2/commit/20ea80bc8abddd1aae93c0e33b3a18703216af0a)) +* **npm-lint:** Various npm audit and lint fixes ([92d0ca6](https://github.com/UK-Export-Finance/dtfs2/commit/92d0ca6f2993366855978f9dbfe1fcc2e6911f5e)) +* **npm-lint:** Various npm audit and lint fixes ([#1296](https://github.com/UK-Export-Finance/dtfs2/issues/1296)) ([b2f6923](https://github.com/UK-Export-Finance/dtfs2/commit/b2f692310d7e0a168185565c92bd5c8916d6898f)) +* **party-urn-additional-check:** PartyURN routes and functions ([04e4fa3](https://github.com/UK-Export-Finance/dtfs2/commit/04e4fa36ce15da08c2b7ed2e2929353b3a63f468)) +* **party-urn-additional-check:** PartyURN routes and functions ([#1328](https://github.com/UK-Export-Finance/dtfs2/issues/1328)) ([2e29c08](https://github.com/UK-Export-Finance/dtfs2/commit/2e29c088bf8ed4cf5b1d4ec55d286f99f5f954ba)) +* **rename-microservice:** external-api from reference-data-proxy ([#1704](https://github.com/UK-Export-Finance/dtfs2/issues/1704)) ([1f11c97](https://github.com/UK-Export-Finance/dtfs2/commit/1f11c976ef869cd8fadeaea96607d860ab36751f)) +* **rename:** renamed reference data proxy to external api ([#1752](https://github.com/UK-Export-Finance/dtfs2/issues/1752)) ([66f53f3](https://github.com/UK-Export-Finance/dtfs2/commit/66f53f345f568b0c76b6ffe13629e27ca76de6f4)) +* **reporting-rad:** CSV write ([4d1ab7f](https://github.com/UK-Export-Finance/dtfs2/commit/4d1ab7fd029669c2ccc5109d366f7001aa219b54)) +* **SR-7:** add internal service rate limiting ([#1941](https://github.com/UK-Export-Finance/dtfs2/issues/1941)) ([b1ebaaa](https://github.com/UK-Export-Finance/dtfs2/commit/b1ebaaacc7b22e1d4a1bb6d988b546d9d8336204)) +* **SR-7:** prevent malicious mongo db queries ([#1946](https://github.com/UK-Export-Finance/dtfs2/issues/1946)) ([c134bc5](https://github.com/UK-Export-Finance/dtfs2/commit/c134bc5d4130b9e91adfd443174897fe9daa6235)) +* **tfm-reporting:** Code abstraction ([5d3578b](https://github.com/UK-Export-Finance/dtfs2/commit/5d3578b796898b3fe7de2a6cb619f9833f6638c2)) +* **tfm-reporting:** Code abstraction ([e676509](https://github.com/UK-Export-Finance/dtfs2/commit/e6765092f178f2bc16229bd506fee31b44c1283e)) +* **tfm-reporting:** EPOCH as an argument ([1604455](https://github.com/UK-Export-Finance/dtfs2/commit/1604455adced5aaf76abe4388653184a0eabf6c4)) +* **tfm-reporting:** EPOCH as an argument ([80070d9](https://github.com/UK-Export-Finance/dtfs2/commit/80070d9fa7d3c771f0af339cb5b1998fb4a0e53e)) +* **tfm-reporting:** TFM reporting ([a8cbd49](https://github.com/UK-Export-Finance/dtfs2/commit/a8cbd49448bcd590255de0a48abfaf5bbcb41dcd)) +* **tfm-reporting:** TFM reporting ([3350555](https://github.com/UK-Export-Finance/dtfs2/commit/33505554adcc93886f7638d334f7013f5176268a)) +* **UI:** removed footer telephone number ([#1830](https://github.com/UK-Export-Finance/dtfs2/issues/1830)) ([b0f33cf](https://github.com/UK-Export-Finance/dtfs2/commit/b0f33cf9f675704e59656fabf5890926f6e929aa)) + + +### Bug Fixes + +* **acbs:** exposure period calculation ([#1648](https://github.com/UK-Export-Finance/dtfs2/issues/1648)) ([2688189](https://github.com/UK-Export-Finance/dtfs2/commit/268818938c1788e7d74b0447a044c2099424e69f)) +* **allowed-extensions:** removed zip and msg ([#1850](https://github.com/UK-Export-Finance/dtfs2/issues/1850)) ([37ecf04](https://github.com/UK-Export-Finance/dtfs2/commit/37ecf0436b1c63119b00baa929933066e75d224a)) +* **api/tfm/facility:** dtfs DOF mulesoft to apim migration ([#1811](https://github.com/UK-Export-Finance/dtfs2/issues/1811)) ([77b9217](https://github.com/UK-Export-Finance/dtfs2/commit/77b9217066f85d7acf7ebc33a82f937c8648b32f)) +* **apim/tfs:** party + deal records ([#1810](https://github.com/UK-Export-Finance/dtfs2/issues/1810)) ([d171731](https://github.com/UK-Export-Finance/dtfs2/commit/d1717314008cc62718028907a105c6e5cfda6396)) +* **apim:** apim tfs migration ([#1837](https://github.com/UK-Export-Finance/dtfs2/issues/1837)) ([f473cf4](https://github.com/UK-Export-Finance/dtfs2/commit/f473cf4c8e055ff64a396f8489c54d05b288bd1c)) +* **apim:** facility issuance ([#1846](https://github.com/UK-Export-Finance/dtfs2/issues/1846)) ([6b5c362](https://github.com/UK-Export-Finance/dtfs2/commit/6b5c362db56b22796e8076e42f0e2e8872d0e074)) +* **commit:** git pre-commit hook ([#1887](https://github.com/UK-Export-Finance/dtfs2/issues/1887)) ([68fb719](https://github.com/UK-Export-Finance/dtfs2/commit/68fb719646d1d9d600ca391fc4c2f2cff0429242)) +* **cspell:** cspell ([58c4450](https://github.com/UK-Export-Finance/dtfs2/commit/58c4450cfbf37a9252808e8d7b58edd350ee4196)) +* **csp:** removed inline <script> tag ([#1944](https://github.com/UK-Export-Finance/dtfs2/issues/1944)) ([1fd6587](https://github.com/UK-Export-Finance/dtfs2/commit/1fd6587c4294f74705294f1d5188f1ccfbd105d0)) +* **csp:** TFM `CSP` fix ([#1950](https://github.com/UK-Export-Finance/dtfs2/issues/1950)) ([1b6455a](https://github.com/UK-Export-Finance/dtfs2/commit/1b6455af4609eb7db520841df44a546078bae90d)) +* **currency-exchange-rate:** Currency exchange rate calculation ([#1644](https://github.com/UK-Export-Finance/dtfs2/issues/1644)) ([75c53df](https://github.com/UK-Export-Finance/dtfs2/commit/75c53df16d2bee556bf7f7788b96924b2c0acb05)) +* **deps:** reverted breaking dependencies ([#1578](https://github.com/UK-Export-Finance/dtfs2/issues/1578)) ([95d2e12](https://github.com/UK-Export-Finance/dtfs2/commit/95d2e1264ca425a9a26f6ec976c7ea84c786858a)) +* **docker:** `redis` docker configuration ([#1643](https://github.com/UK-Export-Finance/dtfs2/issues/1643)) ([6b971f4](https://github.com/UK-Export-Finance/dtfs2/commit/6b971f4ecc52ee582af219abc63d001878b4e28d)) +* **dockerfile:** Node v10 incompatible with npm 9.5.1 ([86deb63](https://github.com/UK-Export-Finance/dtfs2/commit/86deb638cd9c7d4005d50a47ec26a71597846ecd)) +* **dockerfile:** Node v10 incompatible with npm 9.5.1 ([#1332](https://github.com/UK-Export-Finance/dtfs2/issues/1332)) ([d7dc4e1](https://github.com/UK-Export-Finance/dtfs2/commit/d7dc4e1c70f304e1bcae93186aabef5189458a8f)) +* **dockerignore:** fixed docker ignore paths ([#1942](https://github.com/UK-Export-Finance/dtfs2/issues/1942)) ([ca7ffd3](https://github.com/UK-Export-Finance/dtfs2/commit/ca7ffd3d1231547c7f549798c2acf2aeb65026d4)) +* **docs:** markdown syntax error ([560bd3e](https://github.com/UK-Export-Finance/dtfs2/commit/560bd3e4e4fa4b3f8ce7a1e291f5c9fa9b352252)) +* **DTFS2-5656:** Add middleware to strip _csrf token from body of requests ([#1879](https://github.com/UK-Export-Finance/dtfs2/issues/1879)) ([1b7eb95](https://github.com/UK-Export-Finance/dtfs2/commit/1b7eb952be099cd2c1d66dd5c08180073828e1a3)) +* **DTFS2-5768:** Fix deal and facility portal filtering ([#1757](https://github.com/UK-Export-Finance/dtfs2/issues/1757)) ([32330d0](https://github.com/UK-Export-Finance/dtfs2/commit/32330d011c2d969f45b32e0bbbafed2301dce977)) +* **DTFS2-6147:** vulnerabilities test coverage ([#1700](https://github.com/UK-Export-Finance/dtfs2/issues/1700)) ([1c6d17b](https://github.com/UK-Export-Finance/dtfs2/commit/1c6d17bfb49f72e98e934372d475d57e8363efc0)) +* **DTFS2-6235:** Code quality improvement and Data sanatisation ([2e5a103](https://github.com/UK-Export-Finance/dtfs2/commit/2e5a103cd0854a71a53e8254111369adffd393e0)) +* **DTFS2-6235:** Code quality improvement and Data sanatisation ([41b5614](https://github.com/UK-Export-Finance/dtfs2/commit/41b5614e2db9c6efe3e9278e31fbd5f9f504fbfe)) +* **DTFS2-6235:** Test coverage regarding comma amount ([84b4da2](https://github.com/UK-Export-Finance/dtfs2/commit/84b4da239266348819c806543387e20cef68d929)) +* **DTFS2-6235:** Test coverage regarding comma amount ([bdc2136](https://github.com/UK-Export-Finance/dtfs2/commit/bdc21360a9fa69c111c7cbc12b8bb9f4eef55e19)) +* **DTFS2-6239:** ACBS Facility mapping ([#1265](https://github.com/UK-Export-Finance/dtfs2/issues/1265)) ([8620929](https://github.com/UK-Export-Finance/dtfs2/commit/86209294b916fdddfedb1cdd16b7080c595d4dc0)) +* **DTFS2-6239:** Defaulted to if currency.id is not present ([5aeb188](https://github.com/UK-Export-Finance/dtfs2/commit/5aeb188659e2874701050e31c83ed048989d7baa)) +* **DTFS2-6239:** Defaulted to if currency.id is not present ([833261e](https://github.com/UK-Export-Finance/dtfs2/commit/833261ef1761a23455af901c1146c489cf741ae8)) +* **DTFS2-6239:** Facility level default currency ([#1264](https://github.com/UK-Export-Finance/dtfs2/issues/1264)) ([60ca60e](https://github.com/UK-Export-Finance/dtfs2/commit/60ca60e86588119a4686b60af80023ff5d6b3d5d)) +* **DTFS2-6239:** Facility level default currency ([#1264](https://github.com/UK-Export-Finance/dtfs2/issues/1264)) ([32a56d8](https://github.com/UK-Export-Finance/dtfs2/commit/32a56d8d751971e82bba4621f0ef1b5a01b81699)) +* **DTFS2-6239:** Replaced optinal chaining with OR ([0186f35](https://github.com/UK-Export-Finance/dtfs2/commit/0186f35a192cb9575d029f3ebf173ea2a97c6855)) +* **DTFS2-6253:** Introduction of new unit test cases and code simplification ([b2c4f5f](https://github.com/UK-Export-Finance/dtfs2/commit/b2c4f5f07f2b979d8fefeb3d5bd1ca512cfa7057)) +* **DTFS2-6253:** Introduction of new unit test cases and code simplification ([07012dd](https://github.com/UK-Export-Finance/dtfs2/commit/07012dd019b51aca5e803343f400784326ab1b39)) +* **DTFS2-6293:** Added beforeEach visit for test cases ([8397a92](https://github.com/UK-Export-Finance/dtfs2/commit/8397a920f09d70a9b15827afe2d51e8692fb388f)) +* **DTFS2-6293:** Added beforeEach visit for test cases ([7136a21](https://github.com/UK-Export-Finance/dtfs2/commit/7136a210c8b145c9cf4f01d562573f9132b28209)) +* **DTFS2-6293:** connect.sid renamed to dtfs-session ([7d52fab](https://github.com/UK-Export-Finance/dtfs2/commit/7d52fab6b3445aee8fa3432cb3adb7694c3b70b5)) +* **DTFS2-6293:** Cookie debuging ([05319e5](https://github.com/UK-Export-Finance/dtfs2/commit/05319e5b67af6cac41589c019ff499a539b12ea6)) +* **DTFS2-6293:** Cookie preserve ([7b4a533](https://github.com/UK-Export-Finance/dtfs2/commit/7b4a5330e581411aa0a45435031823e39ff1aae0)) +* **DTFS2-6293:** Cookie security ([1348e0b](https://github.com/UK-Export-Finance/dtfs2/commit/1348e0b94f2057dd4de5f783dc68b5b1e37d27b8)) +* **DTFS2-6293:** Cookie security ([#1308](https://github.com/UK-Export-Finance/dtfs2/issues/1308)) ([7480912](https://github.com/UK-Export-Finance/dtfs2/commit/748091227325595edfc7425bb238dc5266de61ed)) +* **DTFS2-6293:** Cypress preserve cookie ([e610f3f](https://github.com/UK-Export-Finance/dtfs2/commit/e610f3f9efdccbc71ca3ad2e1a85eb5ab2410cf8)) +* **DTFS2-6293:** Cypress updated to v12 ([f65f187](https://github.com/UK-Export-Finance/dtfs2/commit/f65f18774489a687dd10eb75fac370f6a4d30d5f)) +* **DTFS2-6293:** Fixed E2E ([8c0fea6](https://github.com/UK-Export-Finance/dtfs2/commit/8c0fea66115eb007bd9f0a495b190242073799d6)) +* **DTFS2-6293:** Fixed E2E ([449f73d](https://github.com/UK-Export-Finance/dtfs2/commit/449f73d5a46190b990b0b1f66c13f59683bf7ddd)) +* **DTFS2-6293:** Fixed E2E ([c79e1c1](https://github.com/UK-Export-Finance/dtfs2/commit/c79e1c1d0702ff24487a5e7f3189c5afc7d91110)) +* **DTFS2-6293:** Fixed E2E ([f54d355](https://github.com/UK-Export-Finance/dtfs2/commit/f54d355482f341236143c5e4e0e0aea876da3e7c)) +* **DTFS2-6293:** Fixed E2E tests ([efda164](https://github.com/UK-Export-Finance/dtfs2/commit/efda1648dd5c8807dd9e150feb2ae503df6dc524)) +* **DTFS2-6293:** Fixed E2E tests ([02d02fb](https://github.com/UK-Export-Finance/dtfs2/commit/02d02fbea6691050dcc4a218b4601176d4373e24)) +* **DTFS2-6293:** Fixed E2E tests ([1bbfd98](https://github.com/UK-Export-Finance/dtfs2/commit/1bbfd98dd7dc6e7fe64cb2068f2ab2107b02d100)) +* **DTFS2-6293:** Fixed E2E tests ([3d2abb3](https://github.com/UK-Export-Finance/dtfs2/commit/3d2abb3a68b8e8a3d348f2e2750134f6d68a1a9e)) +* **DTFS2-6293:** Fixed failing E2E tests ([266eac2](https://github.com/UK-Export-Finance/dtfs2/commit/266eac29cf5927270c173ab5fc24f07f4cf43810)) +* **DTFS2-6293:** Fixed failing E2E tests ([fe10a20](https://github.com/UK-Export-Finance/dtfs2/commit/fe10a20a76bc6cae4b3b4a12f519462aad67b33a)) +* **DTFS2-6293:** Lint fix ([9140450](https://github.com/UK-Export-Finance/dtfs2/commit/91404500f73898b846472860ff18bdadc45eee86)) +* **DTFS2-6293:** Removed Cypress.cookie.preserveOnce deprecated call ([9c5219d](https://github.com/UK-Export-Finance/dtfs2/commit/9c5219db20190d3f132b97a05d066b9679702bc2)) +* **DTFS2-6293:** Removed login() - Frivolous for feedback ([cfc2b38](https://github.com/UK-Export-Finance/dtfs2/commit/cfc2b3874bf68587e63242f038442b590ef29974)) +* **DTFS2-6293:** Test case naming convention ([46483b3](https://github.com/UK-Export-Finance/dtfs2/commit/46483b3d2d3cabb7f448166ac1297dc28769c0d7)) +* **DTFS2-6306:** Added confirm routes ([c94781a](https://github.com/UK-Export-Finance/dtfs2/commit/c94781a0d4cf61c7763eeaa0dfc018ea3804407b)) +* **DTFS2-6306:** Removed console.log ([cb859ad](https://github.com/UK-Export-Finance/dtfs2/commit/cb859ad14bc7b33a4c479ae9c8ba16d948bb2ee9)) +* **DTFS2-6310:** Added uncaught:exception to false and webpack conflicting names resolved ([a888e37](https://github.com/UK-Export-Finance/dtfs2/commit/a888e373541d57d99949feef3745174efd7eb40c)) +* **DTFS2-6310:** Consistent imports ([b7c1ebc](https://github.com/UK-Export-Finance/dtfs2/commit/b7c1ebc5f09c6cb6dcb24dc6dd4a819bf03fb91a)) +* **DTFS2-6310:** E2E test import fix + Main merge ([e9389a2](https://github.com/UK-Export-Finance/dtfs2/commit/e9389a249a2c68678cbe182d1a560ada86b61ecd)) +* **DTFS2-6310:** GHA fix ([b1a97b5](https://github.com/UK-Export-Finance/dtfs2/commit/b1a97b5c55c597888a0e902bcee9cfc5bbd5ff01)) +* **DTFS2-6310:** Import fix ([a2b32de](https://github.com/UK-Export-Finance/dtfs2/commit/a2b32de5454087767363505a448885a33185cfd5)) +* **DTFS2-6310:** Premature return statements removed ([5753add](https://github.com/UK-Export-Finance/dtfs2/commit/5753add10a01995bf72ba30931763c0d296e61b5)) +* **DTFS2-6352:** TFM GEF EC 2.15 updated to reflect MGA ([#1340](https://github.com/UK-Export-Finance/dtfs2/issues/1340)) ([8eaa0af](https://github.com/UK-Export-Finance/dtfs2/commit/8eaa0af2fda835c044f52bd472ef482c718ea956)) +* **DTFS2-6419:** `/currency/exchange` endpoint migration ([#1632](https://github.com/UK-Export-Finance/dtfs2/issues/1632)) ([922611a](https://github.com/UK-Export-Finance/dtfs2/commit/922611a515becaad1f7c6995060af44d76cdc494)) +* **DTFS2-6614:** remove `errorLog` collection usage ([#1966](https://github.com/UK-Export-Finance/dtfs2/issues/1966)) ([fb6df18](https://github.com/UK-Export-Finance/dtfs2/commit/fb6df18cca259b9f4ac201d00170167a071e9bbe)) +* **DTFS2-6615:** allow most csp headers in e2e tests ([#1961](https://github.com/UK-Export-Finance/dtfs2/issues/1961)) ([852e201](https://github.com/UK-Export-Finance/dtfs2/commit/852e201c1334f176be8ef63439616179c2e195f7)) +* **DTFS2-6620:** fix gef correspondence address script not loading due to SRI hash mismatch ([#1965](https://github.com/UK-Export-Finance/dtfs2/issues/1965)) ([12ced93](https://github.com/UK-Export-Finance/dtfs2/commit/12ced93cdd752eb6d5326c7ab5372d508febddcd)) +* **DTFS2-6681:** extract reset password payload in portal-api ([#2045](https://github.com/UK-Export-Finance/dtfs2/issues/2045)) ([86855d4](https://github.com/UK-Export-Finance/dtfs2/commit/86855d4565df7bc0b8211a1ee737486ff31433fc)) +* **DTFS2:** Add interface to premium Schedule ([#1755](https://github.com/UK-Export-Finance/dtfs2/issues/1755)) ([ba08d19](https://github.com/UK-Export-Finance/dtfs2/commit/ba08d197672da7bb3e349c1a92818819dc9488c9)) +* **DTFS2:** Fix amendments endpoint with req.query -> req.params change ([592a496](https://github.com/UK-Export-Finance/dtfs2/commit/592a4966985f1c0a051f1695526492f384c9b45c)) +* **DTFS2:** Fix get all amendments endpoint ([#1766](https://github.com/UK-Export-Finance/dtfs2/issues/1766)) ([d7a583e](https://github.com/UK-Export-Finance/dtfs2/commit/d7a583eeb7897a02f3def91eeebfad2a4f18f678)) +* **DTFS2:** Fix get amendments related central API tests ([e189961](https://github.com/UK-Export-Finance/dtfs2/commit/e1899616758c3981f2584e493b9f790b86c87e1d)) +* **DTFS2:** Fix get amendments related central API tests ([#1772](https://github.com/UK-Export-Finance/dtfs2/issues/1772)) ([1fdd57b](https://github.com/UK-Export-Finance/dtfs2/commit/1fdd57bb62e48d78729f9984e943fb6779915147)) +* **DTFS2:** fix vulnerable endpoints on external api ([#1756](https://github.com/UK-Export-Finance/dtfs2/issues/1756)) ([e16af16](https://github.com/UK-Export-Finance/dtfs2/commit/e16af169ea4536165db2cf74b79c8fcf36ca3684)) +* **DTFS2:** review mark-ups ([76c8774](https://github.com/UK-Export-Finance/dtfs2/commit/76c87746a52722ca6eade703c818374c6c77ff44)) +* **durable-functions:** updated nodejs version to v14 ([#1703](https://github.com/UK-Export-Finance/dtfs2/issues/1703)) ([787a42b](https://github.com/UK-Export-Finance/dtfs2/commit/787a42b6d6a5f18cc3b6b1606348300f5dd20df7)) +* **e2e-tenor:** Changed fxied tenro from 25 to 26 months ([5c9e7c5](https://github.com/UK-Export-Finance/dtfs2/commit/5c9e7c5a06d6fed27f0072ab4072ed2ffd6a1023)) +* **e2e-tenor:** Changed fxied tenro from 25 to 26 months ([3901a35](https://github.com/UK-Export-Finance/dtfs2/commit/3901a35360407f94b569a26aed2af178c43c047a)) +* **env:** fixed environment variables ([#1886](https://github.com/UK-Export-Finance/dtfs2/issues/1886)) ([2dd72aa](https://github.com/UK-Export-Finance/dtfs2/commit/2dd72aaaf5f34339fb9538f3a516ca06b0163035)) +* **error-handling:** Error handling with console.errors and returning errors ([#1877](https://github.com/UK-Export-Finance/dtfs2/issues/1877)) ([e530a64](https://github.com/UK-Export-Finance/dtfs2/commit/e530a6416d22d5dad12df3bb5e47a05c7e1d4f0d)) +* **External-API-console:** Correct format for console.info and errors ([#1871](https://github.com/UK-Export-Finance/dtfs2/issues/1871)) ([b7fddd7](https://github.com/UK-Export-Finance/dtfs2/commit/b7fddd7c149acac91b6bbfba6bf0b43e82dbaca2)) +* **external-api:** url typo fixes ([#1813](https://github.com/UK-Export-Finance/dtfs2/issues/1813)) ([98797c4](https://github.com/UK-Export-Finance/dtfs2/commit/98797c49cf9fe5c29e040f5e7eeeb9ae5c4ddea3)) +* fixed forward slash for file location ([#1875](https://github.com/UK-Export-Finance/dtfs2/issues/1875)) ([1b1f679](https://github.com/UK-Export-Finance/dtfs2/commit/1b1f6796e4bff04d0a8468ff8f546a5b757214ee)) +* fixed the `siteName` not updating in tfm ([#1979](https://github.com/UK-Export-Finance/dtfs2/issues/1979)) ([7941cf1](https://github.com/UK-Export-Finance/dtfs2/commit/7941cf1fc8ffbd75e69e13677cf2bee30674841e)) +* fixed the webpack build ([#1640](https://github.com/UK-Export-Finance/dtfs2/issues/1640)) ([2abe7da](https://github.com/UK-Export-Finance/dtfs2/commit/2abe7dad651686fbf7b6154aef2ea02892a14b2b)) +* fixing json format error in github action publish.yml ([2390d16](https://github.com/UK-Export-Finance/dtfs2/commit/2390d16d6fce3ac442acb840a670e0ba48966db3)) +* fixing json format error in github action publish.yml ([#1991](https://github.com/UK-Export-Finance/dtfs2/issues/1991)) ([917ba87](https://github.com/UK-Export-Finance/dtfs2/commit/917ba87f34b0736231119fbc6500bee82ad414af)) +* **iac:** added jwt validating key ([#1838](https://github.com/UK-Export-Finance/dtfs2/issues/1838)) ([71c2b12](https://github.com/UK-Export-Finance/dtfs2/commit/71c2b12eab13396b0f6f9a43943d3a12b9ae8971)) +* **iac:** environment variables for number generator ([#1864](https://github.com/UK-Export-Finance/dtfs2/issues/1864)) ([a0973cf](https://github.com/UK-Export-Finance/dtfs2/commit/a0973cfdd79bc27f7966be6dfd9298214f457248)) +* lint current commit message on commit instead of previous ([#1888](https://github.com/UK-Export-Finance/dtfs2/issues/1888)) ([64500a7](https://github.com/UK-Export-Finance/dtfs2/commit/64500a716ce82204cc65637db4992931a95f0616)) +* **lint:** Lint error fixed & variables renamed ([#1829](https://github.com/UK-Export-Finance/dtfs2/issues/1829)) ([fc410f0](https://github.com/UK-Export-Finance/dtfs2/commit/fc410f0362e806c0a9bab534170b4475292e15f5)) +* **lint:** lint fixes ([#1694](https://github.com/UK-Export-Finance/dtfs2/issues/1694)) ([1dd2334](https://github.com/UK-Export-Finance/dtfs2/commit/1dd233453dd1999923a627b829f28d36178e5494)) +* **lint:** various lint errors fixes ([6e737d1](https://github.com/UK-Export-Finance/dtfs2/commit/6e737d16c5dc47c956a4700eea0f557ef46cee50)) +* **lint:** various lint errors fixes ([#1853](https://github.com/UK-Export-Finance/dtfs2/issues/1853)) ([36c0d03](https://github.com/UK-Export-Finance/dtfs2/commit/36c0d03b691deb6dc71fc439a2f894486ca80dfb)) +* **mock-data-loader:** Fix TFM failing on mock-data-loader ([#1857](https://github.com/UK-Export-Finance/dtfs2/issues/1857)) ([e7a0049](https://github.com/UK-Export-Finance/dtfs2/commit/e7a0049848a0614a75339cfb10be0aacfc7d6ad2)) +* **mongo:** Remove MongoDB URI with credentials ([#1977](https://github.com/UK-Export-Finance/dtfs2/issues/1977)) ([760cbd6](https://github.com/UK-Export-Finance/dtfs2/commit/760cbd6ef4d2807691968ed99a5955b830c4d6e9)) +* **no-activities:** Prevents TFM crash when no acitivity exist ([6068fe9](https://github.com/UK-Export-Finance/dtfs2/commit/6068fe9916dfd272c2eb992e52c1900a7b8841bb)) +* **no-activities:** Prevents TFM crash when no acitivity exist ([#1318](https://github.com/UK-Export-Finance/dtfs2/issues/1318)) ([b236160](https://github.com/UK-Export-Finance/dtfs2/commit/b236160e843a1d3dc520bdbe37806417d3b35c05)) +* **no-currency:** Default to `GBP` on void currency ([#1326](https://github.com/UK-Export-Finance/dtfs2/issues/1326)) ([52d0941](https://github.com/UK-Export-Finance/dtfs2/commit/52d094172388167e88bb8dcb530d226348ea0784)) +* **no-currency:** Default to GBP when currency exists ([50b69ae](https://github.com/UK-Export-Finance/dtfs2/commit/50b69ae1093c079cc22f66f75cd98e93bcd12752)) +* **npm:** updated deps + new services ([#1637](https://github.com/UK-Export-Finance/dtfs2/issues/1637)) ([97af795](https://github.com/UK-Export-Finance/dtfs2/commit/97af795527dd519b1db759dd14c0da13d8e8d905)) +* **portal-api-exception-text:** Portal-API - error return ([#1866](https://github.com/UK-Export-Finance/dtfs2/issues/1866)) ([55c53ce](https://github.com/UK-Export-Finance/dtfs2/commit/55c53cec29bf3416220086f0658e566996a3974e)) +* **portal-api:** azure webapp healthcheck ([#1638](https://github.com/UK-Export-Finance/dtfs2/issues/1638)) ([de3feb5](https://github.com/UK-Export-Finance/dtfs2/commit/de3feb5c1d0683f7cbc4b7559a6473286a66fcc6)) +* **portal-api:** health check `/` ([#1636](https://github.com/UK-Export-Finance/dtfs2/issues/1636)) ([02f853a](https://github.com/UK-Export-Finance/dtfs2/commit/02f853a55e1b5f6f284fdbc64f54e25075152590)) +* **portal-api:** Replaced `authRouterAllowXss` with `authRouter` ([#1817](https://github.com/UK-Export-Finance/dtfs2/issues/1817)) ([ba93931](https://github.com/UK-Export-Finance/dtfs2/commit/ba939311aacd5ceba8a7643c5d3234321e2299d1)) +* **rad-reporting:** Enhanced strip commas ([b638aae](https://github.com/UK-Export-Finance/dtfs2/commit/b638aae0445d2e1cd86448d5bd0a32d46a2dae75)) +* **rad-reporting:** Enhanced strip commas ([9e15633](https://github.com/UK-Export-Finance/dtfs2/commit/9e156339b09ddf11d748601e11da9ae03c31e275)) +* **regex:** company house validation ([#1859](https://github.com/UK-Export-Finance/dtfs2/issues/1859)) ([c602aca](https://github.com/UK-Export-Finance/dtfs2/commit/c602aca37ee5a1b1dc977eb918ba8ec2294c4a47)) +* **reporting-rad:** Promise handling + GitIgnore ([c6bbbe4](https://github.com/UK-Export-Finance/dtfs2/commit/c6bbbe4dd964c3e99ef08972e57e5a5135868f74)) +* **reporting-rad:** Promise handling + GitIgnore ([16d0037](https://github.com/UK-Export-Finance/dtfs2/commit/16d00374e1dd75466c7780e422feabbf253e93aa)) +* **reporting:** Removed deprecated returnOriginal ([4954982](https://github.com/UK-Export-Finance/dtfs2/commit/4954982133950af578a584f5897e4d3af9abbf8b)) +* **reporting:** Removed deprecated returnOriginal ([0ef4718](https://github.com/UK-Export-Finance/dtfs2/commit/0ef4718a56991c81e12edd90ff4bcc901769139e)) +* reverted redis changes ([#1642](https://github.com/UK-Export-Finance/dtfs2/issues/1642)) ([e8349fc](https://github.com/UK-Export-Finance/dtfs2/commit/e8349fc5cd0c55d71038f77fbcc1dcbe4fd9dbec)) +* **security:** mitigated various GH security alerts ([#1939](https://github.com/UK-Export-Finance/dtfs2/issues/1939)) ([2c1f432](https://github.com/UK-Export-Finance/dtfs2/commit/2c1f4321390fbfece21b0742fced2b70ab97562f)) +* **SR-12:** Stop exposing full error messages and stack traces ([#1860](https://github.com/UK-Export-Finance/dtfs2/issues/1860)) ([682c8ca](https://github.com/UK-Export-Finance/dtfs2/commit/682c8cace90e66c7a5a62164ea62f777e527ca0e)) +* **SR-14:** Estore API SSRF protection ([#1883](https://github.com/UK-Export-Finance/dtfs2/issues/1883)) ([2e475af](https://github.com/UK-Export-Finance/dtfs2/commit/2e475aff7e3e45b996ab7229ddd5bed7675b3920)) +* **SR-14:** file limit size on portal ([#1872](https://github.com/UK-Export-Finance/dtfs2/issues/1872)) ([62fb1ae](https://github.com/UK-Export-Finance/dtfs2/commit/62fb1aedcecca0ca9eb368f8290d1c43107c9ece)) +* **SR-14:** limit file size on uploads ([#1861](https://github.com/UK-Export-Finance/dtfs2/issues/1861)) ([7c5a878](https://github.com/UK-Export-Finance/dtfs2/commit/7c5a87813e508ed3cdb39efe40d51886f0f9f150)) +* **SR-14:** Use constant with 12mb limit instead of hard-coded 10mb ([#1874](https://github.com/UK-Export-Finance/dtfs2/issues/1874)) ([96e1942](https://github.com/UK-Export-Finance/dtfs2/commit/96e19425f4f431d3701666ef48b619b92f94be97)) +* **SR-1:** Add JWT authentication to all endpoints in portal-api ([#1770](https://github.com/UK-Export-Finance/dtfs2/issues/1770)) ([c164333](https://github.com/UK-Export-Finance/dtfs2/commit/c164333439465c1d8b378efc20510c2a23fe45ed)) +* **SR-2:** vulnerability fixes on TFM API ([#1771](https://github.com/UK-Export-Finance/dtfs2/issues/1771)) ([62ceef6](https://github.com/UK-Export-Finance/dtfs2/commit/62ceef6f83a97337a7c5f315440d45ea95f8ddda)) +* **SR-3:** External API - API key middleware ([#1768](https://github.com/UK-Export-Finance/dtfs2/issues/1768)) ([43cb6c5](https://github.com/UK-Export-Finance/dtfs2/commit/43cb6c55cabdf0c01d1bf4cfef666f33cffeaeaa)) +* **SR-4:** Add x-api-key header authentication to dtfs-central-api ([#1778](https://github.com/UK-Export-Finance/dtfs2/issues/1778)) ([96db640](https://github.com/UK-Export-Finance/dtfs2/commit/96db640a1834644e53d0502ad6caf64f044dbd69)) +* **sr-5:** Add SSRF protection to TFM microservices ([#1821](https://github.com/UK-Export-Finance/dtfs2/issues/1821)) ([67a2b69](https://github.com/UK-Export-Finance/dtfs2/commit/67a2b69344eafcdd9204ae6ba37e1acb3fd7d265)) +* **SR-5:** protect `external-api` from SSRF ([#1848](https://github.com/UK-Export-Finance/dtfs2/issues/1848)) ([e06d31f](https://github.com/UK-Export-Finance/dtfs2/commit/e06d31f7de9fb1da43f91c761e853855fc25a7a5)) +* **SR-5:** Small codacity fix ([#1852](https://github.com/UK-Export-Finance/dtfs2/issues/1852)) ([c8e317e](https://github.com/UK-Export-Finance/dtfs2/commit/c8e317e3a6b9593a14e513a1645366c95aabc45c)) +* **SR-8:** sanitise db input additional changes ([#1955](https://github.com/UK-Export-Finance/dtfs2/issues/1955)) ([1443e58](https://github.com/UK-Export-Finance/dtfs2/commit/1443e5860cb28027febf44c80d3bea5979b3e69b)) +* **sr-8:** update error message name ([#1963](https://github.com/UK-Export-Finance/dtfs2/issues/1963)) ([2e930dc](https://github.com/UK-Export-Finance/dtfs2/commit/2e930dcc3ec4b13e7f402d3be882ea4159507873)) +* **SR-9:** Add csrf checks to missing Gef and Portal routes ([#1847](https://github.com/UK-Export-Finance/dtfs2/issues/1847)) ([7374f0f](https://github.com/UK-Export-Finance/dtfs2/commit/7374f0fb05d0b3259efe7fd1840c706cdf01425a)) +* **SR10:** fixed the incomplete string escaping ([#1818](https://github.com/UK-Export-Finance/dtfs2/issues/1818)) ([0f861ad](https://github.com/UK-Export-Finance/dtfs2/commit/0f861ad45e580f3a6fa13ee446fbefe4b763e9ab)) +* **SR13:** fixed exception text reinterpreted as HTML ([#1819](https://github.com/UK-Export-Finance/dtfs2/issues/1819)) ([2cdaeab](https://github.com/UK-Export-Finance/dtfs2/commit/2cdaeab5ff6977bdf69841a49d72b3cd1551c966)) +* **SR6:** removed deal and facility import endpoints ([#1815](https://github.com/UK-Export-Finance/dtfs2/issues/1815)) ([8cddd91](https://github.com/UK-Export-Finance/dtfs2/commit/8cddd91f25e1fb89aa863ccb62728b11ba718f98)) +* **SR7:** `insertOne` NoSQLi mitigation ([#1952](https://github.com/UK-Export-Finance/dtfs2/issues/1952)) ([93aefbb](https://github.com/UK-Export-Finance/dtfs2/commit/93aefbb1bc1dbf67dae82bb89fcd194f27c3d299)) +* **SR8:** `deleteOne` operator NoSQLi mitigation ([#1945](https://github.com/UK-Export-Finance/dtfs2/issues/1945)) ([49ab09f](https://github.com/UK-Export-Finance/dtfs2/commit/49ab09fedb176dd728953a64afe66828b7b1e045)) +* **SSRF:** Add missing validation to routes in portal and gef ([#1878](https://github.com/UK-Export-Finance/dtfs2/issues/1878)) ([beee599](https://github.com/UK-Export-Finance/dtfs2/commit/beee599af29c42be4018077d519033266216344b)) +* **tfm-api-email:** JOI validation for feedback email ([#1870](https://github.com/UK-Export-Finance/dtfs2/issues/1870)) ([4bb894c](https://github.com/UK-Export-Finance/dtfs2/commit/4bb894c554c3452ff50a505466a3f44fb37518b1)) +* **tfm-exception-text:** TFM UI - Sanitise-xss in index.js ([#1865](https://github.com/UK-Export-Finance/dtfs2/issues/1865)) ([a67034f](https://github.com/UK-Export-Finance/dtfs2/commit/a67034f39b814160fe2180ba289e4aae2d16ae62)) +* **tfm:** array validation ([#1840](https://github.com/UK-Export-Finance/dtfs2/issues/1840)) ([443a0eb](https://github.com/UK-Export-Finance/dtfs2/commit/443a0eba59f356d7a12acef4d849cbbbf3df6590)) +* **tfm:** Deal submission logging ([315b43b](https://github.com/UK-Export-Finance/dtfs2/commit/315b43b8a020e4d1cb387fa3c90c10c926ca1fd8)) +* **tfm:** Deal submission logging ([#1302](https://github.com/UK-Export-Finance/dtfs2/issues/1302)) ([5ab4007](https://github.com/UK-Export-Finance/dtfs2/commit/5ab400707f984554ecbf971ec8401970bea611e8)) +* **typo:** GHA job name ([#1754](https://github.com/UK-Export-Finance/dtfs2/issues/1754)) ([5a61411](https://github.com/UK-Export-Finance/dtfs2/commit/5a614115a05a8d346451d2b6f9b3c699b9990d8b)) +* **typo:** typo fix ([246e122](https://github.com/UK-Export-Finance/dtfs2/commit/246e1225ce38983805002a75f0efefc7e0666ebe)) +* **typo:** typo fix ([2ad53bc](https://github.com/UK-Export-Finance/dtfs2/commit/2ad53bc4b3146bf97ab636fa39709a86b7146139)) +* **ukefid:** UKEF ID validation ([#2054](https://github.com/UK-Export-Finance/dtfs2/issues/2054)) ([a948071](https://github.com/UK-Export-Finance/dtfs2/commit/a9480711bc39077f6508598ad76fd6f4c44b9591)) +* updated the eStore intervals ([31033e5](https://github.com/UK-Export-Finance/dtfs2/commit/31033e555693c2506d00d88bb684fceb43295e6a)) +* updated the eStore intervals ([#1331](https://github.com/UK-Export-Finance/dtfs2/issues/1331)) ([2755159](https://github.com/UK-Export-Finance/dtfs2/commit/2755159060ef50c0096e2ac9ce5e40e8b49a9cf6)) +* updated the timer settings for eStore ([#1880](https://github.com/UK-Export-Finance/dtfs2/issues/1880)) ([654e767](https://github.com/UK-Export-Finance/dtfs2/commit/654e7670745b37b0212faf7581ff399e277aac5f)) + + +### Miscellaneous + +* apply cspell check in lint-staged to all packages ([#1962](https://github.com/UK-Export-Finance/dtfs2/issues/1962)) ([96f46ca](https://github.com/UK-Export-Finance/dtfs2/commit/96f46caab8b02a192951b93adf92652639608ea2)) +* **cookie:** Added cookie related documentation ([feabab3](https://github.com/UK-Export-Finance/dtfs2/commit/feabab381a1429016dad54e9e74f234eff9ab0ac)) +* **cookie:** Added cookie related documentation ([#1319](https://github.com/UK-Export-Finance/dtfs2/issues/1319)) ([27c56f8](https://github.com/UK-Export-Finance/dtfs2/commit/27c56f811f2208d93bee745424c78d1de6cd0402)) +* CWE-1321 fix ([235200f](https://github.com/UK-Export-Finance/dtfs2/commit/235200f883f062dfe6fd4424af0611aaf2afce8e)) +* CWE-1321 fix ([69e8069](https://github.com/UK-Export-Finance/dtfs2/commit/69e8069bf1121adcb65c5fd18fd0552b6d79a28a)) +* **deps-dev:** bump @typescript-eslint/eslint-plugin from 5.56.0 to 5.59.0 ([#1532](https://github.com/UK-Export-Finance/dtfs2/issues/1532)) ([7fb66ba](https://github.com/UK-Export-Finance/dtfs2/commit/7fb66ba0e1233a169559fe3f9ec44b79a874c4b3)) +* **deps-dev:** Bump @typescript-eslint/eslint-plugin from 5.59.0 to 5.59.1 ([#1573](https://github.com/UK-Export-Finance/dtfs2/issues/1573)) ([95bcf76](https://github.com/UK-Export-Finance/dtfs2/commit/95bcf762c1bcbcf9d65591d91064c19827ee5c44)) +* **deps-dev:** bump eslint from 8.36.0 to 8.39.0 ([#1571](https://github.com/UK-Export-Finance/dtfs2/issues/1571)) ([1b2af79](https://github.com/UK-Export-Finance/dtfs2/commit/1b2af79b5936e924c496a6759a501f07c3949755)) +* **deps-dev:** bump eslint from 8.36.0 to 8.39.0 in /dtfs-central-api ([#1562](https://github.com/UK-Export-Finance/dtfs2/issues/1562)) ([6ad015f](https://github.com/UK-Export-Finance/dtfs2/commit/6ad015f470d411e9f410e086358266f0b9ad9517)) +* **deps-dev:** Bump eslint from 8.43.0 to 8.44.0 ([#1793](https://github.com/UK-Export-Finance/dtfs2/issues/1793)) ([5ec5b90](https://github.com/UK-Export-Finance/dtfs2/commit/5ec5b90605cbbf3f425009e5682e995c3b0fa172)) +* **deps-dev:** bump eslint-plugin-cypress from 2.12.1 to 2.13.2 ([#1398](https://github.com/UK-Export-Finance/dtfs2/issues/1398)) ([8c4a737](https://github.com/UK-Export-Finance/dtfs2/commit/8c4a737f48a23482e407088d0251653c34149e10)) +* **deps-dev:** bump prettier from 2.8.2 to 2.8.7 ([#1345](https://github.com/UK-Export-Finance/dtfs2/issues/1345)) ([f26ee1c](https://github.com/UK-Export-Finance/dtfs2/commit/f26ee1c2eebf960e52aeb0c219ef4bef955825e2)) +* **deps-dev:** Bump prettier from 2.8.2 to 2.8.8 ([#1580](https://github.com/UK-Export-Finance/dtfs2/issues/1580)) ([0eff77b](https://github.com/UK-Export-Finance/dtfs2/commit/0eff77b40f097e13326769639c5636c272897731)) +* **deps-dev:** bump prettier from 2.8.7 to 2.8.8 ([#1570](https://github.com/UK-Export-Finance/dtfs2/issues/1570)) ([fd62d64](https://github.com/UK-Export-Finance/dtfs2/commit/fd62d64950d19daad492b5293e01e6eda0fc7edc)) +* **deps-update:** apollo-server-express downgraded to 2.26.1 ([bc3a1e4](https://github.com/UK-Export-Finance/dtfs2/commit/bc3a1e4089198d3adc1048fad86a4eb9ca0851d1)) +* **deps-update:** apollo-server-express downgraded to 2.26.1 ([2b8831d](https://github.com/UK-Export-Finance/dtfs2/commit/2b8831d38549a3aa23c093005d0f338c4299a198)) +* **deps-update:** apollo-server-express downgraded to 2.26.1 ([7af9cd6](https://github.com/UK-Export-Finance/dtfs2/commit/7af9cd6756b36217b9e21102d5ee59db31013915)) +* **deps-update:** apollo-server-express downgraded to 2.26.1 ([8c97754](https://github.com/UK-Export-Finance/dtfs2/commit/8c977540b67622cc9750cd6ec5e2fa63fa3e67f9)) +* **deps-update:** apollo-server-express downgraded to 2.26.1 ([af4d5cc](https://github.com/UK-Export-Finance/dtfs2/commit/af4d5ccbc97db981149666b109653b840e8bd772)) +* **deps-update:** apollo-server-express downgraded to 2.26.1 ([f401cec](https://github.com/UK-Export-Finance/dtfs2/commit/f401cec546767263dde61132f993482d317509a3)) +* **deps-update:** Bumped dependencies ([#1259](https://github.com/UK-Export-Finance/dtfs2/issues/1259)) ([2890ed6](https://github.com/UK-Export-Finance/dtfs2/commit/2890ed6e010d966584b154d5aa69def5f97fa12b)) +* **deps-update:** Bumped dependencies ([#1259](https://github.com/UK-Export-Finance/dtfs2/issues/1259)) ([fcf296e](https://github.com/UK-Export-Finance/dtfs2/commit/fcf296ec1f155b9d6eba421befead9679ee4d67b)) +* **deps-update:** Dependency updates ([1c9903f](https://github.com/UK-Export-Finance/dtfs2/commit/1c9903f5f9e13bb73216adabeca2f8bd06a6fc27)) +* **deps-update:** Dependency updates ([c48f377](https://github.com/UK-Export-Finance/dtfs2/commit/c48f377f0d535af193c9ad871909fe2c1501b001)) +* **deps-update:** Dependency updates ([72cd012](https://github.com/UK-Export-Finance/dtfs2/commit/72cd0128b6e4d6c3075a06384690f810637bf2e3)) +* **deps-update:** Dependency updates ([464dd1b](https://github.com/UK-Export-Finance/dtfs2/commit/464dd1b105951f42d0a21ca26f010fb20e83ef57)) +* **deps-update:** npm ci with --legacy-peer-deps flag ([b74d431](https://github.com/UK-Export-Finance/dtfs2/commit/b74d431f2c8ba5857ac726e0acb75cfa5a141b14)) +* **deps-update:** npm ci with --legacy-peer-deps flag ([2574703](https://github.com/UK-Export-Finance/dtfs2/commit/2574703dcbdd42c0cbb6f7adb67885cdcce7a953)) +* **deps-update:** Reference data proxy ([#1263](https://github.com/UK-Export-Finance/dtfs2/issues/1263)) ([e4815ea](https://github.com/UK-Export-Finance/dtfs2/commit/e4815ea41effc2ecd19503f4896ddc3ae60ebe0a)) +* **deps-update:** Reference data proxy ([#1263](https://github.com/UK-Export-Finance/dtfs2/issues/1263)) ([d6bded8](https://github.com/UK-Export-Finance/dtfs2/commit/d6bded84a39fe5c80e4655bec9e53207ef551027)) +* **deps-update:** Updated jsonwebtoken, dicer, apollo-server-express and apollo-server-testing ([af24a92](https://github.com/UK-Export-Finance/dtfs2/commit/af24a925b52d303c81b0b60df76df672420108a1)) +* **deps-update:** Updated jsonwebtoken, dicer, apollo-server-express and apollo-server-testing ([332ced6](https://github.com/UK-Export-Finance/dtfs2/commit/332ced640ce080c43fc387cb0a3aa29689ec3255)) +* **deps:** bump act10ns/slack from 1 to 2 ([#1347](https://github.com/UK-Export-Finance/dtfs2/issues/1347)) ([5420a89](https://github.com/UK-Export-Finance/dtfs2/commit/5420a89224acc1c5af31a2010bddb76ab69a57f5)) +* **deps:** Bump act10ns/slack from 1 to 2 ([#1586](https://github.com/UK-Export-Finance/dtfs2/issues/1586)) ([e13d199](https://github.com/UK-Export-Finance/dtfs2/commit/e13d19949afcadb01bfdd35c95d88949953393f9)) +* **deps:** bump axios from 0.27.2 to 1.3.4 in /azure-functions/acbs-function ([#1362](https://github.com/UK-Export-Finance/dtfs2/issues/1362)) ([d9e2cb4](https://github.com/UK-Export-Finance/dtfs2/commit/d9e2cb49f41042cbbb9f0d5d9ba189897b2d04a0)) +* **deps:** bump axios from 1.3.4 to 1.3.6 in /azure-functions/acbs-function ([#1547](https://github.com/UK-Export-Finance/dtfs2/issues/1547)) ([bda3f9c](https://github.com/UK-Export-Finance/dtfs2/commit/bda3f9c6306d548e7cdc3dafebfae03c8af0095f)) +* **deps:** bump axios from 1.3.4 to 1.3.6 in /azure-functions/number-generator-function ([#1545](https://github.com/UK-Export-Finance/dtfs2/issues/1545)) ([2e1b848](https://github.com/UK-Export-Finance/dtfs2/commit/2e1b8489e8ba0914428882b0cfa0d9ac7ca6ff92)) +* **deps:** bump azure-functions/node from 3.0-appservice to 4.17.3.1-appservice in /azure-functions/acbs-function ([#1401](https://github.com/UK-Export-Finance/dtfs2/issues/1401)) ([8f7c05e](https://github.com/UK-Export-Finance/dtfs2/commit/8f7c05e7fcff8fc42d380b5b5ce2478f6d816539)) +* **deps:** bump azure-functions/node from 3.0-node14-appservice to 4.17.3.1-node14-appservice in /azure-functions/number-generator-function ([#1400](https://github.com/UK-Export-Finance/dtfs2/issues/1400)) ([f0b3629](https://github.com/UK-Export-Finance/dtfs2/commit/f0b3629af31ea349f47d5d116957588473892949)) +* **deps:** bump azure/cli from 1.0.0 to 1.0.7 ([#1353](https://github.com/UK-Export-Finance/dtfs2/issues/1353)) ([ca2c4bb](https://github.com/UK-Export-Finance/dtfs2/commit/ca2c4bb9976577ad39ea298a58025280d0d0345f)) +* **deps:** bump cypress from 12.8.1 to 12.9.0 ([#1392](https://github.com/UK-Export-Finance/dtfs2/issues/1392)) ([0bc5c6f](https://github.com/UK-Export-Finance/dtfs2/commit/0bc5c6f9087739ecab58367987bc5eb64d9bcf5e)) +* **deps:** bump cypress from 12.9.0 to 12.10.0 ([#1534](https://github.com/UK-Export-Finance/dtfs2/issues/1534)) ([b95e63c](https://github.com/UK-Export-Finance/dtfs2/commit/b95e63c3d200abe5563dc448c2783a55b8b72029)) +* **deps:** bump docker/build-push-action from 1 to 4 ([#1343](https://github.com/UK-Export-Finance/dtfs2/issues/1343)) ([a550bcc](https://github.com/UK-Export-Finance/dtfs2/commit/a550bcc9acbb12482207cedf89937ba585ee9767)) +* **deps:** bump durable-functions from 1.5.4 to 2.1.2 in /azure-functions/acbs-function ([#1359](https://github.com/UK-Export-Finance/dtfs2/issues/1359)) ([049e56b](https://github.com/UK-Export-Finance/dtfs2/commit/049e56b6109af2e54ab86f712a080beea6f448c5)) +* **deps:** bump durable-functions from 1.5.4 to 2.1.2 in /azure-functions/number-generator-function ([#1344](https://github.com/UK-Export-Finance/dtfs2/issues/1344)) ([e260cc0](https://github.com/UK-Export-Finance/dtfs2/commit/e260cc05017b7b2b116e0baed5b02c2f83373184)) +* **deps:** bump eslint from 8.36.0 to 8.37.0 in /azure-functions/acbs-function ([#1348](https://github.com/UK-Export-Finance/dtfs2/issues/1348)) ([ec2aed7](https://github.com/UK-Export-Finance/dtfs2/commit/ec2aed7e7a1f5f7c8070ceb7fe5ee0ad67d4f44e)) +* **deps:** bump eslint from 8.37.0 to 8.39.0 in /azure-functions/acbs-function ([#1568](https://github.com/UK-Export-Finance/dtfs2/issues/1568)) ([333d5f7](https://github.com/UK-Export-Finance/dtfs2/commit/333d5f705b25dfb72373a4c00251d23450af337f)) +* **deps:** Bump eslint from 8.43.0 to 8.44.0 in /azure-functions/acbs-function ([#1808](https://github.com/UK-Export-Finance/dtfs2/issues/1808)) ([eedf84d](https://github.com/UK-Export-Finance/dtfs2/commit/eedf84d203554688dcb7bd592ef2eddbc8b052e4)) +* **deps:** Bump fast-xml-parser and @aws-sdk/credential-providers in /utils/data-migration ([#1699](https://github.com/UK-Export-Finance/dtfs2/issues/1699)) ([0561e41](https://github.com/UK-Export-Finance/dtfs2/commit/0561e41dc26c1f8e402841be459c011c102019b1)) +* **deps:** bump moment-timezone from 0.5.40 to 0.5.42 in /portal-api ([#1346](https://github.com/UK-Export-Finance/dtfs2/issues/1346)) ([c264336](https://github.com/UK-Export-Finance/dtfs2/commit/c264336dd80915bcd9a3b9ccb60202cf5807e2ee)) +* **deps:** bump npm-check-updates from 16.8.0 to 16.9.0 ([#1399](https://github.com/UK-Export-Finance/dtfs2/issues/1399)) ([88c6cc4](https://github.com/UK-Export-Finance/dtfs2/commit/88c6cc4ad66ce0a9dcc241e7001a83fc8029cb17)) +* **deps:** bump npm-check-updates from 16.9.0 to 16.10.9 ([#1554](https://github.com/UK-Export-Finance/dtfs2/issues/1554)) ([5899efd](https://github.com/UK-Export-Finance/dtfs2/commit/5899efd359b145a14c03030cb695a7425fe40ba8)) +* **deps:** Bump semver from 5.7.1 to 5.7.2 ([#1833](https://github.com/UK-Export-Finance/dtfs2/issues/1833)) ([98cb857](https://github.com/UK-Export-Finance/dtfs2/commit/98cb8571c108d3b1b2d3f34e8fdb988c6dbab71b)) +* **deps:** dependecies updates ([#1969](https://github.com/UK-Export-Finance/dtfs2/issues/1969)) ([6ce2b13](https://github.com/UK-Export-Finance/dtfs2/commit/6ce2b131406258e74661d2f9af00b1a1d68f4944)) +* **deps:** dependencies bumps + lint fixes ([#1631](https://github.com/UK-Export-Finance/dtfs2/issues/1631)) ([a7b71e0](https://github.com/UK-Export-Finance/dtfs2/commit/a7b71e01ed9ad500b1c30387a4ba1d1e321bb9d7)) +* **deps:** update all npm packages ([#1515](https://github.com/UK-Export-Finance/dtfs2/issues/1515)) ([1a8764d](https://github.com/UK-Export-Finance/dtfs2/commit/1a8764db881adafd71bba6c04c67ab4b2cb80f6c)) +* **deps:** updated dependencies ([#1695](https://github.com/UK-Export-Finance/dtfs2/issues/1695)) ([2653d55](https://github.com/UK-Export-Finance/dtfs2/commit/2653d55de1f73bc49fa4d79f29810e99a2ef71a5)) +* **deps:** updated npm packages ([#1286](https://github.com/UK-Export-Finance/dtfs2/issues/1286)) ([c829473](https://github.com/UK-Export-Finance/dtfs2/commit/c82947366a0bd1a903dd19c15ad15635aa7deb92)) +* **deps:** upgrade xml2js from 0.4.23 to 0.5.0 ([#1460](https://github.com/UK-Export-Finance/dtfs2/issues/1460)) ([3e6a0e6](https://github.com/UK-Export-Finance/dtfs2/commit/3e6a0e61993e93bd3c030e547ea34d589a090893)) +* **docs:** Updated documentation ([60915d6](https://github.com/UK-Export-Finance/dtfs2/commit/60915d6df507ee291e76217ac0992b1d6cd1b708)) +* **docs:** Updated documentation ([c3f32da](https://github.com/UK-Export-Finance/dtfs2/commit/c3f32da5e2efa16db5b8bd02ad33bf32b4e19fca)) +* **docs:** Updated documentation ([#1320](https://github.com/UK-Export-Finance/dtfs2/issues/1320)) ([e40a719](https://github.com/UK-Export-Finance/dtfs2/commit/e40a7194ed06a67f8a19efaf068857c817fcaebf)) +* **docs:** Updated documentation ([#1321](https://github.com/UK-Export-Finance/dtfs2/issues/1321)) ([88d0bef](https://github.com/UK-Export-Finance/dtfs2/commit/88d0beff8a1b1cfc3d1397bc06ce19a935b73641)) +* **nginx:** Dockerfile image upgrade to 1.23 ([bdf3c78](https://github.com/UK-Export-Finance/dtfs2/commit/bdf3c78e7609e80ec4c5fc4c88377832ec179c81)) +* **nginx:** Dockerfile image upgrade to 1.23 ([#1299](https://github.com/UK-Export-Finance/dtfs2/issues/1299)) ([961114b](https://github.com/UK-Export-Finance/dtfs2/commit/961114b9fa404bb6696373828b0802b237e43fb8)) +* **npm-package-bump:** Updated @sideway/formula to 3.0.1 ([a3f7646](https://github.com/UK-Export-Finance/dtfs2/commit/a3f7646d1cdcfc206e0de984d663959addd8b530)) +* **npm-package-bump:** Updated @sideway/formula to 3.0.1 ([#1307](https://github.com/UK-Export-Finance/dtfs2/issues/1307)) ([9b8c705](https://github.com/UK-Export-Finance/dtfs2/commit/9b8c705770e60f795d10217fb7a01960600b2281)) +* **npm-update:** --save flag to npm update ([#1341](https://github.com/UK-Export-Finance/dtfs2/issues/1341)) ([e1b6937](https://github.com/UK-Export-Finance/dtfs2/commit/e1b69376dd4faa08b2efe42eda380966aad51082)) +* **npm-update:** dependencies updates ([#1339](https://github.com/UK-Export-Finance/dtfs2/issues/1339)) ([6e9124c](https://github.com/UK-Export-Finance/dtfs2/commit/6e9124cf2a7f5af70084f7a3d3c9626d567d21d3)) +* **npm-updates:** Various dependecies updates ([1334af6](https://github.com/UK-Export-Finance/dtfs2/commit/1334af6cb40ce4dedca0d7d38089c2eccd84ee7b)) +* **npm-updates:** Various dependecies updates ([#1334](https://github.com/UK-Export-Finance/dtfs2/issues/1334)) ([ad7299c](https://github.com/UK-Export-Finance/dtfs2/commit/ad7299c803db9827c5f0c7037c88f7d027ddad69)) +* **npm:** NPM Major update and packages update ([927a31d](https://github.com/UK-Export-Finance/dtfs2/commit/927a31d09b3396e5edff9b2d4bfa6b92ddc4a11c)) +* **npm:** NPM Major update and packages update ([#1323](https://github.com/UK-Export-Finance/dtfs2/issues/1323)) ([19ab3f9](https://github.com/UK-Export-Finance/dtfs2/commit/19ab3f900342a74f9a9a8fd55dbbb357cc580ea3)) +* **npm:** NPM updates ([7d58ec3](https://github.com/UK-Export-Finance/dtfs2/commit/7d58ec3437ba8a3625a96c8019ee66dcec93088c)) +* **npm:** NPM updates ([#1327](https://github.com/UK-Export-Finance/dtfs2/issues/1327)) ([48a693f](https://github.com/UK-Export-Finance/dtfs2/commit/48a693fa4f368f6c40fbc95b4641c4d28982936f)) +* Removed apollo-server-testing, updated apollo-server-express, graphql and graphql-middleware ([44f07e1](https://github.com/UK-Export-Finance/dtfs2/commit/44f07e1ef1490e75a70a4a09041c0349d5c7b92d)) +* Removed apollo-server-testing, updated apollo-server-express, graphql and graphql-middleware ([ca37595](https://github.com/UK-Export-Finance/dtfs2/commit/ca3759565d9c1207953c211bc5f9998abeb8d539)) +* removed CodeQL file ([13dd2c8](https://github.com/UK-Export-Finance/dtfs2/commit/13dd2c8f1cdb994b8cc36f4d2625658d2941bc92)) +* **security.txt:** Expire updated ([52ba890](https://github.com/UK-Export-Finance/dtfs2/commit/52ba8906183fc90fddc4924415d753fb76585bf1)) +* **security.txt:** Expire updated ([#1301](https://github.com/UK-Export-Finance/dtfs2/issues/1301)) ([fec7cad](https://github.com/UK-Export-Finance/dtfs2/commit/fec7cadbb0a8fbfca6cb7ee9b25103428bfdab3c)) +* Update deps for semver vulnerability ([#1867](https://github.com/UK-Export-Finance/dtfs2/issues/1867)) ([fac6cd4](https://github.com/UK-Export-Finance/dtfs2/commit/fac6cd4a6aad2105abbf9ccc8737c41834287f29)) +* Updated graphql-middleware and downgraded apollo-server-testing ([6ef1128](https://github.com/UK-Export-Finance/dtfs2/commit/6ef1128629c2d40c896fbf768e1cfa4c8f445603)) +* Updated graphql-middleware and downgraded apollo-server-testing ([52b084f](https://github.com/UK-Export-Finance/dtfs2/commit/52b084fc60cb0fab63c1d0b20de733b54d098021)) +* updated NodeJS to `v18.13-alpine3.17` ([#1289](https://github.com/UK-Export-Finance/dtfs2/issues/1289)) ([328117b](https://github.com/UK-Export-Finance/dtfs2/commit/328117bc4f4c91700c765a6dcce9e1848406c934)) +* updated NodeJS to `v20.0.0-alpine3.17` ([#1629](https://github.com/UK-Export-Finance/dtfs2/issues/1629)) ([59c8939](https://github.com/UK-Export-Finance/dtfs2/commit/59c8939b58ec3da34895e4f1a8fb99f99a04ed22)) +* updated NodeJS to v`18.14-alpine3.17` ([#1317](https://github.com/UK-Export-Finance/dtfs2/issues/1317)) ([715ad07](https://github.com/UK-Export-Finance/dtfs2/commit/715ad07dcafd19ad36e087e2e03324d9b35ef288)) + + +### Code improvements + +* **code:** code simplification ([#1844](https://github.com/UK-Export-Finance/dtfs2/issues/1844)) ([4b22cd9](https://github.com/UK-Export-Finance/dtfs2/commit/4b22cd9670193e68c7618fbdb8a6021911a7c98a)) +* **code:** refactored console statements + consistent env variables ([#1841](https://github.com/UK-Export-Finance/dtfs2/issues/1841)) ([402e5b5](https://github.com/UK-Export-Finance/dtfs2/commit/402e5b5cb1bfa3408b85005b6fbff7c338e30a87)) +* **DTFS2-4678:** PR improvements, added references TODO items ([f81bec1](https://github.com/UK-Export-Finance/dtfs2/commit/f81bec13054375cb2debc81410ea621a1e7cf988)) +* **DTFS2-4678:** PR improvements, added references TODO items ([2001f5e](https://github.com/UK-Export-Finance/dtfs2/commit/2001f5ef5200ee7d4fd36b50a44f9ab2133f61de)) +* **DTFS2-4678:** Remove commented out code ([509fa6c](https://github.com/UK-Export-Finance/dtfs2/commit/509fa6c62120aca54a12f4e49c83926560f422ee)) +* **DTFS2-4678:** Remove commented out code ([cb5446f](https://github.com/UK-Export-Finance/dtfs2/commit/cb5446f9d31a171619c1ce689115aaf729175681)) +* **DTFS2-6612:** code refactorisation and reduced logging verbose ([#1978](https://github.com/UK-Export-Finance/dtfs2/issues/1978)) ([282fcdf](https://github.com/UK-Export-Finance/dtfs2/commit/282fcdfb091eacc85c18b1f5b0669d1022a5e941)) +* updated the npm packages. refactored graphql and redis. fixed linting issues ([#1628](https://github.com/UK-Export-Finance/dtfs2/issues/1628)) ([2edc4ce](https://github.com/UK-Export-Finance/dtfs2/commit/2edc4ce78d223692c529ab7719918a31a5d30b53)) From 2cd09a3b64a6f82a4a18a548c461b14eb0354bda Mon Sep 17 00:00:00 2001 From: lmarrai-sw <44811960+lmarrai-sw@users.noreply.github.com> Date: Fri, 8 Sep 2023 13:13:42 +0100 Subject: [PATCH 008/130] feat(DTFS2-6623): allow read only role assignment in portal UI (#1968) --- .../admin/create-user/create-a-user.spec.js | 50 +++++++--- .../admin/create-user/update-a-user.spec.js | 99 +++++++++++-------- .../restrict-access/restrict-access.spec.js | 77 +++++++++------ .../portal/cypress/fixtures/constants.js | 8 ++ e2e-tests/portal/cypress/fixtures/users.js | 3 + .../admin/user-edit.component-test.js | 90 +++++++++++++++++ portal/component-tests/assertions.js | 3 + portal/templates/admin/user-edit.njk | 6 ++ utils/mock-data-loader/portal/users.js | 10 ++ 9 files changed, 262 insertions(+), 84 deletions(-) create mode 100644 portal/component-tests/admin/user-edit.component-test.js diff --git a/e2e-tests/portal/cypress/e2e/journeys/admin/create-user/create-a-user.spec.js b/e2e-tests/portal/cypress/e2e/journeys/admin/create-user/create-a-user.spec.js index 7c4cca0d72..a2aebf5192 100644 --- a/e2e-tests/portal/cypress/e2e/journeys/admin/create-user/create-a-user.spec.js +++ b/e2e-tests/portal/cypress/e2e/journeys/admin/create-user/create-a-user.spec.js @@ -1,8 +1,9 @@ const { header, users, createUser } = require('../../../pages'); const relative = require('../../../relativeURL'); const MOCK_USERS = require('../../../../fixtures/users'); +const { USER_ROLES: { MAKER, READ_ONLY } } = require('../../../../fixtures/constants'); -const { ADMIN, USER_WITH_INJECTION } = MOCK_USERS; +const { ADMIN: AN_ADMIN, USER_WITH_INJECTION } = MOCK_USERS; context('Admin user creates a new user', () => { const validUser = { @@ -12,7 +13,7 @@ context('Admin user creates a new user', () => { firstname: 'bob', surname: 'builder', bank: 'HSBC', - roles: ['maker'], + roles: [MAKER], }; const userWithInvalidPassword = { @@ -22,17 +23,17 @@ context('Admin user creates a new user', () => { firstname: 'alfred', surname: 'd. great', bank: 'HSBC', - roles: ['maker'], + roles: [MAKER], }; beforeEach(() => { - cy.removeUserIfPresent(validUser, ADMIN); - cy.removeUserIfPresent(userWithInvalidPassword, ADMIN); + cy.removeUserIfPresent(validUser, AN_ADMIN); + cy.removeUserIfPresent(userWithInvalidPassword, AN_ADMIN); }); it('Go to add user page and back', () => { // Login and go to the dashboard - cy.login(ADMIN); + cy.login(AN_ADMIN); cy.url().should('include', '/dashboard/deals'); header.users().click(); @@ -47,7 +48,7 @@ context('Admin user creates a new user', () => { it('Admin create user with empty fields', () => { // Login and go to the dashboard - cy.login(ADMIN); + cy.login(AN_ADMIN); cy.url().should('include', '/dashboard/deals'); header.users().click(); @@ -64,7 +65,7 @@ context('Admin user creates a new user', () => { it('Admin user adds a new user and confirms the new user works', () => { // Login and go to the dashboard - cy.login(ADMIN); + cy.login(AN_ADMIN); header.users().click(); users.user(validUser).should('not.exist'); @@ -93,7 +94,7 @@ context('Admin user creates a new user', () => { cy.url().should('eq', relative('/dashboard/deals/0')); // prove the lastLogin timestamp - cy.login(ADMIN); + cy.login(AN_ADMIN); cy.url().should('eq', relative('/dashboard/deals/0')); header.users().click(); @@ -104,7 +105,7 @@ context('Admin user creates a new user', () => { it('Admin user adds a new user, triggering validation errors', () => { // Login and go to the dashboard - cy.login(ADMIN); + cy.login(AN_ADMIN); header.users().click(); users.user(userWithInvalidPassword).should('not.exist'); @@ -133,7 +134,7 @@ context('Admin user creates a new user', () => { it('Admin user adds a new user using "{ "$gt": "" }", triggering validation error for email', () => { // Login and go to the dashboard - cy.login(ADMIN); + cy.login(AN_ADMIN); header.users().click(); users.user(userWithInvalidPassword).should('not.exist'); @@ -169,12 +170,37 @@ context('Admin user creates a new user', () => { * finds one with email { "$gt": "" } * should be undefined */ - cy.listAllUsers(ADMIN).then((usersInDb) => { + cy.listAllUsers(AN_ADMIN).then((usersInDb) => { const injectedUser = usersInDb.find((user) => user.email === {}); expect(injectedUser).to.be.an('undefined'); }); }); + context('Admin user adding a read-only user', () => { + beforeEach(() => { + cy.login(AN_ADMIN); + header.users().click(); + users.addUser().click(); + }); + + it('should create a read-only user', () => { + createUser.username().type(validUser.username); + createUser.manualPassword().click(); + createUser.password().type(validUser.password); + createUser.confirmPassword().type(validUser.password); + createUser.firstname().type(validUser.firstname); + createUser.surname().type(validUser.surname); + createUser.bank().select(validUser.bank); + + createUser.role(READ_ONLY).click(); + createUser.createUser().click(); + + cy.url().should('eq', relative('/admin/users/')); + users.row(validUser).roles().invoke('text').then((text) => { + expect(text.trim()).to.equal(READ_ONLY); + }); + }); + }); // TODO: ADD lighthouse checks DTFS2-4994 }); diff --git a/e2e-tests/portal/cypress/e2e/journeys/admin/create-user/update-a-user.spec.js b/e2e-tests/portal/cypress/e2e/journeys/admin/create-user/update-a-user.spec.js index c6ff537230..be939c9d65 100644 --- a/e2e-tests/portal/cypress/e2e/journeys/admin/create-user/update-a-user.spec.js +++ b/e2e-tests/portal/cypress/e2e/journeys/admin/create-user/update-a-user.spec.js @@ -1,9 +1,8 @@ const { header, users, createUser, editUser, } = require('../../../pages'); -const MOCK_USERS = require('../../../../fixtures/users'); - -const { ADMIN } = MOCK_USERS; +const { ADMIN: AN_ADMIN } = require('../../../../fixtures/users'); +const { USER_ROLES: { MAKER, CHECKER } } = require('../../../../fixtures/constants'); context('Admin user updates an existing user', () => { const userToUpdate = { @@ -13,60 +12,80 @@ context('Admin user updates an existing user', () => { firstname: 'first', surname: 'last', bank: 'Barclays Bank', - roles: ['maker'], + roles: [MAKER], }; beforeEach(() => { - cy.removeUserIfPresent(userToUpdate, ADMIN); - }); - - it('Go to users and back', () => { - // Login and go to the dashboard - cy.login(ADMIN); - cy.url().should('include', '/dashboard/deals'); + cy.removeUserIfPresent(userToUpdate, AN_ADMIN); + cy.login(AN_ADMIN); header.users().click(); + }); - // Cancel + it('clicking cancel from the users pages takes you to the deals dashboard', () => { users.cancel().click(); - - // Back to the dashboard cy.url().should('include', '/dashboard/deals'); }); - it('Create a user, then edit the user and change their role(s)', () => { - // login and go to dashboard - cy.login(ADMIN); - header.users().click(); + context('given a user already exists', () => { + const openPageToEdit = (user) => users.row(user).username().click(); - // add user - users.addUser().click(); - userToUpdate.roles.forEach((role) => { - createUser.role(role).click(); + beforeEach(() => { + users.addUser().click(); + userToUpdate.roles.forEach((role) => { + createUser.role(role).click(); + }); + createUser.username().type(userToUpdate.username); + createUser.manualPassword().click(); + createUser.password().type(userToUpdate.password); + createUser.confirmPassword().type(userToUpdate.password); + createUser.firstname().type(userToUpdate.firstname); + createUser.surname().type(userToUpdate.surname); + createUser.bank().select(userToUpdate.bank); + createUser.createUser().click(); }); - createUser.username().type(userToUpdate.username); - createUser.manualPassword().click(); - createUser.password().type(userToUpdate.password); - createUser.confirmPassword().type(userToUpdate.password); - createUser.firstname().type(userToUpdate.firstname); - createUser.surname().type(userToUpdate.surname); - createUser.bank().select(userToUpdate.bank); - createUser.createUser().click(); - users.row(userToUpdate).username().click(); + it('changing their roles should display the new roles on the user dashboard', () => { + const newRole = CHECKER; + openPageToEdit(userToUpdate); + + // switch off all of the users roles + userToUpdate.roles.forEach((role) => { + editUser.role(role).click(); + }); + + editUser.role(newRole).click(); - // switch off everything we selected before - userToUpdate.roles.forEach((role) => { - editUser.role(role).click(); + editUser.save().click(); + + users.row(userToUpdate).roles().invoke('text').then((text) => { + expect(text.trim()).to.equal(newRole); + }); }); - editUser.role('checker').click(); - editUser.firstname().type('{selectAll}{backspace}Homer'); - editUser.surname().type('{selectAll}{backspace}Simpson'); + it('changing their details should display the new details when the edit page is reloaded', () => { + const newFirstName = 'new first name'; + const newSurname = 'new surname'; + const newRole = CHECKER; + + openPageToEdit(userToUpdate); + + editUser.firstname().type(`{selectAll}{backspace}${newFirstName}`); + editUser.surname().type(`{selectAll}{backspace}${newSurname}`); + // switch off all of the users roles + userToUpdate.roles.forEach((role) => { + editUser.role(role).click(); + }); + editUser.role(newRole).click(); + editUser.save().click(); - editUser.save().click(); + openPageToEdit(userToUpdate); - users.row(userToUpdate).roles().invoke('text').then((text) => { - expect(text.trim()).to.equal('checker'); + editUser.firstname().should('have.value', newFirstName); + editUser.surname().should('have.value', newSurname); + userToUpdate.roles.forEach((role) => { + editUser.role(role).should('not.be.checked'); + }); + editUser.role(newRole).should('be.checked'); }); }); }); diff --git a/e2e-tests/portal/cypress/e2e/journeys/admin/restrict-access/restrict-access.spec.js b/e2e-tests/portal/cypress/e2e/journeys/admin/restrict-access/restrict-access.spec.js index 6aa5959466..583b34c1a9 100644 --- a/e2e-tests/portal/cypress/e2e/journeys/admin/restrict-access/restrict-access.spec.js +++ b/e2e-tests/portal/cypress/e2e/journeys/admin/restrict-access/restrict-access.spec.js @@ -1,40 +1,53 @@ const relative = require('../../../relativeURL'); -const MOCK_USERS = require('../../../../fixtures/users'); - -const validUsers = ['ADMIN', 'UKEF_OPERATIONS']; -const invalidUsers = ['BANK1_MAKER1', 'BANK1_CHECKER1', 'EDITOR']; +const { + ADMIN, + UKEF_OPERATIONS, + BANK1_MAKER1, + BANK1_CHECKER1, + EDITOR, + BANK1_READ_ONLY, +} = require('../../../../fixtures/users'); context('Only allow authorised users to access admin pages', () => { - it('should allow Admins access to restricted pages', () => { - const user = MOCK_USERS[validUsers[0]]; - cy.login(user); - cy.visit('/admin/users/'); - cy.url().should('eq', relative('/admin/users/')); - }); + const authorisedRoles = [{ + roleName: 'Admins', + userWithRole: ADMIN, + }, { + roleName: 'UKEF Operations', + userWithRole: UKEF_OPERATIONS, + }]; - it('should allow UKEF Operations access to restricted pages', () => { - const user = MOCK_USERS[validUsers[1]]; - cy.login(user); - cy.visit('/admin/users/'); - cy.url().should('eq', relative('/admin/users/')); + authorisedRoles.forEach(({ roleName, userWithRole }) => { + it(`should allow ${roleName} access to restricted pages`, () => { + cy.login(userWithRole); + cy.visit('/admin/users/'); + cy.url().should('eq', relative('/admin/users/')); + }); }); - it('should NOT allow Makers access to restricted pages', () => { - const user = MOCK_USERS[invalidUsers[0]]; - cy.login(user); - cy.visit('/admin/users/'); - cy.url().should('eq', relative('/dashboard/deals/0')); - }); - it('should NOT allow Checkers access to restricted pages', () => { - const user = MOCK_USERS[invalidUsers[1]]; - cy.login(user); - cy.visit('/admin/users/'); - cy.url().should('eq', relative('/dashboard/deals/0')); - }); - it('should NOT allow Editors access to restricted pages', () => { - const user = MOCK_USERS[invalidUsers[2]]; - cy.login(user); - cy.visit('/admin/users/'); - cy.url().should('eq', relative('/login')); + const unauthorisedRoles = [{ + roleName: 'Makers', + userWithRole: BANK1_MAKER1, + expectedRedirectLocation: '/dashboard/deals/0', + }, { + roleName: 'Checkers', + userWithRole: BANK1_CHECKER1, + expectedRedirectLocation: '/dashboard/deals/0', + }, { + roleName: 'Editors', + userWithRole: EDITOR, + expectedRedirectLocation: '/login', + }, { + roleName: 'Read Only users', + userWithRole: BANK1_READ_ONLY, + expectedRedirectLocation: '/login', + }]; + + unauthorisedRoles.forEach(({ roleName, userWithRole, expectedRedirectLocation }) => { + it(`should NOT allow ${roleName} access to restricted pages`, () => { + cy.login(userWithRole); + cy.visit('/admin/users/'); + cy.url().should('eq', relative(expectedRedirectLocation)); + }); }); }); diff --git a/e2e-tests/portal/cypress/fixtures/constants.js b/e2e-tests/portal/cypress/fixtures/constants.js index 330c2ac44b..d727d5d0c0 100644 --- a/e2e-tests/portal/cypress/fixtures/constants.js +++ b/e2e-tests/portal/cypress/fixtures/constants.js @@ -51,6 +51,13 @@ const INDUSTRY_SECTOR_CODES = { BUSINESS: '62012', }; +const USER_ROLES = { + ADMIN: 'admin', + MAKER: 'maker', + CHECKER: 'checker', + READ_ONLY: 'read-only', +}; + module.exports = { DEALS: { DEAL_TYPE, @@ -64,4 +71,5 @@ module.exports = { }, COMPANIES_HOUSE_NUMBERS, INDUSTRY_SECTOR_CODES, + USER_ROLES, }; diff --git a/e2e-tests/portal/cypress/fixtures/users.js b/e2e-tests/portal/cypress/fixtures/users.js index e6bd4b8daa..cac71d3986 100644 --- a/e2e-tests/portal/cypress/fixtures/users.js +++ b/e2e-tests/portal/cypress/fixtures/users.js @@ -10,6 +10,8 @@ const BANK1_MAKER2 = MOCK_USERS.find((user) => const BANK2_MAKER2 = MOCK_USERS.find((user) => (user.roles.includes('maker')) && user.username === 'BANK2_MAKER2'); +const BANK1_READ_ONLY = MOCK_USERS.find((user) => user.username === 'BANK1_READ_ONLY'); + const BANK3_GEF_MAKER1 = MOCK_USERS.find((user) => (user.roles.includes('maker') && user.username === 'BANK3_GEF_MAKER1')); @@ -42,6 +44,7 @@ const USER_WITH_INJECTION = { module.exports = { BANK1_MAKER1, BANK1_MAKER2, + BANK1_READ_ONLY, BANK2_MAKER2, BANK3_GEF_MAKER1, BANK1_CHECKER1, diff --git a/portal/component-tests/admin/user-edit.component-test.js b/portal/component-tests/admin/user-edit.component-test.js new file mode 100644 index 0000000000..ed9f096856 --- /dev/null +++ b/portal/component-tests/admin/user-edit.component-test.js @@ -0,0 +1,90 @@ +const pageRenderer = require('../pageRenderer'); + +const page = 'admin/user-edit.njk'; +const render = pageRenderer(page); + +describe(page, () => { + const adminUser = { + timezone: 'Europe/London', + roles: ['admin'], + }; + const newUser = { roles: [] }; + + const banks = [{ + id: 1, + name: 'Bank 1', + }, { + id: 2, + name: 'Bank 2', + }, { + id: 3, + name: 'Bank 3', + }]; + + const roles = [{ + roleName: 'Maker/Checker', + roleDataAttribute: 'maker/checker', + roleValue: 'maker/checker', + }, { + roleName: 'Checker', + roleDataAttribute: 'checker', + roleValue: 'checker', + }, { + roleName: 'Maker', + roleDataAttribute: 'maker', + roleValue: 'maker', + }, { + roleName: 'UKEF Operations', + roleDataAttribute: 'ukef_operations', + roleValue: 'ukef_operations', + }, { + roleName: 'EFM', + roleDataAttribute: 'efm', + roleValue: 'EFM', + }, { + roleName: 'Read Only', + roleDataAttribute: 'read-only', + roleValue: 'read-only', + }]; + + let wrapper; + + describe('the role selectors', () => { + const roleAttributeSelector = (role) => `[data-cy="role-${role}"]`; + + describe.each(roles)('for $roleName', ({ roleDataAttribute, roleValue }) => { + it('should render', () => { + wrapper = render({ + banks, + user: adminUser, + displayedUser: newUser, + }); + wrapper.expectInput(roleAttributeSelector(roleDataAttribute)).toHaveValue(roleValue); + }); + + it('should not be checked if the displayed user does not have the role', () => { + wrapper = render({ + banks, + user: adminUser, + displayedUser: { + ...newUser, + roles: [], + }, + }); + wrapper.expectInput(roleAttributeSelector(roleDataAttribute)).toNotBeChecked(); + }); + + it('should be checked if the displayed user does have the role', () => { + wrapper = render({ + banks, + user: adminUser, + displayedUser: { + ...newUser, + roles: [roleValue], + }, + }); + wrapper.expectInput(roleAttributeSelector(roleDataAttribute)).toBeChecked(); + }); + }); + }); +}); diff --git a/portal/component-tests/assertions.js b/portal/component-tests/assertions.js index fdd4b4367e..fa5931e1be 100644 --- a/portal/component-tests/assertions.js +++ b/portal/component-tests/assertions.js @@ -79,6 +79,9 @@ const assertions = (wrapper) => ({ toHaveValue: (value) => { expect(wrapper(selector).attr('value')).toEqual(value); }, + toNotBeChecked: () => { + expect(wrapper(selector).is(':checked')).toEqual(false); + }, toBeChecked: () => { expect(wrapper(selector).is(':checked')).toEqual(true); }, diff --git a/portal/templates/admin/user-edit.njk b/portal/templates/admin/user-edit.njk index ad4e1d3dc7..2b936dae27 100644 --- a/portal/templates/admin/user-edit.njk +++ b/portal/templates/admin/user-edit.njk @@ -89,6 +89,12 @@ text: "Export Finance Manager (EFM)", checked: displayedUser.roles.includes("EFM"), attributes: {"data-cy": "role-efm"} + }, + { + value: "read-only", + text: "Read Only", + checked: displayedUser.roles.includes("read-only"), + attributes: {"data-cy": "role-read-only"} } ] }) }} diff --git a/utils/mock-data-loader/portal/users.js b/utils/mock-data-loader/portal/users.js index 26283057c3..6a34901695 100644 --- a/utils/mock-data-loader/portal/users.js +++ b/utils/mock-data-loader/portal/users.js @@ -35,6 +35,16 @@ const USERS = [ roles: ['maker'], bank: UKEF_TEST_BANK_1, }, + { + username: 'BANK1_READ_ONLY', + password: 'AbC!2345', + firstname: 'Bank1', + surname: 'Read-only', + email: 'readOnly1@ukexportfinance.gov.uk', + timezone: 'Europe/London', + roles: ['read-only'], + bank: UKEF_TEST_BANK_1, + }, { username: 'BANK3_GEF_MAKER1', password: 'AbC!2345', From 65248cf704d0091716fc335f9a46f9eb2880e1f5 Mon Sep 17 00:00:00 2001 From: Luke Marrai Date: Fri, 8 Sep 2023 14:46:49 +0100 Subject: [PATCH 009/130] chore(DTFS2-6508): run PR linting and testing on 6508 branch --- .github/workflows/lint.yml | 2 +- .github/workflows/test.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index e9950a82a5..9963b05ae2 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -8,7 +8,7 @@ run-name: Executing lint QA on ${{ github.repository }} 🚀 on: pull_request: - branches: [main] + branches: [main, feat/dtfs2-6508/add-read-only-role-to-portal-and-gef] paths: - 'package*.json' - 'docker*.yml' diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 3a66b56b12..86cc4e1f76 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -8,7 +8,7 @@ run-name: Executing test QA on ${{ github.repository }} 🚀 on: pull_request: - branches: [main] + branches: [main, feat/dtfs2-6508/add-read-only-role-to-portal-and-gef] paths: - "package*.json" - "docker*.yml" From 4f7d265cff2511867c861f7986c5344c189e84e2 Mon Sep 17 00:00:00 2001 From: Luke Marrai Date: Fri, 8 Sep 2023 14:49:38 +0100 Subject: [PATCH 010/130] fix(DTFS2-6508): correct branch name in GH actions --- .github/workflows/lint.yml | 2 +- .github/workflows/test.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 9963b05ae2..fae2ba4b94 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -8,7 +8,7 @@ run-name: Executing lint QA on ${{ github.repository }} 🚀 on: pull_request: - branches: [main, feat/dtfs2-6508/add-read-only-role-to-portal-and-gef] + branches: [main, feat/DTFS2-6508/add-read-only-role-to-portal-and-gef] paths: - 'package*.json' - 'docker*.yml' diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 86cc4e1f76..658ca7b31e 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -8,7 +8,7 @@ run-name: Executing test QA on ${{ github.repository }} 🚀 on: pull_request: - branches: [main, feat/dtfs2-6508/add-read-only-role-to-portal-and-gef] + branches: [main, feat/DTFS2-6508/add-read-only-role-to-portal-and-gef] paths: - "package*.json" - "docker*.yml" From c3a80089494370fe7292ec90a135ad4efedec260 Mon Sep 17 00:00:00 2001 From: lmarrai-sw <44811960+lmarrai-sw@users.noreply.github.com> Date: Mon, 11 Sep 2023 09:19:52 +0100 Subject: [PATCH 011/130] feat(DTFS2-6626): add read only role to portal api (#1971) --- .../restrict-access/restrict-access.spec.js | 2 +- portal-api/src/role-validator.js | 27 --- .../deal-status/user-can-submit-deal.js | 10 +- portal-api/src/v1/facility-issuance/index.js | 3 +- .../v1/gef/controllers/files.controller.js | 3 +- portal-api/src/v1/gef/routes.js | 67 +++---- portal-api/src/v1/roles/roles.js | 12 ++ .../src/v1/roles/user-has-sufficient-role.js | 28 +++ .../v1/roles/user-has-sufficient-role.test.js | 181 ++++++++++++++++++ .../validate-user-has-sufficient-role.js | 25 +++ .../validate-user-has-sufficient-role.test.js | 71 +++++++ portal-api/src/v1/routes.js | 97 +++++----- 12 files changed, 418 insertions(+), 108 deletions(-) delete mode 100644 portal-api/src/role-validator.js create mode 100644 portal-api/src/v1/roles/roles.js create mode 100644 portal-api/src/v1/roles/user-has-sufficient-role.js create mode 100644 portal-api/src/v1/roles/user-has-sufficient-role.test.js create mode 100644 portal-api/src/v1/roles/validate-user-has-sufficient-role.js create mode 100644 portal-api/src/v1/roles/validate-user-has-sufficient-role.test.js diff --git a/e2e-tests/portal/cypress/e2e/journeys/admin/restrict-access/restrict-access.spec.js b/e2e-tests/portal/cypress/e2e/journeys/admin/restrict-access/restrict-access.spec.js index 583b34c1a9..acb1ee5342 100644 --- a/e2e-tests/portal/cypress/e2e/journeys/admin/restrict-access/restrict-access.spec.js +++ b/e2e-tests/portal/cypress/e2e/journeys/admin/restrict-access/restrict-access.spec.js @@ -40,7 +40,7 @@ context('Only allow authorised users to access admin pages', () => { }, { roleName: 'Read Only users', userWithRole: BANK1_READ_ONLY, - expectedRedirectLocation: '/login', + expectedRedirectLocation: '/dashboard/deals/0', }]; unauthorisedRoles.forEach(({ roleName, userWithRole, expectedRedirectLocation }) => { diff --git a/portal-api/src/role-validator.js b/portal-api/src/role-validator.js deleted file mode 100644 index 9ba14d60fd..0000000000 --- a/portal-api/src/role-validator.js +++ /dev/null @@ -1,27 +0,0 @@ -const ukefAdminRoles = ['ukef_operations']; - -const userRoleIsValid = (requiredRoles, user) => { - if (!requiredRoles || requiredRoles.length === 0) { - return true; - } - const userHasOneOfTheRequiredRoles = ukefAdminRoles.some((adminRole) => user.roles.includes(adminRole)) - || requiredRoles.some((role) => user.roles.includes(role)); - return userHasOneOfTheRequiredRoles; -}; - -const validate = (opts) => { - const requiredRoles = opts ? opts.role : null; - - return (req, res, next) => { - if (userRoleIsValid(requiredRoles, req.user)) { - next(); - } else { - res.status(401).json({ success: false, msg: "You don't have access to this page" }); - } - }; -}; - -module.exports = { - userRoleIsValid, - validate, -}; diff --git a/portal-api/src/v1/controllers/deal-status/user-can-submit-deal.js b/portal-api/src/v1/controllers/deal-status/user-can-submit-deal.js index 32003c7698..9a369fd922 100644 --- a/portal-api/src/v1/controllers/deal-status/user-can-submit-deal.js +++ b/portal-api/src/v1/controllers/deal-status/user-can-submit-deal.js @@ -1,5 +1,13 @@ +const { CHECKER, MAKER } = require('../../roles/roles'); + const userCanSubmitDeal = (deal, user) => { - const isMakerCheckerUser = (user.roles.includes('maker') && user.roles.includes('checker')); + const userRoles = user?.roles; + + if (!userRoles) { + return false; + } + + const isMakerCheckerUser = (userRoles.includes(MAKER) && userRoles.includes(CHECKER)); if (!isMakerCheckerUser) { return true; diff --git a/portal-api/src/v1/facility-issuance/index.js b/portal-api/src/v1/facility-issuance/index.js index f395133a26..6a97760eb9 100644 --- a/portal-api/src/v1/facility-issuance/index.js +++ b/portal-api/src/v1/facility-issuance/index.js @@ -1,7 +1,8 @@ const CONSTANTS = require('../../constants'); +const { MAKER } = require('../roles/roles'); const canIssueFacility = (userRoles, deal, facility) => { - const isMaker = userRoles.includes('maker'); + const isMaker = userRoles?.includes(MAKER); const { submissionType, status, details } = deal; const { submissionDate } = details; diff --git a/portal-api/src/v1/gef/controllers/files.controller.js b/portal-api/src/v1/gef/controllers/files.controller.js index f933e7d72e..9ef0d60372 100644 --- a/portal-api/src/v1/gef/controllers/files.controller.js +++ b/portal-api/src/v1/gef/controllers/files.controller.js @@ -9,6 +9,7 @@ const { userHasAccess } = require('../utils.service'); const fileshare = require('../../../drivers/fileshare'); const { formatFilenameForSharepoint } = require('../../../utils'); const { FILE_UPLOAD } = require('../../../constants/file-upload'); +const { MAKER } = require('../../roles/roles'); const FILESHARE = 'portal'; const { EXPORT_FOLDER } = fileshare.getConfig(FILESHARE); @@ -66,7 +67,7 @@ exports.create = async (req, res) => { if (!deal) return res.status(422).send('Parent deal not found'); // Check user has rights to access this file - if (!userHasAccess(req.user, deal, ['maker'])) return res.sendStatus(401); + if (!userHasAccess(req.user, deal, [MAKER])) return res.sendStatus(401); try { const processedFiles = await Promise.all( diff --git a/portal-api/src/v1/gef/routes.js b/portal-api/src/v1/gef/routes.js index c163ce5d8a..bad1914d99 100644 --- a/portal-api/src/v1/gef/routes.js +++ b/portal-api/src/v1/gef/routes.js @@ -1,5 +1,6 @@ const express = require('express'); -const { validate } = require('../../role-validator'); +const { MAKER, CHECKER, ADMIN, DATA_ADMIN, EDITOR, READ_ONLY } = require('../roles/roles'); +const { validateUserHasSufficientRole } = require('../roles/validate-user-has-sufficient-role'); const fileUpload = require('../middleware/file-upload'); @@ -16,70 +17,70 @@ const router = express.Router(); // Application router .route('/application') - .get(validate({ role: ['maker', 'checker', 'data-admin', 'admin'] }), application.getAll) - .post(validate({ role: ['maker', 'data-admin'] }), application.create); + .get(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, CHECKER, READ_ONLY, DATA_ADMIN, ADMIN] }), application.getAll) + .post(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, DATA_ADMIN] }), application.create); -router.route('/application/clone').post(validate({ role: ['maker'] }), cloneApplication.clone); +router.route('/application/clone').post(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER] }), cloneApplication.clone); router .route('/application/:id') - .get(validate({ role: ['maker', 'checker', 'data-admin', 'admin'] }), application.getById) - .put(validate({ role: ['maker', 'checker', 'data-admin'] }), application.update) // checker can add a comment - .delete(validate({ role: ['maker', 'data-admin'] }), application.delete); + .get(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, CHECKER, READ_ONLY, DATA_ADMIN, ADMIN] }), application.getById) + .put(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, CHECKER, DATA_ADMIN] }), application.update) // checker can add a comment + .delete(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, DATA_ADMIN] }), application.delete); -router.route('/application/supporting-information/:id').put(validate({ role: ['maker', 'checker', 'data-admin'] }), application.updateSupportingInformation); +router.route('/application/supporting-information/:id').put(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, CHECKER, DATA_ADMIN] }), application.updateSupportingInformation); router .route('/application/status/:id') - .get(validate({ role: ['maker', 'checker', 'data-admin', 'admin'] }), application.getStatus) - .put(validate({ role: ['maker', 'checker', 'data-admin'] }), application.changeStatus); + .get(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, CHECKER, READ_ONLY, DATA_ADMIN, ADMIN] }), application.getStatus) + .put(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, CHECKER, DATA_ADMIN] }), application.changeStatus); // Facilities router .route('/facilities') - .get(validate({ role: ['maker', 'checker', 'data-admin', 'admin'] }), facilities.getAllGET) - .post(validate({ role: ['maker', 'data-admin'] }), facilities.create) - .delete(validate({ role: ['maker', 'data-admin'] }), facilities.deleteByDealId); + .get(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, CHECKER, READ_ONLY, DATA_ADMIN, ADMIN] }), facilities.getAllGET) + .post(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, DATA_ADMIN] }), facilities.create) + .delete(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, DATA_ADMIN] }), facilities.deleteByDealId); router .route('/facilities/:id') - .get(validate({ role: ['maker', 'checker', 'data-admin', 'admin'] }), facilities.getById) - .put(validate({ role: ['maker', 'data-admin'] }), facilities.updatePUT) - .delete(validate({ role: ['maker', 'data-admin'] }), facilities.delete); + .get(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, CHECKER, READ_ONLY, DATA_ADMIN, ADMIN] }), facilities.getById) + .put(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, DATA_ADMIN] }), facilities.updatePUT) + .delete(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, DATA_ADMIN] }), facilities.delete); // Eligibility Criteria router .route('/eligibility-criteria') - .get(validate({ role: ['maker', 'checker', 'editor', 'data-admin', 'admin'] }), eligibilityCriteria.getAll) - .post(validate({ role: ['editor', 'data-admin'] }), eligibilityCriteria.create); + .get(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN] }), eligibilityCriteria.getAll) + .post(validateUserHasSufficientRole({ allowedNonAdminRoles: [EDITOR, DATA_ADMIN] }), eligibilityCriteria.create); -router.route('/eligibility-criteria/latest').get(validate({ role: ['maker', 'checker', 'editor', 'data-admin', 'admin'] }), eligibilityCriteria.getLatest); +router.route('/eligibility-criteria/latest').get(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN] }), eligibilityCriteria.getLatest); router .route('/eligibility-criteria/:version') - .get(validate({ role: ['maker', 'checker', 'editor', 'data-admin', 'admin'] }), eligibilityCriteria.getByVersion) - .delete(validate({ role: ['editor', 'data-admin'] }), eligibilityCriteria.delete); + .get(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN] }), eligibilityCriteria.getByVersion) + .delete(validateUserHasSufficientRole({ allowedNonAdminRoles: [EDITOR, DATA_ADMIN] }), eligibilityCriteria.delete); // Mandatory Criteria router .route('/mandatory-criteria-versioned') - .get(validate({ role: ['maker', 'checker', 'editor', 'data-admin', 'admin'] }), mandatoryCriteriaVersioned.findAll) - .post(validate({ role: ['editor', 'data-admin'] }), mandatoryCriteriaVersioned.create); + .get(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN] }), mandatoryCriteriaVersioned.findAll) + .post(validateUserHasSufficientRole({ allowedNonAdminRoles: [EDITOR, DATA_ADMIN] }), mandatoryCriteriaVersioned.create); router .route('/mandatory-criteria-versioned/latest') - .get(validate({ role: ['maker', 'checker', 'editor', 'data-admin', 'admin'] }), mandatoryCriteriaVersioned.findLatest); + .get(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN] }), mandatoryCriteriaVersioned.findLatest); router .route('/mandatory-criteria-versioned/:id') - .get(validate({ role: ['maker', 'checker', 'editor', 'data-admin', 'admin'] }), mandatoryCriteriaVersioned.findOne) - .put(validate({ role: ['editor', 'data-admin'] }), mandatoryCriteriaVersioned.update) - .delete(validate({ role: ['editor', 'data-admin'] }), mandatoryCriteriaVersioned.delete); + .get(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN] }), mandatoryCriteriaVersioned.findOne) + .put(validateUserHasSufficientRole({ allowedNonAdminRoles: [EDITOR, DATA_ADMIN] }), mandatoryCriteriaVersioned.update) + .delete(validateUserHasSufficientRole({ allowedNonAdminRoles: [EDITOR, DATA_ADMIN] }), mandatoryCriteriaVersioned.delete); // File Uploads // TODO: this feels like it should be a service: https://ukef-dtfs.atlassian.net/browse/DTFS2-4842 router.route('/files').post( - validate({ role: ['maker', 'data-admin'] }), + validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, DATA_ADMIN] }), (req, res, next) => { fileUpload(req, res, (error) => { if (!error) { @@ -94,17 +95,17 @@ router.route('/files').post( router .route('/files/:id') - .get(validate({ role: ['maker', 'checker', 'editor', 'data-admin', 'admin'] }), files.getById) - .delete(validate({ role: ['maker', 'data-admin'] }), files.delete); + .get(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN] }), files.getById) + .delete(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, DATA_ADMIN] }), files.delete); -router.route('/files/:id/download').get(validate({ role: ['maker', 'checker', 'editor', 'data-admin', 'admin'] }), files.downloadFile); +router.route('/files/:id/download').get(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN] }), files.downloadFile); router .route('/company/:number') // Companies House - .get(validate({ role: ['maker', 'data-admin', 'admin'] }), externalApi.getByRegistrationNumber); + .get(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, READ_ONLY, DATA_ADMIN, ADMIN] }), externalApi.getByRegistrationNumber); router .route('/address/:postcode') // Ordnance Survey - .get(validate({ role: ['maker', 'data-admin', 'admin'] }), externalApi.getAddressesByPostcode); + .get(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, READ_ONLY, DATA_ADMIN, ADMIN] }), externalApi.getAddressesByPostcode); module.exports = router; diff --git a/portal-api/src/v1/roles/roles.js b/portal-api/src/v1/roles/roles.js new file mode 100644 index 0000000000..b2ed3b27c0 --- /dev/null +++ b/portal-api/src/v1/roles/roles.js @@ -0,0 +1,12 @@ +const ROLES = { + MAKER: 'maker', + CHECKER: 'checker', + ADMIN: 'admin', + UKEF_OPERATIONS: 'ukef_operations', + READ_ONLY: 'read-only', + EDITOR: 'editor', + DATA_ADMIN: 'data-admin', + INTERFACE: 'interface', +}; + +module.exports = ROLES; diff --git a/portal-api/src/v1/roles/user-has-sufficient-role.js b/portal-api/src/v1/roles/user-has-sufficient-role.js new file mode 100644 index 0000000000..655d57447f --- /dev/null +++ b/portal-api/src/v1/roles/user-has-sufficient-role.js @@ -0,0 +1,28 @@ +const { UKEF_OPERATIONS } = require('./roles'); + +const userHasRole = ({ + user, + targetRole, +}) => { + const { roles: userRoles } = user; + return userRoles.includes(targetRole); +}; + +/** + * Returns true if the user has one of allowedNonAdminRoles or is an admin. + * @param {{ user: { roles: string[] }, allowedNonAdminRoles: string[] }} + * @returns {boolean} + */ +const userHasSufficientRole = ({ + user, + allowedNonAdminRoles, +}) => { + if (userHasRole({ user, targetRole: UKEF_OPERATIONS })) { + return true; + } + return allowedNonAdminRoles.some((allowedRole) => userHasRole({ user, targetRole: allowedRole })); +}; + +module.exports = { + userHasSufficientRole, +}; diff --git a/portal-api/src/v1/roles/user-has-sufficient-role.test.js b/portal-api/src/v1/roles/user-has-sufficient-role.test.js new file mode 100644 index 0000000000..9eaa02c8d2 --- /dev/null +++ b/portal-api/src/v1/roles/user-has-sufficient-role.test.js @@ -0,0 +1,181 @@ +const { userHasSufficientRole } = require('./user-has-sufficient-role'); +const { MAKER, CHECKER, ADMIN, READ_ONLY, UKEF_OPERATIONS } = require('./roles'); + +const adminRoles = [ + UKEF_OPERATIONS +]; + +const nonAdminRoles = [ + MAKER, CHECKER, ADMIN, READ_ONLY, +]; + +const allRoles = [ + ...nonAdminRoles, + ...adminRoles, +]; + +describe('userHasSufficientRole', () => { + describe('when there are no allowed roles', () => { + const allowedNonAdminRoles = []; + + it('returns false if the user has no roles', () => { + const allowed = userHasSufficientRole({ + allowedNonAdminRoles, + user: { roles: [] } + }); + + expect(allowed).toBe(false); + }); + + it.each(nonAdminRoles)('returns false if the user has the %s role and not the ukef_operations role', (userRole) => { + const allowed = userHasSufficientRole({ + allowedNonAdminRoles, + user: { roles: [userRole] } + }); + + expect(allowed).toBe(false); + }); + + it('returns true if the user has the ukef_operations role only', () => { + const allowed = userHasSufficientRole({ + allowedNonAdminRoles, + user: { roles: [UKEF_OPERATIONS] } + }); + + expect(allowed).toBe(true); + }); + + it.each(nonAdminRoles)('returns true if the user has the ukef_operations role and the %s role in either order', (userRole) => { + const allowedWithOperationsFirst = userHasSufficientRole({ + allowedNonAdminRoles, + user: { roles: [UKEF_OPERATIONS, userRole] } + }); + const allowedWithOperationsSecond = userHasSufficientRole({ + allowedNonAdminRoles, + user: { roles: [userRole, UKEF_OPERATIONS] } + }); + + expect(allowedWithOperationsFirst).toBe(true); + expect(allowedWithOperationsSecond).toBe(true); + }); + }); + + describe.each(allRoles)('when the only allowed non-admin role is %s', (allowedRole) => { + const allowedNonAdminRoles = [allowedRole]; + + it('returns false if the user has no roles', () => { + const allowed = userHasSufficientRole({ + allowedNonAdminRoles, + user: { roles: [] } + }); + + expect(allowed).toBe(false); + }); + + const nonMatchingNonAdminRoles = nonAdminRoles.filter((role) => role !== allowedRole); + it.each(nonMatchingNonAdminRoles)('returns false if the user has the %s role and not the ukef_operations role', (userRole) => { + const allowed = userHasSufficientRole({ + allowedNonAdminRoles, + user: { roles: [userRole] } + }); + + expect(allowed).toBe(false); + }); + + it('returns true if the user has the ukef_operations role only', () => { + const allowed = userHasSufficientRole({ + allowedNonAdminRoles, + user: { roles: [UKEF_OPERATIONS] } + }); + + expect(allowed).toBe(true); + }); + + it(`returns true if the user has the ${allowedRole} role only`, () => { + const allowed = userHasSufficientRole({ + allowedNonAdminRoles, + user: { roles: [allowedRole] } + }); + + expect(allowed).toBe(true); + }); + + it.each(nonMatchingNonAdminRoles)(`returns true if the user has the ${allowedRole} role and the %s role in either order`, (userRole) => { + const allowedWithAllowedRoleFirst = userHasSufficientRole({ + allowedNonAdminRoles, + user: { roles: [allowedRole, userRole] } + }); + const allowedWithAllowedRoleSecond = userHasSufficientRole({ + allowedNonAdminRoles, + user: { roles: [userRole, allowedRole] } + }); + + expect(allowedWithAllowedRoleFirst).toBe(true); + expect(allowedWithAllowedRoleSecond).toBe(true); + }); + }); + + describe('when there are multiple allowed non-admin roles', () => { + const allowedNonAdminRoles = [MAKER, READ_ONLY]; + const notAllowedRole = CHECKER; + + it('returns false if the user has no roles', () => { + const allowed = userHasSufficientRole({ + allowedNonAdminRoles, + user: { roles: [] } + }); + + expect(allowed).toBe(false); + }); + + it('returns false if the user has none of the allowed roles and does not have the ukef_operations role', () => { + const allowed = userHasSufficientRole({ + allowedNonAdminRoles, + user: { roles: [notAllowedRole] } + }); + + expect(allowed).toBe(false); + }); + + it('returns true if the user has none of the allowed roles and has the ukef_operations role', () => { + const allowed = userHasSufficientRole({ + allowedNonAdminRoles, + user: { roles: [UKEF_OPERATIONS] } + }); + + expect(allowed).toBe(true); + }); + + it('returns true if the user has one of the allowed roles', () => { + const allowed = userHasSufficientRole({ + allowedNonAdminRoles, + user: { roles: [allowedNonAdminRoles[0]] } + }); + + expect(allowed).toBe(true); + }); + + it('returns true if the user has multiple of the allowed roles', () => { + const allowed = userHasSufficientRole({ + allowedNonAdminRoles, + user: { roles: [allowedNonAdminRoles[0], allowedNonAdminRoles[1]] } + }); + + expect(allowed).toBe(true); + }); + + it('returns true if the user has an allowed role and another role in either order', () => { + const allowedWithAllowedRoleFirst = userHasSufficientRole({ + allowedNonAdminRoles, + user: { roles: [allowedNonAdminRoles[1], notAllowedRole] } + }); + const allowedWithAllowedRoleSecond = userHasSufficientRole({ + allowedNonAdminRoles, + user: { roles: [notAllowedRole, allowedNonAdminRoles[1]] } + }); + + expect(allowedWithAllowedRoleFirst).toBe(true); + expect(allowedWithAllowedRoleSecond).toBe(true); + }); + }); +}); diff --git a/portal-api/src/v1/roles/validate-user-has-sufficient-role.js b/portal-api/src/v1/roles/validate-user-has-sufficient-role.js new file mode 100644 index 0000000000..28c198664a --- /dev/null +++ b/portal-api/src/v1/roles/validate-user-has-sufficient-role.js @@ -0,0 +1,25 @@ +const { userHasSufficientRole } = require('./user-has-sufficient-role'); + +/** + * Creates a middleware that returns a 401 error if the current user does + * not have sufficient role(s), given a list of allowed non-admin roles. + * @param {{ allowedNonAdminRoles: string[] }} + * @returns {(req, res, next) => void} + */ +const validateUserHasSufficientRole = ({ + allowedNonAdminRoles, +}) => (req, res, next) => { + const { user } = req; + const userHasSufficientRolesToAccessNext = userHasSufficientRole({ user, allowedNonAdminRoles }); + + if (userHasSufficientRolesToAccessNext) { + next(); + return; + } + + res.status(401).json({ success: false, msg: "You don't have access to this page" }); +}; + +module.exports = { + validateUserHasSufficientRole, +}; diff --git a/portal-api/src/v1/roles/validate-user-has-sufficient-role.test.js b/portal-api/src/v1/roles/validate-user-has-sufficient-role.test.js new file mode 100644 index 0000000000..838d2c5dd5 --- /dev/null +++ b/portal-api/src/v1/roles/validate-user-has-sufficient-role.test.js @@ -0,0 +1,71 @@ +const { when } = require('jest-when'); +const { validateUserHasSufficientRole } = require('./validate-user-has-sufficient-role'); +const { MAKER, READ_ONLY, CHECKER } = require('./roles'); +const { userHasSufficientRole } = require('./user-has-sufficient-role'); + +jest.mock('./user-has-sufficient-role', () => ({ userHasSufficientRole: jest.fn() })); + +describe('validateUserHasSufficientRole', () => { + describe('returns middleware that', () => { + const allowedNonAdminRoles = [MAKER, READ_ONLY]; + const req = { user: { roles: [CHECKER] } }; + + let res; + let next = jest.fn(); + + beforeEach(() => { + res = { + status: jest.fn().mockReturnThis(), + json: jest.fn(), + }; + next = jest.fn(); + }); + + it('calls next if the request user has sufficient roles for the allowed roles', () => { + when(userHasSufficientRole).calledWith({ user: req.user, allowedNonAdminRoles }).mockReturnValueOnce(true); + const middleware = validateUserHasSufficientRole({ allowedNonAdminRoles }); + + middleware(req, res, next); + + expect(next).toHaveBeenCalledTimes(1); + expect(next).toHaveBeenCalledWith(); + }); + + it('does not set a status on the response if the request user has sufficient roles for the allowed roles', () => { + when(userHasSufficientRole).calledWith({ user: req.user, allowedNonAdminRoles }).mockReturnValueOnce(true); + const middleware = validateUserHasSufficientRole({ allowedNonAdminRoles }); + + middleware(req, res, next); + + expect(res.status).not.toHaveBeenCalled(); + }); + + it('does not send a json response if the request user has sufficient roles for the allowed roles', () => { + when(userHasSufficientRole).calledWith({ user: req.user, allowedNonAdminRoles }).mockReturnValueOnce(true); + const middleware = validateUserHasSufficientRole({ allowedNonAdminRoles }); + + middleware(req, res, next); + + expect(res.json).not.toHaveBeenCalled(); + }); + + it('does not call next if the request user does not have sufficient roles for the allowed roles', () => { + when(userHasSufficientRole).calledWith({ user: req.user, allowedNonAdminRoles }).mockReturnValueOnce(false); + const middleware = validateUserHasSufficientRole({ allowedNonAdminRoles }); + + middleware(req, res, next); + + expect(next).not.toHaveBeenCalled(); + }); + + it('returns a 401 error with a JSON message if the request user does not have sufficient roles for the allowed roles', () => { + when(userHasSufficientRole).calledWith({ user: req.user, allowedNonAdminRoles }).mockReturnValueOnce(false); + const middleware = validateUserHasSufficientRole({ allowedNonAdminRoles }); + + middleware(req, res, next); + + expect(res.status).toHaveBeenCalledWith(401); + expect(res.json).toHaveBeenCalledWith({ success: false, msg: "You don't have access to this page" }); + }); + }); +}); diff --git a/portal-api/src/v1/routes.js b/portal-api/src/v1/routes.js index f81f82537b..007712680e 100644 --- a/portal-api/src/v1/routes.js +++ b/portal-api/src/v1/routes.js @@ -1,7 +1,16 @@ const express = require('express'); const passport = require('passport'); -const { validate } = require('../role-validator'); +const { validateUserHasSufficientRole } = require('./roles/validate-user-has-sufficient-role'); +const { + MAKER, + CHECKER, + ADMIN, + EDITOR, + DATA_ADMIN, + INTERFACE, + READ_ONLY, +} = require('./roles/roles'); const dealsController = require('./controllers/deal.controller'); const dealName = require('./controllers/deal-name.controller'); @@ -60,9 +69,9 @@ authRouter.use(passport.authenticate('jwt', { session: false })); * Allow POST & PUT of MC HTML tags * on non-production environments only */ -authRouter.route('/mandatory-criteria').post(validate({ role: ['editor'] }), mandatoryCriteria.create); +authRouter.route('/mandatory-criteria').post(validateUserHasSufficientRole({ allowedNonAdminRoles: [EDITOR] }), mandatoryCriteria.create); -authRouter.route('/mandatory-criteria/:version').put(validate({ role: ['editor'] }), mandatoryCriteria.update); +authRouter.route('/mandatory-criteria/:version').put(validateUserHasSufficientRole({ allowedNonAdminRoles: [EDITOR] }), mandatoryCriteria.update); // Enable XSS authRouter.use(cleanXss); @@ -75,7 +84,7 @@ authRouter.route('/mandatory-criteria/latest').get(mandatoryCriteria.findLatest) authRouter .route('/mandatory-criteria/:version') .get(mandatoryCriteria.findOne) - .delete(validate({ role: ['editor'] }), mandatoryCriteria.delete); + .delete(validateUserHasSufficientRole({ allowedNonAdminRoles: [EDITOR] }), mandatoryCriteria.delete); authRouter.route('/users').get(users.list).post(users.create); authRouter.route('/users/:_id').get(users.findById).put(users.updateById).delete(users.remove); @@ -83,54 +92,54 @@ authRouter.route('/users/:_id/disable').delete(users.disable); authRouter.use('/gef', gef); -authRouter.route('/deals').post(validate({ role: ['maker'] }), dealsController.create); -authRouter.route('/deals').get(validate({ role: ['maker', 'checker', 'admin'] }), dealsController.getQueryAllDeals); +authRouter.route('/deals').post(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER] }), dealsController.create); +authRouter.route('/deals').get(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, CHECKER, READ_ONLY, ADMIN] }), dealsController.getQueryAllDeals); authRouter .route('/deals/:id/status') - .get(validate({ role: ['maker', 'checker', 'admin'] }), dealStatus.findOne) - .put(validate({ role: ['maker', 'checker', 'interface'] }), dealStatus.update); + .get(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, CHECKER, READ_ONLY, ADMIN] }), dealStatus.findOne) + .put(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, CHECKER, INTERFACE] }), dealStatus.update); authRouter .route('/deals/:id/submission-details') - .get(validate({ role: ['maker', 'checker', 'admin'] }), dealSubmissionDetails.findOne) - .put(validate({ role: ['maker'] }), dealSubmissionDetails.update); + .get(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, CHECKER, READ_ONLY, ADMIN] }), dealSubmissionDetails.findOne) + .put(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER] }), dealSubmissionDetails.update); -authRouter.route('/deals/:id/additionalRefName').put(validate({ role: ['maker'] }), dealName.update); -authRouter.route('/deals/:id/loan/create').put(validate({ role: ['maker'] }), loans.create); +authRouter.route('/deals/:id/additionalRefName').put(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER] }), dealName.update); +authRouter.route('/deals/:id/loan/create').put(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER] }), loans.create); authRouter .route('/deals/:id/loan/:loanId') - .get(validate({ role: ['maker', 'admin'] }), loans.getLoan) - .put(validate({ role: ['maker'] }), loans.updateLoan) - .delete(validate({ role: ['maker'] }), loans.deleteLoan); + .get(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, READ_ONLY, ADMIN] }), loans.getLoan) + .put(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER] }), loans.updateLoan) + .delete(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER] }), loans.deleteLoan); -authRouter.route('/deals/:id/loan/:loanId/issue-facility').put(validate({ role: ['maker'] }), loanIssueFacility.updateLoanIssueFacility); -authRouter.route('/deals/:id/loan/:loanId/change-cover-start-date').put(validate({ role: ['maker'] }), loanChangeCoverStartDate.updateLoanCoverStartDate); -authRouter.route('/deals/:id/bond/create').put(validate({ role: ['maker'] }), bonds.create); +authRouter.route('/deals/:id/loan/:loanId/issue-facility').put(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER] }), loanIssueFacility.updateLoanIssueFacility); +authRouter.route('/deals/:id/loan/:loanId/change-cover-start-date').put(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER] }), loanChangeCoverStartDate.updateLoanCoverStartDate); +authRouter.route('/deals/:id/bond/create').put(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER] }), bonds.create); authRouter .route('/deals/:id/bond/:bondId') - .get(validate({ role: ['maker', 'admin'] }), bonds.getBond) - .put(validate({ role: ['maker'] }), bonds.updateBond) - .delete(validate({ role: ['maker'] }), bonds.deleteBond); + .get(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, READ_ONLY, ADMIN] }), bonds.getBond) + .put(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER] }), bonds.updateBond) + .delete(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER] }), bonds.deleteBond); -authRouter.route('/deals/:id/bond/:bondId/issue-facility').put(validate({ role: ['maker'] }), bondIssueFacility.updateBondIssueFacility); -authRouter.route('/deals/:id/bond/:bondId/change-cover-start-date').put(validate({ role: ['maker'] }), bondChangeCoverStartDate.updateBondCoverStartDate); -authRouter.route('/deals/:id/multiple-facilities').post(validate({ role: ['maker'] }), facilitiesController.createMultiple); +authRouter.route('/deals/:id/bond/:bondId/issue-facility').put(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER] }), bondIssueFacility.updateBondIssueFacility); +authRouter.route('/deals/:id/bond/:bondId/change-cover-start-date').put(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER] }), bondChangeCoverStartDate.updateBondCoverStartDate); +authRouter.route('/deals/:id/multiple-facilities').post(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER] }), facilitiesController.createMultiple); -authRouter.route('/facilities').get(validate({ role: ['maker', 'checker', 'admin'] }), facilitiesController.getQueryAllFacilities); +authRouter.route('/facilities').get(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, CHECKER, READ_ONLY, ADMIN] }), facilitiesController.getQueryAllFacilities); authRouter .route('/deals/:id') - .get(validate({ role: ['maker', 'checker', 'admin'] }), dealsController.findOne) - .put(validate({ role: ['maker'] }), dealsController.update) - .delete(validate({ role: ['maker'] }), dealsController.delete); + .get(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, CHECKER, READ_ONLY, ADMIN] }), dealsController.findOne) + .put(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER] }), dealsController.update) + .delete(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER] }), dealsController.delete); -authRouter.route('/deals/:id/clone').post(validate({ role: ['maker'] }), dealClone.clone); -authRouter.route('/deals/:id/eligibility-criteria').put(validate({ role: ['maker'] }), dealEligibilityCriteria.update); +authRouter.route('/deals/:id/clone').post(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER] }), dealClone.clone); +authRouter.route('/deals/:id/eligibility-criteria').put(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER] }), dealEligibilityCriteria.update); authRouter.route('/deals/:id/eligibility-documentation').put( - validate({ role: ['maker'] }), + validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER] }), (req, res, next) => { fileUpload(req, res, (error) => { if (!error) { @@ -145,18 +154,18 @@ authRouter.route('/deals/:id/eligibility-documentation').put( authRouter .route('/deals/:id/eligibility-documentation/:fieldname/:filename') - .get(validate({ role: ['maker', 'checker', 'admin'] }), dealEligibilityDocumentation.downloadFile); + .get(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, CHECKER, READ_ONLY, ADMIN] }), dealEligibilityDocumentation.downloadFile); authRouter .route('/banks') .get(banks.findAll) - .post(validate({ role: ['editor'] }), banks.create); + .post(validateUserHasSufficientRole({ allowedNonAdminRoles: [EDITOR] }), banks.create); authRouter .route('/banks/:id') .get(banks.findOne) - .put(validate({ role: ['editor'] }), banks.update) - .delete(validate({ role: ['editor'] }), banks.delete); + .put(validateUserHasSufficientRole({ allowedNonAdminRoles: [EDITOR] }), banks.update) + .delete(validateUserHasSufficientRole({ allowedNonAdminRoles: [EDITOR] }), banks.delete); authRouter.route('/currencies').get(currencies.findAll); authRouter.route('/currencies/:id').get(currencies.findOne); @@ -164,12 +173,12 @@ authRouter.route('/currencies/:id').get(currencies.findOne); authRouter.route('/countries').get(countries.findAll); authRouter.route('/countries/:code').get(countries.findOne); -authRouter.route('/feedback').get(validate({ role: ['data-admin', 'admin'] }), feedback.findAll); +authRouter.route('/feedback').get(validateUserHasSufficientRole({ allowedNonAdminRoles: [DATA_ADMIN, ADMIN] }), feedback.findAll); authRouter .route('/feedback/:id') - .get(validate({ role: ['data-admin', 'admin'] }), feedback.findOne) - .delete(validate({ role: ['data-admin'] }), feedback.delete); + .get(validateUserHasSufficientRole({ allowedNonAdminRoles: [DATA_ADMIN, ADMIN] }), feedback.findOne) + .delete(validateUserHasSufficientRole({ allowedNonAdminRoles: [DATA_ADMIN] }), feedback.delete); authRouter.route('/industry-sectors').get(industrySectors.findAll); authRouter.route('/industry-sectors/:code').get(industrySectors.findOne); @@ -177,22 +186,22 @@ authRouter.route('/industry-sectors/:code').get(industrySectors.findOne); authRouter .route('/eligibility-criteria') .get(eligibilityCriteria.findAll) - .post(validate({ role: ['editor'] }), eligibilityCriteria.create); + .post(validateUserHasSufficientRole({ allowedNonAdminRoles: [EDITOR] }), eligibilityCriteria.create); authRouter.route('/eligibility-criteria/latest').get(eligibilityCriteria.findLatestGET); authRouter .route('/eligibility-criteria/:version') .get(eligibilityCriteria.findOne) - .put(validate({ role: ['editor'] }), eligibilityCriteria.update) - .delete(validate({ role: ['editor'] }), eligibilityCriteria.delete); + .put(validateUserHasSufficientRole({ allowedNonAdminRoles: [EDITOR] }), eligibilityCriteria.update) + .delete(validateUserHasSufficientRole({ allowedNonAdminRoles: [EDITOR] }), eligibilityCriteria.delete); // Portal reports -authRouter.route('/reports/unissued-facilities').get(validate({ role: ['maker', 'checker', 'admin'] }), unissuedFacilitiesReport.findUnissuedFacilitiesReports); -authRouter.route('/reports/review-ukef-decision').get(validate({ role: ['maker', 'checker', 'admin'] }), ukefDecisionReport.reviewUkefDecisionReports); +authRouter.route('/reports/unissued-facilities').get(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, CHECKER, READ_ONLY, ADMIN] }), unissuedFacilitiesReport.findUnissuedFacilitiesReports); +authRouter.route('/reports/review-ukef-decision').get(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, CHECKER, READ_ONLY, ADMIN] }), ukefDecisionReport.reviewUkefDecisionReports); // token-validator -authRouter.get('/validate', validate(), (req, res) => { +authRouter.get('/validate', (req, res) => { res.status(200).send(); }); From c31138ca516e75ee9c50147f64058ba228c95db5 Mon Sep 17 00:00:00 2001 From: lmarrai-sw <44811960+lmarrai-sw@users.noreply.github.com> Date: Wed, 13 Sep 2023 09:01:08 +0100 Subject: [PATCH 012/130] feat(DTFS2-6626): replace ukef_operations with updated admin permissions in portal-api (#1975) --- cspell.json | 6 +- portal-api/api-tests/api-test-users.js | 97 +++++++-- portal-api/api-tests/api.js | 82 +++++-- .../client-authentication-tests.js | 31 +++ .../common-tests/role-authorisation-tests.js | 68 ++++++ portal-api/api-tests/fixtures/postcode.js | 3 + .../api-tests/v1/banks/banks.api-test.js | 7 +- ...ge-cover-start-date-validation.api-test.js | 3 +- .../bond-change-cover-start-date.api-test.js | 5 +- ...bond-issue-facility-validation.api-test.js | 3 +- .../v1/bonds/bond-issue-facility.api-test.js | 5 +- .../v1/bonds/bonds-validation.api-test.js | 3 +- .../api-tests/v1/bonds/bonds.api-test.js | 82 ++++--- .../v1/countries/countries.api-test.js | 51 +++-- .../v1/currencies/currencies.api-test.js | 53 +++-- .../api-tests/v1/deals/deal-clone.api-test.js | 5 +- .../v1/deals/deal-comments.api-test.js | 3 +- .../deal-eligibility-criteria.api-test.js | 5 +- ...deal-eligibility-documentation.api-test.js | 198 ++++++++--------- .../api-tests/v1/deals/deal-name.api-test.js | 3 +- .../v1/deals/deal-status-accepted.api-test.js | 5 +- .../v1/deals/deal-validation.api-test.js | 3 +- ...ed-facilities-cover-start-date.api-test.js | 5 +- .../deals/deals-status-facilities.api-test.js | 7 +- ...-unsubmitted-issued-facilities.api-test.js | 5 +- .../deals/deals-status-submitted.api-test.js | 9 +- .../v1/deals/deals-status.api-test.js | 200 ++++++++---------- ...-submission-details-validation.api-test.js | 5 +- .../deals-submission-details.api-test.js | 63 +++--- .../api-tests/v1/deals/deals.api-test.js | 88 ++++---- .../eligibility-criteria.api-test.js | 145 ++++++------- .../feedback/feedback-validation.api-test.js | 3 +- .../v1/feedback/feedback.api-test.js | 95 +++++---- .../api-tests/v1/gef/address.api-test.js | 36 ++++ .../v1/gef/application-submit.api-test.js | 35 +-- .../api-tests/v1/gef/application.api-test.js | 78 ++++--- .../v1/gef/clone-gef-deal.api-test.js | 7 +- .../api-tests/v1/gef/company.api-test.js | 51 +++++ .../v1/gef/eligibility-criteria.api-test.js | 115 +++++----- .../api-tests/v1/gef/external-api.api-test.js | 5 +- .../api-tests/v1/gef/facilities.api-test.js | 53 +++-- portal-api/api-tests/v1/gef/files.api-test.js | 150 ++++++++----- .../mandatory-criteria-versioned.api-test.js | 74 ++++--- .../portal-activities.controller.api-test.js | 19 +- .../industry-sectors.api-test.js | 44 ++-- ...ge-cover-start-date-validation.api-test.js | 3 +- .../loan-change-cover-start-date.api-test.js | 5 +- ...loan-issue-facility-validation.api-test.js | 3 +- .../v1/loan/loan-issue-facility.api-test.js | 5 +- .../v1/loan/loan-validation.api-test.js | 3 +- portal-api/api-tests/v1/loan/loan.api-test.js | 70 +++--- .../mandatory-criteria.api-test.js | 165 +++++++-------- .../reports/review-ukef-decision.api-test.js | 50 +++-- .../reports/unissued-facilities.api-test.js | 42 ++-- portal-api/api-tests/v1/users/test-data.js | 16 +- .../api-tests/v1/users/users.api-test.js | 13 +- .../v1/validate/validate-token.api-test.js | 27 +++ portal-api/package.json | 2 +- portal-api/src/external-api/__mocks__/api.js | 4 + .../external-api/__mocks__/companies-house.js | 5 + .../external-api/__mocks__/ordnance-survey.js | 5 + portal-api/src/external-api/api.js | 4 + .../src/external-api/companies-house.js | 25 +++ .../src/external-api/ordnance-survey.js | 25 +++ .../src/v1/controllers/bonds.controller.js | 2 +- .../gef/controllers/externalApi.controller.js | 13 +- portal-api/src/v1/gef/routes.js | 68 +++--- portal-api/src/v1/roles/roles.js | 1 - .../user-has-at-least-one-allowed-role.js | 22 ++ ...user-has-at-least-one-allowed-role.test.js | 131 ++++++++++++ .../src/v1/roles/user-has-sufficient-role.js | 28 --- .../v1/roles/user-has-sufficient-role.test.js | 181 ---------------- ...date-user-has-at-least-one-allowed-role.js | 24 +++ ...user-has-at-least-one-allowed-role.test.js | 71 +++++++ .../validate-user-has-sufficient-role.js | 25 --- .../validate-user-has-sufficient-role.test.js | 71 ------- portal-api/src/v1/routes.js | 88 ++++---- utils/mock-data-loader/user-helper.js | 2 +- 78 files changed, 1867 insertions(+), 1345 deletions(-) create mode 100644 portal-api/api-tests/common-tests/client-authentication-tests.js create mode 100644 portal-api/api-tests/common-tests/role-authorisation-tests.js create mode 100644 portal-api/api-tests/fixtures/postcode.js create mode 100644 portal-api/api-tests/v1/gef/address.api-test.js create mode 100644 portal-api/api-tests/v1/gef/company.api-test.js create mode 100644 portal-api/api-tests/v1/validate/validate-token.api-test.js create mode 100644 portal-api/src/external-api/__mocks__/companies-house.js create mode 100644 portal-api/src/external-api/__mocks__/ordnance-survey.js create mode 100644 portal-api/src/external-api/companies-house.js create mode 100644 portal-api/src/external-api/ordnance-survey.js create mode 100644 portal-api/src/v1/roles/user-has-at-least-one-allowed-role.js create mode 100644 portal-api/src/v1/roles/user-has-at-least-one-allowed-role.test.js delete mode 100644 portal-api/src/v1/roles/user-has-sufficient-role.js delete mode 100644 portal-api/src/v1/roles/user-has-sufficient-role.test.js create mode 100644 portal-api/src/v1/roles/validate-user-has-at-least-one-allowed-role.js create mode 100644 portal-api/src/v1/roles/validate-user-has-at-least-one-allowed-role.test.js delete mode 100644 portal-api/src/v1/roles/validate-user-has-sufficient-role.js delete mode 100644 portal-api/src/v1/roles/validate-user-has-sufficient-role.test.js diff --git a/cspell.json b/cspell.json index ee85046597..56da067409 100644 --- a/cspell.json +++ b/cspell.json @@ -108,7 +108,11 @@ "tfsdev", "tfsstaging", "tfsprod", - "octocat" + "octocat", + "ADMINNOMAKER", + "MAKENCHECK", + "unmock", + "unsubmitted" ], "dictionaries": [ "en-gb", diff --git a/portal-api/api-tests/api-test-users.js b/portal-api/api-tests/api-test-users.js index 945a82b024..d7195e0585 100644 --- a/portal-api/api-tests/api-test-users.js +++ b/portal-api/api-tests/api-test-users.js @@ -2,6 +2,7 @@ const api = require('./api'); const db = require('../src/drivers/db-client'); const { genPassword } = require('../src/crypto/utils'); const wipeDB = require('./wipeDB'); +const { MAKER, CHECKER, DATA_ADMIN, ADMIN, READ_ONLY, EDITOR } = require('../src/v1/roles/roles'); const banks = { Barclays: { @@ -54,7 +55,7 @@ const testUsers = [ username: 'an-editor', email: 'an-editor@ukexportfinance.gov.uk', password: 'P@ssword1234', - roles: ['editor'], + roles: [EDITOR], bank: {} }, { @@ -64,7 +65,7 @@ const testUsers = [ surname: 'One', email: 'one@email.com', timezone: 'Europe/London', - roles: ['maker'], + roles: [MAKER], bank: banks.HSBC, }, { @@ -74,7 +75,7 @@ const testUsers = [ surname: 'Two', email: 'two@email.com', timezone: 'Europe/London', - roles: ['maker'], + roles: [MAKER], bank: banks.HSBC, }, { @@ -84,7 +85,7 @@ const testUsers = [ surname: 'Three', email: 'three@email.com', timezone: 'Europe/London', - roles: ['maker'], + roles: [MAKER], bank: banks.Barclays, }, { @@ -94,7 +95,7 @@ const testUsers = [ surname: 'Four', email: 'four@email.com', timezone: 'Europe/London', - roles: ['maker'], + roles: [MAKER], bank: banks.Barclays, }, { @@ -104,7 +105,67 @@ const testUsers = [ surname: 'Five', email: 'five@email.com', timezone: 'Europe/London', - roles: ['checker'], + roles: [CHECKER], + bank: banks.Barclays, + }, + { + username: 'Barclays-read-only', + password: 'P@ssword1234', + firstname: 'Read Only', + surname: 'Barclays', + email: 'barclays-read-only@email.com', + timezone: 'Europe/London', + roles: [READ_ONLY], + bank: banks.Barclays, + }, + { + username: 'Barclays-admin', + password: 'P@ssword1234', + firstname: 'Admin', + surname: 'Barclays', + email: 'barclays-admin@email.com', + timezone: 'Europe/London', + roles: [ADMIN], + bank: banks.Barclays, + }, + { + username: 'Barclays-no-roles', + password: 'P@ssword1234', + firstname: 'No Roles', + surname: 'Barclays', + email: 'barclays-no-roles@email.com', + timezone: 'Europe/London', + roles: [], + bank: banks.Barclays, + }, + { + username: 'Barclays-data-admin', + password: 'P@ssword1234', + firstname: 'Data Admin', + surname: 'Barclays', + email: 'barclays-data-admin@email.com', + timezone: 'Europe/London', + roles: [DATA_ADMIN], + bank: banks.Barclays, + }, + { + username: 'Barclays-ukef-operations', + password: 'P@ssword1234', + firstname: 'UKEF Operations', + surname: 'Barclays', + email: 'barclays-ukef-operations@email.com', + timezone: 'Europe/London', + roles: ['ukef_operations'], + bank: banks.Barclays, + }, + { + username: 'Barclays-editor', + password: 'P@ssword1234', + firstname: 'Editor', + surname: 'Barclays', + email: 'barclays-editor@email.com', + timezone: 'Europe/London', + roles: [EDITOR], bank: banks.Barclays, }, { @@ -114,7 +175,7 @@ const testUsers = [ surname: 'Six', email: 'six@email.com', timezone: 'Europe/London', - roles: ['maker'], + roles: [MAKER], bank: banks.UKEF, }, { @@ -124,7 +185,17 @@ const testUsers = [ surname: 'Seven', email: 'seven@email.com', timezone: 'Europe/London', - roles: ['maker'], + roles: [MAKER], + bank: banks.any, + }, + { + username: 'any-bank-ukef-operator', + password: 'P@ssword1234', + firstname: 'UKEF Operator', + surname: 'Any Bank', + email: 'any-bank-ukef-operator@email.com', + timezone: 'Europe/London', + roles: ['ukef_operations'], bank: banks.any, }, { @@ -134,7 +205,7 @@ const testUsers = [ surname: 'Eight', email: 'eight@email.com', timezone: 'Europe/London', - roles: ['data-admin'], + roles: [DATA_ADMIN], bank: {}, }, { @@ -144,7 +215,7 @@ const testUsers = [ surname: 'Nine', email: 'nine@email.com', timezone: 'Europe/London', - roles: ['maker', 'checker'], + roles: [MAKER, CHECKER], bank: banks.Barclays, }, @@ -155,7 +226,7 @@ const testUsers = [ surname: 'Last', email: 'maker@ukexportfinance.gov.uk', timezone: 'Europe/London', - roles: ['maker'], + roles: [MAKER], bank: banks.UKEF, }, { @@ -165,7 +236,7 @@ const testUsers = [ surname: 'Checker', email: 'checker@ukexportfinance.gov.uk', timezone: 'Europe/London', - roles: ['checker'], + roles: [CHECKER], bank: banks.UKEF, }, ]; @@ -215,7 +286,7 @@ const apiTestUser = { surname: 'Test User', email: 'api-tester@example.com', timezone: 'Europe/London', - roles: ['maker'], + roles: [MAKER], bank: banks.any, }; diff --git a/portal-api/api-tests/api.js b/portal-api/api-tests/api.js index a9afde83ec..c429f1101d 100644 --- a/portal-api/api-tests/api.js +++ b/portal-api/api-tests/api.js @@ -6,46 +6,52 @@ dotenv.config(); const { PORTAL_API_KEY } = process.env; -const headers = (token) => ({ +const authHeaders = (token) => ({ 'x-api-key': PORTAL_API_KEY, Authorization: token, }); +const postMultipartForm = (app, { url, data, files, headers }) => { + const requestInProgress = request(app) + .post(url); + + if (headers) { + requestInProgress.set(headers); + } + + if (files.length) { + files.forEach((file) => requestInProgress.attach(file.fieldname, file.filepath)); + } + + Object.entries(data).forEach(([fieldname, value]) => { + requestInProgress.field(fieldname, value); + }); + + return requestInProgress; +}; + module.exports = (app) => ({ as: (user) => { const token = (user && user.token) ? user.token : ''; + const headers = authHeaders(token); return { post: (data) => ({ to: async (url) => request(app) .post(url) - .set(headers(token)) + .set(headers) .send(data), }), postMultipartForm: (data, files = []) => ({ - to: async (url) => { - const apiRequest = request(app) - .post(url) - .set(headers(token)); - - if (files.length) { - files.forEach((file) => apiRequest.attach(file.fieldname, file.filepath)); - } - - Object.entries(data).forEach(([fieldname, value]) => { - apiRequest.field(fieldname, value); - }); - - return apiRequest; - }, + to: (url) => postMultipartForm(app, { url, data, files, headers }), }), postEach: (list) => ({ to: async (url) => { const results = list.map((data) => request(app) .post(url) - .set(headers(token)) + .set(headers) .send(data)); return Promise.all(results); @@ -55,7 +61,7 @@ module.exports = (app) => ({ put: (data) => ({ to: async (url) => request(app) .put(url) - .set(headers(token)) + .set(headers) .send(data), }), @@ -63,7 +69,7 @@ module.exports = (app) => ({ to: async (url) => { const apiRequest = request(app) .put(url) - .set(headers(token)); + .set(headers); if (files.length) { files.forEach((file) => apiRequest.attach(file.fieldname, file.filepath)); @@ -79,13 +85,45 @@ module.exports = (app) => ({ get: async (url, query = {}) => request(app) .get(url) - .set(headers(token)) + .set(headers) .query(query), remove: async (url) => request(app) .delete(url) - .set(headers(token)) + .set(headers) .send(), }; }, + get: (url, { headers, query } = {}) => { + const requestInProgress = request(app).get(url); + if (headers) { + requestInProgress.set(headers); + } + if (query) { + requestInProgress.query(query); + } + return requestInProgress; + }, + put: (url, data, { headers } = {}) => { + const requestInProgress = request(app).put(url); + if (headers) { + requestInProgress.set(headers); + } + return requestInProgress.send(data); + }, + post: (url, data, { headers } = {}) => { + const requestInProgress = request(app).post(url); + if (headers) { + requestInProgress.set(headers); + } + return requestInProgress.send(data); + }, + postMultipartForm: (...args) => postMultipartForm(app, ...args), + remove: (url, { headers } = {}) => { + const requestInProgress = request(app).delete(url); + if (headers) { + requestInProgress.set(headers); + } + return requestInProgress.send(); + }, }); diff --git a/portal-api/api-tests/common-tests/client-authentication-tests.js b/portal-api/api-tests/common-tests/client-authentication-tests.js new file mode 100644 index 0000000000..198d08e581 --- /dev/null +++ b/portal-api/api-tests/common-tests/client-authentication-tests.js @@ -0,0 +1,31 @@ +const expectNotAuthenticatedResponse = ({ + status, + body +}) => { + expect(status).toBe(401); + expect(body).toStrictEqual({}); +}; + +const withClientAuthenticationTests = ({ + makeRequestWithoutAuthHeader, + makeRequestWithAuthHeader, +}) => { + it('returns a 401 response if the request does not have a Authorization header', async () => { + const response = await makeRequestWithoutAuthHeader(); + expectNotAuthenticatedResponse(response); + }); + + it('returns a 401 response if the request has an empty Authorization header', async () => { + const response = await makeRequestWithAuthHeader(''); + expectNotAuthenticatedResponse(response); + }); + + it('returns a 401 response if the request has an invalid Authorization header', async () => { + const response = await makeRequestWithAuthHeader('not-a-real-auth-header'); + expectNotAuthenticatedResponse(response); + }); +}; + +module.exports = { + withClientAuthenticationTests, +}; diff --git a/portal-api/api-tests/common-tests/role-authorisation-tests.js b/portal-api/api-tests/common-tests/role-authorisation-tests.js new file mode 100644 index 0000000000..dd54ecb17b --- /dev/null +++ b/portal-api/api-tests/common-tests/role-authorisation-tests.js @@ -0,0 +1,68 @@ +const { MAKER, CHECKER, READ_ONLY, ADMIN } = require('../../src/v1/roles/roles'); + +const expectNotAuthorisedResponse = ({ + status, + body +}) => { + expect(status).toBe(401); + expect(body).toStrictEqual({ + success: false, + msg: "You don't have access to this page", + }); +}; + +const allRoles = [MAKER, CHECKER, READ_ONLY, ADMIN]; + +const withRoleAuthorisationTests = ({ + allowedRoles, + getUserWithRole, + getUserWithoutAnyRoles, + makeRequestAsUser, + successStatusCode, +}) => { + const notAllowedRoles = allRoles.filter((role) => !allowedRoles.includes(role)); + + if (notAllowedRoles.length) { + it.each(notAllowedRoles)('returns a 401 response for requests from a user with role %s', async (role) => { + const userWithRole = getUserWithRole(role); + const response = await makeRequestAsUser(userWithRole); + expectNotAuthorisedResponse(response); + }); + } + + it('returns a 401 response for requests from a user without any roles', async () => { + const userWithoutRoles = getUserWithoutAnyRoles(); + const response = await makeRequestAsUser(userWithoutRoles); + expectNotAuthorisedResponse(response); + }); + + it.each(allowedRoles)(`returns a ${successStatusCode} response for requests from a user with role %s`, async (role) => { + const userWithRole = getUserWithRole(role); + const { status } = await makeRequestAsUser(userWithRole); + expect(status).toBe(successStatusCode); + }); +}; + +const withNoRoleAuthorisationTests = ({ + getUserWithRole, + getUserWithoutAnyRoles, + makeRequestAsUser, + successStatusCode, +}) => { + it.each(allRoles)(`returns a ${successStatusCode} response for requests from a user with role %s`, async (role) => { + const userWithRole = getUserWithRole(role); + const { status } = await makeRequestAsUser(userWithRole); + expect(status).toBe(successStatusCode); + }); + + it(`returns a ${successStatusCode} response for requests from a user without any roles`, async () => { + const userWithoutRoles = getUserWithoutAnyRoles(); + const { status } = await makeRequestAsUser(userWithoutRoles); + expect(status).toBe(successStatusCode); + }); +}; + +module.exports = { + withRoleAuthorisationTests, + withNoRoleAuthorisationTests, +}; diff --git a/portal-api/api-tests/fixtures/postcode.js b/portal-api/api-tests/fixtures/postcode.js new file mode 100644 index 0000000000..9bd1987d37 --- /dev/null +++ b/portal-api/api-tests/fixtures/postcode.js @@ -0,0 +1,3 @@ +exports.POSTCODE = { + VALID: 'E1 6JE', +}; diff --git a/portal-api/api-tests/v1/banks/banks.api-test.js b/portal-api/api-tests/v1/banks/banks.api-test.js index efa51b28a7..04120abfbf 100644 --- a/portal-api/api-tests/v1/banks/banks.api-test.js +++ b/portal-api/api-tests/v1/banks/banks.api-test.js @@ -5,6 +5,7 @@ const wipeDB = require('../../wipeDB'); const { as } = require('../../api')(app); const { expectMongoId, expectMongoIds } = require('../../expectMongoIds'); const bankController = require('../../../src/v1/controllers/banks.controller'); +const { EDITOR } = require('../../../src/v1/roles/roles'); const aBank = require('./bank-builder'); @@ -16,14 +17,14 @@ const updatedBank = aBank({ // Disabled MGA tests as they remove banks from DB which other functionality now depends on // so other test will break if this is run before -xdescribe('/v1/banks', () => { +describe.skip('/v1/banks', () => { let anEditor; let aNonEditor; beforeAll(async () => { const testUsers = await testUserCache.initialise(app); - anEditor = testUsers().withRole('editor').one(); - aNonEditor = testUsers().withoutRole('editor').one(); + anEditor = testUsers().withRole(EDITOR).one(); + aNonEditor = testUsers().withoutRole(EDITOR).one(); }); beforeEach(async () => { diff --git a/portal-api/api-tests/v1/bonds/bond-change-cover-start-date-validation.api-test.js b/portal-api/api-tests/v1/bonds/bond-change-cover-start-date-validation.api-test.js index 20b72f1ee8..869eadca98 100644 --- a/portal-api/api-tests/v1/bonds/bond-change-cover-start-date-validation.api-test.js +++ b/portal-api/api-tests/v1/bonds/bond-change-cover-start-date-validation.api-test.js @@ -6,6 +6,7 @@ const testUserCache = require('../../api-test-users'); const { as } = require('../../api')(app); const { dateValidationText } = require('../../../src/v1/validation/fields/date'); const { formattedTimestamp } = require('../../../src/v1/facility-dates/timestamp'); +const { MAKER } = require('../../../src/v1/roles/roles'); describe('/v1/deals/:id/bond/:bondId/change-cover-start-date', () => { const newDeal = aDeal({ @@ -68,7 +69,7 @@ describe('/v1/deals/:id/bond/:bondId/change-cover-start-date', () => { beforeAll(async () => { const testUsers = await testUserCache.initialise(app); - aBarclaysMaker = testUsers().withRole('maker').withBankName('Barclays Bank').one(); + aBarclaysMaker = testUsers().withRole(MAKER).withBankName('Barclays Bank').one(); }); beforeEach(async () => { diff --git a/portal-api/api-tests/v1/bonds/bond-change-cover-start-date.api-test.js b/portal-api/api-tests/v1/bonds/bond-change-cover-start-date.api-test.js index 3b814e35a9..bacceb9787 100644 --- a/portal-api/api-tests/v1/bonds/bond-change-cover-start-date.api-test.js +++ b/portal-api/api-tests/v1/bonds/bond-change-cover-start-date.api-test.js @@ -4,6 +4,7 @@ const aDeal = require('../deals/deal-builder'); const app = require('../../../src/createApp'); const testUserCache = require('../../api-test-users'); const { as } = require('../../api')(app); +const { MAKER } = require('../../../src/v1/roles/roles'); describe('/v1/deals/:id/bond/change-cover-start-date', () => { const newDeal = aDeal({ @@ -71,8 +72,8 @@ describe('/v1/deals/:id/bond/change-cover-start-date', () => { const testUsers = await testUserCache.initialise(app); noRoles = testUsers().withoutAnyRoles().one(); - aBarclaysMaker = testUsers().withRole('maker').withBankName('Barclays Bank').one(); - anHSBCMaker = testUsers().withRole('maker').withBankName('HSBC').one(); + aBarclaysMaker = testUsers().withRole(MAKER).withBankName('Barclays Bank').one(); + anHSBCMaker = testUsers().withRole(MAKER).withBankName('HSBC').one(); aSuperuser = testUsers().superuser().one(); }); diff --git a/portal-api/api-tests/v1/bonds/bond-issue-facility-validation.api-test.js b/portal-api/api-tests/v1/bonds/bond-issue-facility-validation.api-test.js index 95bd67fadf..8b67200752 100644 --- a/portal-api/api-tests/v1/bonds/bond-issue-facility-validation.api-test.js +++ b/portal-api/api-tests/v1/bonds/bond-issue-facility-validation.api-test.js @@ -6,6 +6,7 @@ const testUserCache = require('../../api-test-users'); const { as } = require('../../api')(app); const { dateValidationText } = require('../../../src/v1/validation/fields/date'); const { formattedTimestamp } = require('../../../src/v1/facility-dates/timestamp'); +const { MAKER } = require('../../../src/v1/roles/roles'); describe('/v1/deals/:id/bond/:bondId/issue-facility', () => { const submissionDate = moment().subtract(1, 'week'); @@ -70,7 +71,7 @@ describe('/v1/deals/:id/bond/:bondId/issue-facility', () => { beforeAll(async () => { const testUsers = await testUserCache.initialise(app); - aBarclaysMaker = testUsers().withRole('maker').withBankName('Barclays Bank').one(); + aBarclaysMaker = testUsers().withRole(MAKER).withBankName('Barclays Bank').one(); }); beforeEach(async () => { diff --git a/portal-api/api-tests/v1/bonds/bond-issue-facility.api-test.js b/portal-api/api-tests/v1/bonds/bond-issue-facility.api-test.js index ede23f1bc4..ab12d2ed48 100644 --- a/portal-api/api-tests/v1/bonds/bond-issue-facility.api-test.js +++ b/portal-api/api-tests/v1/bonds/bond-issue-facility.api-test.js @@ -5,6 +5,7 @@ const app = require('../../../src/createApp'); const testUserCache = require('../../api-test-users'); const { as } = require('../../api')(app); const CONSTANTS = require('../../../src/constants'); +const { MAKER } = require('../../../src/v1/roles/roles'); describe('/v1/deals/:id/bond/:id/issue-facility', () => { const newDeal = aDeal({ @@ -83,8 +84,8 @@ describe('/v1/deals/:id/bond/:id/issue-facility', () => { beforeAll(async () => { const testUsers = await testUserCache.initialise(app); - aBarclaysMaker = testUsers().withRole('maker').withBankName('Barclays Bank').one(); - anHSBCMaker = testUsers().withRole('maker').withBankName('HSBC').one(); + aBarclaysMaker = testUsers().withRole(MAKER).withBankName('Barclays Bank').one(); + anHSBCMaker = testUsers().withRole(MAKER).withBankName('HSBC').one(); aSuperuser = testUsers().superuser().one(); }); diff --git a/portal-api/api-tests/v1/bonds/bonds-validation.api-test.js b/portal-api/api-tests/v1/bonds/bonds-validation.api-test.js index 945e4729cf..1822246e93 100644 --- a/portal-api/api-tests/v1/bonds/bonds-validation.api-test.js +++ b/portal-api/api-tests/v1/bonds/bonds-validation.api-test.js @@ -4,6 +4,7 @@ const aDeal = require('../deals/deal-builder'); const app = require('../../../src/createApp'); const testUserCache = require('../../api-test-users'); const { as } = require('../../api')(app); +const { MAKER } = require('../../../src/v1/roles/roles'); const { dateValidationText } = require('../../../src/v1/validation/fields/date'); describe('/v1/deals/:id/bond', () => { @@ -56,7 +57,7 @@ describe('/v1/deals/:id/bond', () => { beforeAll(async () => { const testUsers = await testUserCache.initialise(app); - aBarclaysMaker = testUsers().withRole('maker').withBankName('Barclays Bank').one(); + aBarclaysMaker = testUsers().withRole(MAKER).withBankName('Barclays Bank').one(); }); beforeEach(async () => { diff --git a/portal-api/api-tests/v1/bonds/bonds.api-test.js b/portal-api/api-tests/v1/bonds/bonds.api-test.js index 0987f1f087..527b82b1b6 100644 --- a/portal-api/api-tests/v1/bonds/bonds.api-test.js +++ b/portal-api/api-tests/v1/bonds/bonds.api-test.js @@ -3,7 +3,10 @@ const wipeDB = require('../../wipeDB'); const aDeal = require('../deals/deal-builder'); const app = require('../../../src/createApp'); const testUserCache = require('../../api-test-users'); -const { as } = require('../../api')(app); +const { as, get } = require('../../api')(app); +const { withClientAuthenticationTests } = require('../../common-tests/client-authentication-tests'); +const { withRoleAuthorisationTests } = require('../../common-tests/role-authorisation-tests'); +const { MAKER, READ_ONLY, ADMIN } = require('../../../src/v1/roles/roles'); const { calculateGuaranteeFee, calculateUkefExposure, @@ -67,6 +70,7 @@ describe('/v1/deals/:id/bond', () => { }; }; + let testUsers; let noRoles; let aBarclaysMaker; let anHSBCMaker; @@ -85,11 +89,11 @@ describe('/v1/deals/:id/bond', () => { }; beforeAll(async () => { - const testUsers = await testUserCache.initialise(app); + testUsers = await testUserCache.initialise(app); - noRoles = testUsers().withoutAnyRoles().one(); - aBarclaysMaker = testUsers().withRole('maker').withBankName('Barclays Bank').one(); - anHSBCMaker = testUsers().withRole('maker').withBankName('HSBC').one(); + noRoles = testUsers().withoutAnyRoles().withBankName('Barclays Bank').one(); + aBarclaysMaker = testUsers().withRole(MAKER).withBankName('Barclays Bank').one(); + anHSBCMaker = testUsers().withRole(MAKER).withBankName('HSBC').one(); aSuperuser = testUsers().superuser().one(); }); @@ -99,10 +103,31 @@ describe('/v1/deals/:id/bond', () => { }); describe('GET /v1/deals/:id/bond/:id', () => { - it('401s requests that do not present a valid Authorization token', async () => { - const { status } = await as().get('/v1/deals/620a1aa095a618b12da38c7b/bond/620a1aa095a618b12da38c7b'); + let aBarclaysBondUrl; + let dealId; + let bondId; - expect(status).toEqual(401); + beforeEach(async () => { + const { body: { _id: createdDealId } } = await as(aBarclaysMaker).post(newDeal).to('/v1/deals'); + dealId = createdDealId; + + const { body: { bondId: createdBondId } } = await as(aBarclaysMaker).put({}).to(`/v1/deals/${dealId}/bond/create`); + bondId = createdBondId; + + aBarclaysBondUrl = `/v1/deals/${dealId}/bond/${bondId}`; + }); + + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => get(aBarclaysBondUrl), + makeRequestWithAuthHeader: (authHeader) => get(aBarclaysBondUrl, { headers: { Authorization: authHeader } }) + }); + + withRoleAuthorisationTests({ + allowedRoles: [MAKER, READ_ONLY, ADMIN], + getUserWithRole: (role) => testUsers().withRole(role).withBankName('Barclays Bank').one(), + getUserWithoutAnyRoles: () => noRoles, + makeRequestAsUser: (user) => as(user).get(aBarclaysBondUrl), + successStatusCode: 200, }); it('400s requests that do not with a valid bond id param', async () => { @@ -117,17 +142,8 @@ describe('/v1/deals/:id/bond', () => { expect(status).toEqual(400); }); - it('401s requests that do not come from a user with role=maker', async () => { - const { status } = await as(noRoles).get('/v1/deals/620a1aa095a618b12da38c7b/bond/620a1aa095a618b12da38c7b'); - - expect(status).toEqual(401); - }); - it('401s requests if .bank != /bank', async () => { - const postResult = await as(anHSBCMaker).post(newDeal).to('/v1/deals'); - const dealId = postResult.body._id; - - const { status } = await as(aBarclaysMaker).get(`/v1/deals/${dealId}/bond/620a1aa095a618b12da38c7b`); + const { status } = await as(anHSBCMaker).get(aBarclaysBondUrl); expect(status).toEqual(401); }); @@ -139,34 +155,19 @@ describe('/v1/deals/:id/bond', () => { }); it('404s requests for unknown bond', async () => { - const postResult = await as(aBarclaysMaker).post(newDeal).to('/v1/deals'); - const dealId = postResult.body._id; - const { status } = await as(aBarclaysMaker).get(`/v1/deals/${dealId}/bond/620a1aa095a618b12da38c7b`); expect(status).toEqual(404); }); it('accepts requests if .bank.id == *', async () => { - const postResult = await as(aBarclaysMaker).post(newDeal).to('/v1/deals'); - const dealId = postResult.body._id; - - const createBondResponse = await as(aBarclaysMaker).put({}).to(`/v1/deals/${dealId}/bond/create`); - const { bondId } = createBondResponse.body; - - const { status } = await as(aSuperuser).get(`/v1/deals/${dealId}/bond/${bondId}`); + const { status } = await as(aSuperuser).get(aBarclaysBondUrl); expect(status).toEqual(200); }); it('returns a bond with dealId, `Incomplete` status', async () => { - const postResult = await as(aBarclaysMaker).post(newDeal).to('/v1/deals/'); - const dealId = postResult.body._id; - - const createBondResponse = await as(aBarclaysMaker).put({}).to(`/v1/deals/${dealId}/bond/create`); - const { bondId } = createBondResponse.body; - - const { status, body } = await as(aBarclaysMaker).get(`/v1/deals/${dealId}/bond/${bondId}`); + const { status, body } = await as(aBarclaysMaker).get(aBarclaysBondUrl); expect(status).toEqual(200); expect(body.bond._id).toEqual(bondId); @@ -176,9 +177,6 @@ describe('/v1/deals/:id/bond', () => { describe('when a bond has all required fields', () => { it('returns a bond with dealId and `Completed` status and requestedCoverStartDate', async () => { - const deal = await as(aBarclaysMaker).post(newDeal).to('/v1/deals/'); - const dealId = deal.body._id; - const bond = { ...allBondFields, ...requestedCoverStartDate(), @@ -188,17 +186,17 @@ describe('/v1/deals/:id/bond', () => { const createBondResponse = await as(aBarclaysMaker).put(bond).to(`/v1/deals/${dealId}/bond/create`); const { body: createBondBody } = createBondResponse; - const { bondId } = createBondBody; + const { bondId: createdBondId } = createBondBody; - const updateBondResponse = await as(aBarclaysMaker).put(bond).to(`/v1/deals/${dealId}/bond/${bondId}`); + const updateBondResponse = await as(aBarclaysMaker).put(bond).to(`/v1/deals/${dealId}/bond/${createdBondId}`); expect(updateBondResponse.status).toEqual(200); - const getBondResponse = await as(aBarclaysMaker).get(`/v1/deals/${dealId}/bond/${bondId}`); + const getBondResponse = await as(aBarclaysMaker).get(`/v1/deals/${dealId}/bond/${createdBondId}`); expect(getBondResponse.status).toEqual(200); - expect(getBondResponse.body.bond._id).toEqual(bondId); + expect(getBondResponse.body.bond._id).toEqual(createdBondId); expect(getBondResponse.body.dealId).toEqual(dealId); expect(getBondResponse.body.validationErrors.count).toEqual(0); expect(getBondResponse.body.bond.status).toEqual('Completed'); diff --git a/portal-api/api-tests/v1/countries/countries.api-test.js b/portal-api/api-tests/v1/countries/countries.api-test.js index 05c9016201..567350b65b 100644 --- a/portal-api/api-tests/v1/countries/countries.api-test.js +++ b/portal-api/api-tests/v1/countries/countries.api-test.js @@ -4,14 +4,16 @@ const app = require('../../../src/createApp'); const testUserCache = require('../../api-test-users'); +const { withClientAuthenticationTests } = require('../../common-tests/client-authentication-tests'); +const { withNoRoleAuthorisationTests } = require('../../common-tests/role-authorisation-tests'); -const { as } = require('../../api')(app); +const { as, get } = require('../../api')(app); jest.unmock('../../../src/external-api/api'); describe('/v1/countries', () => { let noRoles; - let aBarclaysMaker; + let testUsers; const gbr = { id: 826, @@ -32,26 +34,27 @@ describe('/v1/countries', () => { }; beforeAll(async () => { - const testUsers = await testUserCache.initialise(app); + testUsers = await testUserCache.initialise(app); noRoles = testUsers().withoutAnyRoles().one(); - aBarclaysMaker = testUsers().withRole('maker').withBankName('Barclays Bank').one(); }); describe('GET /v1/countries', () => { - it('rejects requests that do not present a valid Authorization token', async () => { - const { status } = await as().get('/v1/countries'); + const urlToGetCountries = '/v1/countries'; - expect(status).toEqual(401); + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => get(urlToGetCountries), + makeRequestWithAuthHeader: (authHeader) => get(urlToGetCountries, { headers: { Authorization: authHeader } }) }); - it('accepts requests that present a valid Authorization token', async () => { - const { status } = await as(noRoles).get('/v1/countries'); - - expect(status).toEqual(200); + withNoRoleAuthorisationTests({ + getUserWithRole: (role) => testUsers().withRole(role).one(), + getUserWithoutAnyRoles: () => noRoles, + makeRequestAsUser: (user) => as(user).get(urlToGetCountries), + successStatusCode: 200, }); - it('returns a list of countries, alphebetized but with GBR/United Kingdom at the top', async () => { - const { status, body } = await as(noRoles).get('/v1/countries'); + it('returns a list of countries, alphabetised but with GBR/United Kingdom at the top', async () => { + const { status, body } = await as(noRoles).get(urlToGetCountries); expect(status).toEqual(200); expect(body.countries.length).toBeGreaterThan(1); @@ -64,25 +67,33 @@ describe('/v1/countries', () => { }); describe('GET /v1/countries/:code', () => { - it('rejects requests that do not present a valid Authorization token', async () => { - const { status } = await as().get('/v1/countries/GBR'); + const urlToGetGbrCountry = '/v1/countries/GBR'; + + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => get(urlToGetGbrCountry), + makeRequestWithAuthHeader: (authHeader) => get(urlToGetGbrCountry, { headers: { Authorization: authHeader } }) + }); - expect(status).toEqual(401); + withNoRoleAuthorisationTests({ + getUserWithRole: (role) => testUsers().withRole(role).one(), + getUserWithoutAnyRoles: () => noRoles, + makeRequestAsUser: (user) => as(user).get(urlToGetGbrCountry), + successStatusCode: 200, }); - it('accepts requests that do present a valid Authorization token and returns country', async () => { + it('returns the country for "United Kingdom"', async () => { const { status, body } = await as(noRoles).get('/v1/countries/GBR'); expect(status).toEqual(200); expect(body).toEqual(gbr); }); - it('accepts requests for "Abu Dhabi" returns country', async () => { + it('returns the country for "Abu Dhabi"', async () => { const { status, body } = await as(noRoles).get('/v1/countries/XAD'); expect(status).toEqual(200); expect(body).toEqual(abuDhabi); }); - it('accepts requests for "Dubai" returns country', async () => { + it('returns the country for "Dubai"', async () => { const { status, body } = await as(noRoles).get('/v1/countries/XDB'); expect(status).toEqual(200); expect(body).toEqual(dubai); @@ -95,7 +106,7 @@ describe('/v1/countries', () => { }); it('returns 400 when country id is invalid', async () => { - const { status } = await as(aBarclaysMaker).get('/v1/countries/A12'); + const { status } = await as(noRoles).get('/v1/countries/A12'); expect(status).toEqual(400); }); diff --git a/portal-api/api-tests/v1/currencies/currencies.api-test.js b/portal-api/api-tests/v1/currencies/currencies.api-test.js index ecbd3fe923..caf4c8d857 100644 --- a/portal-api/api-tests/v1/currencies/currencies.api-test.js +++ b/portal-api/api-tests/v1/currencies/currencies.api-test.js @@ -4,8 +4,10 @@ const app = require('../../../src/createApp'); const testUserCache = require('../../api-test-users'); +const { withClientAuthenticationTests } = require('../../common-tests/client-authentication-tests'); +const { withNoRoleAuthorisationTests } = require('../../common-tests/role-authorisation-tests'); -const { as } = require('../../api')(app); +const { as, get } = require('../../api')(app); jest.unmock('../../../src/external-api/api'); @@ -16,28 +18,31 @@ const usd = { }; describe('/v1/currencies', () => { - let aNonEditor; + let aUser; + let testUsers; beforeAll(async () => { - const testUsers = await testUserCache.initialise(app); - aNonEditor = testUsers().withoutRole('editor').one(); + testUsers = await testUserCache.initialise(app); + aUser = testUsers().one(); }); describe('GET /v1/currencies', () => { - it('rejects requests that do not present a valid Authorization token', async () => { - const { status } = await as().get('/v1/currencies'); + const urlToGetCurrencies = '/v1/currencies'; - expect(status).toEqual(401); + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => get(urlToGetCurrencies), + makeRequestWithAuthHeader: (authHeader) => get(urlToGetCurrencies, { headers: { Authorization: authHeader } }) }); - it('accepts requests that present a valid Authorization token', async () => { - const { status } = await as(aNonEditor).get('/v1/currencies'); - - expect(status).toEqual(200); + withNoRoleAuthorisationTests({ + getUserWithRole: (role) => testUsers().withRole(role).one(), + getUserWithoutAnyRoles: () => testUsers().withoutAnyRoles().one(), + makeRequestAsUser: (user) => as(user).get(urlToGetCurrencies), + successStatusCode: 200, }); - it('returns a list of currencies, alphebetized', async () => { - const { status, body } = await as(aNonEditor).get('/v1/currencies', aNonEditor.token); + it('returns a list of currencies, alphabetised', async () => { + const { status, body } = await as(aUser).get(urlToGetCurrencies); expect(status).toEqual(200); expect(body.currencies.length).toBeGreaterThan(1); @@ -48,33 +53,35 @@ describe('/v1/currencies', () => { }); describe('GET /v1/currencies/:id', () => { - it('rejects requests that do not present a valid Authorization token', async () => { - const { status } = await as().get('/v1/currencies/USD'); + const urlToGetUsdCurrency = '/v1/currencies/USD'; - expect(status).toEqual(401); + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => get(urlToGetUsdCurrency), + makeRequestWithAuthHeader: (authHeader) => get(urlToGetUsdCurrency, { headers: { Authorization: authHeader } }) }); - it('accepts requests that do present a valid Authorization token', async () => { - const { status } = await as(aNonEditor).get('/v1/currencies/USD'); - - expect(status).toEqual(200); + withNoRoleAuthorisationTests({ + getUserWithRole: (role) => testUsers().withRole(role).one(), + getUserWithoutAnyRoles: () => testUsers().withoutAnyRoles().one(), + makeRequestAsUser: (user) => as(user).get(urlToGetUsdCurrency), + successStatusCode: 200, }); it('returns a currency', async () => { - const { status, body } = await as(aNonEditor).get('/v1/currencies/USD'); + const { status, body } = await as(aUser).get(urlToGetUsdCurrency); expect(status).toEqual(200); expect(body).toMatchObject(usd); }); it('returns 400 when currency doesn\'t exist', async () => { - const { status } = await as(aNonEditor).get('/v1/currencies/AAA'); + const { status } = await as(aUser).get('/v1/currencies/AAA'); expect(status).toEqual(400); }); it('returns 400 when currency is invalid', async () => { - const { status } = await as(aNonEditor).get('/v1/currencies/AB1'); + const { status } = await as(aUser).get('/v1/currencies/AB1'); expect(status).toEqual(400); }); diff --git a/portal-api/api-tests/v1/deals/deal-clone.api-test.js b/portal-api/api-tests/v1/deals/deal-clone.api-test.js index 41e871b08a..91ef7aca49 100644 --- a/portal-api/api-tests/v1/deals/deal-clone.api-test.js +++ b/portal-api/api-tests/v1/deals/deal-clone.api-test.js @@ -5,6 +5,7 @@ const completedDeal = require('../../fixtures/deal-fully-completed'); const { as } = require('../../api')(app); const createFacilities = require('../../createFacilities'); const { createDealEligibility } = require('../../../src/v1/controllers/deal.controller'); +const { MAKER } = require('../../../src/v1/roles/roles'); const dealToClone = completedDeal; @@ -51,8 +52,8 @@ describe('/v1/deals/:id/clone', () => { beforeAll(async () => { const testUsers = await testUserCache.initialise(app); noRoles = testUsers().withoutAnyRoles().one(); - aBarclaysMaker = testUsers().withRole('maker').withBankName('Barclays Bank').one(); - anHSBCMaker = testUsers().withRole('maker').withBankName('HSBC').one(); + aBarclaysMaker = testUsers().withRole(MAKER).withBankName('Barclays Bank').one(); + anHSBCMaker = testUsers().withRole(MAKER).withBankName('HSBC').one(); }); beforeEach(async () => { diff --git a/portal-api/api-tests/v1/deals/deal-comments.api-test.js b/portal-api/api-tests/v1/deals/deal-comments.api-test.js index a78a1cbc96..e86d90e20c 100644 --- a/portal-api/api-tests/v1/deals/deal-comments.api-test.js +++ b/portal-api/api-tests/v1/deals/deal-comments.api-test.js @@ -7,6 +7,7 @@ const completedDeal = require('../../fixtures/deal-fully-completed'); const { as } = require('../../api')(app); const dealCommentsController = require('../../../src/v1/controllers/deal-comments.controller'); +const { MAKER } = require('../../../src/v1/roles/roles'); describe('deal comments controller', () => { let aBarclaysMaker; @@ -17,7 +18,7 @@ describe('deal comments controller', () => { beforeAll(async () => { const testUsers = await testUserCache.initialise(app); - const barclaysMakers = testUsers().withRole('maker').withBankName('Barclays Bank').all(); + const barclaysMakers = testUsers().withRole(MAKER).withBankName('Barclays Bank').all(); [aBarclaysMaker] = barclaysMakers; }); diff --git a/portal-api/api-tests/v1/deals/deal-eligibility-criteria.api-test.js b/portal-api/api-tests/v1/deals/deal-eligibility-criteria.api-test.js index d27de6e216..c4ecd7fbaf 100644 --- a/portal-api/api-tests/v1/deals/deal-eligibility-criteria.api-test.js +++ b/portal-api/api-tests/v1/deals/deal-eligibility-criteria.api-test.js @@ -15,6 +15,7 @@ const { criteria11ExtraInfo, criteria11ExtraInfoEmpty, } = require('./mocks'); +const { MAKER } = require('../../../src/v1/roles/roles'); const newDeal = aDeal({ additionalRefName: 'Original Value' }); @@ -27,8 +28,8 @@ describe('/v1/deals/:id/eligibility-criteria', () => { beforeAll(async () => { const testUsers = await testUserCache.initialise(app); noRoles = testUsers().withoutAnyRoles().one(); - aBarclaysMaker = testUsers().withRole('maker').withBankName('Barclays Bank').one(); - anHSBCMaker = testUsers().withRole('maker').withBankName('HSBC').one(); + aBarclaysMaker = testUsers().withRole(MAKER).withBankName('Barclays Bank').one(); + anHSBCMaker = testUsers().withRole(MAKER).withBankName('HSBC').one(); aSuperuser = testUsers().superuser().one(); }); diff --git a/portal-api/api-tests/v1/deals/deal-eligibility-documentation.api-test.js b/portal-api/api-tests/v1/deals/deal-eligibility-documentation.api-test.js index 3bc9f9c98e..c4a6137d0b 100644 --- a/portal-api/api-tests/v1/deals/deal-eligibility-documentation.api-test.js +++ b/portal-api/api-tests/v1/deals/deal-eligibility-documentation.api-test.js @@ -2,10 +2,13 @@ const wipeDB = require('../../wipeDB'); const aDeal = require('./deal-builder'); const app = require('../../../src/createApp'); +const { withClientAuthenticationTests } = require('../../common-tests/client-authentication-tests'); +const { withRoleAuthorisationTests } = require('../../common-tests/role-authorisation-tests'); +const { MAKER, CHECKER, READ_ONLY, ADMIN, EDITOR } = require('../../../src/v1/roles/roles'); const testUserCache = require('../../api-test-users'); const eligibilityCriteriaCache = require('../../api-test-eligibilityCriteria'); -const { as } = require('../../api')(app); +const { as, get } = require('../../api')(app); const { updatedECCompleted, } = require('./mocks'); @@ -17,13 +20,14 @@ describe('/v1/deals/:id/eligibility-documentation', () => { let aBarclaysMaker; let anHSBCMaker; let anEditor; + let testUsers; beforeAll(async () => { - const testUsers = await testUserCache.initialise(app); - noRoles = testUsers().withoutAnyRoles().one(); - aBarclaysMaker = testUsers().withRole('maker').withBankName('Barclays Bank').one(); - anHSBCMaker = testUsers().withRole('maker').withBankName('HSBC').one(); - anEditor = testUsers().withRole('editor').one(); + testUsers = await testUserCache.initialise(app); + noRoles = testUsers().withoutAnyRoles().withBankName('Barclays Bank').one(); + aBarclaysMaker = testUsers().withRole(MAKER).withBankName('Barclays Bank').one(); + anHSBCMaker = testUsers().withRole(MAKER).withBankName('HSBC').one(); + anEditor = testUsers().withRole(EDITOR).one(); await eligibilityCriteriaCache.initialise(app, anEditor); }); @@ -33,6 +37,86 @@ describe('/v1/deals/:id/eligibility-documentation', () => { await wipeDB.wipe(['facilities']); }); + describe('GET /v1/deals/:id/eligibility-documentation/:fieldname/:filename', () => { + const filename = 'test-file-1.txt'; + const fieldname = 'exporterQuestionnaire'; + const type = 'general_correspondence'; + + const files = [{ + fieldname, + filepath: `api-tests/fixtures/${filename}`, + type, + }]; + + let dealId; + let aBarclaysEligibilityDocumentationFileUrl; + + beforeEach(async () => { + const { body: { _id: createdDealId } } = await as(aBarclaysMaker).post(newDeal).to('/v1/deals'); + dealId = createdDealId; + + await as(aBarclaysMaker).putMultipartForm({}, files).to(`/v1/deals/${dealId}/eligibility-documentation`); + + aBarclaysEligibilityDocumentationFileUrl = `/v1/deals/${dealId}/eligibility-documentation/${fieldname}/${filename.replaceAll(/-/g, '_')}`; + }); + + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => get(aBarclaysEligibilityDocumentationFileUrl), + makeRequestWithAuthHeader: (authHeader) => get(aBarclaysEligibilityDocumentationFileUrl, { headers: { Authorization: authHeader } }) + }); + + withRoleAuthorisationTests({ + allowedRoles: [MAKER, CHECKER, READ_ONLY, ADMIN], + getUserWithRole: (role) => testUsers().withRole(role).withBankName('Barclays Bank').one(), + getUserWithoutAnyRoles: () => noRoles, + makeRequestAsUser: (user) => as(user).get(aBarclaysEligibilityDocumentationFileUrl), + successStatusCode: 200, + }); + + it('downloads an uploaded file', async () => { + const { status, text, header } = await as(aBarclaysMaker).get(aBarclaysEligibilityDocumentationFileUrl); + + expect(status).toEqual(200); + expect(header['content-disposition']).toEqual(`attachment; filename=${filename.replaceAll(/-/g, '_')}`); + expect(text).toEqual('mockFile'); + }); + + it('does not allow download of file from a different user organisation', async () => { + const { status, text, header } = await as(anHSBCMaker).get(aBarclaysEligibilityDocumentationFileUrl); + + expect(status).toEqual(401); + expect(header['content-disposition']).toBeUndefined(); + expect(text).toEqual(''); + }); + + it('returns 404 if deal doesn\'t exist', async () => { + const { status, text, header } = await as(aBarclaysMaker).get(`/v1/deals/620a1aa095a618b12da38c7b/eligibility-documentation/${fieldname}/${filename}`); + + expect(status).toEqual(404); + expect(header['content-disposition']).toBeUndefined(); + expect(text).toEqual(''); + }); + + it('returns 404 if no deal files have been uploaded', async () => { + const postResult = await as(aBarclaysMaker).post(newDeal).to('/v1/deals'); + const newId = postResult.body._id; + + const { status, text, header } = await as(aBarclaysMaker).get(`/v1/deals/${newId}/eligibility-documentation/${fieldname}/${filename}`); + + expect(status).toEqual(404); + expect(header['content-disposition']).toBeUndefined(); + expect(text).toEqual(''); + }); + + it('returns 404 is requested file doesn\'t exist', async () => { + const { status, text, header } = await as(aBarclaysMaker).get(`/v1/deals/${dealId}/eligibility-documentation/${fieldname}/non-exisitant-file.txt`); + + expect(status).toEqual(404); + expect(header['content-disposition']).toBeUndefined(); + expect(text).toEqual(''); + }); + }); + describe('PUT /v1/deals/:id/eligibility-documentation', () => { it('401s requests that do not present a valid Authorization token', async () => { const postResult = await as(aBarclaysMaker).post(newDeal).to('/v1/deals'); @@ -288,108 +372,6 @@ describe('/v1/deals/:id/eligibility-documentation', () => { expect(body.supportingInformation[fieldname].length).toEqual(1); }); - it('downloads an uploaded file', async () => { - const postResult = await as(aBarclaysMaker).post(newDeal).to('/v1/deals'); - const newId = postResult.body._id; - - const filename = 'test-file-1.txt'; - const fieldname = 'exporterQuestionnaire'; - const type = 'general_correspondence'; - - const files = [{ - fieldname, - filepath: `api-tests/fixtures/${filename}`, - type, - }]; - - await as(aBarclaysMaker).putMultipartForm({}, files).to(`/v1/deals/${newId}/eligibility-documentation`); - const { status, text, header } = await as(aBarclaysMaker).get(`/v1/deals/${newId}/eligibility-documentation/${fieldname}/${filename.replaceAll(/-/g, '_')}`); - - expect(status).toEqual(200); - expect(header['content-disposition']).toEqual(`attachment; filename=${filename.replaceAll(/-/g, '_')}`); - expect(text).toEqual('mockFile'); - }); - - it('does not allow download of file from a different user organisation', async () => { - const postResult = await as(aBarclaysMaker).post(newDeal).to('/v1/deals'); - const newId = postResult.body._id; - - const filename = 'test-file-1.txt'; - const fieldname = 'exporterQuestionnaire'; - const type = 'general_correspondence'; - - const files = [{ - fieldname, - filepath: `api-tests/fixtures/${filename}`, - type, - }]; - - await as(aBarclaysMaker).putMultipartForm({}, files).to(`/v1/deals/${newId}/eligibility-documentation`); - const { status, text, header } = await as(anHSBCMaker).get(`/v1/deals/${newId}/eligibility-documentation/${fieldname}/${filename}`); - - expect(status).toEqual(401); - expect(header['content-disposition']).toBeUndefined(); - expect(text).toEqual(''); - }); - - it('returns 404 if deal doesn\'t exist', async () => { - const postResult = await as(aBarclaysMaker).post(newDeal).to('/v1/deals'); - const newId = postResult.body._id; - - const filename = 'test-file-1.txt'; - const fieldname = 'exporterQuestionnaire'; - const type = 'general_correspondence'; - - const files = [{ - fieldname, - filepath: `api-tests/fixtures/${filename}`, - type, - }]; - - await as(aBarclaysMaker).putMultipartForm({}, files).to(`/v1/deals/${newId}/eligibility-documentation`); - const { status, text, header } = await as(aBarclaysMaker).get(`/v1/deals/620a1aa095a618b12da38c7b/eligibility-documentation/${fieldname}/${filename}`); - - expect(status).toEqual(404); - expect(header['content-disposition']).toBeUndefined(); - expect(text).toEqual(''); - }); - - it('returns 404 if no deal files have been uploaded', async () => { - const postResult = await as(aBarclaysMaker).post(newDeal).to('/v1/deals'); - const newId = postResult.body._id; - - const filename = 'test-file-1.txt'; - const fieldname = 'exporterQuestionnaire'; - - const { status, text, header } = await as(aBarclaysMaker).get(`/v1/deals/${newId}/eligibility-documentation/${fieldname}/${filename}`); - - expect(status).toEqual(404); - expect(header['content-disposition']).toBeUndefined(); - expect(text).toEqual(''); - }); - - it('returns 404 is requested file doesn\'t exist', async () => { - const postResult = await as(aBarclaysMaker).post(newDeal).to('/v1/deals'); - const newId = postResult.body._id; - - const filename = 'test-file-1.txt'; - const fieldname = 'exporterQuestionnaire'; - const type = 'general_correspondence'; - - const files = [{ - fieldname, - filepath: `api-tests/fixtures/${filename}`, - type, - }]; - - await as(aBarclaysMaker).putMultipartForm({}, files).to(`/v1/deals/${newId}/eligibility-documentation`); - const { status, text, header } = await as(aBarclaysMaker).get(`/v1/deals/${newId}/eligibility-documentation/${fieldname}/non-exisitant-file.txt`); - - expect(status).toEqual(404); - expect(header['content-disposition']).toBeUndefined(); - expect(text).toEqual(''); - }); - it('deletes an uploaded file', async () => { const postResult = await as(aBarclaysMaker).post(newDeal).to('/v1/deals'); const newId = postResult.body._id; diff --git a/portal-api/api-tests/v1/deals/deal-name.api-test.js b/portal-api/api-tests/v1/deals/deal-name.api-test.js index 929db8bbe6..2529236512 100644 --- a/portal-api/api-tests/v1/deals/deal-name.api-test.js +++ b/portal-api/api-tests/v1/deals/deal-name.api-test.js @@ -5,6 +5,7 @@ const app = require('../../../src/createApp'); const testUserCache = require('../../api-test-users'); const { as } = require('../../api')(app); +const { MAKER } = require('../../../src/v1/roles/roles'); const newDeal = aDeal({ updatedAt: Date.now(), @@ -30,7 +31,7 @@ describe('/v1/deals/:id/additionalRefName', () => { beforeAll(async () => { const testUsers = await testUserCache.initialise(app); noRoles = testUsers().withoutAnyRoles().one(); - const barclaysMakers = testUsers().withRole('maker').withBankName('Barclays Bank').all(); + const barclaysMakers = testUsers().withRole(MAKER).withBankName('Barclays Bank').all(); [aBarclaysMaker, anotherBarclaysMaker] = barclaysMakers; }); diff --git a/portal-api/api-tests/v1/deals/deal-status-accepted.api-test.js b/portal-api/api-tests/v1/deals/deal-status-accepted.api-test.js index d93d4b2e1c..38c6d171e3 100644 --- a/portal-api/api-tests/v1/deals/deal-status-accepted.api-test.js +++ b/portal-api/api-tests/v1/deals/deal-status-accepted.api-test.js @@ -6,6 +6,7 @@ const testUserCache = require('../../api-test-users'); const completedDeal = require('../../fixtures/deal-fully-completed-issued-and-unissued-facilities'); const { as } = require('../../api')(app); +const { MAKER, CHECKER } = require('../../../src/v1/roles/roles'); describe('PUT /v1/deals/:id/status - to `Accepted by UKEF`', () => { let aBarclaysMaker; @@ -16,9 +17,9 @@ describe('PUT /v1/deals/:id/status - to `Accepted by UKEF`', () => { await wipeDB.wipe(['deals']); await wipeDB.wipe(['facilities']); const testUsers = await testUserCache.initialise(app); - const barclaysMakers = testUsers().withRole('maker').withBankName('Barclays Bank').all(); + const barclaysMakers = testUsers().withRole(MAKER).withBankName('Barclays Bank').all(); [aBarclaysMaker] = barclaysMakers; - aBarclaysChecker = testUsers().withRole('checker').withBankName('Barclays Bank').one(); + aBarclaysChecker = testUsers().withRole(CHECKER).withBankName('Barclays Bank').one(); aSuperuser = testUsers().superuser().one(); }); diff --git a/portal-api/api-tests/v1/deals/deal-validation.api-test.js b/portal-api/api-tests/v1/deals/deal-validation.api-test.js index 6ea907285b..c26cdc4e42 100644 --- a/portal-api/api-tests/v1/deals/deal-validation.api-test.js +++ b/portal-api/api-tests/v1/deals/deal-validation.api-test.js @@ -2,13 +2,14 @@ const wipeDB = require('../../wipeDB'); const app = require('../../../src/createApp'); const testUserCache = require('../../api-test-users'); const { as } = require('../../api')(app); +const { MAKER } = require('../../../src/v1/roles/roles'); describe('/v1/deals', () => { let aBarclaysMaker; beforeAll(async () => { const testUsers = await testUserCache.initialise(app); - aBarclaysMaker = testUsers().withRole('maker').withBankName('Barclays Bank').one(); + aBarclaysMaker = testUsers().withRole(MAKER).withBankName('Barclays Bank').one(); }); beforeEach(async () => { diff --git a/portal-api/api-tests/v1/deals/deals-status-accepted-facilities-cover-start-date.api-test.js b/portal-api/api-tests/v1/deals/deals-status-accepted-facilities-cover-start-date.api-test.js index 963c0cc28f..78cfeeb113 100644 --- a/portal-api/api-tests/v1/deals/deals-status-accepted-facilities-cover-start-date.api-test.js +++ b/portal-api/api-tests/v1/deals/deals-status-accepted-facilities-cover-start-date.api-test.js @@ -7,6 +7,7 @@ const completedDeal = require('../../fixtures/deal-fully-completed-issued-and-un const { as } = require('../../api')(app); const createFacilities = require('../../createFacilities'); +const { MAKER, CHECKER } = require('../../../src/v1/roles/roles'); describe('PUT /v1/deals/:id/status - from `Accepted by UKEF` - facility cover start dates', () => { let aBarclaysMaker; @@ -27,9 +28,9 @@ describe('PUT /v1/deals/:id/status - from `Accepted by UKEF` - facility cover st await wipeDB.wipe(['deals']); await wipeDB.wipe(['facilities']); const testUsers = await testUserCache.initialise(app); - const barclaysMakers = testUsers().withRole('maker').withBankName('Barclays Bank').all(); + const barclaysMakers = testUsers().withRole(MAKER).withBankName('Barclays Bank').all(); [aBarclaysMaker] = barclaysMakers; - aBarclaysChecker = testUsers().withRole('checker').withBankName('Barclays Bank').one(); + aBarclaysChecker = testUsers().withRole(CHECKER).withBankName('Barclays Bank').one(); aSuperuser = testUsers().superuser().one(); }); diff --git a/portal-api/api-tests/v1/deals/deals-status-facilities.api-test.js b/portal-api/api-tests/v1/deals/deals-status-facilities.api-test.js index c64e7a3077..fcc40094e5 100644 --- a/portal-api/api-tests/v1/deals/deals-status-facilities.api-test.js +++ b/portal-api/api-tests/v1/deals/deals-status-facilities.api-test.js @@ -7,6 +7,7 @@ const { as } = require('../../api')(app); const createFacilities = require('../../createFacilities'); const api = require('../../../src/v1/api'); const CONSTANTS = require('../../../src/constants'); +const { MAKER, CHECKER } = require('../../../src/v1/roles/roles'); describe('/v1/deals/:id/status - facilities', () => { let aBarclaysMaker; @@ -30,9 +31,9 @@ describe('/v1/deals/:id/status - facilities', () => { await wipeDB.wipe(['facilities']); const testUsers = await testUserCache.initialise(app); - const barclaysMakers = testUsers().withRole('maker').withBankName('Barclays Bank').all(); + const barclaysMakers = testUsers().withRole(MAKER).withBankName('Barclays Bank').all(); [aBarclaysMaker] = barclaysMakers; - aBarclaysChecker = testUsers().withRole('checker').withBankName('Barclays Bank').one(); + aBarclaysChecker = testUsers().withRole(CHECKER).withBankName('Barclays Bank').one(); aSuperuser = testUsers().superuser().one(); }); @@ -76,7 +77,7 @@ describe('/v1/deals/:id/status - facilities', () => { updatedDeal = deal; }); - describe('any issued bonds orloans that have details provided, but not yet been submitted', () => { + describe('any issued bonds or loans that have details provided, but not yet been submitted', () => { it('should add `Ready for check` status', async () => { expect(updatedDeal.status).toEqual(200); expect(updatedDeal.body).toBeDefined(); diff --git a/portal-api/api-tests/v1/deals/deals-status-submitted-updates-unsubmitted-issued-facilities.api-test.js b/portal-api/api-tests/v1/deals/deals-status-submitted-updates-unsubmitted-issued-facilities.api-test.js index 232ca3e45c..5008465449 100644 --- a/portal-api/api-tests/v1/deals/deals-status-submitted-updates-unsubmitted-issued-facilities.api-test.js +++ b/portal-api/api-tests/v1/deals/deals-status-submitted-updates-unsubmitted-issued-facilities.api-test.js @@ -8,6 +8,7 @@ const { as } = require('../../api')(app); const createFacilities = require('../../createFacilities'); const api = require('../../../src/v1/api'); const externalApis = require('../../../src/external-api/api'); +const { MAKER, CHECKER } = require('../../../src/v1/roles/roles'); describe('PUT /v1/deals/:id/status - to `Submitted` - issued/unconditional facility submission details', () => { let aBarclaysMaker; @@ -17,9 +18,9 @@ describe('PUT /v1/deals/:id/status - to `Submitted` - issued/unconditional facil beforeAll(async () => { const testUsers = await testUserCache.initialise(app); - const barclaysMakers = testUsers().withRole('maker').withBankName('Barclays Bank').all(); + const barclaysMakers = testUsers().withRole(MAKER).withBankName('Barclays Bank').all(); [aBarclaysMaker] = barclaysMakers; - aBarclaysChecker = testUsers().withRole('checker').withBankName('Barclays Bank').one(); + aBarclaysChecker = testUsers().withRole(CHECKER).withBankName('Barclays Bank').one(); aSuperuser = testUsers().superuser().one(); }); diff --git a/portal-api/api-tests/v1/deals/deals-status-submitted.api-test.js b/portal-api/api-tests/v1/deals/deals-status-submitted.api-test.js index 95b68534bd..dca2745c0b 100644 --- a/portal-api/api-tests/v1/deals/deals-status-submitted.api-test.js +++ b/portal-api/api-tests/v1/deals/deals-status-submitted.api-test.js @@ -7,6 +7,7 @@ const completedDeal = require('../../fixtures/deal-fully-completed'); const createFacilities = require('../../createFacilities'); const api = require('../../../src/v1/api'); const externalApis = require('../../../src/external-api/api'); +const { MAKER, CHECKER } = require('../../../src/v1/roles/roles'); const { as } = require('../../api')(app); @@ -22,9 +23,9 @@ describe('PUT /v1/deals/:id/status - status changes to `Submitted`', () => { beforeAll(async () => { const testUsers = await testUserCache.initialise(app); - const barclaysMakers = testUsers().withRole('maker').withBankName('Barclays Bank').all(); + const barclaysMakers = testUsers().withRole(MAKER).withBankName('Barclays Bank').all(); [aBarclaysMaker] = barclaysMakers; - aBarclaysChecker = testUsers().withRole('checker').withBankName('Barclays Bank').one(); + aBarclaysChecker = testUsers().withRole(CHECKER).withBankName('Barclays Bank').one(); aSuperuser = testUsers().superuser().one(); }); @@ -294,14 +295,14 @@ describe('PUT /v1/deals/:id/status - status changes to `Submitted`', () => { const dealId = postResult.body._id; - const mockFacilites = [ + const mockFacilities = [ { ...completedDeal.mockFacilities[0], requestedCoverStartDate: moment().utc().valueOf(), }, ]; - await createFacilities(aBarclaysMaker, dealId, mockFacilites); + await createFacilities(aBarclaysMaker, dealId, mockFacilities); const statusUpdate = { status: 'Submitted', diff --git a/portal-api/api-tests/v1/deals/deals-status.api-test.js b/portal-api/api-tests/v1/deals/deals-status.api-test.js index 5b1d4ddb14..b7c6125f2a 100644 --- a/portal-api/api-tests/v1/deals/deals-status.api-test.js +++ b/portal-api/api-tests/v1/deals/deals-status.api-test.js @@ -1,4 +1,6 @@ const wipeDB = require('../../wipeDB'); +const { withClientAuthenticationTests } = require('../../common-tests/client-authentication-tests'); +const { withRoleAuthorisationTests } = require('../../common-tests/role-authorisation-tests'); const app = require('../../../src/createApp'); const testUserCache = require('../../api-test-users'); @@ -6,66 +8,64 @@ const completedDeal = require('../../fixtures/deal-fully-completed'); const sendStatusUpdateEmails = require('../../../src/v1/controllers/deal-status/send-status-update-emails'); const createFacilities = require('../../createFacilities'); const api = require('../../../src/v1/api'); +const { MAKER, CHECKER, READ_ONLY, ADMIN } = require('../../../src/v1/roles/roles'); -const { as } = require('../../api')(app); +const { as, get, put } = require('../../api')(app); jest.mock('../../../src/v1/controllers/deal-status/send-status-update-emails'); describe('/v1/deals/:id/status', () => { + const dealStatusUrl = (dealId) => `/v1/deals/${dealId}/status`; + const dealStatusUrlForUnknownDealId = dealStatusUrl('620a1aa095a618b12da38c7b'); + let noRoles; let aBarclaysMaker; let anHSBCMaker; let aBarclaysChecker; let aBarclaysMakerChecker; let aSuperuser; + let testUsers; beforeAll(async () => { - const testUsers = await testUserCache.initialise(app); + testUsers = await testUserCache.initialise(app); noRoles = testUsers().withoutAnyRoles().one(); - const barclaysMakers = testUsers().withRole('maker').withBankName('Barclays Bank').all(); + const barclaysMakers = testUsers().withRole(MAKER).withBankName('Barclays Bank').all(); [aBarclaysMaker] = barclaysMakers; - anHSBCMaker = testUsers().withRole('maker').withBankName('HSBC').one(); - aBarclaysChecker = testUsers().withRole('checker').withBankName('Barclays Bank').one(); + anHSBCMaker = testUsers().withRole(MAKER).withBankName('HSBC').one(); + aBarclaysChecker = testUsers().withRole(CHECKER).withBankName('Barclays Bank').one(); - const barclaysMakerChecker = testUsers().withMultipleRoles('maker', 'checker').withBankName('Barclays Bank').one(); + const barclaysMakerChecker = testUsers().withMultipleRoles(MAKER, CHECKER).withBankName('Barclays Bank').one(); aBarclaysMakerChecker = barclaysMakerChecker; aSuperuser = testUsers().superuser().one(); }); - beforeEach(async () => { - await wipeDB.wipe(['deals']); - await wipeDB.wipe(['facilities']); - - api.tfmDealSubmit = () => Promise.resolve(); - }); - describe('GET /v1/deals/:id/status', () => { - it('401s requests that do not present a valid Authorization token', async () => { - const { status } = await as().get('/v1/deals/620a1aa095a618b12da38c7b/status'); + let dealId; + let urlToGetDealStatus; - expect(status).toEqual(401); + beforeAll(async () => { + const { body: { _id: createdDealId } } = await as(aBarclaysMaker).post(completedDeal).to('/v1/deals'); + dealId = createdDealId; + urlToGetDealStatus = dealStatusUrl(dealId); }); - it('401s requests that do not come from a user with role=maker || role=checker', async () => { - const { status } = await as(noRoles).get('/v1/deals/620a1aa095a618b12da38c7b/status'); - - expect(status).toEqual(401); + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => get(urlToGetDealStatus), + makeRequestWithAuthHeader: (authHeader) => get(urlToGetDealStatus, { headers: { Authorization: authHeader } }) }); - it('accepts requests from a user with role=maker', async () => { - const { body } = await as(anHSBCMaker).post(completedDeal).to('/v1/deals'); - - const { status } = await as(anHSBCMaker).get(`/v1/deals/${body._id}/status`); - - expect(status).toEqual(200); + withRoleAuthorisationTests({ + allowedRoles: [MAKER, CHECKER, READ_ONLY, ADMIN], + getUserWithRole: (role) => testUsers().withRole(role).withBankName('Barclays Bank').one(), + getUserWithoutAnyRoles: () => testUsers().withoutAnyRoles().withBankName('Barclays Bank').one(), + makeRequestAsUser: (user) => as(user).get(urlToGetDealStatus), + successStatusCode: 200, }); - it('accepts requests from a user with role=checker', async () => { - const { body } = await as(aBarclaysMaker).post(completedDeal).to('/v1/deals'); - - const { status } = await as(aBarclaysChecker).get(`/v1/deals/${body._id}/status`); + it('404s requests for unknown ids', async () => { + const { status } = await as(aBarclaysMaker).get(dealStatusUrlForUnknownDealId); - expect(status).toEqual(200); + expect(status).toEqual(404); }); it('401s requests if .bank != /bank', async () => { @@ -76,25 +76,14 @@ describe('/v1/deals/:id/status', () => { expect(status).toEqual(401); }); - it('404s requests for unkonwn ids', async () => { - const { status } = await as(aBarclaysMaker).get('/v1/deals/620a1aa095a618b12da38c7b/status'); - - expect(status).toEqual(404); - }); - it('accepts requests if .bank.id == *', async () => { - const { body } = await as(anHSBCMaker).post(completedDeal).to('/v1/deals'); - - const { status } = await as(aSuperuser).get(`/v1/deals/${body._id}/status`); + const { status } = await as(aSuperuser).get(urlToGetDealStatus); expect(status).toEqual(200); }); it('returns the requested resource', async () => { - const postResult = await as(anHSBCMaker).post(completedDeal).to('/v1/deals'); - const newId = postResult.body._id; - - const { status, text } = await as(anHSBCMaker).get(`/v1/deals/${newId}/status`); + const { status, text } = await as(aBarclaysMaker).get(urlToGetDealStatus); expect(status).toEqual(200); expect(text).toEqual("Ready for Checker's approval"); @@ -102,14 +91,37 @@ describe('/v1/deals/:id/status', () => { }); describe('PUT /v1/deals/:id/status', () => { - it('401s requests that do not present a valid Authorization token', async () => { - const { status } = await as().put(completedDeal).to('/v1/deals/620a1aa095a618b12da38c7b/status'); + let dealId; + let urlForDealStatus; + let urlForDeal; - expect(status).toEqual(401); + beforeEach(async () => { + await wipeDB.wipe(['deals']); + await wipeDB.wipe(['facilities']); + + api.tfmDealSubmit = () => Promise.resolve(); + + const { body: { _id: createdDealId } } = await as(aBarclaysMaker).post(completedDeal).to('/v1/deals'); + dealId = createdDealId; + urlForDealStatus = dealStatusUrl(dealId); + urlForDeal = `/v1/deals/${dealId}`; + }); + + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => put(urlForDealStatus, completedDeal), + makeRequestWithAuthHeader: (authHeader) => put(urlForDealStatus, completedDeal, { headers: { Authorization: authHeader } }), + }); + + withRoleAuthorisationTests({ + allowedRoles: [MAKER, CHECKER], + getUserWithRole: (role) => testUsers().withRole(role).withBankName('Barclays Bank').one(), + getUserWithoutAnyRoles: () => testUsers().withoutAnyRoles().withBankName('Barclays Bank').one(), + makeRequestAsUser: (user) => as(user).put(completedDeal).to(urlForDealStatus), + successStatusCode: 200, }); it('401s requests that do not come from a user with role=maker', async () => { - const { status } = await as(noRoles).put(completedDeal).to('/v1/deals/620a1aa095a618b12da38c7b/status'); + const { status } = await as(noRoles).put(completedDeal).to(dealStatusUrlForUnknownDealId); expect(status).toEqual(401); }); @@ -128,46 +140,40 @@ describe('/v1/deals/:id/status', () => { }); it('returns the updated status', async () => { - const postResult = await as(anHSBCMaker).post(completedDeal).to('/v1/deals'); - const createdDeal = postResult.body; const statusUpdate = { comments: 'Flee!', status: 'Abandoned', }; - const { status, body } = await as(anHSBCMaker).put(statusUpdate).to(`/v1/deals/${createdDeal._id}/status`); + const { status, body } = await as(aBarclaysMaker).put(statusUpdate).to(urlForDealStatus); expect(status).toEqual(200); expect(body.status).toEqual('Abandoned'); }); it('updates the deal', async () => { - const postResult = await as(anHSBCMaker).post(completedDeal).to('/v1/deals'); - const createdDeal = postResult.body; const statusUpdate = { comments: 'Flee!', status: 'Abandoned', }; - await as(anHSBCMaker).put(statusUpdate).to(`/v1/deals/${createdDeal._id}/status`); + await as(aBarclaysMaker).put(statusUpdate).to(urlForDealStatus); - const { status, body } = await as(anHSBCMaker).get(`/v1/deals/${createdDeal._id}`); + const { status, body } = await as(aBarclaysMaker).get(urlForDeal); expect(status).toEqual(200); expect(body.deal.status).toEqual('Abandoned'); }); it('updates the deals updatedAt field', async () => { - const postResult = await as(anHSBCMaker).post(completedDeal).to('/v1/deals'); - const createdDeal = postResult.body; const statusUpdate = { comments: 'Flee!', status: 'Abandoned', }; - await as(anHSBCMaker).put(statusUpdate).to(`/v1/deals/${createdDeal._id}/status`); + await as(aBarclaysMaker).put(statusUpdate).to(urlForDealStatus); - const { status, body } = await as(anHSBCMaker).get(`/v1/deals/${createdDeal._id}`); + const { status, body } = await as(aBarclaysMaker).get(urlForDeal); expect(status).toEqual(200); expect(body.deal.updatedAt).not.toEqual(completedDeal.updatedAt); @@ -193,10 +199,7 @@ describe('/v1/deals/:id/status', () => { }); it('does NOT update previousStatus if the `from` and `to` status matches', async () => { - const postResult = await as(anHSBCMaker).post(completedDeal).to('/v1/deals'); - const dealId = postResult.body._id; - - await createFacilities(anHSBCMaker, dealId, completedDeal.mockFacilities); + await createFacilities(aBarclaysMaker, dealId, completedDeal.mockFacilities); const statusUpdate = { comments: 'Flee!', @@ -205,38 +208,35 @@ describe('/v1/deals/:id/status', () => { const expectedPreviousStatus = completedDeal.previousStatus; - await as(anHSBCMaker).put(statusUpdate).to(`/v1/deals/${dealId}/status`); + await as(aBarclaysMaker).put(statusUpdate).to(urlForDealStatus); - const { body } = await as(anHSBCMaker).get(`/v1/deals/${dealId}`); + const { body } = await as(aBarclaysMaker).get(urlForDeal); expect(body.deal.previousStatus).toEqual(expectedPreviousStatus); expect(body.deal.status).toEqual(completedDeal.status); }); it('adds the comment to the existing comments', async () => { - const postResult = await as(anHSBCMaker).post(completedDeal).to('/v1/deals'); - const createdDeal = postResult.body; const statusUpdate = { comments: 'Flee!', status: 'Abandoned', }; - await as(anHSBCMaker).put(statusUpdate).to(`/v1/deals/${createdDeal._id}/status`); - - const { body } = await as(anHSBCMaker).get(`/v1/deals/${createdDeal._id}`); + await as(aBarclaysMaker).put(statusUpdate).to(urlForDealStatus); + const { body } = await as(aBarclaysMaker).get(urlForDeal); expect(body.deal.comments[0]).toEqual({ text: 'Flee!', timestamp: expect.any(Number), user: { _id: expect.any(String), - bank: anHSBCMaker.bank, - roles: anHSBCMaker.roles, + bank: aBarclaysMaker.bank, + roles: aBarclaysMaker.roles, lastLogin: expect.any(String), - username: anHSBCMaker.username, - email: anHSBCMaker.email, - firstname: anHSBCMaker.firstname, - surname: anHSBCMaker.surname, + username: aBarclaysMaker.username, + email: aBarclaysMaker.email, + firstname: aBarclaysMaker.firstname, + surname: aBarclaysMaker.surname, timezone: 'Europe/London', 'user-status': 'active', }, @@ -244,77 +244,69 @@ describe('/v1/deals/:id/status', () => { }); it('adds the user to `editedBy` array', async () => { - const postResult = await as(anHSBCMaker).post(completedDeal).to('/v1/deals'); - const createdDeal = postResult.body; const statusUpdate = { comments: 'Flee!', status: 'Abandoned', }; - await as(anHSBCMaker).put(statusUpdate).to(`/v1/deals/${createdDeal._id}/status`); + await as(aBarclaysMaker).put(statusUpdate).to(urlForDealStatus); - const { body } = await as(anHSBCMaker).get(`/v1/deals/${createdDeal._id}`); + const { body } = await as(aBarclaysMaker).get(urlForDeal); expect(body.deal.editedBy[body.deal.editedBy.length - 1]).toEqual({ date: expect.any(Number), - username: anHSBCMaker.username, - roles: anHSBCMaker.roles, - bank: anHSBCMaker.bank, - userId: anHSBCMaker._id, + username: aBarclaysMaker.username, + roles: aBarclaysMaker.roles, + bank: aBarclaysMaker.bank, + userId: aBarclaysMaker._id, }); }); it('sends an email if the status has changed', async () => { const postResult = await as(anHSBCMaker).post(completedDeal).to('/v1/deals'); - const dealId = postResult.body._id; + const createdDealId = postResult.body._id; - await createFacilities(anHSBCMaker, dealId, completedDeal.mockFacilities); + await createFacilities(anHSBCMaker, createdDealId, completedDeal.mockFacilities); const statusUpdate = { status: 'Submitted', confirmSubmit: true, }; - await as(anHSBCMaker).put(statusUpdate).to(`/v1/deals/${dealId}/status`); + await as(anHSBCMaker).put(statusUpdate).to(`/v1/deals/${createdDealId}/status`); expect(sendStatusUpdateEmails).toHaveBeenCalled(); }); it('does NOT add the user to `editedBy` array if a checker changes status to "Further Maker\'s input required"', async () => { - const postResult = await as(anHSBCMaker).post(completedDeal).to('/v1/deals'); - const createdDeal = postResult.body; const statusUpdate = { comments: 'Flee!', status: 'Further Maker\'s input required', }; - await as(aBarclaysChecker).put(statusUpdate).to(`/v1/deals/${createdDeal._id}/status`); + await as(aBarclaysChecker).put(statusUpdate).to(urlForDealStatus); - const { body } = await as(anHSBCMaker).get(`/v1/deals/${createdDeal._id}`); + const { body } = await as(aBarclaysMaker).get(urlForDeal); expect(body.deal.editedBy.length).toEqual(0); }); it('does NOT add the user to `editedBy` array if a checker changes status to "Submitted"', async () => { - const postResult = await as(anHSBCMaker).post(completedDeal).to('/v1/deals'); - const createdDeal = postResult.body; const statusUpdate = { comments: 'Yay!', status: 'Submitted', }; - await as(aBarclaysChecker).put(statusUpdate).to(`/v1/deals/${createdDeal._id}/status`); + await as(aBarclaysChecker).put(statusUpdate).to(urlForDealStatus); - const { body } = await as(anHSBCMaker).get(`/v1/deals/${createdDeal._id}`); + const { body } = await as(aBarclaysMaker).get(urlForDeal); expect(body.deal.editedBy.length).toEqual(0); }); it('rejects "Abandoned" updates if no comment provided.', async () => { - const postResult = await as(anHSBCMaker).post(completedDeal).to('/v1/deals'); - const createdDeal = postResult.body; const statusUpdate = { status: 'Abandoned', }; - const { body } = await as(anHSBCMaker).put(statusUpdate).to(`/v1/deals/${createdDeal._id}/status`); + const { body } = await as(aBarclaysMaker).put(statusUpdate).to(urlForDealStatus); expect(body).toEqual({ success: false, @@ -355,13 +347,11 @@ describe('/v1/deals/:id/status', () => { }); it('rejects "Further makers Input Required" updates if no comment provided.', async () => { - const postResult = await as(aBarclaysMaker).post(completedDeal).to('/v1/deals'); - const createdDeal = postResult.body; const statusUpdate = { status: "Further Maker's input required", }; - const { body } = await as(aBarclaysChecker).put(statusUpdate).to(`/v1/deals/${createdDeal._id}/status`); + const { body } = await as(aBarclaysChecker).put(statusUpdate).to(urlForDealStatus); expect(body).toEqual({ success: false, @@ -376,13 +366,11 @@ describe('/v1/deals/:id/status', () => { }); it('rejects "Submitted" updates if t+cs not confirmed.', async () => { - const postResult = await as(aBarclaysMaker).post(completedDeal).to('/v1/deals'); - const createdDeal = postResult.body; const statusUpdate = { status: 'Submitted', }; - const { body } = await as(aBarclaysChecker).put(statusUpdate).to(`/v1/deals/${createdDeal._id}/status`); + const { body } = await as(aBarclaysChecker).put(statusUpdate).to(urlForDealStatus); expect(body).toEqual({ success: false, @@ -397,7 +385,7 @@ describe('/v1/deals/:id/status', () => { }); it('rejects "Submitted" updates if user is a maker AND checker that has created the deal.', async () => { - const dealCreatedBymakerChecker = { + const dealCreatedByMakerChecker = { ...completedDeal, details: { ...completedDeal.details, @@ -405,7 +393,7 @@ describe('/v1/deals/:id/status', () => { }, }; - const postResult = await as(aBarclaysMakerChecker).post(dealCreatedBymakerChecker).to('/v1/deals'); + const postResult = await as(aBarclaysMakerChecker).post(dealCreatedByMakerChecker).to('/v1/deals'); const createdDeal = postResult.body; const statusUpdate = { status: 'Submitted', diff --git a/portal-api/api-tests/v1/deals/deals-submission-details-validation.api-test.js b/portal-api/api-tests/v1/deals/deals-submission-details-validation.api-test.js index 61d5ebc310..0a867685ec 100644 --- a/portal-api/api-tests/v1/deals/deals-submission-details-validation.api-test.js +++ b/portal-api/api-tests/v1/deals/deals-submission-details-validation.api-test.js @@ -7,6 +7,7 @@ const app = require('../../../src/createApp'); const testUserCache = require('../../api-test-users'); const { as } = require('../../api')(app); +const { MAKER } = require('../../../src/v1/roles/roles'); const newDeal = aDeal({ updatedAt: Date.now(), @@ -29,7 +30,7 @@ describe('PUT /v1/deals/:id/submission-details validation rules', () => { beforeAll(async () => { const testUsers = await testUserCache.initialise(app); - anHSBCMaker = testUsers().withRole('maker').withBankName('HSBC').one(); + anHSBCMaker = testUsers().withRole(MAKER).withBankName('HSBC').one(); }); beforeEach(async () => { @@ -680,7 +681,7 @@ describe('PUT /v1/deals/:id/submission-details validation rules', () => { }); }); - describe('If indemnifier-corresdpondence-address === GBR, postcode is required', () => { + describe('If indemnifier-correspondence-address === GBR, postcode is required', () => { beforeAll(async () => { const postResult = await as(anHSBCMaker).post(newDeal).to('/v1/deals'); const createdDeal = postResult.body; diff --git a/portal-api/api-tests/v1/deals/deals-submission-details.api-test.js b/portal-api/api-tests/v1/deals/deals-submission-details.api-test.js index 33f8587a4e..1ed0a7e8c9 100644 --- a/portal-api/api-tests/v1/deals/deals-submission-details.api-test.js +++ b/portal-api/api-tests/v1/deals/deals-submission-details.api-test.js @@ -3,8 +3,11 @@ const aDeal = require('./deal-builder'); const app = require('../../../src/createApp'); const testUserCache = require('../../api-test-users'); +const { withClientAuthenticationTests } = require('../../common-tests/client-authentication-tests'); +const { withRoleAuthorisationTests } = require('../../common-tests/role-authorisation-tests'); -const { as } = require('../../api')(app); +const { as, get } = require('../../api')(app); +const { MAKER, CHECKER, READ_ONLY, ADMIN } = require('../../../src/v1/roles/roles'); const newDeal = aDeal({ updatedAt: Date.now(), @@ -26,15 +29,14 @@ describe('/v1/deals/:id/submission-details', () => { let noRoles; let anHSBCMaker; let aBarclaysMaker; - let aBarclaysChecker; let aSuperuser; + let testUsers; beforeAll(async () => { - const testUsers = await testUserCache.initialise(app); + testUsers = await testUserCache.initialise(app); noRoles = testUsers().withoutAnyRoles().one(); - aBarclaysMaker = testUsers().withRole('maker').withBankName('Barclays Bank').one(); - aBarclaysChecker = testUsers().withRole('checker').withBankName('Barclays Bank').one(); - anHSBCMaker = testUsers().withRole('maker').withBankName('HSBC').one(); + aBarclaysMaker = testUsers().withRole(MAKER).withBankName('Barclays Bank').one(); + anHSBCMaker = testUsers().withRole(MAKER).withBankName('HSBC').one(); aSuperuser = testUsers().superuser().one(); }); @@ -44,61 +46,46 @@ describe('/v1/deals/:id/submission-details', () => { }); describe('GET /v1/deals/:id/submission-details', () => { - it('401s requests that do not present a valid Authorization token', async () => { - const { status } = await as().get('/v1/deals/620a1aa095a618b12da38c7b/submission-details'); + let oneDealSubmissionDetailsUrl; - expect(status).toEqual(401); + beforeEach(async () => { + const { body: { _id: dealId } } = await as(aBarclaysMaker).post(newDeal).to('/v1/deals'); + oneDealSubmissionDetailsUrl = `/v1/deals/${dealId}/submission-details`; }); - it('401s requests that do not come from a user with role=maker || role=checker', async () => { - const { status } = await as(noRoles).get('/v1/deals/620a1aa095a618b12da38c7b/submission-details'); - - expect(status).toEqual(401); + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => get(oneDealSubmissionDetailsUrl), + makeRequestWithAuthHeader: (authHeader) => get(oneDealSubmissionDetailsUrl, { headers: { Authorization: authHeader } }) }); - it('accepts requests from a user with role=maker', async () => { - const { body } = await as(anHSBCMaker).post(newDeal).to('/v1/deals'); - - const { status } = await as(anHSBCMaker).get(`/v1/deals/${body._id}/submission-details`); - - expect(status).toEqual(200); - }); - - it('accepts requests from a user with role=checker', async () => { - const { body } = await as(aBarclaysMaker).post(newDeal).to('/v1/deals'); - - const { status } = await as(aBarclaysChecker).get(`/v1/deals/${body._id}/submission-details`); - - expect(status).toEqual(200); + withRoleAuthorisationTests({ + allowedRoles: [MAKER, CHECKER, READ_ONLY, ADMIN], + getUserWithRole: (role) => testUsers().withBankName('Barclays Bank').withRole(role).one(), + getUserWithoutAnyRoles: () => testUsers().withBankName('Barclays Bank').withoutAnyRoles().one(), + makeRequestAsUser: (user) => as(user).get(oneDealSubmissionDetailsUrl), + successStatusCode: 200, }); it('401s requests if .bank != /bank', async () => { - const { body } = await as(anHSBCMaker).post(newDeal).to('/v1/deals'); - - const { status } = await as(aBarclaysMaker).get(`/v1/deals/${body._id}/submission-details`); + const { status } = await as(anHSBCMaker).get(oneDealSubmissionDetailsUrl); expect(status).toEqual(401); }); - it('404s requests for unkonwn ids', async () => { + it('404s requests for unknown ids', async () => { const { status } = await as(aBarclaysMaker).get('/v1/deals/620a1aa095a618b12da38c7b/submission-details'); expect(status).toEqual(404); }); it('accepts requests if .bank.id == *', async () => { - const { body } = await as(anHSBCMaker).post(newDeal).to('/v1/deals'); - - const { status } = await as(aSuperuser).get(`/v1/deals/${body._id}/submission-details`); + const { status } = await as(aSuperuser).get(oneDealSubmissionDetailsUrl); expect(status).toEqual(200); }); it('returns the requested resource', async () => { - const postResult = await as(anHSBCMaker).post(newDeal).to('/v1/deals'); - const newId = postResult.body._id; - - const { status, body } = await as(anHSBCMaker).get(`/v1/deals/${newId}/submission-details`); + const { status, body } = await as(aBarclaysMaker).get(oneDealSubmissionDetailsUrl); expect(status).toEqual(200); expect(body.data).toEqual({ status: 'Not started' }); diff --git a/portal-api/api-tests/v1/deals/deals.api-test.js b/portal-api/api-tests/v1/deals/deals.api-test.js index 8b1006dd4e..4f0a57f138 100644 --- a/portal-api/api-tests/v1/deals/deals.api-test.js +++ b/portal-api/api-tests/v1/deals/deals.api-test.js @@ -2,9 +2,12 @@ const wipeDB = require('../../wipeDB'); const aDeal = require('./deal-builder'); const app = require('../../../src/createApp'); const testUserCache = require('../../api-test-users'); +const { withClientAuthenticationTests } = require('../../common-tests/client-authentication-tests'); +const { withRoleAuthorisationTests } = require('../../common-tests/role-authorisation-tests'); +const { MAKER, CHECKER, READ_ONLY, ADMIN } = require('../../../src/v1/roles/roles'); const dealWithAboutComplete = require('../../fixtures/deal-with-complete-about-section.json'); const dealWithAboutIncomplete = require('../../fixtures/deal-with-incomplete-about-section.json'); -const { as } = require('../../api')(app); +const { as, get } = require('../../api')(app); const { expectAddedFields, expectAddedFieldsWithEditedBy } = require('./expectAddedFields'); const calculateDealSummary = require('../../../src/v1/deal-summary'); @@ -32,15 +35,14 @@ describe('/v1/deals', () => { let noRoles; let anHSBCMaker; let aBarclaysMaker; - let aBarclaysChecker; let aSuperuser; + let testUsers; beforeAll(async () => { - const testUsers = await testUserCache.initialise(app); + testUsers = await testUserCache.initialise(app); noRoles = testUsers().withoutAnyRoles().one(); - aBarclaysMaker = testUsers().withRole('maker').withBankName('Barclays Bank').one(); - aBarclaysChecker = testUsers().withRole('checker').withBankName('Barclays Bank').one(); - anHSBCMaker = testUsers().withRole('maker').withBankName('HSBC').one(); + aBarclaysMaker = testUsers().withRole(MAKER).withBankName('Barclays Bank').one(); + anHSBCMaker = testUsers().withRole(MAKER).withBankName('HSBC').one(); aSuperuser = testUsers().superuser().one(); }); @@ -49,17 +51,42 @@ describe('/v1/deals', () => { await wipeDB.wipe(['facilities']); }); + describe('GET /v1/deals', () => { + const dealsUrl = '/v1/deals'; + + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => get(dealsUrl), + makeRequestWithAuthHeader: (authHeader) => get(dealsUrl, { headers: { Authorization: authHeader } }) + }); + + withRoleAuthorisationTests({ + allowedRoles: [MAKER, CHECKER, READ_ONLY, ADMIN], + getUserWithRole: (role) => testUsers().withRole(role).one(), + getUserWithoutAnyRoles: () => noRoles, + makeRequestAsUser: (user) => as(user).get(dealsUrl), + successStatusCode: 200, + }); + }); + describe('GET /v1/deals/:id', () => { - it('401s requests that do not present a valid Authorization token', async () => { - const { status } = await as().get('/v1/deals/620a1aa095a618b12da38c7b'); + let aDealUrl; - expect(status).toEqual(401); + beforeEach(async () => { + const { body: { _id: dealId } } = await as(aBarclaysMaker).post(newDeal).to('/v1/deals'); + aDealUrl = `/v1/deals/${dealId}`; }); - it('401s requests that do not come from a user with role=maker || role=checker', async () => { - const { status } = await as(noRoles).get('/v1/deals/620a1aa095a618b12da38c7b'); + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => get(aDealUrl), + makeRequestWithAuthHeader: (authHeader) => get(aDealUrl, { headers: { Authorization: authHeader } }) + }); - expect(status).toEqual(401); + withRoleAuthorisationTests({ + allowedRoles: [MAKER, CHECKER, READ_ONLY, ADMIN], + getUserWithRole: (role) => testUsers().withBankName('Barclays Bank').withRole(role).one(), + getUserWithoutAnyRoles: () => testUsers().withBankName('Barclays Bank').withoutAnyRoles().one(), + makeRequestAsUser: (user) => as(user).get(aDealUrl), + successStatusCode: 200, }); it('400s requests that do not have a valid deal id', async () => { @@ -68,49 +95,26 @@ describe('/v1/deals', () => { expect(status).toEqual(400); }); - it('accepts requests from a user with role=maker', async () => { - const { body } = await as(anHSBCMaker).post(newDeal).to('/v1/deals'); - - const { status } = await as(anHSBCMaker).get(`/v1/deals/${body._id}`); - - expect(status).toEqual(200); - }); - - it('accepts requests from a user with role=checker', async () => { - const { body } = await as(aBarclaysMaker).post(newDeal).to('/v1/deals'); - - const { status } = await as(aBarclaysChecker).get(`/v1/deals/${body._id}`); + it('404s requests for unknown ids', async () => { + const { status } = await as(aBarclaysMaker).get('/v1/deals/620a1aa095a618b12da38c7b'); - expect(status).toEqual(200); + expect(status).toEqual(404); }); it('401s requests if .bank != /bank', async () => { - const { body } = await as(anHSBCMaker).post(newDeal).to('/v1/deals'); - - const { status } = await as(aBarclaysMaker).get(`/v1/deals/${body._id}`); + const { status } = await as(anHSBCMaker).get(aDealUrl); expect(status).toEqual(401); }); - it('404s requests for unkonwn ids', async () => { - const { status } = await as(aBarclaysMaker).get('/v1/deals/620a1aa095a618b12da38c7b'); - - expect(status).toEqual(404); - }); - it('accepts requests if .bank.id == *', async () => { - const { body } = await as(anHSBCMaker).post(newDeal).to('/v1/deals'); - - const { status } = await as(aSuperuser).get(`/v1/deals/${body._id}`); + const { status } = await as(aSuperuser).get(aDealUrl); expect(status).toEqual(200); }); it('returns the requested resource', async () => { - const postResult = await as(anHSBCMaker).post(newDeal).to('/v1/deals'); - const newId = postResult.body._id; - - const { status, body } = await as(anHSBCMaker).get(`/v1/deals/${newId}`); + const { status, body } = await as(aBarclaysMaker).get(aDealUrl); expect(status).toEqual(200); expect(body.deal).toEqual(expectAddedFields(newDeal)); @@ -365,7 +369,7 @@ describe('/v1/deals', () => { expect(status).toEqual(401); }); - it('404s requests to delete unkonwn ids', async () => { + it('404s requests to delete unknown ids', async () => { const { status } = await as(anHSBCMaker).remove('/v1/deals/620a1aa095a618b12da38c7b'); expect(status).toEqual(404); diff --git a/portal-api/api-tests/v1/eligibility-criteria/eligibility-criteria.api-test.js b/portal-api/api-tests/v1/eligibility-criteria/eligibility-criteria.api-test.js index 69863b91a4..b663b08731 100644 --- a/portal-api/api-tests/v1/eligibility-criteria/eligibility-criteria.api-test.js +++ b/portal-api/api-tests/v1/eligibility-criteria/eligibility-criteria.api-test.js @@ -2,11 +2,14 @@ const wipeDB = require('../../wipeDB'); const app = require('../../../src/createApp'); const testUserCache = require('../../api-test-users'); +const { withClientAuthenticationTests } = require('../../common-tests/client-authentication-tests'); +const { withNoRoleAuthorisationTests, withRoleAuthorisationTests } = require('../../common-tests/role-authorisation-tests'); -const { as } = require('../../api')(app); +const { as, get, remove, put, post } = require('../../api')(app); const { expectMongoId, expectMongoIds } = require('../../expectMongoIds'); const allEligibilityCriteria = require('../../fixtures/eligibilityCriteria'); +const { EDITOR, ADMIN } = require('../../../src/v1/roles/roles'); const newEligibilityCriteria = allEligibilityCriteria[0]; const updatedEligibilityCriteria = { @@ -22,11 +25,12 @@ const updatedEligibilityCriteria = { describe('/v1/eligibility-criteria', () => { let noRoles; let anEditor; + let testUsers; beforeAll(async () => { - const testUsers = await testUserCache.initialise(app); + testUsers = await testUserCache.initialise(app); noRoles = testUsers().withoutAnyRoles().one(); - anEditor = testUsers().withRole('editor').one(); + anEditor = testUsers().withRole(EDITOR).one(); }); beforeEach(async () => { @@ -34,24 +38,26 @@ describe('/v1/eligibility-criteria', () => { }); describe('GET /v1/eligibility-criteria', () => { - it('rejects requests that do not present a valid Authorization token', async () => { - const { status } = await as().get('/v1/eligibility-criteria'); + const eligibilityCriteriaUrl = '/v1/eligibility-criteria'; - expect(status).toEqual(401); + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => get(eligibilityCriteriaUrl), + makeRequestWithAuthHeader: (authHeader) => get(eligibilityCriteriaUrl, { headers: { Authorization: authHeader } }) }); - it('accepts requests that present a valid Authorization token', async () => { - const { status } = await as(noRoles).get('/v1/eligibility-criteria'); - - expect(status).toEqual(200); + withNoRoleAuthorisationTests({ + getUserWithRole: (role) => testUsers().withRole(role).one(), + getUserWithoutAnyRoles: () => noRoles, + makeRequestAsUser: (user) => as(user).get(eligibilityCriteriaUrl), + successStatusCode: 200, }); it('returns a list of eligibility-criteria sorted by id', async () => { // randomise the order a bit on the way in... - await as(anEditor).post(allEligibilityCriteria[0]).to('/v1/eligibility-criteria'); - await as(anEditor).post(allEligibilityCriteria[1]).to('/v1/eligibility-criteria'); + await as(anEditor).post(allEligibilityCriteria[0]).to(eligibilityCriteriaUrl); + await as(anEditor).post(allEligibilityCriteria[1]).to(eligibilityCriteriaUrl); - const { body } = await as(noRoles).get('/v1/eligibility-criteria'); + const { body } = await as(noRoles).get(eligibilityCriteriaUrl); expect(body).toEqual({ count: allEligibilityCriteria.length, eligibilityCriteria: expectMongoIds(allEligibilityCriteria), @@ -60,22 +66,24 @@ describe('/v1/eligibility-criteria', () => { }); describe('GET /v1/eligibility-criteria/latest', () => { - it('rejects requests that do not present a valid Authorization token', async () => { - const { status } = await as().get('/v1/eligibility-criteria/latest'); + const latestEligibilityCriteriaUrl = '/v1/eligibility-criteria/latest'; - expect(status).toEqual(401); + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => get(latestEligibilityCriteriaUrl), + makeRequestWithAuthHeader: (authHeader) => get(latestEligibilityCriteriaUrl, { headers: { Authorization: authHeader } }) }); - it('accepts requests that do present a valid Authorization token', async () => { - const { status } = await as(noRoles).get('/v1/eligibility-criteria/latest'); - - expect(status).toEqual(200); + withNoRoleAuthorisationTests({ + getUserWithRole: (role) => testUsers().withRole(role).one(), + getUserWithoutAnyRoles: () => noRoles, + makeRequestAsUser: (user) => as(user).get(latestEligibilityCriteriaUrl), + successStatusCode: 200, }); - it('returns an eligibility-criteria', async () => { + it('returns the last created eligibility-criteria', async () => { await as(anEditor).post(newEligibilityCriteria).to('/v1/eligibility-criteria'); - const { status, body } = await as(anEditor).get(`/v1/eligibility-criteria/${newEligibilityCriteria.version}`); + const { status, body } = await as(anEditor).get(latestEligibilityCriteriaUrl); expect(status).toEqual(200); expect(body).toEqual(expectMongoId(newEligibilityCriteria)); @@ -83,16 +91,18 @@ describe('/v1/eligibility-criteria', () => { }); describe('GET /v1/eligibility-criteria/:version', () => { - it('rejects requests that do not present a valid Authorization token', async () => { - const { status } = await as().get('/v1/eligibility-criteria/1'); + const eligibilityCriteria1Url = '/v1/eligibility-criteria/1'; - expect(status).toEqual(401); + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => get(eligibilityCriteria1Url), + makeRequestWithAuthHeader: (authHeader) => get(eligibilityCriteria1Url, { headers: { Authorization: authHeader } }) }); - it('accepts requests that do present a valid Authorization token', async () => { - const { status } = await as(noRoles).get('/v1/eligibility-criteria/1'); - - expect(status).toEqual(200); + withNoRoleAuthorisationTests({ + getUserWithRole: (role) => testUsers().withRole(role).one(), + getUserWithoutAnyRoles: () => noRoles, + makeRequestAsUser: (user) => as(user).get(eligibilityCriteria1Url), + successStatusCode: 200, }); it('returns an eligibility-criteria', async () => { @@ -106,46 +116,36 @@ describe('/v1/eligibility-criteria', () => { }); describe('POST /v1/eligibility-criteria', () => { - it('rejects requests that do not present a valid Authorization token', async () => { - const { status } = await as().post(newEligibilityCriteria).to('/v1/eligibility-criteria'); + const eligibilityCriteriaUrl = '/v1/eligibility-criteria'; - expect(status).toEqual(401); + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => post(eligibilityCriteriaUrl, newEligibilityCriteria), + makeRequestWithAuthHeader: (authHeader) => post(eligibilityCriteriaUrl, newEligibilityCriteria, { headers: { Authorization: authHeader } }) }); - it('rejects requests that present a valid Authorization token but do not have "editor" role', async () => { - const { status } = await as(noRoles).post(newEligibilityCriteria).to('/v1/eligibility-criteria'); - - expect(status).toEqual(401); - }); - - it('accepts requests that present a valid Authorization token with "editor" role', async () => { - const { status } = await as(anEditor).post(newEligibilityCriteria).to('/v1/eligibility-criteria'); - - expect(status).toEqual(200); + withRoleAuthorisationTests({ + allowedRoles: [ADMIN, EDITOR], + getUserWithRole: (role) => testUsers().withRole(role).one(), + getUserWithoutAnyRoles: () => noRoles, + makeRequestAsUser: (user) => as(user).post(newEligibilityCriteria).to(eligibilityCriteriaUrl), + successStatusCode: 200, }); }); describe('PUT /v1/eligibility-criteria/:version', () => { - it('rejects requests that do not present a valid Authorization token', async () => { - const { status } = await as().put(updatedEligibilityCriteria).to('/v1/eligibility-criteria/1'); + const eligibilityCriteria1Url = '/v1/eligibility-criteria/1'; - expect(status).toEqual(401); + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => put(eligibilityCriteria1Url, updatedEligibilityCriteria), + makeRequestWithAuthHeader: (authHeader) => put(eligibilityCriteria1Url, updatedEligibilityCriteria, { headers: { Authorization: authHeader } }) }); - it('rejects requests that present a valid Authorization token but do not have "editor" role', async () => { - await as(anEditor).post(newEligibilityCriteria).to('/v1/eligibility-criteria'); - - const { status } = await as(noRoles).put(updatedEligibilityCriteria).to('/v1/eligibility-criteria/1'); - - expect(status).toEqual(401); - }); - - it('accepts requests that present a valid Authorization token with "editor" role', async () => { - await as(anEditor).post(newEligibilityCriteria).to('/v1/eligibility-criteria'); - - const { status } = await as(anEditor).put(updatedEligibilityCriteria).to('/v1/eligibility-criteria/1'); - - expect(status).toEqual(200); + withRoleAuthorisationTests({ + allowedRoles: [ADMIN, EDITOR], + getUserWithRole: (role) => testUsers().withRole(role).one(), + getUserWithoutAnyRoles: () => noRoles, + makeRequestAsUser: (user) => as(user).put(updatedEligibilityCriteria).to(eligibilityCriteria1Url), + successStatusCode: 200, }); it('updates an eligibility criteria', async () => { @@ -170,26 +170,19 @@ describe('/v1/eligibility-criteria', () => { }); describe('DELETE /v1/eligibility-criteria/:version', () => { - it('rejects requests that do not present a valid Authorization token', async () => { - const { status } = await as().remove('/v1/eligibility-criteria/1'); + const eligibilityCriteria1Url = '/v1/eligibility-criteria/1'; - expect(status).toEqual(401); + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => remove(eligibilityCriteria1Url), + makeRequestWithAuthHeader: (authHeader) => remove(eligibilityCriteria1Url, { headers: { Authorization: authHeader } }) }); - it('rejects requests that present a valid Authorization token but do not have "editor" role', async () => { - await as(anEditor).post(newEligibilityCriteria).to('/v1/eligibility-criteria'); - - const { status } = await as(noRoles).remove('/v1/eligibility-criteria/1'); - - expect(status).toEqual(401); - }); - - it('accepts requests that present a valid Authorization token with "editor" role', async () => { - await as(anEditor).post(newEligibilityCriteria).to('/v1/eligibility-criteria'); - - const { status } = await as(anEditor).remove('/v1/eligibility-criteria/1'); - - expect(status).toEqual(200); + withRoleAuthorisationTests({ + allowedRoles: [ADMIN, EDITOR], + getUserWithRole: (role) => testUsers().withRole(role).one(), + getUserWithoutAnyRoles: () => noRoles, + makeRequestAsUser: (user) => as(user).remove(eligibilityCriteria1Url), + successStatusCode: 200, }); it('deletes the eligibility-criteria', async () => { diff --git a/portal-api/api-tests/v1/feedback/feedback-validation.api-test.js b/portal-api/api-tests/v1/feedback/feedback-validation.api-test.js index 46d6efaeca..06eee51f71 100644 --- a/portal-api/api-tests/v1/feedback/feedback-validation.api-test.js +++ b/portal-api/api-tests/v1/feedback/feedback-validation.api-test.js @@ -2,6 +2,7 @@ const wipeDB = require('../../wipeDB'); const app = require('../../../src/createApp'); const testUserCache = require('../../api-test-users'); const { as } = require('../../api')(app); +const { MAKER } = require('../../../src/v1/roles/roles'); describe('/v1/deals/:id/bond', () => { const allFeedbackFields = { @@ -19,7 +20,7 @@ describe('/v1/deals/:id/bond', () => { beforeAll(async () => { const testUsers = await testUserCache.initialise(app); - aBarclaysMaker = testUsers().withRole('maker').withBankName('Barclays Bank').one(); + aBarclaysMaker = testUsers().withRole(MAKER).withBankName('Barclays Bank').one(); }); beforeEach(async () => { diff --git a/portal-api/api-tests/v1/feedback/feedback.api-test.js b/portal-api/api-tests/v1/feedback/feedback.api-test.js index 2fbfed6d19..416252135c 100644 --- a/portal-api/api-tests/v1/feedback/feedback.api-test.js +++ b/portal-api/api-tests/v1/feedback/feedback.api-test.js @@ -1,13 +1,17 @@ const wipeDB = require('../../wipeDB'); const app = require('../../../src/createApp'); const testUserCache = require('../../api-test-users'); -const { as } = require('../../api')(app); +const { withClientAuthenticationTests } = require('../../common-tests/client-authentication-tests'); +const { withRoleAuthorisationTests } = require('../../common-tests/role-authorisation-tests'); +const { MAKER, CHECKER, ADMIN, DATA_ADMIN } = require('../../../src/v1/roles/roles'); +const { as, get, remove } = require('../../api')(app); describe('/v1/feedback', () => { let noRoles; let aDataAdmin; let aBarclaysMaker; let aBarclaysChecker; + let testUsers; const feedbackFormBody = { role: 'computers', @@ -26,12 +30,12 @@ describe('/v1/feedback', () => { }; beforeAll(async () => { - const testUsers = await testUserCache.initialise(app); + testUsers = await testUserCache.initialise(app); noRoles = testUsers().withoutAnyRoles().one(); - aBarclaysMaker = testUsers().withRole('maker').withBankName('Barclays Bank').one(); - aBarclaysChecker = testUsers().withRole('checker').withBankName('Barclays Bank').one(); - aDataAdmin = testUsers().withRole('data-admin').one(); + aBarclaysMaker = testUsers().withRole(MAKER).withBankName('Barclays Bank').one(); + aBarclaysChecker = testUsers().withRole(CHECKER).withBankName('Barclays Bank').one(); + aDataAdmin = testUsers().withRole(DATA_ADMIN).one(); }); beforeEach(async () => { @@ -95,19 +99,19 @@ describe('/v1/feedback', () => { }); describe('GET /v1/feedback', () => { - it('401s requests that do not present a valid Authorization token', async () => { - const { status } = await as().get('/v1/feedback'); - expect(status).toEqual(401); - }); + const feedbackUrl = '/v1/feedback'; - it('401s requests that do not come from a user with role=data-admin', async () => { - const { status } = await as(noRoles).get('/v1/feedback'); - expect(status).toEqual(401); + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => get(feedbackUrl), + makeRequestWithAuthHeader: (authHeader) => get(feedbackUrl, { headers: { Authorization: authHeader } }) }); - it('accepts requests from a user with role=data-admin', async () => { - const { status } = await as(aDataAdmin).get('/v1/feedback'); - expect(status).toEqual(200); + withRoleAuthorisationTests({ + allowedRoles: [DATA_ADMIN, ADMIN], + getUserWithRole: (role) => testUsers().withRole(role).one(), + getUserWithoutAnyRoles: () => noRoles, + makeRequestAsUser: (user) => as(user).get(feedbackUrl), + successStatusCode: 200, }); it('returns all feedback', async () => { @@ -119,7 +123,7 @@ describe('/v1/feedback', () => { const { body: feedback2 } = await as(aDataAdmin).get(`/v1/feedback/${createdFeedback2._id}`); const { body: feedback3 } = await as(aDataAdmin).get(`/v1/feedback/${createdFeedback3._id}`); - const { status, body } = await as(aDataAdmin).get('/v1/feedback'); + const { status, body } = await as(aDataAdmin).get(feedbackUrl); expect(status).toEqual(200); @@ -132,22 +136,25 @@ describe('/v1/feedback', () => { }); describe('GET /v1/feedback/:id', () => { - it('401s requests that do not present a valid Authorization token', async () => { - const { status } = await as().get('/v1/feedback/620a1aa095a618b12da38c7b'); - expect(status).toEqual(401); - }); - - it('401s requests that do not come from a user with role=data-admin', async () => { - const { status } = await as(noRoles).get('/v1/feedback/620a1aa095a618b12da38c7b'); - expect(status).toEqual(401); - }); + let aFeedbackUrl; - it('accepts requests from a user with role=data-admin', async () => { + beforeEach(async () => { const createdFeedback = await postFeedback(); const { _id } = createdFeedback.body; + aFeedbackUrl = `/v1/feedback/${_id}`; + }); - const { status } = await as(aDataAdmin).get(`/v1/feedback/${_id}`); - expect(status).toEqual(200); + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => get(aFeedbackUrl), + makeRequestWithAuthHeader: (authHeader) => get(aFeedbackUrl, { headers: { Authorization: authHeader } }) + }); + + withRoleAuthorisationTests({ + allowedRoles: [DATA_ADMIN, ADMIN], + getUserWithRole: (role) => testUsers().withRole(role).one(), + getUserWithoutAnyRoles: () => noRoles, + makeRequestAsUser: (user) => as(user).get(aFeedbackUrl), + successStatusCode: 200, }); it('404s requests for unknown resources', async () => { @@ -156,13 +163,9 @@ describe('/v1/feedback', () => { }); it('returns a feedback', async () => { - const createdFeedback = await postFeedback(); - const { _id } = createdFeedback.body; - - const { status, body } = await as(aDataAdmin).get(`/v1/feedback/${_id}`); + const { status, body } = await as(aDataAdmin).get(aFeedbackUrl); expect(status).toEqual(200); - expect(body).toEqual({ ...feedbackFormBody, _id: expect.any(String), @@ -176,22 +179,24 @@ describe('/v1/feedback', () => { }); describe('DELETE /v1/feedback/:id', () => { - it('401s requests that do not present a valid Authorization token', async () => { - const { status } = await as().remove('/v1/feedback/620a1aa095a618b12da38c7b'); - expect(status).toEqual(401); + let aFeedbackUrl; + beforeEach(async () => { + const createdFeedback = await postFeedback(); + const { _id } = createdFeedback.body; + aFeedbackUrl = `/v1/feedback/${_id}`; }); - it('401s requests that do not come from a user with role=data-admin', async () => { - const { status } = await as(noRoles).remove('/v1/feedback/620a1aa095a618b12da38c7b'); - expect(status).toEqual(401); + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => remove(aFeedbackUrl), + makeRequestWithAuthHeader: (authHeader) => remove(aFeedbackUrl, { headers: { Authorization: authHeader } }) }); - it('accepts requests from a user with role=data-admin', async () => { - const createdFeedback = await postFeedback(); - const { _id } = createdFeedback.body; - - const { status } = await as(aDataAdmin).remove(`/v1/feedback/${_id}`); - expect(status).toEqual(200); + withRoleAuthorisationTests({ + allowedRoles: [DATA_ADMIN, ADMIN], + getUserWithRole: (role) => testUsers().withRole(role).one(), + getUserWithoutAnyRoles: () => noRoles, + makeRequestAsUser: (user) => as(user).remove(aFeedbackUrl), + successStatusCode: 200, }); it('404s requests for unknown resources', async () => { diff --git a/portal-api/api-tests/v1/gef/address.api-test.js b/portal-api/api-tests/v1/gef/address.api-test.js new file mode 100644 index 0000000000..df149ab4f6 --- /dev/null +++ b/portal-api/api-tests/v1/gef/address.api-test.js @@ -0,0 +1,36 @@ +const app = require('../../../src/createApp'); +const { MAKER, DATA_ADMIN, READ_ONLY, ADMIN } = require('../../../src/v1/roles/roles'); +const testUserCache = require('../../api-test-users'); +const { withClientAuthenticationTests } = require('../../common-tests/client-authentication-tests'); +const { withRoleAuthorisationTests } = require('../../common-tests/role-authorisation-tests'); +const { POSTCODE } = require('../../fixtures/postcode'); +const { ordnanceSurvey } = require('../../../src/external-api/api'); + +const { as, get } = require('../../api')(app); + +describe('GET /v1/gef/address/:postcode', () => { + const aPostcodeAddressUrl = `/v1/gef/address/${POSTCODE.VALID}`; + let testUsers; + + beforeAll(async () => { + testUsers = await testUserCache.initialise(app); + }); + + beforeEach(() => { + ordnanceSurvey.getAddressesByPostcode = jest.fn(); + ordnanceSurvey.getAddressesByPostcode.mockResolvedValueOnce({ data: { results: [] } }); + }); + + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => get(aPostcodeAddressUrl), + makeRequestWithAuthHeader: (authHeader) => get(aPostcodeAddressUrl, { headers: { Authorization: authHeader } }) + }); + + withRoleAuthorisationTests({ + allowedRoles: [MAKER, DATA_ADMIN, READ_ONLY, ADMIN], + getUserWithRole: (role) => testUsers().withRole(role).one(), + getUserWithoutAnyRoles: () => testUsers().withoutAnyRoles().one(), + makeRequestAsUser: (user) => as(user).get(aPostcodeAddressUrl), + successStatusCode: 200, + }); +}); diff --git a/portal-api/api-tests/v1/gef/application-submit.api-test.js b/portal-api/api-tests/v1/gef/application-submit.api-test.js index 5203915b3b..bf82a5b9d9 100644 --- a/portal-api/api-tests/v1/gef/application-submit.api-test.js +++ b/portal-api/api-tests/v1/gef/application-submit.api-test.js @@ -38,6 +38,7 @@ const CONSTANTS = require('../../../src/constants'); const { PORTAL_ACTIVITY_LABEL, PORTAL_ACTIVITY_TYPE } = require('../../../src/v1/portalActivity-object-generator/activityConstants'); const mockFacilities = require('../../fixtures/gef/facilities'); +const { MAKER, CHECKER } = require('../../../src/v1/roles/roles'); describe('submissionPortalActivity()', () => { it('should return a populated array with submission activity object and MIA if submission count is 0', async () => { @@ -48,7 +49,7 @@ describe('submissionPortalActivity()', () => { await testUserCache.initialise(app); const userCollection = await db.getCollection('users'); // finds someone with role checker only - const checker = await userCollection.findOne({ roles: { $eq: ['checker'] } }); + const checker = await userCollection.findOne({ roles: { $eq: [CHECKER] } }); MOCK_APPLICATION.checkerId = checker._id; MOCK_APPLICATION.submissionType = CONSTANTS.DEAL.SUBMISSION_TYPE.MIA; MOCK_APPLICATION.portalActivities = []; @@ -92,7 +93,7 @@ describe('submissionPortalActivity()', () => { await wipeDB.wipe([dealsCollectionName]); const testUsers = await testUserCache.initialise(app); - const aMaker = testUsers().withRole('maker').one(); + const aMaker = testUsers().withRole(MAKER).one(); /* As _id's can change for checker, need to access db and find a checker @@ -100,7 +101,7 @@ describe('submissionPortalActivity()', () => { */ const userCollection = await db.getCollection('users'); // finds someone with role checker only - const checker = await userCollection.findOne({ roles: { $eq: ['checker'] } }); + const checker = await userCollection.findOne({ roles: { $eq: [CHECKER] } }); MOCK_APPLICATION_FACILITIES.checkerId = checker._id; MOCK_APPLICATION_FACILITIES.submissionType = CONSTANTS.DEAL.SUBMISSION_TYPE.MIA; MOCK_APPLICATION_FACILITIES.portalActivities = []; @@ -129,15 +130,15 @@ describe('submissionPortalActivity()', () => { await wipeDB.wipe([dealsCollectionName]); const testUsers = await testUserCache.initialise(app); - const aMaker = testUsers().withRole('maker').one(); - const aChecker = testUsers().withRole('checker').one(); + const aMaker = testUsers().withRole(MAKER).one(); + const aChecker = testUsers().withRole(CHECKER).one(); /* As _id's can change for checker, need to access db and find a checker These details then added to the MOCK_APPLICATION */ const userCollection = await db.getCollection('users'); // finds someone with role checker only - const checker = await userCollection.findOne({ roles: { $eq: ['checker'] } }); + const checker = await userCollection.findOne({ roles: { $eq: [CHECKER] } }); MOCK_APPLICATION_FACILITIES.checkerId = checker._id; MOCK_APPLICATION_FACILITIES.submissionType = CONSTANTS.DEAL.SUBMISSION_TYPE.AIN; MOCK_APPLICATION_FACILITIES.portalActivities = []; @@ -208,8 +209,8 @@ describe('updateChangedToIssued()', () => { beforeAll(async () => { const testUsers = await testUserCache.initialise(app); - aMaker = testUsers().withRole('maker').one(); - aChecker = testUsers().withRole('checker').one(); + aMaker = testUsers().withRole(MAKER).one(); + aChecker = testUsers().withRole(CHECKER).one(); mockApplication = await as(aMaker).post(mockApplications[0]).to(applicationBaseUrl); }); @@ -238,7 +239,7 @@ describe('updateChangedToIssued()', () => { // gets facilities from DB const { body } = await as(aChecker).get(baseUrl, mockQuery); - // gets value from body for changedToIssed + // gets value from body for changedToIssued const changedToIssuedValue = body.items[0].details.canResubmitIssuedFacilities; expect(changedToIssuedValue).toEqual(false); @@ -248,7 +249,7 @@ describe('updateChangedToIssued()', () => { describe('checkCoverDateConfirmed()', () => { it('Should return and set `coverDateConfirmed` to true with following conditions:\n\n1. AIN\n2. Have one issued facility \n3. Not yet submitted to UKEF', async () => { const testUsers = await testUserCache.initialise(app); - const aMaker = testUsers().withRole('maker').one(); + const aMaker = testUsers().withRole(MAKER).one(); const mockAIN = mockApplications[0]; let mockApplication = await as(aMaker).post(mockAIN).to(applicationBaseUrl); mockApplication = await as(aMaker).put({ submissionType: CONSTANTS.DEAL.SUBMISSION_TYPE.AIN }).to(`${applicationBaseUrl}/${mockApplication.body._id}`); @@ -268,7 +269,7 @@ describe('checkCoverDateConfirmed()', () => { it('Should return false and set `coverDateConfirmed` to false with following conditions:\n\n1. AIN\n2. Have one unissued facility and cover date is not true \n3. Not yet submitted to UKEF', async () => { const testUsers = await testUserCache.initialise(app); - const aMaker = testUsers().withRole('maker').one(); + const aMaker = testUsers().withRole(MAKER).one(); const mockAIN = mockApplications[0]; let mockApplication = await as(aMaker).post(mockAIN).to(applicationBaseUrl); mockApplication = await as(aMaker).put({ submissionType: CONSTANTS.DEAL.SUBMISSION_TYPE.AIN }).to(`${applicationBaseUrl}/${mockApplication.body._id}`); @@ -288,7 +289,7 @@ describe('checkCoverDateConfirmed()', () => { it('Should return true and set `coverDateConfirmed` to false with following conditions:\n\n1. MIA\n2. Have one issued facility \n3. Not yet submitted to UKEF', async () => { const testUsers = await testUserCache.initialise(app); - const aMaker = testUsers().withRole('maker').one(); + const aMaker = testUsers().withRole(MAKER).one(); const mockAIN = mockApplications[0]; let mockApplication = await as(aMaker).post(mockAIN).to(applicationBaseUrl); mockApplication = await as(aMaker).put({ submissionType: CONSTANTS.DEAL.SUBMISSION_TYPE.MIA }).to(`${applicationBaseUrl}/${mockApplication.body._id}`); @@ -308,7 +309,7 @@ describe('checkCoverDateConfirmed()', () => { it('Should return false and set `coverDateConfirmed` to false with following conditions:\n\n1. MIA\n2. Have one unissued facility \n3. Not yet submitted to UKEF', async () => { const testUsers = await testUserCache.initialise(app); - const aMaker = testUsers().withRole('maker').one(); + const aMaker = testUsers().withRole(MAKER).one(); const mockAIN = mockApplications[0]; let mockApplication = await as(aMaker).post(mockAIN).to(applicationBaseUrl); mockApplication = await as(aMaker).put({ submissionType: CONSTANTS.DEAL.SUBMISSION_TYPE.MIA }).to(`${applicationBaseUrl}/${mockApplication.body._id}`); @@ -328,7 +329,7 @@ describe('checkCoverDateConfirmed()', () => { it('Should return true and set `coverDateConfirmed` to false with following conditions:\n\n1. MIA\n2. Have one issued facility with cover date set to true \n3. Not yet submitted to UKEF', async () => { const testUsers = await testUserCache.initialise(app); - const aMaker = testUsers().withRole('maker').one(); + const aMaker = testUsers().withRole(MAKER).one(); const mockAIN = mockApplications[0]; let mockApplication = await as(aMaker).post(mockAIN).to(applicationBaseUrl); mockApplication = await as(aMaker).put({ submissionType: CONSTANTS.DEAL.SUBMISSION_TYPE.MIA }).to(`${applicationBaseUrl}/${mockApplication.body._id}`); @@ -348,7 +349,7 @@ describe('checkCoverDateConfirmed()', () => { it('Should return true and set `coverDateConfirmed` to false with following conditions:\n\n1. MIA\n2. Have one issued and unissued facilities with cover date set to true \n3. Not yet submitted to UKEF', async () => { const testUsers = await testUserCache.initialise(app); - const aMaker = testUsers().withRole('maker').one(); + const aMaker = testUsers().withRole(MAKER).one(); const mockAIN = mockApplications[0]; let mockApplication = await as(aMaker).post(mockAIN).to(applicationBaseUrl); mockApplication = await as(aMaker).put({ submissionType: CONSTANTS.DEAL.SUBMISSION_TYPE.MIA }).to(`${applicationBaseUrl}/${mockApplication.body._id}`); @@ -377,7 +378,7 @@ describe('checkCoverDateConfirmed()', () => { describe('addSubmissionDateToIssuedFacilities()', () => { it('if facility hasBeenIssued but not hasBeenIssuedAndAcknowledged then should add coverStartDate and submittedAsIssuedDate', async () => { const testUsers = await testUserCache.initialise(app); - const aMaker = testUsers().withRole('maker').one(); + const aMaker = testUsers().withRole(MAKER).one(); await wipeDB.wipe([facilitiesCollectionName]); await wipeDB.wipe([dealsCollectionName]); @@ -415,7 +416,7 @@ describe('addSubmissionDateToIssuedFacilities()', () => { it('if facility hasBeenIssued and hasBeenIssuedAndAcknowledged then should not override coverStartDate or submittedAsIssuedDate', async () => { const testUsers = await testUserCache.initialise(app); - const aMaker = testUsers().withRole('maker').one(); + const aMaker = testUsers().withRole(MAKER).one(); await wipeDB.wipe([facilitiesCollectionName]); await wipeDB.wipe([dealsCollectionName]); diff --git a/portal-api/api-tests/v1/gef/application.api-test.js b/portal-api/api-tests/v1/gef/application.api-test.js index 667edcca8c..f7db33e389 100644 --- a/portal-api/api-tests/v1/gef/application.api-test.js +++ b/portal-api/api-tests/v1/gef/application.api-test.js @@ -3,8 +3,11 @@ const wipeDB = require('../../wipeDB'); const app = require('../../../src/createApp'); const testUserCache = require('../../api-test-users'); +const { withClientAuthenticationTests } = require('../../common-tests/client-authentication-tests'); +const { withRoleAuthorisationTests } = require('../../common-tests/role-authorisation-tests'); +const { MAKER, CHECKER, READ_ONLY, DATA_ADMIN, ADMIN } = require('../../../src/v1/roles/roles'); -const { as } = require('../../api')(app); +const { as, get } = require('../../api')(app); const { expectMongoId } = require('../../expectMongoIds'); const { exporterStatus } = require('../../../src/v1/gef/controllers/validation/exporter'); @@ -34,12 +37,13 @@ const mockEligibilityCriteriaLatestVersion = mockEligibilityCriteria.find((crite describe(baseUrl, () => { let aMaker; let aChecker; + let testUsers; const tfmDealSubmitSpy = jest.fn(() => Promise.resolve()); beforeAll(async () => { - const testUsers = await testUserCache.initialise(app); - aMaker = testUsers().withRole('maker').one(); - aChecker = testUsers().withRole('checker').one(); + testUsers = await testUserCache.initialise(app); + aMaker = testUsers().withRole(MAKER).one(); + aChecker = testUsers().withRole(CHECKER).one(); }); beforeEach(async () => { @@ -53,9 +57,17 @@ describe(baseUrl, () => { }); describe(`GET ${baseUrl}`, () => { - it('rejects requests that do not present a valid Authorization token', async () => { - const { status } = await as().get(baseUrl); - expect(status).toEqual(401); + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => get(baseUrl), + makeRequestWithAuthHeader: (authHeader) => get(baseUrl, { headers: { Authorization: authHeader } }) + }); + + withRoleAuthorisationTests({ + allowedRoles: [MAKER, CHECKER, READ_ONLY, DATA_ADMIN, ADMIN], + getUserWithRole: (role) => testUsers().withRole(role).one(), + getUserWithoutAnyRoles: () => testUsers().withoutAnyRoles().one(), + makeRequestAsUser: (user) => as(user).get(baseUrl), + successStatusCode: 200, }); it('returns list of all items', async () => { @@ -117,20 +129,28 @@ describe(baseUrl, () => { }); describe(`GET ${baseUrl}/:id`, () => { - it('rejects requests that do not present a valid Authorization token', async () => { - const { status } = await as().get(`${baseUrl}/1`); - expect(status).toEqual(401); + let oneApplicationUrl; + + beforeEach(async () => { + const { body: { _id: applicationId } } = await as(aMaker).post(mockApplications[0]).to(baseUrl); + oneApplicationUrl = `${baseUrl}/${applicationId}`; }); - it('accepts requests that present a valid Authorization token with "maker" role', async () => { - const item = await as(aMaker).post(mockApplications[0]).to(baseUrl); - const { status } = await as(aMaker).get(`${baseUrl}/${item.body._id}`); - expect(status).toEqual(200); + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => get(oneApplicationUrl), + makeRequestWithAuthHeader: (authHeader) => get(oneApplicationUrl, { headers: { Authorization: authHeader } }) + }); + + withRoleAuthorisationTests({ + allowedRoles: [MAKER, CHECKER, READ_ONLY, DATA_ADMIN, ADMIN], + getUserWithRole: (role) => testUsers().withRole(role).one(), + getUserWithoutAnyRoles: () => testUsers().withoutAnyRoles().one(), + makeRequestAsUser: (user) => as(user).get(oneApplicationUrl), + successStatusCode: 200, }); it('returns an individual item', async () => { - const item = await as(aMaker).post(mockApplications[0]).to(baseUrl); - const { body } = await as(aMaker).get(`${baseUrl}/${item.body._id}`); + const { body } = await as(aMaker).get(oneApplicationUrl); const expected = { ...mockApplications[0], exporter: { @@ -174,20 +194,28 @@ describe(baseUrl, () => { }); describe(`GET ${baseUrl}/status/:id`, () => { - it('rejects requests that do not present a valid Authorization token', async () => { - const { status } = await as().get(`${baseUrl}/status/1`); - expect(status).toEqual(401); + let oneApplicationStatusUrl; + + beforeEach(async () => { + const { body: { _id: applicationId } } = await as(aMaker).post(mockApplications[0]).to(baseUrl); + oneApplicationStatusUrl = `${baseUrl}/status/${applicationId}`; }); - it('accepts requests that present a valid Authorization token with "maker" role', async () => { - const item = await as(aMaker).post(mockApplications[0]).to(baseUrl); - const { status } = await as(aMaker).get(`${baseUrl}/status/${item.body._id}`); - expect(status).toEqual(200); + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => get(oneApplicationStatusUrl), + makeRequestWithAuthHeader: (authHeader) => get(oneApplicationStatusUrl, { headers: { Authorization: authHeader } }) + }); + + withRoleAuthorisationTests({ + allowedRoles: [MAKER, CHECKER, READ_ONLY, DATA_ADMIN, ADMIN], + getUserWithRole: (role) => testUsers().withRole(role).one(), + getUserWithoutAnyRoles: () => testUsers().withoutAnyRoles().one(), + makeRequestAsUser: (user) => as(user).get(oneApplicationStatusUrl), + successStatusCode: 200, }); it('returns a status', async () => { - const item = await as(aMaker).post(mockApplications[0]).to(baseUrl); - const { body } = await as(aMaker).get(`${baseUrl}/status/${item.body._id}`); + const { body } = await as(aMaker).get(oneApplicationStatusUrl); expect(body).toEqual({ status: CONSTANTS.DEAL.DEAL_STATUS.DRAFT }); }); diff --git a/portal-api/api-tests/v1/gef/clone-gef-deal.api-test.js b/portal-api/api-tests/v1/gef/clone-gef-deal.api-test.js index ddbd7cf364..d0753a8686 100644 --- a/portal-api/api-tests/v1/gef/clone-gef-deal.api-test.js +++ b/portal-api/api-tests/v1/gef/clone-gef-deal.api-test.js @@ -14,6 +14,7 @@ const mockApplication = { bankInternalRefName: 'Updated Ref Name - Unit Test', submissionType: CONSTANTS.DEAL.SUBMISSION_TYPE.AIN, }; +const { MAKER, CHECKER } = require('../../../src/v1/roles/roles'); describe(baseUrl, () => { let aMaker; @@ -23,9 +24,9 @@ describe(baseUrl, () => { beforeAll(async () => { const testUsers = await testUserCache.initialise(app); - aChecker = testUsers().withRole('checker').one(); - aMaker = testUsers().withRole('maker').withBankName('Barclays Bank').one(); - anotherMaker = testUsers().withRole('maker').withBankName('HSBC').one(); + aChecker = testUsers().withRole(CHECKER).one(); + aMaker = testUsers().withRole(MAKER).withBankName('Barclays Bank').one(); + anotherMaker = testUsers().withRole(MAKER).withBankName('HSBC').one(); }); beforeEach(async () => { diff --git a/portal-api/api-tests/v1/gef/company.api-test.js b/portal-api/api-tests/v1/gef/company.api-test.js new file mode 100644 index 0000000000..ca26b5ec7f --- /dev/null +++ b/portal-api/api-tests/v1/gef/company.api-test.js @@ -0,0 +1,51 @@ +const app = require('../../../src/createApp'); +const { MAKER, DATA_ADMIN, READ_ONLY, ADMIN } = require('../../../src/v1/roles/roles'); +const testUserCache = require('../../api-test-users'); +const { withClientAuthenticationTests } = require('../../common-tests/client-authentication-tests'); +const { withRoleAuthorisationTests } = require('../../common-tests/role-authorisation-tests'); +const { COMPANIES_HOUSE_NUMBER } = require('../../fixtures/companies-house-number'); +const { POSTCODE } = require('../../fixtures/postcode'); +const { companiesHouse } = require('../../../src/external-api/api'); + +const { as, get } = require('../../api')(app); + +describe('GET /v1/gef/company/:number', () => { + const aCompanyNumberUrl = `/v1/gef/company/${COMPANIES_HOUSE_NUMBER.VALID}`; + let testUsers; + + beforeAll(async () => { + testUsers = await testUserCache.initialise(app); + }); + + beforeEach(() => { + companiesHouse.getCompanyProfileByCompanyRegistrationNumber = jest.fn(); + companiesHouse.getCompanyProfileByCompanyRegistrationNumber.mockResolvedValueOnce({ + data: { + sic_codes: [], + company_number: COMPANIES_HOUSE_NUMBER.VALID, + company_name: 'Test Co.', + registered_office_address: { + organisation_name: 'Test Org', + address_line_1: '1 Test Road', + address_line_2: 'Test Place', + locality: 'London', + postal_code: POSTCODE.VALID, + country: 'Great Britain', + }, + } + }); + }); + + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => get(aCompanyNumberUrl), + makeRequestWithAuthHeader: (authHeader) => get(aCompanyNumberUrl, { headers: { Authorization: authHeader } }) + }); + + withRoleAuthorisationTests({ + allowedRoles: [MAKER, DATA_ADMIN, READ_ONLY, ADMIN], + getUserWithRole: (role) => testUsers().withRole(role).one(), + getUserWithoutAnyRoles: () => testUsers().withoutAnyRoles().one(), + makeRequestAsUser: (user) => as(user).get(aCompanyNumberUrl), + successStatusCode: 200, + }); +}); diff --git a/portal-api/api-tests/v1/gef/eligibility-criteria.api-test.js b/portal-api/api-tests/v1/gef/eligibility-criteria.api-test.js index c49bdc0fe3..5516876155 100644 --- a/portal-api/api-tests/v1/gef/eligibility-criteria.api-test.js +++ b/portal-api/api-tests/v1/gef/eligibility-criteria.api-test.js @@ -3,8 +3,11 @@ const wipeDB = require('../../wipeDB'); const app = require('../../../src/createApp'); const testUserCache = require('../../api-test-users'); +const { withClientAuthenticationTests } = require('../../common-tests/client-authentication-tests'); +const { withRoleAuthorisationTests } = require('../../common-tests/role-authorisation-tests'); +const { MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN } = require('../../../src/v1/roles/roles'); -const { as } = require('../../api')(app); +const { as, get, post, remove } = require('../../api')(app); const { expectMongoId } = require('../../expectMongoIds'); const items = require('../../fixtures/gef/eligibilityCriteria'); @@ -14,11 +17,12 @@ const baseUrl = '/v1/gef/eligibility-criteria'; describe(baseUrl, () => { let aMaker; let anEditor; + let testUsers; beforeAll(async () => { - const testUsers = await testUserCache.initialise(app); - aMaker = testUsers().withRole('maker').one(); - anEditor = testUsers().withRole('editor').one(); + testUsers = await testUserCache.initialise(app); + aMaker = testUsers().withRole(MAKER).one(); + anEditor = testUsers().withRole(EDITOR).one(); }); beforeEach(async () => { @@ -26,36 +30,42 @@ describe(baseUrl, () => { }); describe(`GET ${baseUrl}`, () => { - it('rejects requests that do not present a valid Authorization token', async () => { - const { status } = await as().get(baseUrl); - expect(status).toEqual(401); + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => get(baseUrl), + makeRequestWithAuthHeader: (authHeader) => get(baseUrl, { headers: { Authorization: authHeader } }) }); - it('accepts requests that present a valid Authorization token', async () => { - const { status } = await as(aMaker).get(baseUrl); - expect(status).toEqual(200); + withRoleAuthorisationTests({ + allowedRoles: [MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN], + getUserWithRole: (role) => testUsers().withRole(role).one(), + getUserWithoutAnyRoles: () => testUsers().withoutAnyRoles().one(), + makeRequestAsUser: (user) => as(user).get(baseUrl), + successStatusCode: 200, }); }); describe(`GET ${baseUrl}/latest`, () => { - it('rejects requests that do not present a valid Authorization token', async () => { - const { status } = await as().get(`${baseUrl}/latest`); + const latestEligibilityCriteriaUrl = `${baseUrl}/latest`; - expect(status).toEqual(401); + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => get(latestEligibilityCriteriaUrl), + makeRequestWithAuthHeader: (authHeader) => get(latestEligibilityCriteriaUrl, { headers: { Authorization: authHeader } }) }); - it('accepts requests that present a valid Authorization token', async () => { - const { status } = await as(aMaker).get(`${baseUrl}/latest`); - - expect(status).toEqual(200); + withRoleAuthorisationTests({ + allowedRoles: [MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN], + getUserWithRole: (role) => testUsers().withRole(role).one(), + getUserWithoutAnyRoles: () => testUsers().withoutAnyRoles().one(), + makeRequestAsUser: (user) => as(user).get(latestEligibilityCriteriaUrl), + successStatusCode: 200, }); - it('returns the latest eligibilty-criteria version', async () => { + it('returns the latest eligibility-criteria version', async () => { await as(anEditor).post(items[0]).to(baseUrl); await as(anEditor).post(items[1]).to(baseUrl); await as(anEditor).post(items[2]).to(baseUrl); - const { body } = await as(aMaker).get(`${baseUrl}/latest`); + const { body } = await as(aMaker).get(latestEligibilityCriteriaUrl); expect(body).toEqual(expect.objectContaining({ ...expectMongoId(items[1]), @@ -66,9 +76,19 @@ describe(baseUrl, () => { }); describe(`GET ${baseUrl}/:version`, () => { - it('rejects requests that do not present a valid Authorization token', async () => { - const { status } = await as().get(`${baseUrl}/1`); - expect(status).toEqual(401); + const eligibilityCriteria1Url = `${baseUrl}/1`; + + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => get(eligibilityCriteria1Url), + makeRequestWithAuthHeader: (authHeader) => get(eligibilityCriteria1Url, { headers: { Authorization: authHeader } }) + }); + + withRoleAuthorisationTests({ + allowedRoles: [MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN], + getUserWithRole: (role) => testUsers().withRole(role).one(), + getUserWithoutAnyRoles: () => testUsers().withoutAnyRoles().one(), + makeRequestAsUser: (user) => as(user).get(eligibilityCriteria1Url), + successStatusCode: 200, }); it('returns a 404 if there are no records', async () => { @@ -76,12 +96,6 @@ describe(baseUrl, () => { expect(status).toEqual(404); }); - it('accepts requests that do present a valid Authorization token', async () => { - await as(anEditor).post(items[0]).to(baseUrl); - const { status } = await as(aMaker).get(`${baseUrl}/${items[0].version}`); - expect(status).toEqual(200); - }); - it('returns an eligibility criteria', async () => { await as(anEditor).post(items[0]).to(baseUrl); const { status, body } = await as(anEditor).get(`${baseUrl}/${items[0].version}`); @@ -98,40 +112,39 @@ describe(baseUrl, () => { }); describe(`POST ${baseUrl}`, () => { - it('rejects requests that do not present a valid Authorization token', async () => { - const { status } = await as().post(items[0]).to(baseUrl); - expect(status).toEqual(401); + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => post(baseUrl, items[0]), + makeRequestWithAuthHeader: (authHeader) => post(baseUrl, items[0], { headers: { Authorization: authHeader } }) }); - it('rejects requests that present a valid Authorization token but do not have "editor" role', async () => { - const { status } = await as(aMaker).post(items[0]).to(baseUrl); - - expect(status).toEqual(401); - }); - - it('accepts requests that present a valid Authorization token with "editor" role', async () => { - const { status } = await as(anEditor).post(items[0]).to(baseUrl); - - expect(status).toEqual(201); + withRoleAuthorisationTests({ + allowedRoles: [ADMIN, EDITOR, DATA_ADMIN], + getUserWithRole: (role) => testUsers().withRole(role).one(), + getUserWithoutAnyRoles: () => testUsers().withoutAnyRoles().one(), + makeRequestAsUser: (user) => as(user).post(items[0]).to(baseUrl), + successStatusCode: 201, }); }); describe(`DELETE ${baseUrl}/:version`, () => { - it('rejects requests that do not present a valid Authorization token', async () => { - await as(anEditor).post(items[0]).to(baseUrl); - const { status } = await as().remove(`${baseUrl}/${items[0].version}`); - expect(status).toEqual(401); + const eligibilityCriteria1Url = `${baseUrl}/1`; + + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => remove(eligibilityCriteria1Url), + makeRequestWithAuthHeader: (authHeader) => remove(eligibilityCriteria1Url, { headers: { Authorization: authHeader } }) }); - it('accepts requests that present a valid Authorization token with "editor" role', async () => { - await as(anEditor).post(items[0]).to(baseUrl); - const { status } = await as(anEditor).remove(`${baseUrl}/${items[0].version}`); - expect(status).toEqual(200); + withRoleAuthorisationTests({ + allowedRoles: [ADMIN, EDITOR, DATA_ADMIN], + getUserWithRole: (role) => testUsers().withRole(role).one(), + getUserWithoutAnyRoles: () => testUsers().withoutAnyRoles().one(), + makeRequestAsUser: (user) => as(user).remove(eligibilityCriteria1Url), + successStatusCode: 200, }); - it('deletes the eligibilty-criteria', async () => { + it('deletes the eligibility-criteria', async () => { // eslint-disable-next-line no-unused-vars - const { body: createdItem } = await as(anEditor).post(items[0]).to(baseUrl); + await as(anEditor).post(items[0]).to(baseUrl); const { body: item } = await as(anEditor).get(`${baseUrl}/${items[0].version}`); const { status, body } = await as(anEditor).remove(`${baseUrl}/${items[0].version}`); diff --git a/portal-api/api-tests/v1/gef/external-api.api-test.js b/portal-api/api-tests/v1/gef/external-api.api-test.js index 2e9cd5818e..59b8c24b51 100644 --- a/portal-api/api-tests/v1/gef/external-api.api-test.js +++ b/portal-api/api-tests/v1/gef/external-api.api-test.js @@ -1,6 +1,9 @@ const app = require('../../../src/createApp'); const testUserCache = require('../../api-test-users'); const { as } = require('../../api')(app); +const { MAKER } = require('../../../src/v1/roles/roles'); + +jest.unmock('../../../src/external-api/api'); const baseUrl = '/v1/gef'; @@ -9,7 +12,7 @@ describe(baseUrl, () => { beforeAll(async () => { const testUsers = await testUserCache.initialise(app); - aMaker = testUsers().withRole('maker').one(); + aMaker = testUsers().withRole(MAKER).one(); }); describe(`GET ${baseUrl}/company (Companies House)`, () => { diff --git a/portal-api/api-tests/v1/gef/facilities.api-test.js b/portal-api/api-tests/v1/gef/facilities.api-test.js index 7177372456..7a926c69e8 100644 --- a/portal-api/api-tests/v1/gef/facilities.api-test.js +++ b/portal-api/api-tests/v1/gef/facilities.api-test.js @@ -8,8 +8,11 @@ const { const app = require('../../../src/createApp'); const testUserCache = require('../../api-test-users'); +const { withClientAuthenticationTests } = require('../../common-tests/client-authentication-tests'); +const { withRoleAuthorisationTests } = require('../../common-tests/role-authorisation-tests'); +const { MAKER, CHECKER, READ_ONLY, DATA_ADMIN, ADMIN } = require('../../../src/v1/roles/roles'); -const { as } = require('../../api')(app); +const { as, get } = require('../../api')(app); const baseUrl = '/v1/gef/facilities'; const mockFacilities = require('../../fixtures/gef/facilities'); @@ -28,10 +31,11 @@ describe(baseUrl, () => { let mockApplication; let newFacility; let completeUpdate; + let testUsers; beforeAll(async () => { - const testUsers = await testUserCache.initialise(app); - aMaker = testUsers().withRole('maker').one(); + testUsers = await testUserCache.initialise(app); + aMaker = testUsers().withRole(MAKER).one(); mockApplication = await as(aMaker).post(mockApplications[0]).to(applicationBaseUrl); newFacility = { @@ -101,6 +105,21 @@ describe(baseUrl, () => { }); describe(`GET ${baseUrl}?dealId=`, () => { + const facilitiesUrl = `${baseUrl}?dealId=620a1aa095a618b12da38c7b`; + + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => get(facilitiesUrl), + makeRequestWithAuthHeader: (authHeader) => get(facilitiesUrl, { headers: { Authorization: authHeader } }) + }); + + withRoleAuthorisationTests({ + allowedRoles: [MAKER, CHECKER, READ_ONLY, DATA_ADMIN, ADMIN], + getUserWithRole: (role) => testUsers().withRole(role).one(), + getUserWithoutAnyRoles: () => testUsers().withoutAnyRoles().one(), + makeRequestAsUser: (user) => as(user).get(facilitiesUrl), + successStatusCode: 200, + }); + it('returns a 400 error if the dealId is not a valid mongo id', async () => { const { status, body } = await as(aMaker).get(`${baseUrl}?dealId=123`); expect(status).toEqual(400); @@ -109,20 +128,30 @@ describe(baseUrl, () => { }); describe(`GET ${baseUrl}/:id`, () => { - it('rejects requests that do not present a valid Authorization token', async () => { - const { status } = await as().get(`${baseUrl}/1`); - expect(status).toEqual(401); + let oneFacilityUrl; + + beforeEach(async () => { + const { body: { details: { _id: createdFacilityId } } } = await as(aMaker) + .post({ dealId: mockApplication.body._id, type: FACILITY_TYPE.CASH, hasBeenIssued: false }) + .to(baseUrl); + oneFacilityUrl = `${baseUrl}/${createdFacilityId}`; }); - it('accepts requests that present a valid Authorization token with "maker" role', async () => { - const item = await as(aMaker).post({ dealId: mockApplication.body._id, type: FACILITY_TYPE.CASH, hasBeenIssued: false }).to(baseUrl); - const { status } = await as(aMaker).get(`${baseUrl}/${item.body.details._id}`); - expect(status).toEqual(200); + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => get(oneFacilityUrl), + makeRequestWithAuthHeader: (authHeader) => get(oneFacilityUrl, { headers: { Authorization: authHeader } }) + }); + + withRoleAuthorisationTests({ + allowedRoles: [MAKER, CHECKER, READ_ONLY, DATA_ADMIN, ADMIN], + getUserWithRole: (role) => testUsers().withRole(role).one(), + getUserWithoutAnyRoles: () => testUsers().withoutAnyRoles().one(), + makeRequestAsUser: (user) => as(user).get(oneFacilityUrl), + successStatusCode: 200, }); it('returns an individual item', async () => { - const item = await as(aMaker).post({ dealId: mockApplication.body._id, type: FACILITY_TYPE.CASH, hasBeenIssued: false }).to(baseUrl); - const { body } = await as(aMaker).get(`${baseUrl}/${item.body.details._id}`); + const { body } = await as(aMaker).get(oneFacilityUrl); expect(body).toEqual(newFacility); }); diff --git a/portal-api/api-tests/v1/gef/files.api-test.js b/portal-api/api-tests/v1/gef/files.api-test.js index e077335f02..e9ebf1c406 100644 --- a/portal-api/api-tests/v1/gef/files.api-test.js +++ b/portal-api/api-tests/v1/gef/files.api-test.js @@ -3,9 +3,12 @@ const { ObjectId } = require('mongodb'); const wipeDB = require('../../wipeDB'); const app = require('../../../src/createApp'); const testUserCache = require('../../api-test-users'); -const { as } = require('../../api')(app); +const { as, get, remove, postMultipartForm } = require('../../api')(app); const { uploadFile, deleteFile, readFile } = require('../../../src/drivers/fileshare'); const CONSTANTS = require('../../../src/constants'); +const { withClientAuthenticationTests } = require('../../common-tests/client-authentication-tests'); +const { withRoleAuthorisationTests } = require('../../common-tests/role-authorisation-tests'); +const { MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN } = require('../../../src/v1/roles/roles'); const baseUrl = '/v1/gef/files'; const collectionName = 'files'; @@ -27,16 +30,16 @@ jest.mock('../../../src/drivers/fileshare', () => ({ })); describe(baseUrl, () => { + const testBankName = 'Barclays Bank'; let aMaker; - let aChecker; let invalidMaker; let mockDeal; + let testUsers; beforeAll(async () => { - const testUsers = await testUserCache.initialise(app); - aMaker = testUsers().withRole('maker').withBankName('UKEF test bank (Delegated)').one(); - aChecker = testUsers().withRole('checker').withBankName('UKEF test bank (Delegated)').one(); - invalidMaker = testUsers().withRole('maker').withBankName('HSBC').one(); + testUsers = await testUserCache.initialise(app); + aMaker = testUsers().withRole(MAKER).withBankName(testBankName).one(); + invalidMaker = testUsers().withRole(MAKER).withBankName('HSBC').one(); await wipeDB.wipe([applicationCollectionName]); @@ -61,9 +64,26 @@ describe(baseUrl, () => { }); describe(`POST ${baseUrl}`, () => { - it('rejects requests that do not present a valid Authorization token', async () => { - const { status } = await as().post({}).to(baseUrl); - expect(status).toEqual(401); + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => postMultipartForm({ + url: baseUrl, + data: { parentId: mockDeal.body._id }, + files: [], + }), + makeRequestWithAuthHeader: (authHeader) => postMultipartForm({ + url: baseUrl, + data: { parentId: mockDeal.body._id }, + files: [], + headers: { Authorization: authHeader } + }), + }); + + withRoleAuthorisationTests({ + allowedRoles: [MAKER], + getUserWithRole: (role) => testUsers().withBankName(testBankName).withRole(role).one(), + getUserWithoutAnyRoles: () => testUsers().withBankName(testBankName).withoutAnyRoles().one(), + makeRequestAsUser: (user) => as(user).postMultipartForm({ parentId: mockDeal.body._id }, validFiles).to(baseUrl), + successStatusCode: 201, }); it('rejects requests that are missing a parentId', async () => { @@ -94,12 +114,6 @@ describe(baseUrl, () => { expect(status).toEqual(401); }); - it('rejects requests that do not have "maker" role', async () => { - const { status } = await as(aChecker).postMultipartForm({ parentId: mockDeal.body._id }, validFiles).to(baseUrl); - - expect(status).toEqual(401); - }); - it('shows errors for files that are invalid', async () => { const invalidFiles = [ { @@ -147,9 +161,27 @@ describe(baseUrl, () => { }); describe(`GET ${baseUrl}/:id`, () => { - it('rejects requests that do not present a valid Authorization token', async () => { - const { status } = await as().get(`${baseUrl}/1`); - expect(status).toEqual(401); + let oneFileUrl; + + beforeEach(async () => { + const { body } = await as(aMaker) + .postMultipartForm({ parentId: mockDeal.body._id }, validFiles) + .to(baseUrl); + const createdId = body[0]._id; + oneFileUrl = `${baseUrl}/${createdId}`; + }); + + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => get(oneFileUrl), + makeRequestWithAuthHeader: (authHeader) => get(oneFileUrl, { headers: { Authorization: authHeader } }) + }); + + withRoleAuthorisationTests({ + allowedRoles: [MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN], + getUserWithRole: (role) => testUsers().withBankName(testBankName).withRole(role).one(), + getUserWithoutAnyRoles: () => testUsers().withBankName(testBankName).withoutAnyRoles().one(), + makeRequestAsUser: (user) => as(user).get(oneFileUrl), + successStatusCode: 200, }); it('returns 404 if files is not found', async () => { @@ -158,30 +190,40 @@ describe(baseUrl, () => { }); it('rejects requests that do not have access to deal', async () => { - const { body } = await as(aMaker) - .postMultipartForm({ parentId: mockDeal.body._id }, validFiles) - .to(baseUrl); - - const { status } = await as(invalidMaker).get(`${baseUrl}/${body[0]._id}`); + const { status } = await as(invalidMaker).get(oneFileUrl); expect(status).toEqual(401); }); it('returns file information when available', async () => { - const { body } = await as(aMaker) - .postMultipartForm({ parentId: mockDeal.body._id }, validFiles) - .to(baseUrl); - - const { status } = await as(aMaker).get(`${baseUrl}/${body[0]._id}`); + const { status } = await as(aMaker).get(oneFileUrl); expect(status).toEqual(200); }); }); describe(`DELETE ${baseUrl}/:id`, () => { - it('rejects requests that do not present a valid Authorization token', async () => { - const { status } = await as().remove(`${baseUrl}/1`); - expect(status).toEqual(401); + let oneFileUrl; + + beforeEach(async () => { + const { body } = await as(aMaker) + .postMultipartForm({ parentId: mockDeal.body._id }, validFiles) + .to(baseUrl); + const createdId = body[0]._id; + oneFileUrl = `${baseUrl}/${createdId}`; + }); + + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => remove(oneFileUrl), + makeRequestWithAuthHeader: (authHeader) => remove(oneFileUrl, { headers: { Authorization: authHeader } }) + }); + + withRoleAuthorisationTests({ + allowedRoles: [MAKER, DATA_ADMIN], + getUserWithRole: (role) => testUsers().withBankName(testBankName).withRole(role).one(), + getUserWithoutAnyRoles: () => testUsers().withBankName(testBankName).withoutAnyRoles().one(), + makeRequestAsUser: (user) => as(user).remove(oneFileUrl), + successStatusCode: 200, }); it('returns 404 if files is not found', async () => { @@ -199,16 +241,6 @@ describe(baseUrl, () => { expect(status).toEqual(401); }); - it('rejects requests that aare not by a maker', async () => { - const { body } = await as(aMaker) - .postMultipartForm({ parentId: mockDeal.body._id }, validFiles) - .to(baseUrl); - - const { status } = await as(aChecker).remove(`${baseUrl}/${body[0]._id}`); - - expect(status).toEqual(401); - }); - it('deletes the file', async () => { const { body } = await as(aMaker) .postMultipartForm({ parentId: mockDeal.body._id }, validFiles) @@ -233,9 +265,27 @@ describe(baseUrl, () => { }); describe(`GET ${baseUrl}/:id/download`, () => { - it('rejects requests that do not present a valid Authorization token', async () => { - const { status } = await as().get(`${baseUrl}/1/download`); - expect(status).toEqual(401); + let oneFileDownloadUrl; + + beforeEach(async () => { + const { body } = await as(aMaker) + .postMultipartForm({ parentId: mockDeal.body._id }, validFiles) + .to(baseUrl); + const createdId = body[0]._id; + oneFileDownloadUrl = `${baseUrl}/${createdId}/download`; + }); + + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => get(oneFileDownloadUrl), + makeRequestWithAuthHeader: (authHeader) => get(oneFileDownloadUrl, { headers: { Authorization: authHeader } }) + }); + + withRoleAuthorisationTests({ + allowedRoles: [MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN], + getUserWithRole: (role) => testUsers().withBankName(testBankName).withRole(role).one(), + getUserWithoutAnyRoles: () => testUsers().withBankName(testBankName).withoutAnyRoles().one(), + makeRequestAsUser: (user) => as(user).get(oneFileDownloadUrl), + successStatusCode: 200, }); it('returns 404 if files is not found', async () => { @@ -244,11 +294,7 @@ describe(baseUrl, () => { }); it('rejects requests that do not have access to deal', async () => { - const { body } = await as(aMaker) - .postMultipartForm({ parentId: mockDeal.body._id }, validFiles) - .to(baseUrl); - - const { status } = await as(invalidMaker).get(`${baseUrl}/${body[0]._id}/download`); + const { status } = await as(invalidMaker).get(oneFileDownloadUrl); expect(status).toEqual(401); }); @@ -267,13 +313,9 @@ describe(baseUrl, () => { }); it('posts 500 if there is an error', async () => { - const { body } = await as(aMaker) - .postMultipartForm({ parentId: mockDeal.body._id }, validFiles) - .to(baseUrl); - readFile.mockRejectedValueOnce(new Error('mock error')); - const { status } = await as(aMaker).get(`${baseUrl}/${body[0]._id}/download`); + const { status } = await as(aMaker).get(oneFileDownloadUrl); expect(status).toEqual(500); }); diff --git a/portal-api/api-tests/v1/gef/mandatory-criteria-versioned.api-test.js b/portal-api/api-tests/v1/gef/mandatory-criteria-versioned.api-test.js index 65269bdc93..8bf0350ffa 100644 --- a/portal-api/api-tests/v1/gef/mandatory-criteria-versioned.api-test.js +++ b/portal-api/api-tests/v1/gef/mandatory-criteria-versioned.api-test.js @@ -2,8 +2,11 @@ const wipeDB = require('../../wipeDB'); const app = require('../../../src/createApp'); const testUserCache = require('../../api-test-users'); +const { withClientAuthenticationTests } = require('../../common-tests/client-authentication-tests'); +const { withRoleAuthorisationTests } = require('../../common-tests/role-authorisation-tests'); +const { MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN } = require('../../../src/v1/roles/roles'); -const { as } = require('../../api')(app); +const { as, get } = require('../../api')(app); const { expectMongoId } = require('../../expectMongoIds'); const allMandatoryCriteria = require('../../fixtures/gef/mandatoryCriteriaVersioned'); @@ -19,11 +22,12 @@ const baseUrl = '/v1/gef/mandatory-criteria-versioned'; describe(baseUrl, () => { let aMaker; let anEditor; + let testUsers; beforeAll(async () => { - const testUsers = await testUserCache.initialise(app); - aMaker = testUsers().withRole('maker').one(); - anEditor = testUsers().withRole('editor').one(); + testUsers = await testUserCache.initialise(app); + aMaker = testUsers().withRole(MAKER).one(); + anEditor = testUsers().withRole(EDITOR).one(); }); beforeEach(async () => { @@ -31,32 +35,47 @@ describe(baseUrl, () => { }); describe('GET /v1/gef/mandatory-criteria-versioned', () => { - it('rejects requests that do not present a valid Authorization token', async () => { - const { status } = await as().get(baseUrl); - expect(status).toEqual(401); + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => get(baseUrl), + makeRequestWithAuthHeader: (authHeader) => get(baseUrl, { headers: { Authorization: authHeader } }) }); - it('accepts requests that present a valid Authorization token', async () => { - const { status } = await as(aMaker).get(baseUrl); - expect(status).toEqual(200); + withRoleAuthorisationTests({ + allowedRoles: [MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN], + getUserWithRole: (role) => testUsers().withRole(role).one(), + getUserWithoutAnyRoles: () => testUsers().withoutAnyRoles().one(), + makeRequestAsUser: (user) => as(user).get(baseUrl), + successStatusCode: 200, }); }); describe('GET /v1/gef/mandatory-criteria-versioned/latest', () => { - it('rejects requests that do not present a valid Authorization token', async () => { - const { status } = await as().get(`${baseUrl}/latest`); + const latestMandatoryCriteriaVersionedUrl = `${baseUrl}/latest`; - expect(status).toEqual(401); + beforeEach(async () => { + await as(anEditor).post(allMandatoryCriteria[0]).to(baseUrl); + }); + + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => get(latestMandatoryCriteriaVersionedUrl), + makeRequestWithAuthHeader: (authHeader) => get(latestMandatoryCriteriaVersionedUrl, { headers: { Authorization: authHeader } }) + }); + + withRoleAuthorisationTests({ + allowedRoles: [MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN], + getUserWithRole: (role) => testUsers().withRole(role).one(), + getUserWithoutAnyRoles: () => testUsers().withoutAnyRoles().one(), + makeRequestAsUser: (user) => as(user).get(latestMandatoryCriteriaVersionedUrl), + successStatusCode: 200, }); it('returns the latest mandatory-criteria version', async () => { - await as(anEditor).post(allMandatoryCriteria[0]).to(baseUrl); await as(anEditor).post(allMandatoryCriteria[1]).to(baseUrl); await as(anEditor).post(allMandatoryCriteria[2]).to(baseUrl); await as(anEditor).post(allMandatoryCriteria[3]).to(baseUrl); await as(anEditor).post(allMandatoryCriteria[4]).to(baseUrl); - const { body } = await as(aMaker).get(`${baseUrl}/latest`); + const { body } = await as(aMaker).get(latestMandatoryCriteriaVersionedUrl); expect(body).toEqual(expect.objectContaining({ ...expectMongoId(allMandatoryCriteria[2]), @@ -73,21 +92,28 @@ describe(baseUrl, () => { }); describe('GET /v1/gef/mandatory-criteria-versioned/:id', () => { - it('rejects requests that do not present a valid Authorization token', async () => { - const { status } = await as().get(`${baseUrl}/12345678`); - expect(status).toEqual(401); + let oneMandatoryCriteriaVersionedUrl; + + beforeEach(async () => { + const { body: { _id: newId } } = await as(anEditor).post(newMandatoryCriteria).to(baseUrl); + oneMandatoryCriteriaVersionedUrl = `${baseUrl}/${newId}`; }); - it('accepts requests that do present a valid Authorization token', async () => { - const item = await as(anEditor).post(newMandatoryCriteria).to(baseUrl); + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => get(oneMandatoryCriteriaVersionedUrl), + makeRequestWithAuthHeader: (authHeader) => get(oneMandatoryCriteriaVersionedUrl, { headers: { Authorization: authHeader } }) + }); - const { status } = await as(aMaker).get(`${baseUrl}/${item.body._id}`); - expect(status).toEqual(200); + withRoleAuthorisationTests({ + allowedRoles: [MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN], + getUserWithRole: (role) => testUsers().withRole(role).one(), + getUserWithoutAnyRoles: () => testUsers().withoutAnyRoles().one(), + makeRequestAsUser: (user) => as(user).get(oneMandatoryCriteriaVersionedUrl), + successStatusCode: 200, }); it('returns a mandatory-criteria-versioned', async () => { - const item = await as(anEditor).post(newMandatoryCriteria).to(baseUrl); - const { status, body } = await as(anEditor).get(`${baseUrl}/${item.body._id}`); + const { status, body } = await as(anEditor).get(oneMandatoryCriteriaVersionedUrl); expect(status).toEqual(200); const expected = { ...expectMongoId(newMandatoryCriteria), diff --git a/portal-api/api-tests/v1/gef/portal-activities.controller.api-test.js b/portal-api/api-tests/v1/gef/portal-activities.controller.api-test.js index 7b59e7c2e1..5ad5c8521e 100644 --- a/portal-api/api-tests/v1/gef/portal-activities.controller.api-test.js +++ b/portal-api/api-tests/v1/gef/portal-activities.controller.api-test.js @@ -23,6 +23,7 @@ const mockFacilities = require('../../fixtures/gef/facilities'); const CONSTANTS = require('../../../src/constants'); const wipeDB = require('../../wipeDB'); +const { MAKER, CHECKER } = require('../../../src/v1/roles/roles'); const collectionName = 'facilities'; const applicationCollectionName = 'deals'; @@ -35,15 +36,15 @@ describe('submissionPortalActivity()', () => { // adds user to db incase empty const testUsers = await testUserCache.initialise(app); - testUsers().withRole('maker').one(); - testUsers().withRole('checker').one(); + testUsers().withRole(MAKER).one(); + testUsers().withRole(CHECKER).one(); /* As _id's can change for checker, need to access db and find a checker These details then added to the MOCK_APPLICATION */ const userCollection = await db.getCollection('users'); // finds someone with role checker only - const checker = await userCollection.findOne({ roles: { $eq: ['checker'] } }); + const checker = await userCollection.findOne({ roles: { $eq: [CHECKER] } }); MOCK_APPLICATION.checkerId = checker._id; MOCK_APPLICATION.submissionType = CONSTANTS.DEAL.SUBMISSION_TYPE.MIA; @@ -92,7 +93,7 @@ describe('submissionPortalActivity()', () => { const userCollection = await db.getCollection('users'); // finds someone with role checker only - const checker = await userCollection.findOne({ roles: { $eq: ['checker'] } }); + const checker = await userCollection.findOne({ roles: { $eq: [CHECKER] } }); MOCK_APPLICATION.checkerId = checker._id; MOCK_APPLICATION.submissionType = CONSTANTS.DEAL.SUBMISSION_TYPE.AIN; MOCK_APPLICATION.portalActivities = [testObject]; @@ -130,8 +131,8 @@ describe('facilityChangePortalActivity()', () => { const userCollection = await db.getCollection('users'); - const checker = await userCollection.findOne({ roles: { $eq: ['checker'] } }); - const maker = await userCollection.findOne({ roles: { $eq: ['maker'] } }); + const checker = await userCollection.findOne({ roles: { $eq: [CHECKER] } }); + const maker = await userCollection.findOne({ roles: { $eq: [MAKER] } }); MOCK_APPLICATION_FACILITIES.checkerId = checker._id; @@ -209,8 +210,8 @@ describe('facilityChangePortalActivity()', () => { const userCollection = await db.getCollection('users'); - const checker = await userCollection.findOne({ roles: { $eq: ['checker'] } }); - const maker = await userCollection.findOne({ roles: { $eq: ['maker'] } }); + const checker = await userCollection.findOne({ roles: { $eq: [CHECKER] } }); + const maker = await userCollection.findOne({ roles: { $eq: [MAKER] } }); MOCK_APPLICATION_FACILITIES.checkerId = checker._id; @@ -279,7 +280,7 @@ describe('getUserInfo()', () => { const userCollection = await db.getCollection('users'); // finds someone with role checker only - const checker = await userCollection.findOne({ roles: { $eq: ['checker'] } }); + const checker = await userCollection.findOne({ roles: { $eq: [CHECKER] } }); const returnedUser = await getUserInfo(checker._id); diff --git a/portal-api/api-tests/v1/industry-sectors/industry-sectors.api-test.js b/portal-api/api-tests/v1/industry-sectors/industry-sectors.api-test.js index c8b75d82c1..d11fd17d3f 100644 --- a/portal-api/api-tests/v1/industry-sectors/industry-sectors.api-test.js +++ b/portal-api/api-tests/v1/industry-sectors/industry-sectors.api-test.js @@ -4,8 +4,11 @@ const app = require('../../../src/createApp'); const testUserCache = require('../../api-test-users'); +const { withClientAuthenticationTests } = require('../../common-tests/client-authentication-tests'); +const { withNoRoleAuthorisationTests } = require('../../common-tests/role-authorisation-tests'); -const { as } = require('../../api')(app); +const { as, get } = require('../../api')(app); +const { MAKER } = require('../../../src/v1/roles/roles'); jest.unmock('../../../src/external-api/api'); @@ -14,28 +17,31 @@ const mockIndustrySectorCode = '1008'; describe('/v1/industry-sectors', () => { let noRoles; let aBarclaysMaker; + let testUsers; beforeAll(async () => { - const testUsers = await testUserCache.initialise(app); + testUsers = await testUserCache.initialise(app); noRoles = testUsers().withoutAnyRoles().one(); - aBarclaysMaker = testUsers().withRole('maker').withBankName('Barclays Bank').one(); + aBarclaysMaker = testUsers().withRole(MAKER).withBankName('Barclays Bank').one(); }); describe('GET /v1/industry-sectors', () => { - it('rejects requests that do not present a valid Authorization token', async () => { - const { status } = await as().get('/v1/industry-sectors'); + const industrySectorsUrl = '/v1/industry-sectors'; - expect(status).toEqual(401); + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => get(industrySectorsUrl), + makeRequestWithAuthHeader: (authHeader) => get(industrySectorsUrl, { headers: { Authorization: authHeader } }) }); - it('accepts requests that present a valid Authorization token', async () => { - const { status } = await as(noRoles).get('/v1/industry-sectors'); - - expect(status).toEqual(200); + withNoRoleAuthorisationTests({ + getUserWithRole: (role) => testUsers().withRole(role).one(), + getUserWithoutAnyRoles: () => testUsers().withoutAnyRoles().one(), + makeRequestAsUser: (user) => as(user).get(industrySectorsUrl), + successStatusCode: 200, }); it('returns a list of industry-sectors', async () => { - const { status, body } = await as(aBarclaysMaker).get('/v1/industry-sectors'); + const { status, body } = await as(aBarclaysMaker).get(industrySectorsUrl); expect(status).toEqual(200); @@ -49,13 +55,21 @@ describe('/v1/industry-sectors', () => { }); describe('GET /v1/industry-sectors/:code', () => { - it('rejects requests that do not present a valid Authorization token', async () => { - const { status } = await as().get(`/v1/industry-sectors/${mockIndustrySectorCode}`); + const mockIndustrySectorUrl = `/v1/industry-sectors/${mockIndustrySectorCode}`; + + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => get(mockIndustrySectorUrl), + makeRequestWithAuthHeader: (authHeader) => get(mockIndustrySectorUrl, { headers: { Authorization: authHeader } }) + }); - expect(status).toEqual(401); + withNoRoleAuthorisationTests({ + getUserWithRole: (role) => testUsers().withRole(role).one(), + getUserWithoutAnyRoles: () => testUsers().withoutAnyRoles().one(), + makeRequestAsUser: (user) => as(user).get(mockIndustrySectorUrl), + successStatusCode: 200, }); - it('accepts requests that do present a valid Authorization token', async () => { + it('returns an industry sector', async () => { const { status, body } = await as(noRoles).get(`/v1/industry-sectors/${mockIndustrySectorCode}`); expect(status).toEqual(200); diff --git a/portal-api/api-tests/v1/loan/loan-change-cover-start-date-validation.api-test.js b/portal-api/api-tests/v1/loan/loan-change-cover-start-date-validation.api-test.js index 7c2a6724b3..7096a67e86 100644 --- a/portal-api/api-tests/v1/loan/loan-change-cover-start-date-validation.api-test.js +++ b/portal-api/api-tests/v1/loan/loan-change-cover-start-date-validation.api-test.js @@ -6,6 +6,7 @@ const testUserCache = require('../../api-test-users'); const { as } = require('../../api')(app); const { dateValidationText } = require('../../../src/v1/validation/fields/date'); const { formattedTimestamp } = require('../../../src/v1/facility-dates/timestamp'); +const { MAKER } = require('../../../src/v1/roles/roles'); describe('/v1/deals/:id/loan/:loanId', () => { const newDeal = aDeal({ @@ -68,7 +69,7 @@ describe('/v1/deals/:id/loan/:loanId', () => { beforeAll(async () => { const testUsers = await testUserCache.initialise(app); - aBarclaysMaker = testUsers().withRole('maker').withBankName('Barclays Bank').one(); + aBarclaysMaker = testUsers().withRole(MAKER).withBankName('Barclays Bank').one(); }); beforeEach(async () => { diff --git a/portal-api/api-tests/v1/loan/loan-change-cover-start-date.api-test.js b/portal-api/api-tests/v1/loan/loan-change-cover-start-date.api-test.js index 09586a2e78..51330dac70 100644 --- a/portal-api/api-tests/v1/loan/loan-change-cover-start-date.api-test.js +++ b/portal-api/api-tests/v1/loan/loan-change-cover-start-date.api-test.js @@ -4,6 +4,7 @@ const aDeal = require('../deals/deal-builder'); const app = require('../../../src/createApp'); const testUserCache = require('../../api-test-users'); const { as } = require('../../api')(app); +const { MAKER } = require('../../../src/v1/roles/roles'); describe('/v1/deals/:id/loan/change-cover-start-date', () => { const newDeal = aDeal({ @@ -72,8 +73,8 @@ describe('/v1/deals/:id/loan/change-cover-start-date', () => { const testUsers = await testUserCache.initialise(app); noRoles = testUsers().withoutAnyRoles().one(); - aBarclaysMaker = testUsers().withRole('maker').withBankName('Barclays Bank').one(); - anHSBCMaker = testUsers().withRole('maker').withBankName('HSBC').one(); + aBarclaysMaker = testUsers().withRole(MAKER).withBankName('Barclays Bank').one(); + anHSBCMaker = testUsers().withRole(MAKER).withBankName('HSBC').one(); aSuperuser = testUsers().superuser().one(); }); diff --git a/portal-api/api-tests/v1/loan/loan-issue-facility-validation.api-test.js b/portal-api/api-tests/v1/loan/loan-issue-facility-validation.api-test.js index b551775fb6..f4741db879 100644 --- a/portal-api/api-tests/v1/loan/loan-issue-facility-validation.api-test.js +++ b/portal-api/api-tests/v1/loan/loan-issue-facility-validation.api-test.js @@ -6,6 +6,7 @@ const testUserCache = require('../../api-test-users'); const { as } = require('../../api')(app); const { dateValidationText } = require('../../../src/v1/validation/fields/date'); const { formattedTimestamp } = require('../../../src/v1/facility-dates/timestamp'); +const { MAKER } = require('../../../src/v1/roles/roles'); describe('/v1/deals/:id/loan/:loanId/issue-facility', () => { const submissionDate = moment().subtract(1, 'week'); @@ -70,7 +71,7 @@ describe('/v1/deals/:id/loan/:loanId/issue-facility', () => { beforeAll(async () => { const testUsers = await testUserCache.initialise(app); - aBarclaysMaker = testUsers().withRole('maker').withBankName('Barclays Bank').one(); + aBarclaysMaker = testUsers().withRole(MAKER).withBankName('Barclays Bank').one(); }); beforeEach(async () => { diff --git a/portal-api/api-tests/v1/loan/loan-issue-facility.api-test.js b/portal-api/api-tests/v1/loan/loan-issue-facility.api-test.js index 1146ecebcb..084e2dd37e 100644 --- a/portal-api/api-tests/v1/loan/loan-issue-facility.api-test.js +++ b/portal-api/api-tests/v1/loan/loan-issue-facility.api-test.js @@ -5,6 +5,7 @@ const app = require('../../../src/createApp'); const testUserCache = require('../../api-test-users'); const { as } = require('../../api')(app); const CONSTANTS = require('../../../src/constants'); +const { MAKER } = require('../../../src/v1/roles/roles'); describe('/v1/deals/:id/loan/:id/issue-facility', () => { const newDeal = aDeal({ @@ -76,8 +77,8 @@ describe('/v1/deals/:id/loan/:id/issue-facility', () => { beforeAll(async () => { const testUsers = await testUserCache.initialise(app); - aBarclaysMaker = testUsers().withRole('maker').withBankName('Barclays Bank').one(); - anHSBCMaker = testUsers().withRole('maker').withBankName('HSBC').one(); + aBarclaysMaker = testUsers().withRole(MAKER).withBankName('Barclays Bank').one(); + anHSBCMaker = testUsers().withRole(MAKER).withBankName('HSBC').one(); aSuperuser = testUsers().superuser().one(); }); diff --git a/portal-api/api-tests/v1/loan/loan-validation.api-test.js b/portal-api/api-tests/v1/loan/loan-validation.api-test.js index 0bf4e665cf..9d0bd45cf5 100644 --- a/portal-api/api-tests/v1/loan/loan-validation.api-test.js +++ b/portal-api/api-tests/v1/loan/loan-validation.api-test.js @@ -5,6 +5,7 @@ const app = require('../../../src/createApp'); const testUserCache = require('../../api-test-users'); const { as } = require('../../api')(app); const { dateValidationText } = require('../../../src/v1/validation/fields/date'); +const { MAKER } = require('../../../src/v1/roles/roles'); describe('/v1/deals/:id/loan', () => { const newDeal = aDeal({ @@ -39,7 +40,7 @@ describe('/v1/deals/:id/loan', () => { beforeAll(async () => { const testUsers = await testUserCache.initialise(app); - aBarclaysMaker = testUsers().withRole('maker').withBankName('Barclays Bank').one(); + aBarclaysMaker = testUsers().withRole(MAKER).withBankName('Barclays Bank').one(); }); beforeEach(async () => { diff --git a/portal-api/api-tests/v1/loan/loan.api-test.js b/portal-api/api-tests/v1/loan/loan.api-test.js index ffb7469b5c..3df5d936a2 100644 --- a/portal-api/api-tests/v1/loan/loan.api-test.js +++ b/portal-api/api-tests/v1/loan/loan.api-test.js @@ -2,8 +2,11 @@ const moment = require('moment'); const wipeDB = require('../../wipeDB'); const aDeal = require('../deals/deal-builder'); const app = require('../../../src/createApp'); +const { withClientAuthenticationTests } = require('../../common-tests/client-authentication-tests'); +const { withRoleAuthorisationTests } = require('../../common-tests/role-authorisation-tests'); +const { MAKER, READ_ONLY, ADMIN } = require('../../../src/v1/roles/roles'); const testUserCache = require('../../api-test-users'); -const { as } = require('../../api')(app); +const { as, get } = require('../../api')(app); const { calculateGuaranteeFee, calculateUkefExposure, @@ -47,6 +50,7 @@ describe('/v1/deals/:id/loan', () => { }; }; + let testUsers; let noRoles; let aBarclaysMaker; let anHSBCMaker; @@ -72,11 +76,11 @@ describe('/v1/deals/:id/loan', () => { }; beforeAll(async () => { - const testUsers = await testUserCache.initialise(app); + testUsers = await testUserCache.initialise(app); - noRoles = testUsers().withoutAnyRoles().one(); - aBarclaysMaker = testUsers().withRole('maker').withBankName('Barclays Bank').one(); - anHSBCMaker = testUsers().withRole('maker').withBankName('HSBC').one(); + noRoles = testUsers().withoutAnyRoles().withBankName('Barclays Bank').one(); + aBarclaysMaker = testUsers().withRole(MAKER).withBankName('Barclays Bank').one(); + anHSBCMaker = testUsers().withRole(MAKER).withBankName('HSBC').one(); aSuperuser = testUsers().superuser().one(); }); @@ -86,10 +90,28 @@ describe('/v1/deals/:id/loan', () => { }); describe('GET /v1/deals/:id/loan/:id', () => { - it('401s requests that do not present a valid Authorization token', async () => { - const { status } = await as().get('/v1/deals/620a1aa095a618b12da38c7b/loan/620a1aa095a618b12da38c7b'); + let dealId; + let loanId; + let aLoanUrl; - expect(status).toEqual(401); + beforeEach(async () => { + const { dealId: createdDealId, loanId: createdLoanId } = await createLoan(); + dealId = createdDealId; + loanId = createdLoanId; + aLoanUrl = `/v1/deals/${dealId}/loan/${loanId}`; + }); + + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => get(aLoanUrl), + makeRequestWithAuthHeader: (authHeader) => get(aLoanUrl, { headers: { Authorization: authHeader } }) + }); + + withRoleAuthorisationTests({ + allowedRoles: [MAKER, READ_ONLY, ADMIN], + getUserWithRole: (role) => testUsers().withRole(role).withBankName('Barclays Bank').one(), + getUserWithoutAnyRoles: () => noRoles, + makeRequestAsUser: (user) => as(user).get(aLoanUrl), + successStatusCode: 200, }); it('400s requests that do not present with a valid deal id parameter', async () => { @@ -104,17 +126,8 @@ describe('/v1/deals/:id/loan', () => { expect(status).toEqual(400); }); - it('401s requests that do not come from a user with role=maker', async () => { - const { status } = await as(noRoles).get('/v1/deals/620a1aa095a618b12da38c7b/loan/620a1aa095a618b12da38c7b'); - - expect(status).toEqual(401); - }); - it('401s requests if .bank != /bank', async () => { - const deal = await as(anHSBCMaker).post(newDeal).to('/v1/deals'); - const dealId = deal.body._id; - - const { status } = await as(aBarclaysMaker).get(`/v1/deals/${dealId}/loan/620a1aa095a618b12da38c7b`); + const { status } = await as(anHSBCMaker).get(`/v1/deals/${dealId}/loan/620a1aa095a618b12da38c7b`); expect(status).toEqual(401); }); @@ -126,29 +139,18 @@ describe('/v1/deals/:id/loan', () => { }); it('404s requests for unknown loan', async () => { - const deal = await as(aBarclaysMaker).post(newDeal).to('/v1/deals'); - const dealId = deal.body._id; - const { status } = await as(aBarclaysMaker).get(`/v1/deals/${dealId}/loan/620a1aa095a618b12da38c7b`); expect(status).toEqual(404); }); it('accepts requests if .bank.id == *', async () => { - const deal = await as(aBarclaysMaker).post(newDeal).to('/v1/deals'); - const dealId = deal.body._id; - - const createLoanResponse = await as(aBarclaysMaker).put({}).to(`/v1/deals/${dealId}/loan/create`); - const { loanId } = createLoanResponse.body; - const { status } = await as(aSuperuser).get(`/v1/deals/${dealId}/loan/${loanId}`); expect(status).toEqual(200); }); it('returns a loan with dealId, `Incomplete` status', async () => { - const { dealId, loanId } = await createLoan(); - await updateLoan(dealId, loanId, {}); const { status, body } = await as(aSuperuser).get(`/v1/deals/${dealId}/loan/${loanId}`); @@ -161,7 +163,7 @@ describe('/v1/deals/:id/loan', () => { describe('when a loan has all required fields', () => { it('returns a loan with dealId and `Completed` status', async () => { - const { dealId, loanId } = await createLoan(); + const { dealId: createdDealId, loanId: createdLoanId } = await createLoan(); const loan = { facilityStage: 'Unconditional', @@ -178,14 +180,14 @@ describe('/v1/deals/:id/loan', () => { dayCountBasis: '365', }; - await updateLoan(dealId, loanId, loan); - const { status, body } = await as(aSuperuser).get(`/v1/deals/${dealId}/loan/${loanId}`); + await updateLoan(createdDealId, createdLoanId, loan); + const { status, body } = await as(aSuperuser).get(`/v1/deals/${createdDealId}/loan/${createdLoanId}`); expect(status).toEqual(200); - expect(body.loan._id).toEqual(loanId); + expect(body.loan._id).toEqual(createdLoanId); expect(body.validationErrors.count).toEqual(0); expect(body.loan.status).toEqual('Completed'); - expect(body.dealId).toEqual(dealId); + expect(body.dealId).toEqual(createdDealId); }); }); }); diff --git a/portal-api/api-tests/v1/mandatory-criteria/mandatory-criteria.api-test.js b/portal-api/api-tests/v1/mandatory-criteria/mandatory-criteria.api-test.js index 9bc838e2af..04046922e2 100644 --- a/portal-api/api-tests/v1/mandatory-criteria/mandatory-criteria.api-test.js +++ b/portal-api/api-tests/v1/mandatory-criteria/mandatory-criteria.api-test.js @@ -1,12 +1,15 @@ const wipeDB = require('../../wipeDB'); +const { withClientAuthenticationTests } = require('../../common-tests/client-authentication-tests'); +const { withRoleAuthorisationTests, withNoRoleAuthorisationTests } = require('../../common-tests/role-authorisation-tests'); const app = require('../../../src/createApp'); const testUserCache = require('../../api-test-users'); -const { as } = require('../../api')(app); +const { as, get, post, put, remove } = require('../../api')(app); const { expectMongoId, expectMongoIds } = require('../../expectMongoIds'); const allMandatoryCriteria = require('../../fixtures/mandatoryCriteria'); +const { ADMIN, EDITOR } = require('../../../src/v1/roles/roles'); const newMandatoryCriteria = allMandatoryCriteria[0]; const oldMandatoryCriteria = allMandatoryCriteria[1]; @@ -22,12 +25,13 @@ const updatedMandatoryCriteria = { describe('/v1/mandatory-criteria', () => { let noRoles; - let anEditor; + let anAdmin; + let testUsers; beforeAll(async () => { - const testUsers = await testUserCache.initialise(app); + testUsers = await testUserCache.initialise(app); noRoles = testUsers().withoutAnyRoles().one(); - anEditor = testUsers().withRole('editor').one(); + anAdmin = testUsers().withRole(ADMIN).one(); }); beforeEach(async () => { @@ -35,23 +39,25 @@ describe('/v1/mandatory-criteria', () => { }); describe('GET /v1/mandatory-criteria', () => { - it('rejects requests that do not present a valid Authorization token', async () => { - const { status } = await as().get('/v1/mandatory-criteria'); + const allMandatoryCriteriaUrl = '/v1/mandatory-criteria'; - expect(status).toEqual(401); + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => get(allMandatoryCriteriaUrl), + makeRequestWithAuthHeader: (authHeader) => get(allMandatoryCriteriaUrl, { headers: { Authorization: authHeader } }) }); - it('accepts requests that present a valid Authorization token', async () => { - const { status } = await as(noRoles).get('/v1/mandatory-criteria'); - - expect(status).toEqual(200); + withNoRoleAuthorisationTests({ + getUserWithRole: (role) => testUsers().withRole(role).one(), + getUserWithoutAnyRoles: () => testUsers().withoutAnyRoles().one(), + makeRequestAsUser: (user) => as(user).get(allMandatoryCriteriaUrl), + successStatusCode: 200, }); it('returns a list of mandatory-criteria sorted by id', async () => { - await as(anEditor).post(allMandatoryCriteria[0]).to('/v1/mandatory-criteria'); - await as(anEditor).post(allMandatoryCriteria[1]).to('/v1/mandatory-criteria'); + await as(anAdmin).post(allMandatoryCriteria[0]).to(allMandatoryCriteriaUrl); + await as(anAdmin).post(allMandatoryCriteria[1]).to(allMandatoryCriteriaUrl); - const { body } = await as(noRoles).get('/v1/mandatory-criteria'); + const { body } = await as(noRoles).get(allMandatoryCriteriaUrl); expect(body).toEqual({ count: allMandatoryCriteria.length, @@ -61,23 +67,25 @@ describe('/v1/mandatory-criteria', () => { }); describe('GET /v1/mandatory-criteria/latest', () => { - it('rejects requests that do not present a valid Authorization token', async () => { - const { status } = await as().get('/v1/mandatory-criteria/latest'); + const latestMandatoryCriteriaUrl = '/v1/mandatory-criteria/latest'; - expect(status).toEqual(401); + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => get(latestMandatoryCriteriaUrl), + makeRequestWithAuthHeader: (authHeader) => get(latestMandatoryCriteriaUrl, { headers: { Authorization: authHeader } }) }); - it('accepts requests that do present a valid Authorization token', async () => { - const { status } = await as(noRoles).get('/v1/mandatory-criteria/latest'); - - expect(status).toEqual(200); + withNoRoleAuthorisationTests({ + getUserWithRole: (role) => testUsers().withRole(role).one(), + getUserWithoutAnyRoles: () => testUsers().withoutAnyRoles().one(), + makeRequestAsUser: (user) => as(user).get(latestMandatoryCriteriaUrl), + successStatusCode: 200, }); it('returns the latest mandatory criteria', async () => { - await as(anEditor).post(oldMandatoryCriteria).to('/v1/mandatory-criteria'); - await as(anEditor).post(newMandatoryCriteria).to('/v1/mandatory-criteria'); + await as(anAdmin).post(oldMandatoryCriteria).to('/v1/mandatory-criteria'); + await as(anAdmin).post(newMandatoryCriteria).to('/v1/mandatory-criteria'); - const { status, body } = await as(anEditor).get('/v1/mandatory-criteria/latest'); + const { status, body } = await as(anAdmin).get(latestMandatoryCriteriaUrl); expect(status).toEqual(200); expect(body).toEqual(expectMongoId(newMandatoryCriteria)); @@ -85,22 +93,24 @@ describe('/v1/mandatory-criteria', () => { }); describe('GET /v1/mandatory-criteria/:version', () => { - it('rejects requests that do not present a valid Authorization token', async () => { - const { status } = await as().get('/v1/mandatory-criteria/1'); + const mandatoryCriteria1Url = '/v1/mandatory-criteria/1'; - expect(status).toEqual(401); + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => get(mandatoryCriteria1Url), + makeRequestWithAuthHeader: (authHeader) => get(mandatoryCriteria1Url, { headers: { Authorization: authHeader } }) }); - it('accepts requests that do present a valid Authorization token', async () => { - const { status } = await as(noRoles).get('/v1/mandatory-criteria/1'); - - expect(status).toEqual(200); + withNoRoleAuthorisationTests({ + getUserWithRole: (role) => testUsers().withRole(role).one(), + getUserWithoutAnyRoles: () => testUsers().withoutAnyRoles().one(), + makeRequestAsUser: (user) => as(user).get(mandatoryCriteria1Url), + successStatusCode: 200, }); it('returns a mandatory-criteria', async () => { - await as(anEditor).post(newMandatoryCriteria).to('/v1/mandatory-criteria'); + await as(anAdmin).post(newMandatoryCriteria).to('/v1/mandatory-criteria'); - const { status, body } = await as(anEditor).get(`/v1/mandatory-criteria/${newMandatoryCriteria.version}`); + const { status, body } = await as(anAdmin).get(`/v1/mandatory-criteria/${newMandatoryCriteria.version}`); expect(status).toEqual(200); expect(body).toEqual(expectMongoId(newMandatoryCriteria)); @@ -108,46 +118,36 @@ describe('/v1/mandatory-criteria', () => { }); describe('POST /v1/mandatory-criteria', () => { - it('rejects requests that do not present a valid Authorization token', async () => { - const { status } = await as().post(newMandatoryCriteria).to('/v1/mandatory-criteria'); + const allMandatoryCriteriaUrl = '/v1/mandatory-criteria'; - expect(status).toEqual(401); + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => post(allMandatoryCriteriaUrl, newMandatoryCriteria), + makeRequestWithAuthHeader: (authHeader) => post(allMandatoryCriteriaUrl, newMandatoryCriteria, { headers: { Authorization: authHeader } }) }); - it('rejects requests that present a valid Authorization token but do not have "editor" role', async () => { - const { status } = await as(noRoles).post(newMandatoryCriteria).to('/v1/mandatory-criteria'); - - expect(status).toEqual(401); - }); - - it('accepts requests that present a valid Authorization token with "editor" role', async () => { - const { status } = await as(anEditor).post(newMandatoryCriteria).to('/v1/mandatory-criteria'); - - expect(status).toEqual(200); + withRoleAuthorisationTests({ + allowedRoles: [ADMIN, EDITOR], + getUserWithRole: (role) => testUsers().withRole(role).one(), + getUserWithoutAnyRoles: () => testUsers().withoutAnyRoles().one(), + makeRequestAsUser: (user) => as(user).post(newMandatoryCriteria).to(allMandatoryCriteriaUrl), + successStatusCode: 200, }); }); describe('PUT /v1/mandatory-criteria/:version', () => { - it('rejects requests that do not present a valid Authorization token', async () => { - const { status } = await as().put(updatedMandatoryCriteria).to('/v1/mandatory-criteria/1'); + const mandatoryCriteria1Url = '/v1/mandatory-criteria/1'; - expect(status).toEqual(401); + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => put(mandatoryCriteria1Url, updatedMandatoryCriteria), + makeRequestWithAuthHeader: (authHeader) => put(mandatoryCriteria1Url, updatedMandatoryCriteria, { headers: { Authorization: authHeader } }) }); - it('rejects requests that present a valid Authorization token but do not have "editor" role', async () => { - await as(anEditor).post(newMandatoryCriteria).to('/v1/mandatory-criteria'); - - const { status } = await as(noRoles).put(updatedMandatoryCriteria).to('/v1/mandatory-criteria/1'); - - expect(status).toEqual(401); - }); - - it('accepts requests that present a valid Authorization token with "editor" role', async () => { - await as(anEditor).post(newMandatoryCriteria).to('/v1/mandatory-criteria'); - - const { status } = await as(anEditor).put(updatedMandatoryCriteria).to('/v1/mandatory-criteria/1'); - - expect(status).toEqual(200); + withRoleAuthorisationTests({ + allowedRoles: [ADMIN, EDITOR], + getUserWithRole: (role) => testUsers().withRole(role).one(), + getUserWithoutAnyRoles: () => testUsers().withoutAnyRoles().one(), + makeRequestAsUser: (user) => as(user).put(updatedMandatoryCriteria).to(mandatoryCriteria1Url), + successStatusCode: 200, }); it('updates a mandatory criteria', async () => { @@ -158,10 +158,10 @@ describe('/v1/mandatory-criteria', () => { ], }; - await as(anEditor).post(mandatoryCriteria).to('/v1/mandatory-criteria'); - await as(anEditor).put(update).to(`/v1/mandatory-criteria/${mandatoryCriteria.version}`); + await as(anAdmin).post(mandatoryCriteria).to('/v1/mandatory-criteria'); + await as(anAdmin).put(update).to(`/v1/mandatory-criteria/${mandatoryCriteria.version}`); - const { status, body } = await as(anEditor).get(`/v1/mandatory-criteria/${mandatoryCriteria.version}`); + const { status, body } = await as(anAdmin).get(`/v1/mandatory-criteria/${mandatoryCriteria.version}`); expect(status).toEqual(200); expect(body).toEqual(expectMongoId({ @@ -172,33 +172,26 @@ describe('/v1/mandatory-criteria', () => { }); describe('DELETE /v1/mandatory-criteria/:version', () => { - it('rejects requests that do not present a valid Authorization token', async () => { - const { status } = await as().remove('/v1/mandatory-criteria/1'); - - expect(status).toEqual(401); - }); - - it('rejects requests that present a valid Authorization token but do not have "editor" role', async () => { - await as(anEditor).post(newMandatoryCriteria).to('/v1/mandatory-criteria'); - - const { status } = await as(noRoles).remove('/v1/mandatory-criteria/1'); + const mandatoryCriteria1Url = '/v1/mandatory-criteria/1'; - expect(status).toEqual(401); + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => remove(mandatoryCriteria1Url), + makeRequestWithAuthHeader: (authHeader) => remove(mandatoryCriteria1Url, { headers: { Authorization: authHeader } }) }); - it('accepts requests that present a valid Authorization token with "editor" role', async () => { - await as(anEditor).post(newMandatoryCriteria).to('/v1/mandatory-criteria'); - - const { status } = await as(anEditor).remove('/v1/mandatory-criteria/1'); - - expect(status).toEqual(200); + withRoleAuthorisationTests({ + allowedRoles: [ADMIN, EDITOR], + getUserWithRole: (role) => testUsers().withRole(role).one(), + getUserWithoutAnyRoles: () => testUsers().withoutAnyRoles().one(), + makeRequestAsUser: (user) => as(user).remove(mandatoryCriteria1Url), + successStatusCode: 200, }); it('deletes the mandatory-criteria', async () => { - await as(anEditor).post(newMandatoryCriteria).to('/v1/mandatory-criteria'); - await as(anEditor).remove('/v1/mandatory-criteria/1'); + await as(anAdmin).post(newMandatoryCriteria).to('/v1/mandatory-criteria'); + await as(anAdmin).remove(mandatoryCriteria1Url); - const { status, body } = await as(anEditor).get('/v1/mandatory-criteria/1'); + const { status, body } = await as(anAdmin).get(mandatoryCriteria1Url); expect(status).toEqual(200); expect(body).toEqual({}); diff --git a/portal-api/api-tests/v1/reports/review-ukef-decision.api-test.js b/portal-api/api-tests/v1/reports/review-ukef-decision.api-test.js index a800649a14..1bef5f0005 100644 --- a/portal-api/api-tests/v1/reports/review-ukef-decision.api-test.js +++ b/portal-api/api-tests/v1/reports/review-ukef-decision.api-test.js @@ -1,9 +1,12 @@ const wipeDB = require('../../wipeDB'); const CONSTANTS = require('../../../src/constants'); const app = require('../../../src/createApp'); -const { as } = require('../../api')(app); +const { as, get } = require('../../api')(app); const testUserCache = require('../../api-test-users'); const mockApplications = require('../../fixtures/gef/application'); +const { withClientAuthenticationTests } = require('../../common-tests/client-authentication-tests'); +const { withRoleAuthorisationTests } = require('../../common-tests/role-authorisation-tests'); +const { MAKER, CHECKER, READ_ONLY, ADMIN } = require('../../../src/v1/roles/roles'); const dealsCollectionName = 'deals'; const gefDealUrl = '/v1/gef/application'; @@ -16,15 +19,17 @@ const mockPayload = { ] }; -describe('v1/reports/review-ukef-decision', () => { +describe('GET /v1/reports/review-ukef-decision', () => { + const reviewDecisionReportUrl = '/v1/reports/review-ukef-decision'; let aMaker; let aChecker; let mockApplication; + let testUsers; beforeAll(async () => { - const testUsers = await testUserCache.initialise(app); - aMaker = testUsers().withRole('maker').one(); - aChecker = testUsers().withRole('checker').one(); + testUsers = await testUserCache.initialise(app); + aMaker = testUsers().withRole(MAKER).one(); + aChecker = testUsers().withRole(CHECKER).one(); }); beforeEach(async () => { @@ -34,6 +39,19 @@ describe('v1/reports/review-ukef-decision', () => { mockApplication = await as(aMaker).post({ ...mockApplications[0], bank: { id: aMaker.bank.id } }).to(gefDealUrl); }); + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => get(reviewDecisionReportUrl), + makeRequestWithAuthHeader: (authHeader) => get(reviewDecisionReportUrl, { headers: { Authorization: authHeader } }) + }); + + withRoleAuthorisationTests({ + allowedRoles: [MAKER, CHECKER, READ_ONLY, ADMIN], + getUserWithRole: (role) => testUsers().withRole(role).one(), + getUserWithoutAnyRoles: () => testUsers().withoutAnyRoles().one(), + makeRequestAsUser: (user) => as(user).get(reviewDecisionReportUrl), + successStatusCode: 200, + }); + it('retrieves all deals with a ukefDecision status set to `UKEF_APPROVED_WITHOUT_CONDITIONS` (Maker)', async () => { mockPayload.ukefDecision[0].decision = CONSTANTS.DEAL.DEAL_STATUS.UKEF_APPROVED_WITHOUT_CONDITIONS; // update the GEF deal @@ -46,7 +64,7 @@ describe('v1/reports/review-ukef-decision', () => { const mockQuery = { ukefDecision: CONSTANTS.DEAL.DEAL_STATUS.UKEF_APPROVED_WITHOUT_CONDITIONS }; // perform a GET request to retrieve the reports for UKEF decision as a MAKER - const { status: reportsStatus, body: reportsBody } = await as(aMaker).get('/v1/reports/review-ukef-decision', mockQuery); + const { status: reportsStatus, body: reportsBody } = await as(aMaker).get(reviewDecisionReportUrl, mockQuery); expect(reportsStatus).toEqual(200); // ensure that the body has the following format: expect(reportsBody).toEqual([{ @@ -74,7 +92,7 @@ describe('v1/reports/review-ukef-decision', () => { const mockQuery = { ukefDecision: CONSTANTS.DEAL.DEAL_STATUS.UKEF_APPROVED_WITHOUT_CONDITIONS }; // perform a GET request to retrieve the reports for UKEF decision as a CHECKER - const { status: reportsStatus, body: reportsBody } = await as(aChecker).get('/v1/reports/review-ukef-decision', mockQuery); + const { status: reportsStatus, body: reportsBody } = await as(aChecker).get(reviewDecisionReportUrl, mockQuery); expect(reportsStatus).toEqual(200); // ensure that the body has the following format: expect(reportsBody).toEqual([]); @@ -92,7 +110,7 @@ describe('v1/reports/review-ukef-decision', () => { const mockQuery = { ukefDecision: CONSTANTS.DEAL.DEAL_STATUS.UKEF_APPROVED_WITHOUT_CONDITIONS }; // perform a GET request to retrieve the reports for UKEF decision as a MAKER - const { status: reportsStatus, body: reportsBody } = await as(aMaker).get('/v1/reports/review-ukef-decision', mockQuery); + const { status: reportsStatus, body: reportsBody } = await as(aMaker).get(reviewDecisionReportUrl, mockQuery); expect(reportsStatus).toEqual(200); // ensure that the body has the following format: expect(reportsBody).toEqual([]); @@ -110,7 +128,7 @@ describe('v1/reports/review-ukef-decision', () => { const mockQuery = { ukefDecision: CONSTANTS.DEAL.DEAL_STATUS.UKEF_APPROVED_WITH_CONDITIONS }; // perform a GET request to retrieve the reports for UKEF decision as a MAKER - const { status: reportsStatus, body: reportsBody } = await as(aMaker).get('/v1/reports/review-ukef-decision', mockQuery); + const { status: reportsStatus, body: reportsBody } = await as(aMaker).get(reviewDecisionReportUrl, mockQuery); expect(reportsStatus).toEqual(200); // ensure that the body has the following format: expect(reportsBody).toEqual([{ @@ -141,7 +159,7 @@ describe('v1/reports/review-ukef-decision', () => { const mockQuery = { ukefDecision: CONSTANTS.DEAL.DEAL_STATUS.UKEF_APPROVED_WITH_CONDITIONS }; // perform a GET request to retrieve the reports for UKEF decision as a MAKER - const { status: reportsStatus, body: reportsBody } = await as(aMaker).get('/v1/reports/review-ukef-decision', mockQuery); + const { status: reportsStatus, body: reportsBody } = await as(aMaker).get(reviewDecisionReportUrl, mockQuery); expect(reportsStatus).toEqual(200); // ensure that the body has the following format: expect(reportsBody).toEqual([]); @@ -156,7 +174,7 @@ describe('v1/reports/review-ukef-decision', () => { const mockQuery = { ukefDecision: CONSTANTS.DEAL.DEAL_STATUS.UKEF_APPROVED_WITH_CONDITIONS }; // perform a GET request to retrieve the reports for UKEF decision as a CHECKER - const { status: reportsStatus, body: reportsBody } = await as(aChecker).get('/v1/reports/review-ukef-decision', mockQuery); + const { status: reportsStatus, body: reportsBody } = await as(aChecker).get(reviewDecisionReportUrl, mockQuery); expect(reportsStatus).toEqual(200); // ensure that the body has the following format: expect(reportsBody).toEqual([]); @@ -171,7 +189,7 @@ describe('v1/reports/review-ukef-decision', () => { const mockQuery = { ukefDecision: 'Unknown' }; // perform a GET request to retrieve the the reports for UKEF decision - const { status: reportsStatus, body: reportsBody } = await as(aMaker).get('/v1/reports/review-ukef-decision', mockQuery); + const { status: reportsStatus, body: reportsBody } = await as(aMaker).get(reviewDecisionReportUrl, mockQuery); expect(reportsStatus).toEqual(200); // ensure that the body has the following format: expect(reportsBody).toEqual([]); @@ -186,7 +204,7 @@ describe('v1/reports/review-ukef-decision', () => { const mockQuery = { ukefDecision: CONSTANTS.DEAL.DEAL_STATUS.UKEF_REFUSED }; // perform a GET request to retrieve the reports for UKEF decision - const { status: reportsStatus, body: reportsBody } = await as(aMaker).get('/v1/reports/review-ukef-decision', mockQuery); + const { status: reportsStatus, body: reportsBody } = await as(aMaker).get(reviewDecisionReportUrl, mockQuery); expect(reportsStatus).toEqual(200); // ensure that the body has the following format: expect(reportsBody).toEqual([]); @@ -201,7 +219,7 @@ describe('v1/reports/review-ukef-decision', () => { const mockQuery = { ukefDecision: CONSTANTS.DEAL.DEAL_STATUS.ABANDONED }; // perform a GET request to retrieve the reports for UKEF decision - const { status: reportsStatus, body: reportsBody } = await as(aMaker).get('/v1/reports/review-ukef-decision', mockQuery); + const { status: reportsStatus, body: reportsBody } = await as(aMaker).get(reviewDecisionReportUrl, mockQuery); expect(reportsStatus).toEqual(200); // ensure that the body has the following format: expect(reportsBody).toEqual([]); @@ -210,7 +228,7 @@ describe('v1/reports/review-ukef-decision', () => { it('retrieves an empty array if the `ukefDecision` property does not exist and the query is `UKEF_APPROVED_WITH_CONDITIONS`', async () => { const mockQuery = { ukefDecision: CONSTANTS.DEAL.DEAL_STATUS.UKEF_APPROVED_WITH_CONDITIONS }; // perform a GET request to retrieve the reports for UKEF decision - const { status: reportsStatus, body: reportsBody } = await as(aMaker).get('/v1/reports/review-ukef-decision', mockQuery); + const { status: reportsStatus, body: reportsBody } = await as(aMaker).get(reviewDecisionReportUrl, mockQuery); expect(reportsStatus).toEqual(200); // ensure that the body has the following format: expect(reportsBody).toEqual([]); @@ -219,7 +237,7 @@ describe('v1/reports/review-ukef-decision', () => { it('retrieves an empty array if the `ukefDecision` property does not exist and the query is `UKEF_APPROVED_WITHOUT_CONDITIONS`', async () => { const mockQuery = { ukefDecision: CONSTANTS.DEAL.DEAL_STATUS.UKEF_APPROVED_WITHOUT_CONDITIONS }; // perform a GET request to retrieve the reports for UKEF decision - const { status: reportsStatus, body: reportsBody } = await as(aMaker).get('/v1/reports/review-ukef-decision', mockQuery); + const { status: reportsStatus, body: reportsBody } = await as(aMaker).get(reviewDecisionReportUrl, mockQuery); expect(reportsStatus).toEqual(200); // ensure that the body has the following format: expect(reportsBody).toEqual([]); diff --git a/portal-api/api-tests/v1/reports/unissued-facilities.api-test.js b/portal-api/api-tests/v1/reports/unissued-facilities.api-test.js index 39ed0d21ea..f1ee6e124e 100644 --- a/portal-api/api-tests/v1/reports/unissued-facilities.api-test.js +++ b/portal-api/api-tests/v1/reports/unissued-facilities.api-test.js @@ -2,22 +2,27 @@ const wipeDB = require('../../wipeDB'); const CONSTANTS = require('../../../src/constants'); const app = require('../../../src/createApp'); -const { as } = require('../../api')(app); +const { as, get } = require('../../api')(app); const testUserCache = require('../../api-test-users'); const mockApplications = require('../../fixtures/gef/application'); +const { withClientAuthenticationTests } = require('../../common-tests/client-authentication-tests'); +const { withRoleAuthorisationTests } = require('../../common-tests/role-authorisation-tests'); +const { MAKER, CHECKER, READ_ONLY, ADMIN } = require('../../../src/v1/roles/roles'); const facilitiesCollectionName = 'facilities'; const dealsCollectionName = 'deals'; const gefDealUrl = '/v1/gef/application'; const gefFacilityUrl = '/v1/gef/facilities'; -describe('v1/reports/unissued-facilities', () => { +describe('GET /v1/reports/unissued-facilities', () => { + const unissuedFacilitiesReportUrl = '/v1/reports/unissued-facilities'; let aMaker; let mockApplication; + let testUsers; beforeAll(async () => { - const testUsers = await testUserCache.initialise(app); - aMaker = testUsers().withRole('maker').one(); + testUsers = await testUserCache.initialise(app); + aMaker = testUsers().withRole(MAKER).one(); }); beforeEach(async () => { @@ -35,6 +40,19 @@ describe('v1/reports/unissued-facilities', () => { }).to(gefFacilityUrl); }); + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => get(unissuedFacilitiesReportUrl), + makeRequestWithAuthHeader: (authHeader) => get(unissuedFacilitiesReportUrl, { headers: { Authorization: authHeader } }) + }); + + withRoleAuthorisationTests({ + allowedRoles: [MAKER, CHECKER, READ_ONLY, ADMIN], + getUserWithRole: (role) => testUsers().withRole(role).one(), + getUserWithoutAnyRoles: () => testUsers().withoutAnyRoles().one(), + makeRequestAsUser: (user) => as(user).get(unissuedFacilitiesReportUrl), + successStatusCode: 200, + }); + it('retrieves the unissued facilities based on AIN deals', async () => { const updated = { submissionType: CONSTANTS.DEAL.SUBMISSION_TYPE.AIN }; // update the submissionType to AIN @@ -50,7 +68,7 @@ describe('v1/reports/unissued-facilities', () => { expect(putResponse.body.submissionDate).toEqual(expect.any(String)); // perform a GET request to retrieve the unissued facilities for reports - const { status: reportsStatus, body: reportsBody } = await as(aMaker).get('/v1/reports/unissued-facilities'); + const { status: reportsStatus, body: reportsBody } = await as(aMaker).get(unissuedFacilitiesReportUrl); expect(reportsStatus).toEqual(200); // ensure that the body has the following format: expect(reportsBody).toEqual([{ @@ -86,7 +104,7 @@ describe('v1/reports/unissued-facilities', () => { expect(putResponse.body.submissionDate).toEqual(expect.any(String)); // perform a GET request to retrieve the unissued facilities for reports - const { status: reportsStatus, body: reportsBody } = await as(aMaker).get('/v1/reports/unissued-facilities'); + const { status: reportsStatus, body: reportsBody } = await as(aMaker).get(unissuedFacilitiesReportUrl); expect(reportsStatus).toEqual(200); // ensure that the body has the following format: expect(reportsBody).toEqual([{ @@ -122,7 +140,7 @@ describe('v1/reports/unissued-facilities', () => { expect(putResponse.body.submissionDate).toEqual(expect.any(String)); // perform a GET request to retrieve the unissued facilities for reports - const { status: reportsStatus, body: reportsBody } = await as(aMaker).get('/v1/reports/unissued-facilities'); + const { status: reportsStatus, body: reportsBody } = await as(aMaker).get(unissuedFacilitiesReportUrl); expect(reportsStatus).toEqual(200); // ensure that the body has the following format: expect(reportsBody).toEqual([]); @@ -143,7 +161,7 @@ describe('v1/reports/unissued-facilities', () => { expect(putResponse.body.submissionDate).toEqual(expect.any(String)); // perform a GET request to retrieve the unissued facilities for reports - const { status: reportsStatus, body: reportsBody } = await as(aMaker).get('/v1/reports/unissued-facilities'); + const { status: reportsStatus, body: reportsBody } = await as(aMaker).get(unissuedFacilitiesReportUrl); expect(reportsStatus).toEqual(200); // ensure that the body has the following format: expect(reportsBody).toEqual([]); @@ -151,7 +169,7 @@ describe('v1/reports/unissued-facilities', () => { it('retrieves an empty array if the deal has NOT been submitted to UKEF', async () => { // perform a GET request to retrieve the unissued facilities for reports - const { status: reportsStatus, body: reportsBody } = await as(aMaker).get('/v1/reports/unissued-facilities'); + const { status: reportsStatus, body: reportsBody } = await as(aMaker).get(unissuedFacilitiesReportUrl); expect(reportsStatus).toEqual(200); // ensure that the body has the following format: expect(reportsBody).toEqual([]); @@ -165,7 +183,7 @@ describe('v1/reports/unissued-facilities', () => { expect(submissionTypeStatus).toEqual(200); // perform a GET request to retrieve the unissued facilities for reports - const { status: reportsStatus, body: reportsBody } = await as(aMaker).get('/v1/reports/unissued-facilities'); + const { status: reportsStatus, body: reportsBody } = await as(aMaker).get(unissuedFacilitiesReportUrl); expect(reportsStatus).toEqual(200); // ensure that the body has the following format: expect(reportsBody).toEqual([]); @@ -179,7 +197,7 @@ describe('v1/reports/unissued-facilities', () => { expect(submissionTypeStatus).toEqual(200); // perform a GET request to retrieve the unissued facilities for reports - const { status: reportsStatus, body: reportsBody } = await as(aMaker).get('/v1/reports/unissued-facilities'); + const { status: reportsStatus, body: reportsBody } = await as(aMaker).get(unissuedFacilitiesReportUrl); expect(reportsStatus).toEqual(200); // ensure that the body has the following format: expect(reportsBody).toEqual([]); @@ -193,7 +211,7 @@ describe('v1/reports/unissued-facilities', () => { expect(submissionTypeStatus).toEqual(200); // perform a GET request to retrieve the unissued facilities for reports - const { status: reportsStatus, body: reportsBody } = await as(aMaker).get('/v1/reports/unissued-facilities'); + const { status: reportsStatus, body: reportsBody } = await as(aMaker).get(unissuedFacilitiesReportUrl); expect(reportsStatus).toEqual(200); // ensure that the body has the following format: expect(reportsBody).toEqual([]); diff --git a/portal-api/api-tests/v1/users/test-data.js b/portal-api/api-tests/v1/users/test-data.js index ed3807de14..57390a7341 100644 --- a/portal-api/api-tests/v1/users/test-data.js +++ b/portal-api/api-tests/v1/users/test-data.js @@ -1,3 +1,5 @@ +const { MAKER, CHECKER } = require('../../../src/v1/roles/roles'); + module.exports = [ { username: 'NOBODY', @@ -12,7 +14,7 @@ module.exports = [ firstname: 'Miss', surname: 'Two', email: 'maker2@ukexportfinance.gov.uk', - roles: ['maker'], + roles: [MAKER], bank: { id: '956', name: 'Barclays Bank', @@ -27,7 +29,7 @@ module.exports = [ firstname: 'Miss', surname: 'Three', email: 'maker3@ukexportfinance.gov.uk', - roles: ['checker'], + roles: [CHECKER], bank: { id: '956', name: 'Barclays Bank', @@ -42,7 +44,7 @@ module.exports = [ firstname: 'Miss', surname: 'Four', email: 'maker4@ukexportfinance.gov.uk', - roles: ['maker', 'checker'], + roles: [MAKER, CHECKER], bank: { id: '956', name: 'Barclays Bank', @@ -72,7 +74,7 @@ module.exports = [ firstname: 'Miss', surname: 'Six', email: 'maker6@ukexportfinance.gov.uk', - roles: ['maker'], + roles: [MAKER], bank: { id: '961', name: 'HSBC', @@ -83,7 +85,7 @@ module.exports = [ firstname: 'Miss', surname: 'Seven', email: 'maker7@ukexportfinance.gov.uk', - roles: ['checker'], + roles: [CHECKER], bank: { id: '961', name: 'HSBC', @@ -94,7 +96,7 @@ module.exports = [ firstname: 'Miss', surname: 'Eight', email: 'maker8@ukexportfinance.gov.uk', - roles: ['maker', 'checker'], + roles: [MAKER, CHECKER], bank: { id: '961', name: 'HSBC', @@ -117,7 +119,7 @@ module.exports = [ firstname: 'Miss', surname: 'Two', email: 'maker@testemail.com', - roles: ['maker'], + roles: [MAKER], bank: { id: '956', name: 'Barclays Bank', diff --git a/portal-api/api-tests/v1/users/users.api-test.js b/portal-api/api-tests/v1/users/users.api-test.js index 4942d54916..9e217557ea 100644 --- a/portal-api/api-tests/v1/users/users.api-test.js +++ b/portal-api/api-tests/v1/users/users.api-test.js @@ -5,6 +5,7 @@ const app = require('../../../src/createApp'); const { as } = require('../../api')(app); const users = require('./test-data'); +const { MAKER, CHECKER } = require('../../../src/v1/roles/roles'); const aMaker = users.find((user) => user.username === 'MAKER'); const MOCK_USER = { ...aMaker, username: 'TEMPORARY_USER' }; @@ -28,7 +29,7 @@ describe('a user', () => { it('rejects if the provided password contains zero numeric characters', async () => { const newUser = { ...MOCK_USER, - password: 'sdgkjbsdgkjbsdgkjdskj', + password: 'No-numeric-characters', }; const { status, body } = await as(loggedInUser).post(newUser).to('/v1/users'); @@ -41,7 +42,7 @@ describe('a user', () => { it('rejects if the provided password contains zero upper-case characters', async () => { const newUser = { ...MOCK_USER, - password: 'sdgkjbsdgkjbsdgkjdskj', + password: '0-upper-case-characters', }; const { status, body } = await as(loggedInUser).post(newUser).to('/v1/users'); @@ -54,7 +55,7 @@ describe('a user', () => { it('rejects if the provided password contains zero lower-case characters', async () => { const newUser = { ...MOCK_USER, - password: 'SDGASDFGHSDKGNL', + password: '0-LOWER-CASE-CHARACTERS', }; const { status, body } = await as(loggedInUser).post(newUser).to('/v1/users'); @@ -67,7 +68,7 @@ describe('a user', () => { it('rejects if the provided password contains zero special characters', async () => { const newUser = { ...MOCK_USER, - password: 'SDGASDFGHSDKGNL', + password: '0specialCharacters', }; const { status, body } = await as(loggedInUser).post(newUser).to('/v1/users'); @@ -147,7 +148,7 @@ describe('a user', () => { const createdUser = response.body.user; const updatedUserCredentials = { - roles: ['checker', 'maker'], + roles: [CHECKER, MAKER], }; await as(loggedInUser).put(updatedUserCredentials).to(`/v1/users/${createdUser._id}`); @@ -155,7 +156,7 @@ describe('a user', () => { const { status, body } = await as(loggedInUser).get(`/v1/users/${createdUser._id}`); expect(status).toEqual(200); - expect(body.roles).toEqual(['checker', 'maker']); + expect(body.roles).toEqual([CHECKER, MAKER]); }); it('a user can be deleted', async () => { diff --git a/portal-api/api-tests/v1/validate/validate-token.api-test.js b/portal-api/api-tests/v1/validate/validate-token.api-test.js new file mode 100644 index 0000000000..a0c5b4d794 --- /dev/null +++ b/portal-api/api-tests/v1/validate/validate-token.api-test.js @@ -0,0 +1,27 @@ +const app = require('../../../src/createApp'); +const testUserCache = require('../../api-test-users'); +const { withClientAuthenticationTests } = require('../../common-tests/client-authentication-tests'); +const { withNoRoleAuthorisationTests } = require('../../common-tests/role-authorisation-tests'); + +const { as, get } = require('../../api')(app); + +describe('GET /v1/validate', () => { + const url = '/v1/validate'; + let testUsers; + + beforeAll(async () => { + testUsers = await testUserCache.initialise(app); + }); + + withClientAuthenticationTests({ + makeRequestWithoutAuthHeader: () => get(url), + makeRequestWithAuthHeader: (authHeader) => get(url, { headers: { Authorization: authHeader } }) + }); + + withNoRoleAuthorisationTests({ + getUserWithRole: (role) => testUsers().withRole(role).one(), + getUserWithoutAnyRoles: () => testUsers().withoutAnyRoles().one(), + makeRequestAsUser: (user) => as(user).get(url), + successStatusCode: 200, + }); +}); diff --git a/portal-api/package.json b/portal-api/package.json index 88b1329cb9..17a720a873 100644 --- a/portal-api/package.json +++ b/portal-api/package.json @@ -32,7 +32,7 @@ "*.js": "eslint --fix", "*.ts": "eslint --fix", "*": [ - "cspell lint --gitignore --no-summary --fail-fast --no-must-find-files --color" + "cspell lint --gitignore --no-summary --no-must-find-files --color" ] }, "dependencies": { diff --git a/portal-api/src/external-api/__mocks__/api.js b/portal-api/src/external-api/__mocks__/api.js index f497c8f10f..fcbc8234e4 100644 --- a/portal-api/src/external-api/__mocks__/api.js +++ b/portal-api/src/external-api/__mocks__/api.js @@ -1,8 +1,10 @@ +const companiesHouse = require('./companies-house'); const MOCK_COUNTRIES = require('./countries'); const MOCK_CURRENCIES = require('./currencies'); const MOCK_INDUSTRY_SECTORS = require('./industry-sectors'); const MOCK_NUMBER_GENERATOR = require('./number-generator'); const MOCK_EMAIL_RESPONSE = require('./send-email'); +const ordnanceSurvey = require('./ordnance-survey'); const getCountries = () => MOCK_COUNTRIES; const getCountry = (findCode) => ({ status: 200, data: MOCK_COUNTRIES.find(({ code }) => code === findCode) }); @@ -16,6 +18,7 @@ const getIndustrySector = (findCode) => MOCK_INDUSTRY_SECTORS.find(({ code }) => const sendEmail = () => MOCK_EMAIL_RESPONSE; module.exports = { + companiesHouse, countries: { getCountries, getCountry, @@ -29,5 +32,6 @@ module.exports = { getIndustrySector, }, numberGenerator: MOCK_NUMBER_GENERATOR, + ordnanceSurvey, sendEmail, }; diff --git a/portal-api/src/external-api/__mocks__/companies-house.js b/portal-api/src/external-api/__mocks__/companies-house.js new file mode 100644 index 0000000000..499ad7b9fc --- /dev/null +++ b/portal-api/src/external-api/__mocks__/companies-house.js @@ -0,0 +1,5 @@ +const getCompanyProfileByCompanyRegistrationNumber = jest.fn(); + +module.exports = { + getCompanyProfileByCompanyRegistrationNumber, +}; diff --git a/portal-api/src/external-api/__mocks__/ordnance-survey.js b/portal-api/src/external-api/__mocks__/ordnance-survey.js new file mode 100644 index 0000000000..fc4786c9af --- /dev/null +++ b/portal-api/src/external-api/__mocks__/ordnance-survey.js @@ -0,0 +1,5 @@ +const getAddressesByPostcode = jest.fn(); + +module.exports = { + getAddressesByPostcode, +}; diff --git a/portal-api/src/external-api/api.js b/portal-api/src/external-api/api.js index 6327b5dfc4..74062f88aa 100644 --- a/portal-api/src/external-api/api.js +++ b/portal-api/src/external-api/api.js @@ -1,13 +1,17 @@ +const companiesHouse = require('./companies-house'); const countries = require('./countries'); const currencies = require('./currencies'); const industrySectors = require('./industry-sectors'); const numberGenerator = require('./number-generator'); +const ordnanceSurvey = require('./ordnance-survey'); const sendEmail = require('./send-email'); module.exports = { + companiesHouse, countries, currencies, industrySectors, numberGenerator, + ordnanceSurvey, sendEmail, }; diff --git a/portal-api/src/external-api/companies-house.js b/portal-api/src/external-api/companies-house.js new file mode 100644 index 0000000000..11297e2408 --- /dev/null +++ b/portal-api/src/external-api/companies-house.js @@ -0,0 +1,25 @@ +const axios = require('axios'); +const dotenv = require('dotenv'); + +dotenv.config(); +const { EXTERNAL_API_URL, EXTERNAL_API_KEY } = process.env; + +const headers = { + 'Content-Type': 'application/json', + 'x-api-key': EXTERNAL_API_KEY, +}; + +/** + * Resolves to the response of `GET /companies-house/{companyRegistrationNumber}` from external-api. + * @param {string} companyRegistrationNumber + * @returns {Promise} + */ +const getCompanyProfileByCompanyRegistrationNumber = (companyRegistrationNumber) => axios({ + method: 'get', + url: `${EXTERNAL_API_URL}/companies-house/${companyRegistrationNumber}`, + headers, +}); + +module.exports = { + getCompanyProfileByCompanyRegistrationNumber, +}; diff --git a/portal-api/src/external-api/ordnance-survey.js b/portal-api/src/external-api/ordnance-survey.js new file mode 100644 index 0000000000..8cc5a64bb0 --- /dev/null +++ b/portal-api/src/external-api/ordnance-survey.js @@ -0,0 +1,25 @@ +const axios = require('axios'); +const dotenv = require('dotenv'); + +dotenv.config(); +const { EXTERNAL_API_URL, EXTERNAL_API_KEY } = process.env; + +const headers = { + 'Content-Type': 'application/json', + 'x-api-key': EXTERNAL_API_KEY, +}; + +/** + * Resolves to the response of `GET /ordnance-survey/{postcode}` from external-api. + * @param {string} postcode + * @returns {Promise} + */ +const getAddressesByPostcode = (postcode) => axios({ + method: 'get', + url: `${EXTERNAL_API_URL}/ordnance-survey/${postcode}`, + headers, +}); + +module.exports = { + getAddressesByPostcode, +}; diff --git a/portal-api/src/v1/controllers/bonds.controller.js b/portal-api/src/v1/controllers/bonds.controller.js index 82bd535223..93f36bbd56 100644 --- a/portal-api/src/v1/controllers/bonds.controller.js +++ b/portal-api/src/v1/controllers/bonds.controller.js @@ -62,7 +62,7 @@ exports.getBond = async (req, res) => { return findOneDeal(req.params.id, async (deal) => { if (deal) { if (!userHasAccessTo(req.user, deal)) { - res.status(401).send(); + return res.status(401).send(); } const bond = await facilitiesController.findOne(bondId); diff --git a/portal-api/src/v1/gef/controllers/externalApi.controller.js b/portal-api/src/v1/gef/controllers/externalApi.controller.js index 997ac88968..49a877eb34 100644 --- a/portal-api/src/v1/gef/controllers/externalApi.controller.js +++ b/portal-api/src/v1/gef/controllers/externalApi.controller.js @@ -6,6 +6,7 @@ const { UK_POSTCODE } = require('../../../constants/regex'); require('dotenv').config(); const { ERROR } = require('../enums'); const mapCompaniesHouseData = require('../mappings/map-companies-house-data'); +const externalApi = require('../../../external-api/api'); const { EXTERNAL_API_URL, EXTERNAL_API_KEY } = process.env; @@ -65,11 +66,7 @@ exports.getByRegistrationNumber = async (req, res) => { ]); } - const response = await axios({ - method: 'get', - url: `${EXTERNAL_API_URL}/companies-house/${companyNumber}`, - headers, - }); + const response = await externalApi.companiesHouse.getCompanyProfileByCompanyRegistrationNumber(companyNumber); if (response.data.type === 'oversea-company') { return res.status(422).send([ @@ -110,11 +107,7 @@ exports.getAddressesByPostcode = async (req, res) => { ]); } - const response = await axios({ - method: 'get', - url: `${EXTERNAL_API_URL}/ordnance-survey/${postcode}`, - headers, - }); + const response = await externalApi.ordnanceSurvey.getAddressesByPostcode(postcode); const addresses = []; diff --git a/portal-api/src/v1/gef/routes.js b/portal-api/src/v1/gef/routes.js index bad1914d99..6b33dfd2ce 100644 --- a/portal-api/src/v1/gef/routes.js +++ b/portal-api/src/v1/gef/routes.js @@ -1,6 +1,6 @@ const express = require('express'); -const { MAKER, CHECKER, ADMIN, DATA_ADMIN, EDITOR, READ_ONLY } = require('../roles/roles'); -const { validateUserHasSufficientRole } = require('../roles/validate-user-has-sufficient-role'); +const { MAKER, CHECKER, DATA_ADMIN, EDITOR, READ_ONLY, ADMIN } = require('../roles/roles'); +const { validateUserHasAtLeastOneAllowedRole } = require('../roles/validate-user-has-at-least-one-allowed-role'); const fileUpload = require('../middleware/file-upload'); @@ -17,70 +17,70 @@ const router = express.Router(); // Application router .route('/application') - .get(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, CHECKER, READ_ONLY, DATA_ADMIN, ADMIN] }), application.getAll) - .post(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, DATA_ADMIN] }), application.create); + .get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, READ_ONLY, DATA_ADMIN, ADMIN] }), application.getAll) + .post(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, DATA_ADMIN] }), application.create); -router.route('/application/clone').post(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER] }), cloneApplication.clone); +router.route('/application/clone').post(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER] }), cloneApplication.clone); router .route('/application/:id') - .get(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, CHECKER, READ_ONLY, DATA_ADMIN, ADMIN] }), application.getById) - .put(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, CHECKER, DATA_ADMIN] }), application.update) // checker can add a comment - .delete(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, DATA_ADMIN] }), application.delete); + .get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, READ_ONLY, DATA_ADMIN, ADMIN] }), application.getById) + .put(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, DATA_ADMIN] }), application.update) // checker can add a comment + .delete(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, DATA_ADMIN] }), application.delete); -router.route('/application/supporting-information/:id').put(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, CHECKER, DATA_ADMIN] }), application.updateSupportingInformation); +router.route('/application/supporting-information/:id').put(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, DATA_ADMIN] }), application.updateSupportingInformation); router .route('/application/status/:id') - .get(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, CHECKER, READ_ONLY, DATA_ADMIN, ADMIN] }), application.getStatus) - .put(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, CHECKER, DATA_ADMIN] }), application.changeStatus); + .get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, READ_ONLY, DATA_ADMIN, ADMIN] }), application.getStatus) + .put(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, DATA_ADMIN] }), application.changeStatus); // Facilities router .route('/facilities') - .get(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, CHECKER, READ_ONLY, DATA_ADMIN, ADMIN] }), facilities.getAllGET) - .post(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, DATA_ADMIN] }), facilities.create) - .delete(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, DATA_ADMIN] }), facilities.deleteByDealId); + .get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, READ_ONLY, DATA_ADMIN, ADMIN] }), facilities.getAllGET) + .post(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, DATA_ADMIN] }), facilities.create) + .delete(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, DATA_ADMIN] }), facilities.deleteByDealId); router .route('/facilities/:id') - .get(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, CHECKER, READ_ONLY, DATA_ADMIN, ADMIN] }), facilities.getById) - .put(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, DATA_ADMIN] }), facilities.updatePUT) - .delete(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, DATA_ADMIN] }), facilities.delete); + .get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, READ_ONLY, DATA_ADMIN, ADMIN] }), facilities.getById) + .put(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, DATA_ADMIN] }), facilities.updatePUT) + .delete(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, DATA_ADMIN] }), facilities.delete); // Eligibility Criteria router .route('/eligibility-criteria') - .get(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN] }), eligibilityCriteria.getAll) - .post(validateUserHasSufficientRole({ allowedNonAdminRoles: [EDITOR, DATA_ADMIN] }), eligibilityCriteria.create); + .get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN] }), eligibilityCriteria.getAll) + .post(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [EDITOR, DATA_ADMIN, ADMIN] }), eligibilityCriteria.create); -router.route('/eligibility-criteria/latest').get(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN] }), eligibilityCriteria.getLatest); +router.route('/eligibility-criteria/latest').get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN] }), eligibilityCriteria.getLatest); router .route('/eligibility-criteria/:version') - .get(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN] }), eligibilityCriteria.getByVersion) - .delete(validateUserHasSufficientRole({ allowedNonAdminRoles: [EDITOR, DATA_ADMIN] }), eligibilityCriteria.delete); + .get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN] }), eligibilityCriteria.getByVersion) + .delete(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [EDITOR, DATA_ADMIN, ADMIN] }), eligibilityCriteria.delete); // Mandatory Criteria router .route('/mandatory-criteria-versioned') - .get(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN] }), mandatoryCriteriaVersioned.findAll) - .post(validateUserHasSufficientRole({ allowedNonAdminRoles: [EDITOR, DATA_ADMIN] }), mandatoryCriteriaVersioned.create); + .get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN] }), mandatoryCriteriaVersioned.findAll) + .post(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [EDITOR, DATA_ADMIN, ADMIN] }), mandatoryCriteriaVersioned.create); router .route('/mandatory-criteria-versioned/latest') - .get(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN] }), mandatoryCriteriaVersioned.findLatest); + .get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN] }), mandatoryCriteriaVersioned.findLatest); router .route('/mandatory-criteria-versioned/:id') - .get(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN] }), mandatoryCriteriaVersioned.findOne) - .put(validateUserHasSufficientRole({ allowedNonAdminRoles: [EDITOR, DATA_ADMIN] }), mandatoryCriteriaVersioned.update) - .delete(validateUserHasSufficientRole({ allowedNonAdminRoles: [EDITOR, DATA_ADMIN] }), mandatoryCriteriaVersioned.delete); + .get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN] }), mandatoryCriteriaVersioned.findOne) + .put(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [EDITOR, DATA_ADMIN, ADMIN] }), mandatoryCriteriaVersioned.update) + .delete(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [EDITOR, DATA_ADMIN, ADMIN] }), mandatoryCriteriaVersioned.delete); // File Uploads // TODO: this feels like it should be a service: https://ukef-dtfs.atlassian.net/browse/DTFS2-4842 router.route('/files').post( - validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, DATA_ADMIN] }), + validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, DATA_ADMIN] }), (req, res, next) => { fileUpload(req, res, (error) => { if (!error) { @@ -95,17 +95,17 @@ router.route('/files').post( router .route('/files/:id') - .get(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN] }), files.getById) - .delete(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, DATA_ADMIN] }), files.delete); + .get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN] }), files.getById) + .delete(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, DATA_ADMIN] }), files.delete); -router.route('/files/:id/download').get(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN] }), files.downloadFile); +router.route('/files/:id/download').get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN] }), files.downloadFile); router .route('/company/:number') // Companies House - .get(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, READ_ONLY, DATA_ADMIN, ADMIN] }), externalApi.getByRegistrationNumber); + .get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, READ_ONLY, DATA_ADMIN, ADMIN] }), externalApi.getByRegistrationNumber); router .route('/address/:postcode') // Ordnance Survey - .get(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, READ_ONLY, DATA_ADMIN, ADMIN] }), externalApi.getAddressesByPostcode); + .get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, READ_ONLY, DATA_ADMIN, ADMIN] }), externalApi.getAddressesByPostcode); module.exports = router; diff --git a/portal-api/src/v1/roles/roles.js b/portal-api/src/v1/roles/roles.js index b2ed3b27c0..0932f56429 100644 --- a/portal-api/src/v1/roles/roles.js +++ b/portal-api/src/v1/roles/roles.js @@ -2,7 +2,6 @@ const ROLES = { MAKER: 'maker', CHECKER: 'checker', ADMIN: 'admin', - UKEF_OPERATIONS: 'ukef_operations', READ_ONLY: 'read-only', EDITOR: 'editor', DATA_ADMIN: 'data-admin', diff --git a/portal-api/src/v1/roles/user-has-at-least-one-allowed-role.js b/portal-api/src/v1/roles/user-has-at-least-one-allowed-role.js new file mode 100644 index 0000000000..3f419e18fc --- /dev/null +++ b/portal-api/src/v1/roles/user-has-at-least-one-allowed-role.js @@ -0,0 +1,22 @@ +const userHasRole = ({ + user, + targetRole, +}) => { + const { roles: userRoles } = user; + return userRoles.includes(targetRole); +}; + +/** + * Returns true if the user has at least one of allowedRoles. + * Returns false otherwise. + * @param {{ user: { roles: string[] }, allowedRoles: string[] }} + * @returns {boolean} + */ +const userHasAtLeastOneAllowedRole = ({ + user, + allowedRoles, +}) => allowedRoles.some((allowedRole) => userHasRole({ user, targetRole: allowedRole })); + +module.exports = { + userHasAtLeastOneAllowedRole, +}; diff --git a/portal-api/src/v1/roles/user-has-at-least-one-allowed-role.test.js b/portal-api/src/v1/roles/user-has-at-least-one-allowed-role.test.js new file mode 100644 index 0000000000..2f8ee5264a --- /dev/null +++ b/portal-api/src/v1/roles/user-has-at-least-one-allowed-role.test.js @@ -0,0 +1,131 @@ +const { userHasAtLeastOneAllowedRole } = require('./user-has-at-least-one-allowed-role'); +const { MAKER, CHECKER, ADMIN, READ_ONLY } = require('./roles'); + +const allRoles = [ + MAKER, CHECKER, READ_ONLY, ADMIN, +]; + +describe('userHasAtLeastOneAllowedRole', () => { + describe('when there are no allowed roles', () => { + const allowedRoles = []; + + it('returns false if the user has no roles', () => { + const allowed = userHasAtLeastOneAllowedRole({ + allowedRoles, + user: { roles: [] } + }); + + expect(allowed).toBe(false); + }); + + it.each(allRoles)('returns false if the user has the %s role', (userRole) => { + const allowed = userHasAtLeastOneAllowedRole({ + allowedRoles, + user: { roles: [userRole] } + }); + + expect(allowed).toBe(false); + }); + }); + + describe.each(allRoles)('when the only allowed role is %s', (allowedRole) => { + const allowedRoles = [allowedRole]; + + it('returns false if the user has no roles', () => { + const allowed = userHasAtLeastOneAllowedRole({ + allowedRoles, + user: { roles: [] } + }); + + expect(allowed).toBe(false); + }); + + const nonMatchingRoles = allRoles.filter((role) => role !== allowedRole); + it.each(nonMatchingRoles)('returns false if the user has the %s role', (userRole) => { + const allowed = userHasAtLeastOneAllowedRole({ + allowedRoles, + user: { roles: [userRole] } + }); + + expect(allowed).toBe(false); + }); + + it(`returns true if the user has the ${allowedRole} role only`, () => { + const allowed = userHasAtLeastOneAllowedRole({ + allowedRoles, + user: { roles: [allowedRole] } + }); + + expect(allowed).toBe(true); + }); + + it.each(nonMatchingRoles)(`returns true if the user has the ${allowedRole} role and the %s role in either order`, (userRole) => { + const allowedWithAllowedRoleFirst = userHasAtLeastOneAllowedRole({ + allowedRoles, + user: { roles: [allowedRole, userRole] } + }); + const allowedWithAllowedRoleSecond = userHasAtLeastOneAllowedRole({ + allowedRoles, + user: { roles: [userRole, allowedRole] } + }); + + expect(allowedWithAllowedRoleFirst).toBe(true); + expect(allowedWithAllowedRoleSecond).toBe(true); + }); + }); + + describe('when there are multiple allowed roles', () => { + const allowedRoles = [MAKER, READ_ONLY]; + const notAllowedRole = CHECKER; + + it('returns false if the user has no roles', () => { + const allowed = userHasAtLeastOneAllowedRole({ + allowedRoles, + user: { roles: [] } + }); + + expect(allowed).toBe(false); + }); + + it('returns false if the user has none of the allowed roles', () => { + const allowed = userHasAtLeastOneAllowedRole({ + allowedRoles, + user: { roles: [notAllowedRole] } + }); + + expect(allowed).toBe(false); + }); + + it('returns true if the user has one of the allowed roles', () => { + const allowed = userHasAtLeastOneAllowedRole({ + allowedRoles, + user: { roles: [allowedRoles[0]] } + }); + + expect(allowed).toBe(true); + }); + + it('returns true if the user has multiple of the allowed roles', () => { + const allowed = userHasAtLeastOneAllowedRole({ + allowedRoles, + user: { roles: [allowedRoles[0], allowedRoles[1]] } + }); + + expect(allowed).toBe(true); + }); + + it('returns true if the user has an allowed role and another role in either order', () => { + const allowedWithAllowedRoleFirst = userHasAtLeastOneAllowedRole({ + allowedRoles, + user: { roles: [allowedRoles[1], notAllowedRole] } + }); + const allowedWithAllowedRoleSecond = userHasAtLeastOneAllowedRole({ + allowedRoles, + user: { roles: [notAllowedRole, allowedRoles[1]] } + }); + + expect(allowedWithAllowedRoleFirst).toBe(true); + expect(allowedWithAllowedRoleSecond).toBe(true); + }); + }); +}); diff --git a/portal-api/src/v1/roles/user-has-sufficient-role.js b/portal-api/src/v1/roles/user-has-sufficient-role.js deleted file mode 100644 index 655d57447f..0000000000 --- a/portal-api/src/v1/roles/user-has-sufficient-role.js +++ /dev/null @@ -1,28 +0,0 @@ -const { UKEF_OPERATIONS } = require('./roles'); - -const userHasRole = ({ - user, - targetRole, -}) => { - const { roles: userRoles } = user; - return userRoles.includes(targetRole); -}; - -/** - * Returns true if the user has one of allowedNonAdminRoles or is an admin. - * @param {{ user: { roles: string[] }, allowedNonAdminRoles: string[] }} - * @returns {boolean} - */ -const userHasSufficientRole = ({ - user, - allowedNonAdminRoles, -}) => { - if (userHasRole({ user, targetRole: UKEF_OPERATIONS })) { - return true; - } - return allowedNonAdminRoles.some((allowedRole) => userHasRole({ user, targetRole: allowedRole })); -}; - -module.exports = { - userHasSufficientRole, -}; diff --git a/portal-api/src/v1/roles/user-has-sufficient-role.test.js b/portal-api/src/v1/roles/user-has-sufficient-role.test.js deleted file mode 100644 index 9eaa02c8d2..0000000000 --- a/portal-api/src/v1/roles/user-has-sufficient-role.test.js +++ /dev/null @@ -1,181 +0,0 @@ -const { userHasSufficientRole } = require('./user-has-sufficient-role'); -const { MAKER, CHECKER, ADMIN, READ_ONLY, UKEF_OPERATIONS } = require('./roles'); - -const adminRoles = [ - UKEF_OPERATIONS -]; - -const nonAdminRoles = [ - MAKER, CHECKER, ADMIN, READ_ONLY, -]; - -const allRoles = [ - ...nonAdminRoles, - ...adminRoles, -]; - -describe('userHasSufficientRole', () => { - describe('when there are no allowed roles', () => { - const allowedNonAdminRoles = []; - - it('returns false if the user has no roles', () => { - const allowed = userHasSufficientRole({ - allowedNonAdminRoles, - user: { roles: [] } - }); - - expect(allowed).toBe(false); - }); - - it.each(nonAdminRoles)('returns false if the user has the %s role and not the ukef_operations role', (userRole) => { - const allowed = userHasSufficientRole({ - allowedNonAdminRoles, - user: { roles: [userRole] } - }); - - expect(allowed).toBe(false); - }); - - it('returns true if the user has the ukef_operations role only', () => { - const allowed = userHasSufficientRole({ - allowedNonAdminRoles, - user: { roles: [UKEF_OPERATIONS] } - }); - - expect(allowed).toBe(true); - }); - - it.each(nonAdminRoles)('returns true if the user has the ukef_operations role and the %s role in either order', (userRole) => { - const allowedWithOperationsFirst = userHasSufficientRole({ - allowedNonAdminRoles, - user: { roles: [UKEF_OPERATIONS, userRole] } - }); - const allowedWithOperationsSecond = userHasSufficientRole({ - allowedNonAdminRoles, - user: { roles: [userRole, UKEF_OPERATIONS] } - }); - - expect(allowedWithOperationsFirst).toBe(true); - expect(allowedWithOperationsSecond).toBe(true); - }); - }); - - describe.each(allRoles)('when the only allowed non-admin role is %s', (allowedRole) => { - const allowedNonAdminRoles = [allowedRole]; - - it('returns false if the user has no roles', () => { - const allowed = userHasSufficientRole({ - allowedNonAdminRoles, - user: { roles: [] } - }); - - expect(allowed).toBe(false); - }); - - const nonMatchingNonAdminRoles = nonAdminRoles.filter((role) => role !== allowedRole); - it.each(nonMatchingNonAdminRoles)('returns false if the user has the %s role and not the ukef_operations role', (userRole) => { - const allowed = userHasSufficientRole({ - allowedNonAdminRoles, - user: { roles: [userRole] } - }); - - expect(allowed).toBe(false); - }); - - it('returns true if the user has the ukef_operations role only', () => { - const allowed = userHasSufficientRole({ - allowedNonAdminRoles, - user: { roles: [UKEF_OPERATIONS] } - }); - - expect(allowed).toBe(true); - }); - - it(`returns true if the user has the ${allowedRole} role only`, () => { - const allowed = userHasSufficientRole({ - allowedNonAdminRoles, - user: { roles: [allowedRole] } - }); - - expect(allowed).toBe(true); - }); - - it.each(nonMatchingNonAdminRoles)(`returns true if the user has the ${allowedRole} role and the %s role in either order`, (userRole) => { - const allowedWithAllowedRoleFirst = userHasSufficientRole({ - allowedNonAdminRoles, - user: { roles: [allowedRole, userRole] } - }); - const allowedWithAllowedRoleSecond = userHasSufficientRole({ - allowedNonAdminRoles, - user: { roles: [userRole, allowedRole] } - }); - - expect(allowedWithAllowedRoleFirst).toBe(true); - expect(allowedWithAllowedRoleSecond).toBe(true); - }); - }); - - describe('when there are multiple allowed non-admin roles', () => { - const allowedNonAdminRoles = [MAKER, READ_ONLY]; - const notAllowedRole = CHECKER; - - it('returns false if the user has no roles', () => { - const allowed = userHasSufficientRole({ - allowedNonAdminRoles, - user: { roles: [] } - }); - - expect(allowed).toBe(false); - }); - - it('returns false if the user has none of the allowed roles and does not have the ukef_operations role', () => { - const allowed = userHasSufficientRole({ - allowedNonAdminRoles, - user: { roles: [notAllowedRole] } - }); - - expect(allowed).toBe(false); - }); - - it('returns true if the user has none of the allowed roles and has the ukef_operations role', () => { - const allowed = userHasSufficientRole({ - allowedNonAdminRoles, - user: { roles: [UKEF_OPERATIONS] } - }); - - expect(allowed).toBe(true); - }); - - it('returns true if the user has one of the allowed roles', () => { - const allowed = userHasSufficientRole({ - allowedNonAdminRoles, - user: { roles: [allowedNonAdminRoles[0]] } - }); - - expect(allowed).toBe(true); - }); - - it('returns true if the user has multiple of the allowed roles', () => { - const allowed = userHasSufficientRole({ - allowedNonAdminRoles, - user: { roles: [allowedNonAdminRoles[0], allowedNonAdminRoles[1]] } - }); - - expect(allowed).toBe(true); - }); - - it('returns true if the user has an allowed role and another role in either order', () => { - const allowedWithAllowedRoleFirst = userHasSufficientRole({ - allowedNonAdminRoles, - user: { roles: [allowedNonAdminRoles[1], notAllowedRole] } - }); - const allowedWithAllowedRoleSecond = userHasSufficientRole({ - allowedNonAdminRoles, - user: { roles: [notAllowedRole, allowedNonAdminRoles[1]] } - }); - - expect(allowedWithAllowedRoleFirst).toBe(true); - expect(allowedWithAllowedRoleSecond).toBe(true); - }); - }); -}); diff --git a/portal-api/src/v1/roles/validate-user-has-at-least-one-allowed-role.js b/portal-api/src/v1/roles/validate-user-has-at-least-one-allowed-role.js new file mode 100644 index 0000000000..1783995d42 --- /dev/null +++ b/portal-api/src/v1/roles/validate-user-has-at-least-one-allowed-role.js @@ -0,0 +1,24 @@ +const { userHasAtLeastOneAllowedRole } = require('./user-has-at-least-one-allowed-role'); + +/** + * Creates a middleware that returns a 401 error if the current user does not + * have at least one of the allowedRoles, and calls the next handler otherwise. + * @param {{ allowedRoles: string[] }} + * @returns {(req, res, next) => void} + */ +const validateUserHasAtLeastOneAllowedRole = ({ + allowedRoles, +}) => (req, res, next) => { + const { user } = req; + + if (!userHasAtLeastOneAllowedRole({ user, allowedRoles })) { + res.status(401).json({ success: false, msg: "You don't have access to this page" }); + return; + } + + next(); +}; + +module.exports = { + validateUserHasAtLeastOneAllowedRole, +}; diff --git a/portal-api/src/v1/roles/validate-user-has-at-least-one-allowed-role.test.js b/portal-api/src/v1/roles/validate-user-has-at-least-one-allowed-role.test.js new file mode 100644 index 0000000000..8c20f8b1ba --- /dev/null +++ b/portal-api/src/v1/roles/validate-user-has-at-least-one-allowed-role.test.js @@ -0,0 +1,71 @@ +const { when } = require('jest-when'); +const { validateUserHasAtLeastOneAllowedRole } = require('./validate-user-has-at-least-one-allowed-role'); +const { MAKER, READ_ONLY, CHECKER } = require('./roles'); +const { userHasAtLeastOneAllowedRole } = require('./user-has-at-least-one-allowed-role'); + +jest.mock('./user-has-at-least-one-allowed-role', () => ({ userHasAtLeastOneAllowedRole: jest.fn() })); + +describe('validateUserHasAtLeastOneAllowedRole', () => { + describe('returns middleware that', () => { + const allowedRoles = [MAKER, READ_ONLY]; + const req = { user: { roles: [CHECKER] } }; + + let res; + let next = jest.fn(); + + beforeEach(() => { + res = { + status: jest.fn().mockReturnThis(), + json: jest.fn(), + }; + next = jest.fn(); + }); + + it('calls next if the request user has at least one of the allowed roles', () => { + when(userHasAtLeastOneAllowedRole).calledWith({ user: req.user, allowedRoles }).mockReturnValueOnce(true); + const middleware = validateUserHasAtLeastOneAllowedRole({ allowedRoles }); + + middleware(req, res, next); + + expect(next).toHaveBeenCalledTimes(1); + expect(next).toHaveBeenCalledWith(); + }); + + it('does not set a status on the response if the request user has at least one of the allowed roles', () => { + when(userHasAtLeastOneAllowedRole).calledWith({ user: req.user, allowedRoles }).mockReturnValueOnce(true); + const middleware = validateUserHasAtLeastOneAllowedRole({ allowedRoles }); + + middleware(req, res, next); + + expect(res.status).not.toHaveBeenCalled(); + }); + + it('does not send a json response if the request user has at least one of the allowed roles', () => { + when(userHasAtLeastOneAllowedRole).calledWith({ user: req.user, allowedRoles }).mockReturnValueOnce(true); + const middleware = validateUserHasAtLeastOneAllowedRole({ allowedRoles }); + + middleware(req, res, next); + + expect(res.json).not.toHaveBeenCalled(); + }); + + it('does not call next if the request user does not have at least one of the allowed roles', () => { + when(userHasAtLeastOneAllowedRole).calledWith({ user: req.user, allowedRoles }).mockReturnValueOnce(false); + const middleware = validateUserHasAtLeastOneAllowedRole({ allowedRoles }); + + middleware(req, res, next); + + expect(next).not.toHaveBeenCalled(); + }); + + it('returns a 401 error with a JSON message if the request user does not have at least one of the allowed roles', () => { + when(userHasAtLeastOneAllowedRole).calledWith({ user: req.user, allowedRoles }).mockReturnValueOnce(false); + const middleware = validateUserHasAtLeastOneAllowedRole({ allowedRoles }); + + middleware(req, res, next); + + expect(res.status).toHaveBeenCalledWith(401); + expect(res.json).toHaveBeenCalledWith({ success: false, msg: "You don't have access to this page" }); + }); + }); +}); diff --git a/portal-api/src/v1/roles/validate-user-has-sufficient-role.js b/portal-api/src/v1/roles/validate-user-has-sufficient-role.js deleted file mode 100644 index 28c198664a..0000000000 --- a/portal-api/src/v1/roles/validate-user-has-sufficient-role.js +++ /dev/null @@ -1,25 +0,0 @@ -const { userHasSufficientRole } = require('./user-has-sufficient-role'); - -/** - * Creates a middleware that returns a 401 error if the current user does - * not have sufficient role(s), given a list of allowed non-admin roles. - * @param {{ allowedNonAdminRoles: string[] }} - * @returns {(req, res, next) => void} - */ -const validateUserHasSufficientRole = ({ - allowedNonAdminRoles, -}) => (req, res, next) => { - const { user } = req; - const userHasSufficientRolesToAccessNext = userHasSufficientRole({ user, allowedNonAdminRoles }); - - if (userHasSufficientRolesToAccessNext) { - next(); - return; - } - - res.status(401).json({ success: false, msg: "You don't have access to this page" }); -}; - -module.exports = { - validateUserHasSufficientRole, -}; diff --git a/portal-api/src/v1/roles/validate-user-has-sufficient-role.test.js b/portal-api/src/v1/roles/validate-user-has-sufficient-role.test.js deleted file mode 100644 index 838d2c5dd5..0000000000 --- a/portal-api/src/v1/roles/validate-user-has-sufficient-role.test.js +++ /dev/null @@ -1,71 +0,0 @@ -const { when } = require('jest-when'); -const { validateUserHasSufficientRole } = require('./validate-user-has-sufficient-role'); -const { MAKER, READ_ONLY, CHECKER } = require('./roles'); -const { userHasSufficientRole } = require('./user-has-sufficient-role'); - -jest.mock('./user-has-sufficient-role', () => ({ userHasSufficientRole: jest.fn() })); - -describe('validateUserHasSufficientRole', () => { - describe('returns middleware that', () => { - const allowedNonAdminRoles = [MAKER, READ_ONLY]; - const req = { user: { roles: [CHECKER] } }; - - let res; - let next = jest.fn(); - - beforeEach(() => { - res = { - status: jest.fn().mockReturnThis(), - json: jest.fn(), - }; - next = jest.fn(); - }); - - it('calls next if the request user has sufficient roles for the allowed roles', () => { - when(userHasSufficientRole).calledWith({ user: req.user, allowedNonAdminRoles }).mockReturnValueOnce(true); - const middleware = validateUserHasSufficientRole({ allowedNonAdminRoles }); - - middleware(req, res, next); - - expect(next).toHaveBeenCalledTimes(1); - expect(next).toHaveBeenCalledWith(); - }); - - it('does not set a status on the response if the request user has sufficient roles for the allowed roles', () => { - when(userHasSufficientRole).calledWith({ user: req.user, allowedNonAdminRoles }).mockReturnValueOnce(true); - const middleware = validateUserHasSufficientRole({ allowedNonAdminRoles }); - - middleware(req, res, next); - - expect(res.status).not.toHaveBeenCalled(); - }); - - it('does not send a json response if the request user has sufficient roles for the allowed roles', () => { - when(userHasSufficientRole).calledWith({ user: req.user, allowedNonAdminRoles }).mockReturnValueOnce(true); - const middleware = validateUserHasSufficientRole({ allowedNonAdminRoles }); - - middleware(req, res, next); - - expect(res.json).not.toHaveBeenCalled(); - }); - - it('does not call next if the request user does not have sufficient roles for the allowed roles', () => { - when(userHasSufficientRole).calledWith({ user: req.user, allowedNonAdminRoles }).mockReturnValueOnce(false); - const middleware = validateUserHasSufficientRole({ allowedNonAdminRoles }); - - middleware(req, res, next); - - expect(next).not.toHaveBeenCalled(); - }); - - it('returns a 401 error with a JSON message if the request user does not have sufficient roles for the allowed roles', () => { - when(userHasSufficientRole).calledWith({ user: req.user, allowedNonAdminRoles }).mockReturnValueOnce(false); - const middleware = validateUserHasSufficientRole({ allowedNonAdminRoles }); - - middleware(req, res, next); - - expect(res.status).toHaveBeenCalledWith(401); - expect(res.json).toHaveBeenCalledWith({ success: false, msg: "You don't have access to this page" }); - }); - }); -}); diff --git a/portal-api/src/v1/routes.js b/portal-api/src/v1/routes.js index 007712680e..0167bf7be1 100644 --- a/portal-api/src/v1/routes.js +++ b/portal-api/src/v1/routes.js @@ -1,15 +1,15 @@ const express = require('express'); const passport = require('passport'); -const { validateUserHasSufficientRole } = require('./roles/validate-user-has-sufficient-role'); +const { validateUserHasAtLeastOneAllowedRole } = require('./roles/validate-user-has-at-least-one-allowed-role'); const { MAKER, CHECKER, - ADMIN, EDITOR, DATA_ADMIN, INTERFACE, READ_ONLY, + ADMIN, } = require('./roles/roles'); const dealsController = require('./controllers/deal.controller'); @@ -69,9 +69,9 @@ authRouter.use(passport.authenticate('jwt', { session: false })); * Allow POST & PUT of MC HTML tags * on non-production environments only */ -authRouter.route('/mandatory-criteria').post(validateUserHasSufficientRole({ allowedNonAdminRoles: [EDITOR] }), mandatoryCriteria.create); +authRouter.route('/mandatory-criteria').post(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [EDITOR, ADMIN] }), mandatoryCriteria.create); -authRouter.route('/mandatory-criteria/:version').put(validateUserHasSufficientRole({ allowedNonAdminRoles: [EDITOR] }), mandatoryCriteria.update); +authRouter.route('/mandatory-criteria/:version').put(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [EDITOR, ADMIN] }), mandatoryCriteria.update); // Enable XSS authRouter.use(cleanXss); @@ -84,7 +84,7 @@ authRouter.route('/mandatory-criteria/latest').get(mandatoryCriteria.findLatest) authRouter .route('/mandatory-criteria/:version') .get(mandatoryCriteria.findOne) - .delete(validateUserHasSufficientRole({ allowedNonAdminRoles: [EDITOR] }), mandatoryCriteria.delete); + .delete(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [EDITOR, ADMIN] }), mandatoryCriteria.delete); authRouter.route('/users').get(users.list).post(users.create); authRouter.route('/users/:_id').get(users.findById).put(users.updateById).delete(users.remove); @@ -92,54 +92,54 @@ authRouter.route('/users/:_id/disable').delete(users.disable); authRouter.use('/gef', gef); -authRouter.route('/deals').post(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER] }), dealsController.create); -authRouter.route('/deals').get(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, CHECKER, READ_ONLY, ADMIN] }), dealsController.getQueryAllDeals); +authRouter.route('/deals').post(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER] }), dealsController.create); +authRouter.route('/deals').get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, READ_ONLY, ADMIN] }), dealsController.getQueryAllDeals); authRouter .route('/deals/:id/status') - .get(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, CHECKER, READ_ONLY, ADMIN] }), dealStatus.findOne) - .put(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, CHECKER, INTERFACE] }), dealStatus.update); + .get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, READ_ONLY, ADMIN] }), dealStatus.findOne) + .put(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, INTERFACE] }), dealStatus.update); authRouter .route('/deals/:id/submission-details') - .get(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, CHECKER, READ_ONLY, ADMIN] }), dealSubmissionDetails.findOne) - .put(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER] }), dealSubmissionDetails.update); + .get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, READ_ONLY, ADMIN] }), dealSubmissionDetails.findOne) + .put(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER] }), dealSubmissionDetails.update); -authRouter.route('/deals/:id/additionalRefName').put(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER] }), dealName.update); -authRouter.route('/deals/:id/loan/create').put(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER] }), loans.create); +authRouter.route('/deals/:id/additionalRefName').put(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER] }), dealName.update); +authRouter.route('/deals/:id/loan/create').put(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER] }), loans.create); authRouter .route('/deals/:id/loan/:loanId') - .get(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, READ_ONLY, ADMIN] }), loans.getLoan) - .put(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER] }), loans.updateLoan) - .delete(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER] }), loans.deleteLoan); + .get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, READ_ONLY, ADMIN] }), loans.getLoan) + .put(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER] }), loans.updateLoan) + .delete(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER] }), loans.deleteLoan); -authRouter.route('/deals/:id/loan/:loanId/issue-facility').put(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER] }), loanIssueFacility.updateLoanIssueFacility); -authRouter.route('/deals/:id/loan/:loanId/change-cover-start-date').put(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER] }), loanChangeCoverStartDate.updateLoanCoverStartDate); -authRouter.route('/deals/:id/bond/create').put(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER] }), bonds.create); +authRouter.route('/deals/:id/loan/:loanId/issue-facility').put(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER] }), loanIssueFacility.updateLoanIssueFacility); +authRouter.route('/deals/:id/loan/:loanId/change-cover-start-date').put(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER] }), loanChangeCoverStartDate.updateLoanCoverStartDate); +authRouter.route('/deals/:id/bond/create').put(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER] }), bonds.create); authRouter .route('/deals/:id/bond/:bondId') - .get(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, READ_ONLY, ADMIN] }), bonds.getBond) - .put(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER] }), bonds.updateBond) - .delete(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER] }), bonds.deleteBond); + .get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, READ_ONLY, ADMIN] }), bonds.getBond) + .put(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER] }), bonds.updateBond) + .delete(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER] }), bonds.deleteBond); -authRouter.route('/deals/:id/bond/:bondId/issue-facility').put(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER] }), bondIssueFacility.updateBondIssueFacility); -authRouter.route('/deals/:id/bond/:bondId/change-cover-start-date').put(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER] }), bondChangeCoverStartDate.updateBondCoverStartDate); -authRouter.route('/deals/:id/multiple-facilities').post(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER] }), facilitiesController.createMultiple); +authRouter.route('/deals/:id/bond/:bondId/issue-facility').put(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER] }), bondIssueFacility.updateBondIssueFacility); +authRouter.route('/deals/:id/bond/:bondId/change-cover-start-date').put(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER] }), bondChangeCoverStartDate.updateBondCoverStartDate); +authRouter.route('/deals/:id/multiple-facilities').post(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER] }), facilitiesController.createMultiple); -authRouter.route('/facilities').get(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, CHECKER, READ_ONLY, ADMIN] }), facilitiesController.getQueryAllFacilities); +authRouter.route('/facilities').get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, READ_ONLY, ADMIN] }), facilitiesController.getQueryAllFacilities); authRouter .route('/deals/:id') - .get(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, CHECKER, READ_ONLY, ADMIN] }), dealsController.findOne) - .put(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER] }), dealsController.update) - .delete(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER] }), dealsController.delete); + .get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, READ_ONLY, ADMIN] }), dealsController.findOne) + .put(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER] }), dealsController.update) + .delete(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER] }), dealsController.delete); -authRouter.route('/deals/:id/clone').post(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER] }), dealClone.clone); -authRouter.route('/deals/:id/eligibility-criteria').put(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER] }), dealEligibilityCriteria.update); +authRouter.route('/deals/:id/clone').post(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER] }), dealClone.clone); +authRouter.route('/deals/:id/eligibility-criteria').put(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER] }), dealEligibilityCriteria.update); authRouter.route('/deals/:id/eligibility-documentation').put( - validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER] }), + validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER] }), (req, res, next) => { fileUpload(req, res, (error) => { if (!error) { @@ -154,18 +154,18 @@ authRouter.route('/deals/:id/eligibility-documentation').put( authRouter .route('/deals/:id/eligibility-documentation/:fieldname/:filename') - .get(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, CHECKER, READ_ONLY, ADMIN] }), dealEligibilityDocumentation.downloadFile); + .get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, READ_ONLY, ADMIN] }), dealEligibilityDocumentation.downloadFile); authRouter .route('/banks') .get(banks.findAll) - .post(validateUserHasSufficientRole({ allowedNonAdminRoles: [EDITOR] }), banks.create); + .post(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [EDITOR, ADMIN] }), banks.create); authRouter .route('/banks/:id') .get(banks.findOne) - .put(validateUserHasSufficientRole({ allowedNonAdminRoles: [EDITOR] }), banks.update) - .delete(validateUserHasSufficientRole({ allowedNonAdminRoles: [EDITOR] }), banks.delete); + .put(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [EDITOR, ADMIN] }), banks.update) + .delete(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [EDITOR, ADMIN] }), banks.delete); authRouter.route('/currencies').get(currencies.findAll); authRouter.route('/currencies/:id').get(currencies.findOne); @@ -173,12 +173,12 @@ authRouter.route('/currencies/:id').get(currencies.findOne); authRouter.route('/countries').get(countries.findAll); authRouter.route('/countries/:code').get(countries.findOne); -authRouter.route('/feedback').get(validateUserHasSufficientRole({ allowedNonAdminRoles: [DATA_ADMIN, ADMIN] }), feedback.findAll); +authRouter.route('/feedback').get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [DATA_ADMIN, ADMIN] }), feedback.findAll); authRouter .route('/feedback/:id') - .get(validateUserHasSufficientRole({ allowedNonAdminRoles: [DATA_ADMIN, ADMIN] }), feedback.findOne) - .delete(validateUserHasSufficientRole({ allowedNonAdminRoles: [DATA_ADMIN] }), feedback.delete); + .get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [DATA_ADMIN, ADMIN] }), feedback.findOne) + .delete(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [DATA_ADMIN, ADMIN] }), feedback.delete); authRouter.route('/industry-sectors').get(industrySectors.findAll); authRouter.route('/industry-sectors/:code').get(industrySectors.findOne); @@ -186,19 +186,19 @@ authRouter.route('/industry-sectors/:code').get(industrySectors.findOne); authRouter .route('/eligibility-criteria') .get(eligibilityCriteria.findAll) - .post(validateUserHasSufficientRole({ allowedNonAdminRoles: [EDITOR] }), eligibilityCriteria.create); + .post(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [EDITOR, ADMIN] }), eligibilityCriteria.create); authRouter.route('/eligibility-criteria/latest').get(eligibilityCriteria.findLatestGET); authRouter .route('/eligibility-criteria/:version') .get(eligibilityCriteria.findOne) - .put(validateUserHasSufficientRole({ allowedNonAdminRoles: [EDITOR] }), eligibilityCriteria.update) - .delete(validateUserHasSufficientRole({ allowedNonAdminRoles: [EDITOR] }), eligibilityCriteria.delete); + .put(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [EDITOR, ADMIN] }), eligibilityCriteria.update) + .delete(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [EDITOR, ADMIN] }), eligibilityCriteria.delete); // Portal reports -authRouter.route('/reports/unissued-facilities').get(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, CHECKER, READ_ONLY, ADMIN] }), unissuedFacilitiesReport.findUnissuedFacilitiesReports); -authRouter.route('/reports/review-ukef-decision').get(validateUserHasSufficientRole({ allowedNonAdminRoles: [MAKER, CHECKER, READ_ONLY, ADMIN] }), ukefDecisionReport.reviewUkefDecisionReports); +authRouter.route('/reports/unissued-facilities').get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, READ_ONLY, ADMIN] }), unissuedFacilitiesReport.findUnissuedFacilitiesReports); +authRouter.route('/reports/review-ukef-decision').get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, READ_ONLY, ADMIN] }), ukefDecisionReport.reviewUkefDecisionReports); // token-validator authRouter.get('/validate', (req, res) => { diff --git a/utils/mock-data-loader/user-helper.js b/utils/mock-data-loader/user-helper.js index d289ce331c..9b424cff81 100644 --- a/utils/mock-data-loader/user-helper.js +++ b/utils/mock-data-loader/user-helper.js @@ -6,7 +6,7 @@ const mockDataLoaderUser = { password: 'AbC!2345', firstname: 'Mock', surname: 'DataLoader', - roles: ['editor', 'maker'], + roles: ['editor', 'maker', 'ukef_operations'], email: 're-insert-mocks-data-loader@ukexportfinance.gov.uk', bank: { id: '*' }, timezone: 'Europe/London', From 4e799586147d48e3bbc39d127b123537459d8ca0 Mon Sep 17 00:00:00 2001 From: oscar-richardson-softwire <116292912+oscar-richardson-softwire@users.noreply.github.com> Date: Wed, 13 Sep 2023 16:48:50 +0100 Subject: [PATCH 013/130] feat(DTFS2-6625): add read-only limitation on Portal UI routes (#1980) Co-authored-by: Alex Co-authored-by: lmarrai-sw <44811960+lmarrai-sw@users.noreply.github.com> Co-authored-by: Luke Marrai --- portal/api-tests/admin-routes.api-test.js | 90 +++++++++ .../common-tests/role-validation-api-tests.js | 89 +++++++++ .../contract/about-routes.api-test.js | 122 ++++++++++++ .../contract/bond-routes.api-test.js | 180 ++++++++++++++++++ .../contract/contract-routes.api-test.js | 173 +++++++++++++++++ .../contract/loan-routes.api-test.js | 179 +++++++++++++++++ portal/api-tests/create-api.js | 10 +- portal/api-tests/dashboard-routes.api-test.js | 149 +++++++++++++++ .../api-tests/eligibility-routes.api-test.js | 95 +++++++++ portal/api-tests/feedback-routes.api-test.js | 32 ++++ portal/api-tests/footer-routes.api-test.js | 32 ++++ portal/api-tests/helpers/mockProvide.js | 8 + portal/api-tests/login-routes.api-test.js | 69 +++++++ portal/api-tests/portal-routes.api-test.js | 69 +++++++ .../api-tests/scheme-type-routes.api-test.js | 22 +++ portal/api-tests/start-routes.api-test.js | 58 ++++++ portal/api-tests/static-routes.api-test.js | 24 +++ portal/api-tests/user-routes.api-test.js | 36 ++++ portal/server/constants/index.js | 2 + portal/server/constants/roles.js | 14 ++ portal/server/routes/admin/index.js | 7 +- portal/server/routes/admin/users.js | 5 +- .../server/routes/contract/about/buyerPage.js | 17 +- .../routes/contract/about/financialPage.js | 17 +- .../routes/contract/about/previewPage.js | 17 +- .../routes/contract/about/supplierPage.js | 20 +- portal/server/routes/contract/bond/index.js | 36 ++-- .../canIssueOrEditIssueFacility.test.js | 5 +- ...thCanIssueOrEditIssueFacilityFlags.test.js | 3 +- .../index.js | 4 +- .../index.test.js | 0 .../routes/contract/eligibility/index.js | 34 +--- portal/server/routes/contract/index.js | 29 +-- .../routes/contract/isDealEditable.test.js | 5 +- portal/server/routes/contract/loan/index.js | 48 ++--- .../routes/contract/userCanSubmitDeal.test.js | 11 +- .../server/routes/middleware/isMaker/index.js | 4 +- .../routes/middleware/isMaker/index.test.js | 5 +- .../routes/middleware/validateBank/index.js | 3 +- .../routes/middleware/validateRole/index.js | 9 +- portal/server/routes/reports.route.js | 15 +- portal/server/routes/schemeType/index.js | 7 +- portal/server/routes/schemeType/index.test.js | 6 +- portal/server/routes/start.js | 9 +- 44 files changed, 1568 insertions(+), 201 deletions(-) create mode 100644 portal/api-tests/admin-routes.api-test.js create mode 100644 portal/api-tests/common-tests/role-validation-api-tests.js create mode 100644 portal/api-tests/contract/about-routes.api-test.js create mode 100644 portal/api-tests/contract/bond-routes.api-test.js create mode 100644 portal/api-tests/contract/contract-routes.api-test.js create mode 100644 portal/api-tests/contract/loan-routes.api-test.js create mode 100644 portal/api-tests/dashboard-routes.api-test.js create mode 100644 portal/api-tests/eligibility-routes.api-test.js create mode 100644 portal/api-tests/feedback-routes.api-test.js create mode 100644 portal/api-tests/footer-routes.api-test.js create mode 100644 portal/api-tests/helpers/mockProvide.js create mode 100644 portal/api-tests/login-routes.api-test.js create mode 100644 portal/api-tests/portal-routes.api-test.js create mode 100644 portal/api-tests/scheme-type-routes.api-test.js create mode 100644 portal/api-tests/start-routes.api-test.js create mode 100644 portal/api-tests/static-routes.api-test.js create mode 100644 portal/api-tests/user-routes.api-test.js create mode 100644 portal/server/constants/roles.js rename portal/server/routes/contract/eligibility/{elgibilityCheckYourAnswersValidationErrors => eligibilityCheckYourAnswersValidationErrors}/index.js (86%) rename portal/server/routes/contract/eligibility/{elgibilityCheckYourAnswersValidationErrors => eligibilityCheckYourAnswersValidationErrors}/index.test.js (100%) diff --git a/portal/api-tests/admin-routes.api-test.js b/portal/api-tests/admin-routes.api-test.js new file mode 100644 index 0000000000..ee3006367c --- /dev/null +++ b/portal/api-tests/admin-routes.api-test.js @@ -0,0 +1,90 @@ +const { withRoleValidationApiTests } = require('./common-tests/role-validation-api-tests'); +const app = require('../server/createApp'); +const { ADMIN, UKEF_OPERATIONS } = require('../server/constants/roles'); +const { get, post } = require('./create-api').createApi(app); + +const _id = '64f736071f0fd6ecf617db8a'; + +describe('user routes', () => { + describe('GET /admin/users', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get('/admin/users', {}, headers), + whitelistedRoles: [ADMIN, UKEF_OPERATIONS], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('GET /admin/users/create', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get('/admin/users/create', {}, headers), + whitelistedRoles: [ADMIN, UKEF_OPERATIONS], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('POST /admin/users/create', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to('/admin/users/create'), + whitelistedRoles: [ADMIN, UKEF_OPERATIONS], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('GET /admin/users/edit/:_id', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/admin/users/edit/${_id}`, {}, headers), + whitelistedRoles: [ADMIN, UKEF_OPERATIONS], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('POST /admin/users/edit/:_id', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/admin/users/edit/${_id}`), + whitelistedRoles: [ADMIN, UKEF_OPERATIONS], + successCode: 302, + successHeaders: { location: '/admin/users' }, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('GET /admin/users/disable/:_id', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/admin/users/disable/${_id}`, {}, headers), + whitelistedRoles: [ADMIN, UKEF_OPERATIONS], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('GET /admin/users/enable/:_id', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/admin/users/enable/${_id}`, {}, headers), + whitelistedRoles: [ADMIN, UKEF_OPERATIONS], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('GET /admin/users/:_id/change-password', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/admin/users/${_id}/change-password`, {}, headers), + whitelistedRoles: [ADMIN, UKEF_OPERATIONS], + successCode: 200, + }); + }); + + describe('POST /admin/users/:_id/change-password', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/admin/users/${_id}/change-password`), + whitelistedRoles: [ADMIN, UKEF_OPERATIONS], + successCode: 302, + successHeaders: { location: `/admin/users/edit/${_id}` }, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); +}); diff --git a/portal/api-tests/common-tests/role-validation-api-tests.js b/portal/api-tests/common-tests/role-validation-api-tests.js new file mode 100644 index 0000000000..f28b6091bd --- /dev/null +++ b/portal/api-tests/common-tests/role-validation-api-tests.js @@ -0,0 +1,89 @@ +jest.mock('csurf', () => () => (req, res, next) => next()); +jest.mock('../../server/routes/middleware/csrf', () => ({ + ...(jest.requireActual('../../server/routes/middleware/csrf')), + csrfToken: () => (req, res, next) => next(), +})); +jest.mock('../../server/api', () => ({ + ...(jest.requireActual('../../server/api')), + login: jest.fn(), + validateToken: () => true, +})); + +const { login } = require('../../server/api'); +const { ROLES } = require('../../server/constants'); +const app = require('../../server/createApp'); +const { post } = require('../create-api').createApi(app); + +const allRoles = Object.values(ROLES); + +const email = 'mock email'; +const password = 'mock password'; + +const loginAsRole = (role) => () => ({ + success: true, + token: 'mock token', + user: { roles: [role] }, +}); + +const extractSessionCookie = (res) => res.headers['set-cookie'].pop().split(';')[0]; + +const withRoleValidationApiTests = ({ + makeRequestWithHeaders, + whitelistedRoles, + successCode, + successHeaders, + disableHappyPath, // TODO DTFS2-6654: remove and test happy paths. + redirectUrlForInvalidRoles, +}) => { + const nonWhitelistedRoles = allRoles.filter((role) => !whitelistedRoles.includes(role)); + + describe('role validation', () => { + if (!disableHappyPath) { // TODO DTFS2-6654: remove and test happy paths. + if (whitelistedRoles.length) { + describe('whitelisted roles', () => { + it.each(whitelistedRoles)( + `returns a ${successCode} response if the user only has the '%s' role`, + async (allowedRole) => { + login.mockImplementation(loginAsRole(allowedRole)); + + const sessionCookie = await post({ email, password }).to('/login').then(extractSessionCookie); + + const response = await makeRequestWithHeaders({ Cookie: [sessionCookie] }); + + expect(response.status).toBe(successCode); + + if (successHeaders) { + for (const [key, value] of Object.entries(successHeaders)) { + expect(response.headers[key]).toBe(value); + } + } + }, + ); + }); + } + } + + if (nonWhitelistedRoles.length) { + describe('non-whitelisted roles', () => { + it.each(nonWhitelistedRoles)( + 'returns a 302 response if the user only has the \'%s\' role', + async (disallowedRole) => { + login.mockImplementation(loginAsRole(disallowedRole)); + + const sessionCookie = await post({ email, password }).to('/login').then(extractSessionCookie); + + const response = await makeRequestWithHeaders({ Cookie: [sessionCookie] }); + + expect(response.status).toBe(302); + const redirectUrl = redirectUrlForInvalidRoles ?? '/'; + expect(response.headers.location).toBe(redirectUrl); + }, + ); + }); + } + }); +}; + +module.exports = { + withRoleValidationApiTests, +}; diff --git a/portal/api-tests/contract/about-routes.api-test.js b/portal/api-tests/contract/about-routes.api-test.js new file mode 100644 index 0000000000..5a314786f8 --- /dev/null +++ b/portal/api-tests/contract/about-routes.api-test.js @@ -0,0 +1,122 @@ +const mockProvide = require('../helpers/mockProvide'); + +mockProvide(); + +const { withRoleValidationApiTests } = require('../common-tests/role-validation-api-tests'); +const app = require('../../server/createApp'); +const { get, post } = require('../create-api').createApi(app); +const { ROLES } = require('../../server/constants'); +const { MAKER } = require('../../server/constants/roles'); + +const allRoles = Object.values(ROLES); + +const _id = '64ef48ee17a3231be0ad48b3'; +const prefix = 'prefix'; + +describe('about routes', () => { + describe('GET /contract/:_id/about/supplier', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/contract/${_id}/about/supplier`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('POST /contract/:_id/about/supplier', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/contract/${_id}/about/supplier`), + whitelistedRoles: allRoles, + successCode: 302, + successHeaders: { location: `/contract/${_id}/about/buyer` }, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('POST /contract/:_id/about/supplier/save-go-back', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/contract/${_id}/about/supplier/save-go-back`), + whitelistedRoles: allRoles, + successCode: 302, + successHeaders: { location: `/contract/${_id}` }, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('POST /contract/:_id/about/supplier/companies-house-search/:prefix', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/contract/${_id}/about/supplier/companies-house-search/${prefix}`), + whitelistedRoles: allRoles, + successCode: 302, + successHeaders: { location: `/contract/${_id}/about/supplier#${prefix}-companies-house-registration-number` }, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('GET /contract/:_id/about/buyer', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/contract/${_id}/about/buyer`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('POST /contract/:_id/about/buyer', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/contract/${_id}/about/buyer`), + whitelistedRoles: allRoles, + successCode: 302, + successHeaders: { location: `/contract/${_id}/about/financial` }, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('POST /contract/:_id/about/buyer/save-go-back', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/contract/${_id}/about/buyer/save-go-back`), + whitelistedRoles: allRoles, + successCode: 302, + successHeaders: { location: `/contract/${_id}` }, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('GET /contract/:_id/about/financial', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/contract/${_id}/about/financial`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('POST /contract/:_id/about/financial', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/contract/${_id}/about/financial`), + whitelistedRoles: allRoles, + successCode: 302, + successHeaders: { location: `/contract/${_id}/about/check-your-answers` }, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('POST /contract/:_id/about/financial/save-go-back', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/contract/${_id}/about/financial/save-go-back`), + whitelistedRoles: allRoles, + successCode: 302, + successHeaders: { location: `/contract/${_id}` }, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('GET /contract/:_id/about/check-your-answers', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/contract/${_id}/about/check-your-answers`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); +}); diff --git a/portal/api-tests/contract/bond-routes.api-test.js b/portal/api-tests/contract/bond-routes.api-test.js new file mode 100644 index 0000000000..f8d511c562 --- /dev/null +++ b/portal/api-tests/contract/bond-routes.api-test.js @@ -0,0 +1,180 @@ +const mockProvide = require('../helpers/mockProvide'); + +mockProvide(); + +const { withRoleValidationApiTests } = require('../common-tests/role-validation-api-tests'); +const app = require('../../server/createApp'); +const { get, post } = require('../create-api').createApi(app); +const { ROLES } = require('../../server/constants'); +const { MAKER } = require('../../server/constants/roles'); + +const allRoles = Object.values(ROLES); + +const _id = '64ef48ee17a3231be0ad48b3'; +const bondId = 'bondId'; + +describe('bond routes', () => { + describe('GET /contract/:_id/bond/create', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/contract/${_id}/bond/create`, {}, headers), + whitelistedRoles: allRoles, + successCode: 302, + successHeaders: { location: `/contract/${_id}/bond/${bondId}/details` }, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('GET /contract/:_id/bond/:bondId/details', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/contract/${_id}/bond/${bondId}/details`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('POST /contract/:_id/bond/:bondId/details', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/contract/${_id}/bond/${bondId}/details`), + whitelistedRoles: allRoles, + successCode: 302, + successHeaders: { location: `/contract/${_id}/bond/${bondId}/financial-details` }, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('POST /contract/:_id/bond/:bondId/details/save-go-back', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/contract/${_id}/bond/${bondId}/details/save-go-back`), + whitelistedRoles: allRoles, + successCode: 302, + successHeaders: { location: `/contract/${_id}` }, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('GET /contract/:_id/bond/:bondId/financial-details', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/contract/${_id}/bond/${bondId}/financial-details`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('POST /contract/:_id/bond/:bondId/financial-details', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/contract/${_id}/bond/${bondId}/financial-details`), + whitelistedRoles: allRoles, + successCode: 302, + successHeaders: { location: `/contract/${_id}/bond/${bondId}/fee-details` }, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('POST /contract/:_id/bond/:bondId/financial-details/save-go-back', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/contract/${_id}/bond/${bondId}/financial-details/save-go-back`), + whitelistedRoles: allRoles, + successCode: 302, + successHeaders: { location: `/contract/${_id}` }, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('GET /contract/:_id/bond/:bondId/fee-details', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/contract/${_id}/bond/${bondId}/fee-details`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('POST /contract/:_id/bond/:bondId/fee-details', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/contract/${_id}/bond/${bondId}/fee-details`), + whitelistedRoles: allRoles, + successCode: 302, + successHeaders: { location: `/contract/${_id}/bond/${bondId}/check-your-answers` }, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('POST /contract/:_id/bond/:bondId/fee-details/save-go-back', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/contract/${_id}/bond/${bondId}/fee-details/save-go-back`), + whitelistedRoles: allRoles, + successCode: 302, + successHeaders: { location: `/contract/${_id}` }, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('GET /contract/:_id/bond/:bondId/check-your-answers', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/contract/${_id}/bond/${bondId}/check-your-answers`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('GET /contract/:_id/bond/:bondId/issue-facility', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/contract/${_id}/bond/${bondId}/issue-facility`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, + }); + }); + + describe('POST /contract/:_id/bond/:bondId/issue-facility', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/contract/${_id}/bond/${bondId}/issue-facility`), + whitelistedRoles: allRoles, + successCode: 302, + successHeaders: { location: `/contract/${_id}` }, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('GET /contract/:_id/bond/:bondId/confirm-requested-cover-start-date', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/contract/${_id}/bond/${bondId}/confirm-requested-cover-start-date`, {}, headers), + whitelistedRoles: allRoles, + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('POST /contract/:_id/bond/:bondId/confirm-requested-cover-start-date', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/contract/${_id}/bond/${bondId}/confirm-requested-cover-start-date`), + whitelistedRoles: allRoles, + successCode: 302, + successHeaders: { location: `/contract/${_id}` }, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('GET /contract/:_id/bond/:bondId/delete', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/contract/${_id}/bond/${bondId}/delete`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, + redirectUrlForInvalidRoles: `/contract/${_id}`, + }); + }); + + describe('POST /contract/:_id/bond/:bondId/delete', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/contract/${_id}/bond/${bondId}/delete`), + whitelistedRoles: allRoles, + successCode: 302, + successHeaders: { location: `/contract/${_id}` }, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); +}); diff --git a/portal/api-tests/contract/contract-routes.api-test.js b/portal/api-tests/contract/contract-routes.api-test.js new file mode 100644 index 0000000000..05d0ca8be4 --- /dev/null +++ b/portal/api-tests/contract/contract-routes.api-test.js @@ -0,0 +1,173 @@ +const mockProvide = require('../helpers/mockProvide'); + +mockProvide(); +jest.mock('../../server/routes/middleware/validateBank', () => (req, res, next) => next()); + +const { withRoleValidationApiTests } = require('../common-tests/role-validation-api-tests'); +const app = require('../../server/createApp'); +const { get, post } = require('../create-api').createApi(app); +const { ROLES } = require('../../server/constants'); +const { MAKER, CHECKER } = require('../../server/constants/roles'); + +const allRoles = Object.values(ROLES); + +const _id = '64ef48ee17a3231be0ad48b3'; + +describe('contract routes', () => { + describe('GET /contract/:_id', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/contract/${_id}`, {}, headers), + whitelistedRoles: allRoles, + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('GET /contract/:_id/comments', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/contract/${_id}/comments`, {}, headers), + whitelistedRoles: allRoles, + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('GET /contract/:_id/submission-details', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/contract/${_id}/submission-details`, {}, headers), + whitelistedRoles: allRoles, + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('GET /contract/:_id/delete', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/contract/${_id}/delete`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('POST /contract/:_id/delete', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/contract/${_id}/delete`), + whitelistedRoles: [MAKER], + successCode: 302, + successHeaders: { location: '/dashboard' }, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('GET /contract/:_id/ready-for-review', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/contract/${_id}/ready-for-review`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('POST /contract/:_id/ready-for-review', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/contract/${_id}/ready-for-review`), + whitelistedRoles: [MAKER], + successCode: 302, + successHeaders: { location: '/dashboard' }, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('GET /contract/:_id/edit-name', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/contract/${_id}/edit-name`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('POST /contract/:_id/edit-name', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/contract/${_id}/edit-name`), + whitelistedRoles: [MAKER], + successCode: 302, + successHeaders: { location: `/contract/${_id}` }, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('GET /contract/:_id/return-to-maker', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/contract/${_id}/return-to-maker`, {}, headers), + whitelistedRoles: [CHECKER], + successCode: 200, + }); + }); + + describe('POST /contract/:_id/return-to-maker', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/contract/${_id}/return-to-maker`), + whitelistedRoles: [CHECKER], + successCode: 302, + successHeaders: { location: '/dashboard' }, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('GET /contract/:_id/confirm-submission', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/contract/${_id}/confirm-submission`, {}, headers), + whitelistedRoles: [CHECKER], + successCode: 200, + }); + }); + + describe('POST /contract/:_id/confirm-submission', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/contract/${_id}/confirm-submission`), + whitelistedRoles: [CHECKER], + successCode: 302, + successHeaders: { location: '/dashboard' }, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('GET /contract/:_id/clone', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/contract/${_id}/clone`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('POST /contract/:_id/clone', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/contract/${_id}/clone`), + whitelistedRoles: [MAKER], + successCode: 302, + successHeaders: { location: '/dashboard' }, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('GET /contract/:_id/clone/before-you-start', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/contract/${_id}/clone/before-you-start`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('POST /contract/:_id/clone/before-you-start', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/contract/${_id}/clone/before-you-start`), + whitelistedRoles: [MAKER], + successCode: 302, + successHeaders: { location: '/unable-to-proceed' }, + }); + }); +}); diff --git a/portal/api-tests/contract/loan-routes.api-test.js b/portal/api-tests/contract/loan-routes.api-test.js new file mode 100644 index 0000000000..2227b8bcbe --- /dev/null +++ b/portal/api-tests/contract/loan-routes.api-test.js @@ -0,0 +1,179 @@ +jest.mock('../../server/routes/api-data-provider', () => ({ + ...(jest.requireActual('../../server/routes/api-data-provider')), + provide: () => (req, res, next) => { req.apiData = { deal: { details: {} }, loan: { validationErrors: {} } }; return next(); }, +})); + +const { withRoleValidationApiTests } = require('../common-tests/role-validation-api-tests'); +const app = require('../../server/createApp'); +const { get, post } = require('../create-api').createApi(app); +const { ROLES } = require('../../server/constants'); +const { MAKER } = require('../../server/constants/roles'); + +const allRoles = Object.values(ROLES); + +const _id = '64ef48ee17a3231be0ad48b3'; +const loanId = 'loanId'; + +describe('loan routes', () => { + describe('GET /contract/:_id/loan/create', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/contract/${_id}/loan/create`, {}, headers), + whitelistedRoles: allRoles, + successCode: 302, + successHeaders: { location: `/contract/${_id}/loan/${loanId}/guarantee-details` }, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('GET /contract/:_id/loan/:loanId/guarantee-details', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/contract/${_id}/loan/${loanId}/guarantee-details`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + }); + }); + + describe('POST /contract/:_id/loan/:loanId/guarantee-details', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/contract/${_id}/loan/${loanId}/guarantee-details`), + whitelistedRoles: allRoles, + successCode: 302, + successHeaders: { location: `/contract/${_id}/loan/${loanId}/financial-details` }, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('POST /contract/:_id/loan/:loanId/guarantee-details/save-go-back', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/contract/${_id}/loan/${loanId}/guarantee-details/save-go-back`), + whitelistedRoles: allRoles, + successCode: 302, + successHeaders: { location: `/contract/${_id}` }, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('GET /contract/:_id/loan/:loanId/financial-details', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/contract/${_id}/loan/${loanId}/financial-details`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('POST /contract/:_id/loan/:loanId/financial-details', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/contract/${_id}/loan/${loanId}/financial-details`), + whitelistedRoles: allRoles, + successCode: 302, + successHeaders: { location: `/contract/${_id}/loan/${loanId}/dates-repayments` }, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('POST /contract/:_id/loan/:loanId/financial-details/save-go-back', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/contract/${_id}/loan/${loanId}/financial-details/save-go-back`), + whitelistedRoles: allRoles, + successCode: 302, + successHeaders: { location: `/contract/${_id}` }, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('GET /contract/:_id/loan/:loanId/dates-repayments', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/contract/${_id}/loan/${loanId}/dates-repayments`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + }); + }); + + describe('POST /contract/:_id/loan/:loanId/dates-repayments', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/contract/${_id}/loan/${loanId}/dates-repayments`), + whitelistedRoles: allRoles, + successCode: 302, + successHeaders: { location: `/contract/${_id}/loan/${loanId}/check-your-answers` }, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('POST /contract/:_id/loan/:loanId/dates-repayments/save-go-back', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/contract/${_id}/loan/${loanId}/dates-repayments/save-go-back`), + whitelistedRoles: allRoles, + successCode: 302, + successHeaders: { location: `/contract/${_id}` }, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('GET /contract/:_id/loan/:loanId/check-your-answers', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/contract/${_id}/loan/${loanId}/check-your-answers`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('GET /contract/:_id/loan/:loanId/issue-facility', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/contract/${_id}/loan/${loanId}/issue-facility`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, + }); + }); + + describe('POST /contract/:_id/loan/:loanId/issue-facility', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/contract/${_id}/loan/${loanId}/issue-facility`), + whitelistedRoles: allRoles, + successCode: 302, + successHeaders: { location: `/contract/${_id}` }, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('GET /contract/:_id/loan/:loanId/confirm-requested-cover-start-date', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/contract/${_id}/loan/${loanId}/confirm-requested-cover-start-date`, {}, headers), + whitelistedRoles: allRoles, + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('POST /contract/:_id/loan/:loanId/confirm-requested-cover-start-date', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/contract/${_id}/loan/${loanId}/confirm-requested-cover-start-date`), + whitelistedRoles: allRoles, + successCode: 302, + successHeaders: { location: `/contract/${_id}` }, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('GET /contract/:_id/loan/:loanId/delete', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/contract/${_id}/loan/${loanId}/delete`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, + redirectUrlForInvalidRoles: `/contract/${_id}`, + }); + }); + + describe('POST /contract/:_id/loan/:loanId/delete', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/contract/${_id}/loan/${loanId}/delete`), + whitelistedRoles: allRoles, + successCode: 302, + successHeaders: { location: `/contract/${_id}` }, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); +}); diff --git a/portal/api-tests/create-api.js b/portal/api-tests/create-api.js index bd83300ca7..99d4387794 100644 --- a/portal/api-tests/create-api.js +++ b/portal/api-tests/create-api.js @@ -4,9 +4,17 @@ const dotenv = require('dotenv'); dotenv.config(); const createApi = (app) => ({ - get: async (url, query = {}) => request(app) + get: async (url, query = {}, headers = {}) => request(app) .get(url) + .set(headers) .query(query), + + post: (data, headers = {}) => ({ + to: async (url) => request(app) + .post(url) + .set(headers) + .send(data), + }), }); module.exports = { diff --git a/portal/api-tests/dashboard-routes.api-test.js b/portal/api-tests/dashboard-routes.api-test.js new file mode 100644 index 0000000000..029a401c33 --- /dev/null +++ b/portal/api-tests/dashboard-routes.api-test.js @@ -0,0 +1,149 @@ +const { withRoleValidationApiTests } = require('./common-tests/role-validation-api-tests'); +const app = require('../server/createApp'); +const { get, post } = require('./create-api').createApi(app); +const { ROLES } = require('../server/constants'); + +const allRoles = Object.values(ROLES); + +const dealsRemoveFilterTestCases = [ + { fieldName: 'dealType', fieldValue: 'BSS-EWCS' }, + { fieldName: 'dealType', fieldValue: 'GEF' }, + { fieldName: 'submissionType', fieldValue: 'Automatic-Inclusion-Notice' }, + { fieldName: 'submissionType', fieldValue: 'Manual-Inclusion-Application' }, + { fieldName: 'submissionType', fieldValue: 'Manual-Inclusion-Notice' }, + { fieldName: 'status', fieldValue: 'All-statuses' }, + { fieldName: 'status', fieldValue: 'Draft' }, + { fieldName: 'status', fieldValue: 'Ready-for-Checkers-approval' }, + { fieldName: 'status', fieldValue: 'Further-Makers-input-required' }, + { fieldName: 'status', fieldValue: 'Submitted' }, + { fieldName: 'status', fieldValue: 'Acknowledged' }, + { fieldName: 'status', fieldValue: 'In-progress-by-UKEF' }, + { fieldName: 'status', fieldValue: 'Accepted-by-UKEF-(with-conditions)' }, + { fieldName: 'status', fieldValue: 'Accepted-by-UKEF-(without-conditions)' }, + { fieldName: 'status', fieldValue: 'Rejected-by-UKEF' }, + { fieldName: 'status', fieldValue: 'Abandoned' }, + { fieldName: 'createdBy', fieldValue: 'Created-by-you' }, +]; + +const facilitiesRemoveFilterTestCases = [ + { fieldName: 'type', fieldValue: 'Cash' }, + { fieldName: 'type', fieldValue: 'Contingent' }, + { fieldName: 'type', fieldValue: 'Bond' }, + { fieldName: 'type', fieldValue: 'Loan' }, + { fieldName: 'deal.submissionType', fieldValue: 'Automatic-Inclusion-Notice' }, + { fieldName: 'deal.submissionType', fieldValue: 'Manual-Inclusion-Application' }, + { fieldName: 'deal.submissionType', fieldValue: 'Manual-Inclusion-Notice' }, + { fieldName: 'hasBeenIssued', fieldValue: 'true' }, + { fieldName: 'hasBeenIssued', fieldValue: 'false' }, + { fieldName: 'createdBy', fieldValue: 'Created-by-you' }, +]; + +describe('dashboard routes', () => { + describe('GET /', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get('/', {}, headers), + whitelistedRoles: allRoles, + successCode: 302, + successHeaders: { location: '/dashboard/deals' }, + }); + }); + + describe('GET /dashboard', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get('/dashboard', {}, headers), + whitelistedRoles: allRoles, + successCode: 302, + successHeaders: { location: '/dashboard/deals' }, + }); + }); + + describe('GET /dashboard/deals', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get('/dashboard/deals', {}, headers), + whitelistedRoles: allRoles, + successCode: 302, + successHeaders: { location: '/dashboard/deals/0' }, + }); + }); + + describe('GET /dashboard/deals/clear-all-filters', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get('/dashboard/deals/clear-all-filters', {}, headers), + whitelistedRoles: allRoles, + successCode: 302, + successHeaders: { location: '/dashboard/deals/0' }, + }); + }); + + describe.each(dealsRemoveFilterTestCases)('GET /dashboard/deals/filters/remove/$fieldName/$fieldValue', ({ fieldName, fieldValue }) => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/dashboard/deals/filters/remove/${fieldName}/${fieldValue}`, {}, headers), + whitelistedRoles: allRoles, + successCode: 302, + successHeaders: { location: '/dashboard/deals/0' }, + }); + }); + + describe('GET /dashboard/facilities', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get('/dashboard/facilities', {}, headers), + whitelistedRoles: allRoles, + successCode: 302, + successHeaders: { location: '/dashboard/facilities/0' }, + }); + }); + + describe('GET /dashboard/facilities/clear-all-filters', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get('/dashboard/facilities/clear-all-filters', {}, headers), + whitelistedRoles: allRoles, + successCode: 302, + successHeaders: { location: '/dashboard/facilities/0' }, + }); + }); + + describe.each(facilitiesRemoveFilterTestCases)('GET /dashboard/facilities/filters/remove/$fieldName/$fieldValue', ({ fieldName, fieldValue }) => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/dashboard/facilities/filters/remove/${fieldName}/${fieldValue}`, {}, headers), + whitelistedRoles: allRoles, + successCode: 302, + successHeaders: { location: '/dashboard/facilities/0' }, + }); + }); + + describe('GET /dashboard/deals/0', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get('/dashboard/deals/0', {}, headers), + whitelistedRoles: allRoles, + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('POST /dashboard/deals/0', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to('/dashboard/deals/0'), + whitelistedRoles: allRoles, + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('GET /dashboard/facilities/0', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get('/dashboard/facilities/0', {}, headers), + whitelistedRoles: allRoles, + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('POST /dashboard/facilities/0', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to('/dashboard/facilities/0'), + whitelistedRoles: allRoles, + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); +}); diff --git a/portal/api-tests/eligibility-routes.api-test.js b/portal/api-tests/eligibility-routes.api-test.js new file mode 100644 index 0000000000..b82da77d4c --- /dev/null +++ b/portal/api-tests/eligibility-routes.api-test.js @@ -0,0 +1,95 @@ +const mockProvide = require('./helpers/mockProvide'); + +mockProvide(); + +const { withRoleValidationApiTests } = require('./common-tests/role-validation-api-tests'); +const app = require('../server/createApp'); +const { get, post } = require('./create-api').createApi(app); +const { ROLES } = require('../server/constants'); +const { MAKER } = require('../server/constants/roles'); + +const allRoles = Object.values(ROLES); + +const _id = '64ef48ee17a3231be0ad48b3'; + +const eligibilityDocumentationGetByFieldnameAndFileNameTestCases = [ + { fieldname: 'validationErrors', filename: 'exampleFilename' }, + { fieldname: 'securityDetails', filename: 'exampleFilename' }, +]; + +describe('eligibility routes', () => { + describe('GET /contract/:_id/eligibility/criteria', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/contract/${_id}/eligibility/criteria`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('POST /contract/:_id/eligibility/criteria', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/contract/${_id}/eligibility/criteria`), + whitelistedRoles: allRoles, + successCode: 302, + successHeaders: { location: `/contract/${_id}/eligibility/supporting-documentation` }, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('POST /contract/:_id/eligibility/criteria/save-go-back', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/contract/${_id}/eligibility/criteria/save-go-back`), + whitelistedRoles: allRoles, + successCode: 302, + successHeaders: { location: `/contract/${_id}` }, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('GET /contract/:_id/eligibility/supporting-documentation', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/contract/${_id}/eligibility/supporting-documentation`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('POST /contract/:_id/eligibility/supporting-documentation', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/contract/${_id}/eligibility/supporting-documentation`), + whitelistedRoles: allRoles, + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('POST /contract/:_id/eligibility/supporting-documentation/save-go-back', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/contract/${_id}/eligibility/supporting-documentation/save-go-back`), + whitelistedRoles: allRoles, + successCode: 302, + successHeaders: { location: `/contract/${_id}` }, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe.each(eligibilityDocumentationGetByFieldnameAndFileNameTestCases)('GET /contract/:_id/eligibility-documentation/$fieldname/$filename', ({ fieldname, filename }) => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/contract/:_id/eligibility-documentation/${fieldname}/${filename}`, {}, headers), + whitelistedRoles: allRoles, + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('GET /contract/:_id/eligibility/check-your-answers', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/contract/${_id}/eligibility/check-your-answers`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); +}); diff --git a/portal/api-tests/feedback-routes.api-test.js b/portal/api-tests/feedback-routes.api-test.js new file mode 100644 index 0000000000..5c16682bd4 --- /dev/null +++ b/portal/api-tests/feedback-routes.api-test.js @@ -0,0 +1,32 @@ +const { withRoleValidationApiTests } = require('./common-tests/role-validation-api-tests'); +const app = require('../server/createApp'); +const { get, post } = require('./create-api').createApi(app); +const { ROLES } = require('../server/constants'); + +const allRoles = Object.values(ROLES); + +describe('feedback routes', () => { + describe('GET /feedback', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get('/feedback', {}, headers), + whitelistedRoles: allRoles, + successCode: 200, + }); + }); + + describe('POST /feedback', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to('/feedback'), + whitelistedRoles: allRoles, + successCode: 200, + }); + }); + + describe('GET /thank-you-feedback', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get('/thank-you-feedback', {}, headers), + whitelistedRoles: allRoles, + successCode: 200, + }); + }); +}); diff --git a/portal/api-tests/footer-routes.api-test.js b/portal/api-tests/footer-routes.api-test.js new file mode 100644 index 0000000000..6d96db3163 --- /dev/null +++ b/portal/api-tests/footer-routes.api-test.js @@ -0,0 +1,32 @@ +const { withRoleValidationApiTests } = require('./common-tests/role-validation-api-tests'); +const app = require('../server/createApp'); +const { get } = require('./create-api').createApi(app); +const { ROLES } = require('../server/constants'); + +const allRoles = Object.values(ROLES); + +describe('footer routes', () => { + describe('GET /contact-us', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get('/contact-us', {}, headers), + whitelistedRoles: allRoles, + successCode: 200, + }); + }); + + describe('GET /cookies', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get('/cookies', {}, headers), + whitelistedRoles: allRoles, + successCode: 200, + }); + }); + + describe('GET /accessibility-statement', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get('/accessibility-statement', {}, headers), + whitelistedRoles: allRoles, + successCode: 200, + }); + }); +}); diff --git a/portal/api-tests/helpers/mockProvide.js b/portal/api-tests/helpers/mockProvide.js new file mode 100644 index 0000000000..977f6bd0a4 --- /dev/null +++ b/portal/api-tests/helpers/mockProvide.js @@ -0,0 +1,8 @@ +const mockProvide = () => { + jest.mock('../../server/routes/api-data-provider', () => ({ + ...(jest.requireActual('../../server/routes/api-data-provider')), + provide: () => (req, res, next) => next(), + })); +}; + +module.exports = mockProvide; diff --git a/portal/api-tests/login-routes.api-test.js b/portal/api-tests/login-routes.api-test.js new file mode 100644 index 0000000000..d024869478 --- /dev/null +++ b/portal/api-tests/login-routes.api-test.js @@ -0,0 +1,69 @@ +const { withRoleValidationApiTests } = require('./common-tests/role-validation-api-tests'); +const app = require('../server/createApp'); +const { get, post } = require('./create-api').createApi(app); +const { ROLES } = require('../server/constants'); + +const allRoles = Object.values(ROLES); + +const pwdResetToken = 'pwd-reset-token'; + +describe('login routes', () => { + describe('GET /login', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get('/login', {}, headers), + whitelistedRoles: allRoles, + successCode: 200, + }); + }); + + describe('POST /login', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to('/login'), + whitelistedRoles: allRoles, + successCode: 200, + }); + }); + + describe('GET /logout', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get('/logout', {}, headers), + whitelistedRoles: allRoles, + successCode: 302, + successHeaders: { location: '/login' }, + }); + }); + + describe('GET /reset-password', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get('/reset-password', {}, headers), + whitelistedRoles: allRoles, + successCode: 200, + }); + }); + + describe('POST /reset-password', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to('/reset-password'), + whitelistedRoles: allRoles, + successCode: 200, + }); + }); + + describe('GET /reset-password/:pwdResetToken', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/reset-password/${pwdResetToken}`, {}, headers), + whitelistedRoles: allRoles, + successCode: 200, + }); + }); + + describe('POST /reset-password/:pwdResetToken', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/reset-password/${pwdResetToken}`), + whitelistedRoles: allRoles, + successCode: 302, + successHeaders: { location: '/login?passwordupdated=1' }, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); +}); diff --git a/portal/api-tests/portal-routes.api-test.js b/portal/api-tests/portal-routes.api-test.js new file mode 100644 index 0000000000..c174145830 --- /dev/null +++ b/portal/api-tests/portal-routes.api-test.js @@ -0,0 +1,69 @@ +const { withRoleValidationApiTests } = require('./common-tests/role-validation-api-tests'); +const app = require('../server/createApp'); +const { MAKER, CHECKER } = require('../server/constants/roles'); +const { get } = require('./create-api').createApi(app); + +describe('portal routes', () => { + describe('GET /reports', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get('/reports', {}, headers), + whitelistedRoles: [MAKER, CHECKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('GET /reports/review-unissued-facilities', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get('/reports/review-unissued-facilities', {}, headers), + whitelistedRoles: [MAKER, CHECKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('GET /reports/review-unconditional-decision', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get('/reports/review-unconditional-decision', {}, headers), + whitelistedRoles: [MAKER, CHECKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('GET /reports/review-conditional-decision', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get('/reports/review-conditional-decision', {}, headers), + whitelistedRoles: [MAKER, CHECKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('GET /reports/download-unissued-facilities-report', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get('/reports/download-unissued-facilities-report', {}, headers), + whitelistedRoles: [MAKER, CHECKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('GET /reports/download-unconditional-decision-report', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get('/reports/download-unconditional-decision-report', {}, headers), + whitelistedRoles: [MAKER, CHECKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('GET /reports/download-conditional-decision-report', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get('/reports/download-conditional-decision-report', {}, headers), + whitelistedRoles: [MAKER, CHECKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); +}); diff --git a/portal/api-tests/scheme-type-routes.api-test.js b/portal/api-tests/scheme-type-routes.api-test.js new file mode 100644 index 0000000000..1b8de8a6a6 --- /dev/null +++ b/portal/api-tests/scheme-type-routes.api-test.js @@ -0,0 +1,22 @@ +const { withRoleValidationApiTests } = require('./common-tests/role-validation-api-tests'); +const app = require('../server/createApp'); +const { MAKER, CHECKER } = require('../server/constants/roles'); +const { get, post } = require('./create-api').createApi(app); + +describe('scheme type routes', () => { + describe('GET /select-scheme', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get('/select-scheme', {}, headers), + whitelistedRoles: [MAKER, CHECKER], + successCode: 200, + }); + }); + + describe('POST /select-scheme', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to('/select-scheme'), + whitelistedRoles: [MAKER], + successCode: 200, + }); + }); +}); diff --git a/portal/api-tests/start-routes.api-test.js b/portal/api-tests/start-routes.api-test.js new file mode 100644 index 0000000000..792e41a1e4 --- /dev/null +++ b/portal/api-tests/start-routes.api-test.js @@ -0,0 +1,58 @@ +const mockProvide = require('./helpers/mockProvide'); + +mockProvide(); + +const { withRoleValidationApiTests } = require('./common-tests/role-validation-api-tests'); +const app = require('../server/createApp'); +const { get, post } = require('./create-api').createApi(app); +const { ROLES } = require('../server/constants'); +const { MAKER } = require('../server/constants/roles'); + +const allRoles = Object.values(ROLES); + +describe('start routes', () => { + describe('GET /before-you-start', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get('/before-you-start', {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('POST /before-you-start', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to('/before-you-start'), + whitelistedRoles: [MAKER], + successCode: 302, + successHeaders: { location: '/before-you-start/bank-deal' }, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('GET /before-you-start/bank-deal', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get('/before-you-start/bank-deal', {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + }); + }); + + describe('POST /before-you-start/bank-deal', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to('/before-you-start/bank-deal'), + whitelistedRoles: [MAKER], + successCode: 302, + successHeaders: { location: '/contract/undefined' }, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('GET /unable-to-proceed', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get('/unable-to-proceed', {}, headers), + whitelistedRoles: allRoles, + successCode: 200, + }); + }); +}); diff --git a/portal/api-tests/static-routes.api-test.js b/portal/api-tests/static-routes.api-test.js new file mode 100644 index 0000000000..ebbb926299 --- /dev/null +++ b/portal/api-tests/static-routes.api-test.js @@ -0,0 +1,24 @@ +const { withRoleValidationApiTests } = require('./common-tests/role-validation-api-tests'); +const app = require('../server/createApp'); +const { ROLES } = require('../server/constants'); +const { get } = require('./create-api').createApi(app); + +const allRoles = Object.values(ROLES); + +describe('static routes', () => { + describe('GET /.well-known/security.txt', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get('/.well-known/security.txt', {}, headers), + whitelistedRoles: allRoles, + successCode: 200, + }); + }); + + describe('GET /thanks.txt', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get('/thanks.txt', {}, headers), + whitelistedRoles: allRoles, + successCode: 200, + }); + }); +}); diff --git a/portal/api-tests/user-routes.api-test.js b/portal/api-tests/user-routes.api-test.js new file mode 100644 index 0000000000..a9d8cb97f7 --- /dev/null +++ b/portal/api-tests/user-routes.api-test.js @@ -0,0 +1,36 @@ +const { withRoleValidationApiTests } = require('./common-tests/role-validation-api-tests'); +const app = require('../server/createApp'); +const { get, post } = require('./create-api').createApi(app); +const { ROLES } = require('../server/constants'); + +const allRoles = Object.values(ROLES); + +const _id = '64f736071f0fd6ecf617db8a'; + +describe('user routes', () => { + describe('GET /user/:_id', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/user/${_id}`, {}, headers), + whitelistedRoles: allRoles, + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); + + describe('GET /user/:_id/change-password', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/user/${_id}/change-password`, {}, headers), + whitelistedRoles: allRoles, + successCode: 200, + }); + }); + + describe('POST /user/:_id/change-password', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/user/${_id}/change-password`), + whitelistedRoles: allRoles, + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6654: remove and test happy path. + }); + }); +}); diff --git a/portal/server/constants/index.js b/portal/server/constants/index.js index b43eb6a24d..c2c2c1d241 100644 --- a/portal/server/constants/index.js +++ b/portal/server/constants/index.js @@ -11,6 +11,7 @@ const TRANSACTION_TYPE = require('./transaction-type'); const PORTAL_URL = require('./portalUrl.constant'); const SORT_BY = require('./sort'); const CURRENCY = require('./currency'); +const ROLES = require('./roles'); module.exports = { DASHBOARD, @@ -26,4 +27,5 @@ module.exports = { PORTAL_URL, SORT_BY, CURRENCY, + ROLES, }; diff --git a/portal/server/constants/roles.js b/portal/server/constants/roles.js new file mode 100644 index 0000000000..a9c4138ee8 --- /dev/null +++ b/portal/server/constants/roles.js @@ -0,0 +1,14 @@ +const ROLES = { + MAKER: 'maker', + CHECKER: 'checker', + ADMIN: 'admin', + UKEF_OPERATIONS: 'ukef_operations', + UKEF_ADMIN: 'ukef_admin', + READ_ONLY: 'read-only', + EDITOR: 'editor', + DATA_ADMIN: 'data-admin', + INTERFACE: 'interface', + EFM: 'efm', +}; + +module.exports = ROLES; diff --git a/portal/server/routes/admin/index.js b/portal/server/routes/admin/index.js index cdf9dce8e4..0254603763 100644 --- a/portal/server/routes/admin/index.js +++ b/portal/server/routes/admin/index.js @@ -1,11 +1,12 @@ const express = require('express'); -const userRoutes = require('./users'); +const userAdminRoutes = require('./users'); const { validateToken, validateRole } = require('../middleware'); +const { ADMIN, UKEF_OPERATIONS } = require('../../constants/roles'); const router = express.Router(); -router.use('/admin/*', [validateToken, validateRole({ role: ['admin', 'ukef_operations'] })]); -router.use('/admin/', userRoutes); +router.use('/admin/*', [validateToken, validateRole({ role: [ADMIN, UKEF_OPERATIONS] })]); +router.use('/admin/', userAdminRoutes); module.exports = router; diff --git a/portal/server/routes/admin/users.js b/portal/server/routes/admin/users.js index 743935d637..9387a1a6b3 100644 --- a/portal/server/routes/admin/users.js +++ b/portal/server/routes/admin/users.js @@ -7,6 +7,7 @@ const { generateErrorSummary, constructPayload, } = require('../../helpers'); +const { MAKER, CHECKER } = require('../../constants/roles'); const router = express.Router(); @@ -52,8 +53,8 @@ const handleRoles = (roles) => { if (result.includes('maker/checker')) { const makerCheckerIndex = result.findIndex((i) => i === 'maker/checker'); result.splice(makerCheckerIndex, 1); - result.push('maker'); - result.push('checker'); + result.push(MAKER); + result.push(CHECKER); } return result; diff --git a/portal/server/routes/contract/about/buyerPage.js b/portal/server/routes/contract/about/buyerPage.js index 75afb34487..8b7961939f 100644 --- a/portal/server/routes/contract/about/buyerPage.js +++ b/portal/server/routes/contract/about/buyerPage.js @@ -17,25 +17,14 @@ const aboutTaskList = require('./aboutTaskList'); const calculateStatusOfEachPage = require('./navStatusCalculations'); const { buyerValidationErrors } = require('./pageSpecificValidationErrors'); const { formDataMatchesOriginalData } = require('../formDataMatchesOriginalData'); +const { validateRole } = require('../../middleware'); +const { MAKER } = require('../../../constants/roles'); const router = express.Router(); -const userCanAccessAbout = (user) => { - if (!user.roles.includes('maker')) { - return false; - } - - return true; -}; - -router.get('/contract/:_id/about/buyer', provide([DEAL, COUNTRIES]), async (req, res) => { +router.get('/contract/:_id/about/buyer', [validateRole({ role: [MAKER] }), provide([DEAL, COUNTRIES])], async (req, res) => { const { _id, userToken } = requestParams(req); - const { user } = req.session; - if (!userCanAccessAbout(user)) { - return res.redirect('/'); - } - const { deal, countries } = req.apiData; const { validationErrors } = await api.getSubmissionDetails(_id, userToken); diff --git a/portal/server/routes/contract/about/financialPage.js b/portal/server/routes/contract/about/financialPage.js index d557ea0018..3f58b06227 100644 --- a/portal/server/routes/contract/about/financialPage.js +++ b/portal/server/routes/contract/about/financialPage.js @@ -19,25 +19,14 @@ const aboutTaskList = require('./aboutTaskList'); const { financialPageValidationErrors } = require('./pageSpecificValidationErrors'); const { formDataMatchesOriginalData } = require('../formDataMatchesOriginalData'); const { CURRENCY } = require('../../../constants'); +const { validateRole } = require('../../middleware'); +const { MAKER } = require('../../../constants/roles'); const router = express.Router(); -const userCanAccessAbout = (user) => { - if (!user.roles.includes('maker')) { - return false; - } - - return true; -}; - -router.get('/contract/:_id/about/financial', provide([CURRENCIES]), async (req, res) => { +router.get('/contract/:_id/about/financial', [validateRole({ role: [MAKER] }), provide([CURRENCIES])], async (req, res) => { const { _id, userToken } = requestParams(req); - const { user } = req.session; - if (!userCanAccessAbout(user)) { - return res.redirect('/'); - } - const { deal, currencies } = req.apiData; const { validationErrors } = await api.getSubmissionDetails(_id, userToken); diff --git a/portal/server/routes/contract/about/previewPage.js b/portal/server/routes/contract/about/previewPage.js index e6f015df97..03ad299f62 100644 --- a/portal/server/routes/contract/about/previewPage.js +++ b/portal/server/routes/contract/about/previewPage.js @@ -11,25 +11,14 @@ const { DEAL } = require('../../api-data-provider'); const { aboutSupplyContractPreviewValidationErrors } = require('./pageSpecificValidationErrors'); const calculateStatusOfEachPage = require('./navStatusCalculations'); const aboutTaskList = require('./aboutTaskList'); +const { validateRole } = require('../../middleware'); +const { MAKER } = require('../../../constants/roles'); const router = express.Router(); -const userCanAccessAbout = (user) => { - if (!user.roles.includes('maker')) { - return false; - } - - return true; -}; - -router.get('/contract/:_id/about/check-your-answers', async (req, res) => { +router.get('/contract/:_id/about/check-your-answers', validateRole({ role: [MAKER] }), async (req, res) => { const { _id, userToken } = requestParams(req); - const { user } = req.session; - if (!userCanAccessAbout(user)) { - return res.redirect('/'); - } - const deal = req.apiData[DEAL]; // dirty hack; this is how we apply the business rule diff --git a/portal/server/routes/contract/about/supplierPage.js b/portal/server/routes/contract/about/supplierPage.js index 538ea0ddd0..7f94316a57 100644 --- a/portal/server/routes/contract/about/supplierPage.js +++ b/portal/server/routes/contract/about/supplierPage.js @@ -20,32 +20,20 @@ const aboutTaskList = require('./aboutTaskList'); const { supplierValidationErrors } = require('./pageSpecificValidationErrors'); const { formDataMatchesOriginalData } = require('../formDataMatchesOriginalData'); const industryFields = require('./industryFields'); +const { validateRole } = require('../../middleware'); +const { MAKER } = require('../../../constants/roles'); const router = express.Router(); -const userCanAccessAbout = (user) => { - if (!user.roles.includes('maker')) { - return false; - } - - return true; -}; - -router.get('/contract/:_id/about/supplier', provide([DEAL, INDUSTRY_SECTORS, COUNTRIES]), async (req, res) => { +router.get('/contract/:_id/about/supplier', [validateRole({ role: [MAKER] }), provide([DEAL, INDUSTRY_SECTORS, COUNTRIES])], async (req, res) => { const { industrySectors, countries } = req.apiData; let { deal } = req.apiData; const { _id, userToken } = requestParams(req); - const { user } = req.session; - - if (!userCanAccessAbout(user)) { - return res.redirect('/'); - } - const { validationErrors } = await api.getSubmissionDetails(_id, userToken); - // if companies house submit button was pressed and there are validaiton errors, + // if companies house submit button was pressed and there are validation errors, // combine with existing deal validation errors. if (req.session.companiesHouseSearchValidationErrors) { validationErrors.count += req.session.companiesHouseSearchValidationErrors.count; diff --git a/portal/server/routes/contract/bond/index.js b/portal/server/routes/contract/bond/index.js index 8aa6b2f8ca..175e0d6bc2 100644 --- a/portal/server/routes/contract/bond/index.js +++ b/portal/server/routes/contract/bond/index.js @@ -30,14 +30,12 @@ const canIssueOrEditIssueFacility = require('../canIssueOrEditIssueFacility'); const isDealEditable = require('../isDealEditable'); const feeFrequencyField = require('./feeFrequencyField'); const saveFacilityAndGoBackToDeal = require('../saveFacilityAndGoBack'); +const { validateRole } = require('../../middleware'); +const { MAKER } = require('../../../constants/roles'); const router = express.Router(); -const userCanAccessBond = (user, deal) => { - if (!user.roles.includes('maker')) { - return false; - } - +const bondCanBeAccessed = (deal) => { if (!deal?.details) { return false; } @@ -54,19 +52,16 @@ const userCanAccessBond = (user, deal) => { return !validStatus.includes(status); }; -const userCanAccessBondPreview = (user) => user.roles.includes('maker'); - router.get('/contract/:_id/bond/create', async (req, res) => { const { dealId, bondId } = await api.createBond(req.params._id, req.session.userToken); return res.redirect(`/contract/${dealId}/bond/${bondId}/details`); }); -router.get('/contract/:_id/bond/:bondId/details', provide([DEAL]), async (req, res) => { +router.get('/contract/:_id/bond/:bondId/details', [validateRole({ role: [MAKER] }), provide([DEAL])], async (req, res) => { const { _id, bondId, userToken } = requestParams(req); - const { user } = req.session; - if (!await api.validateToken(userToken) || !userCanAccessBond(user, req.apiData.deal)) { + if (!await api.validateToken(userToken) || !bondCanBeAccessed(req.apiData.deal)) { return res.redirect('/'); } @@ -148,11 +143,10 @@ router.post('/contract/:_id/bond/:bondId/details/save-go-back', provide([BOND]), return saveFacilityAndGoBackToDeal(req, res, filteredBondPayload); }); -router.get('/contract/:_id/bond/:bondId/financial-details', provide([CURRENCIES, DEAL]), async (req, res) => { +router.get('/contract/:_id/bond/:bondId/financial-details', [validateRole({ role: [MAKER] }), provide([CURRENCIES, DEAL])], async (req, res) => { const { _id, bondId, userToken } = requestParams(req); - const { user } = req.session; - if (!await api.validateToken(userToken) || !userCanAccessBond(user, req.apiData.deal)) { + if (!await api.validateToken(userToken) || !bondCanBeAccessed(req.apiData.deal)) { return res.redirect('/'); } @@ -230,11 +224,10 @@ router.post('/contract/:_id/bond/:bondId/financial-details/save-go-back', provid return saveFacilityAndGoBackToDeal(req, res, bondPayload); }); -router.get('/contract/:_id/bond/:bondId/fee-details', provide([DEAL]), async (req, res) => { +router.get('/contract/:_id/bond/:bondId/fee-details', [validateRole({ role: [MAKER] }), provide([DEAL])], async (req, res) => { const { _id, bondId, userToken } = requestParams(req); - const { user } = req.session; - if (!await api.validateToken(userToken) || !userCanAccessBond(user, req.apiData.deal)) { + if (!await api.validateToken(userToken) || !bondCanBeAccessed(req.apiData.deal)) { return res.redirect('/'); } @@ -293,11 +286,10 @@ router.post('/contract/:_id/bond/:bondId/fee-details/save-go-back', provide([BON return saveFacilityAndGoBackToDeal(req, res, modifiedBody); }); -router.get('/contract/:_id/bond/:bondId/check-your-answers', async (req, res) => { +router.get('/contract/:_id/bond/:bondId/check-your-answers', validateRole({ role: [MAKER] }), async (req, res) => { const { _id, bondId, userToken } = requestParams(req); - const { user } = req.session; - if (!await api.validateToken(userToken) || !userCanAccessBondPreview(user)) { + if (!await api.validateToken(userToken)) { return res.redirect('/'); } @@ -354,7 +346,7 @@ router.get('/contract/:_id/bond/:bondId/check-your-answers', async (req, res) => }); }); -router.get('/contract/:_id/bond/:bondId/issue-facility', provide([BOND, DEAL]), async (req, res) => { +router.get('/contract/:_id/bond/:bondId/issue-facility', [validateRole({ role: [MAKER] }), provide([BOND, DEAL])], async (req, res) => { const { _id: dealId } = requestParams(req); const { bond } = req.apiData.bond; const { user } = req.session; @@ -552,9 +544,9 @@ router.post('/contract/:_id/bond/:bondId/confirm-requested-cover-start-date', as return res.redirect(redirectUrl); }); -router.get('/contract/:_id/bond/:bondId/delete', provide([DEAL, BOND]), async (req, res) => { - const { user } = req.session; +router.get('/contract/:_id/bond/:bondId/delete', [validateRole({ role: [MAKER] }, (req) => `/contract/${req.params._id}`), provide([DEAL, BOND])], async (req, res) => { const { bond } = req.apiData.bond; + const { user } = req.session; if (isDealEditable(req.apiData.deal, user)) { return res.render('bond/bond-delete.njk', { diff --git a/portal/server/routes/contract/canIssueOrEditIssueFacility.test.js b/portal/server/routes/contract/canIssueOrEditIssueFacility.test.js index e68723436f..768368d016 100644 --- a/portal/server/routes/contract/canIssueOrEditIssueFacility.test.js +++ b/portal/server/routes/contract/canIssueOrEditIssueFacility.test.js @@ -1,7 +1,8 @@ +import { CHECKER, MAKER } from '../../constants/roles'; import canIssueOrEditIssueFacility from './canIssueOrEditIssueFacility'; describe('canIssueOrEditIssueFacility', () => { - const mockUserRoles = ['maker']; + const mockUserRoles = [MAKER]; const mockLoanThatCanBeIssued = { facilityStage: 'Conditional', @@ -258,7 +259,7 @@ describe('canIssueOrEditIssueFacility', () => { describe('when user is NOT a maker', () => { it('should return false', () => { - const checkerUserRole = ['checker']; + const checkerUserRole = [CHECKER]; const mockDeal = { submissionType: 'Manual Inclusion Notice', status: 'Further Maker\'s input required', diff --git a/portal/server/routes/contract/dealWithCanIssueOrEditIssueFacilityFlags.test.js b/portal/server/routes/contract/dealWithCanIssueOrEditIssueFacilityFlags.test.js index d804991c8c..9dbfceb5ab 100644 --- a/portal/server/routes/contract/dealWithCanIssueOrEditIssueFacilityFlags.test.js +++ b/portal/server/routes/contract/dealWithCanIssueOrEditIssueFacilityFlags.test.js @@ -1,8 +1,9 @@ import dealWithCanIssueOrEditIssueFacilityFlags from './dealWithCanIssueOrEditIssueFacilityFlags'; import canIssueOrEditIssueFacility from './canIssueOrEditIssueFacility'; +import { MAKER } from '../../constants/roles'; describe('dealWithCanIssueOrEditIssueFacilityFlags', () => { - const mockUserRoles = ['maker']; + const mockUserRoles = [MAKER]; const mockDeal = { submissionType: 'Automatic Inclusion Notice', diff --git a/portal/server/routes/contract/eligibility/elgibilityCheckYourAnswersValidationErrors/index.js b/portal/server/routes/contract/eligibility/eligibilityCheckYourAnswersValidationErrors/index.js similarity index 86% rename from portal/server/routes/contract/eligibility/elgibilityCheckYourAnswersValidationErrors/index.js rename to portal/server/routes/contract/eligibility/eligibilityCheckYourAnswersValidationErrors/index.js index 5764477dbf..42cca4b3c4 100644 --- a/portal/server/routes/contract/eligibility/elgibilityCheckYourAnswersValidationErrors/index.js +++ b/portal/server/routes/contract/eligibility/eligibilityCheckYourAnswersValidationErrors/index.js @@ -1,6 +1,6 @@ const FIELDS = require('../pageFields'); -const elgibilityCheckYourAnswersValidationErrors = (validationErrors, dealId) => { +const eligibilityCheckYourAnswersValidationErrors = (validationErrors, dealId) => { const mappedValidationErrors = validationErrors; if (mappedValidationErrors && mappedValidationErrors.errorList) { @@ -20,4 +20,4 @@ const elgibilityCheckYourAnswersValidationErrors = (validationErrors, dealId) => return mappedValidationErrors; }; -module.exports = elgibilityCheckYourAnswersValidationErrors; +module.exports = eligibilityCheckYourAnswersValidationErrors; diff --git a/portal/server/routes/contract/eligibility/elgibilityCheckYourAnswersValidationErrors/index.test.js b/portal/server/routes/contract/eligibility/eligibilityCheckYourAnswersValidationErrors/index.test.js similarity index 100% rename from portal/server/routes/contract/eligibility/elgibilityCheckYourAnswersValidationErrors/index.test.js rename to portal/server/routes/contract/eligibility/eligibilityCheckYourAnswersValidationErrors/index.test.js diff --git a/portal/server/routes/contract/eligibility/index.js b/portal/server/routes/contract/eligibility/index.js index 17eb899f4e..891acfd2c2 100644 --- a/portal/server/routes/contract/eligibility/index.js +++ b/portal/server/routes/contract/eligibility/index.js @@ -8,9 +8,11 @@ const { submittedEligibilityMatchesOriginalData } = require('./submittedEligibil const submittedDocumentationMatchesOriginalData = require('./submittedDocumentationMatchesOriginalData'); const completedEligibilityForms = require('./completedForms'); const eligibilityTaskList = require('./eligibilityTaskList'); -const elgibilityCheckYourAnswersValidationErrors = require('./elgibilityCheckYourAnswersValidationErrors'); +const eligibilityCheckYourAnswersValidationErrors = require('./eligibilityCheckYourAnswersValidationErrors'); const { multerFilter, formatBytes } = require('../../../utils/multer-filter.utils'); const { FILE_UPLOAD } = require('../../../constants/file-upload'); +const { validateRole } = require('../../middleware'); +const { MAKER } = require('../../../constants/roles'); const mergeEligibilityValidationErrors = (criteria, files) => { const criteriaCount = criteria?.validationErrors?.count ? criteria.validationErrors.count : 0; @@ -38,21 +40,9 @@ const router = express.Router(); const eligibilityErrorHref = (id) => `#criterion-group-${id}`; -const userCanAccessEligibility = (user) => { - if (!user?.roles?.includes('maker')) { - return false; - } - return true; -}; - -router.get('/contract/:_id/eligibility/criteria', provide([DEAL, COUNTRIES]), async (req, res) => { +router.get('/contract/:_id/eligibility/criteria', [validateRole({ role: [MAKER] }), provide([DEAL, COUNTRIES])], async (req, res) => { const { deal, countries } = req.apiData; - const { user } = req.session; - if (!userCanAccessEligibility(user)) { - return res.redirect('/'); - } - const allEligibilityValidationErrors = mergeEligibilityValidationErrors(deal.eligibility, deal.supportingInformation); const validationErrors = generateErrorSummary(allEligibilityValidationErrors, errorHref); @@ -99,14 +89,9 @@ router.post('/contract/:_id/eligibility/criteria/save-go-back', provide([DEAL]), return res.redirect(redirectUrl); }); -router.get('/contract/:_id/eligibility/supporting-documentation', provide([DEAL]), async (req, res) => { +router.get('/contract/:_id/eligibility/supporting-documentation', [validateRole({ role: [MAKER] }), provide([DEAL])], async (req, res) => { const { deal } = req.apiData; - const { user } = req.session; - if (!userCanAccessEligibility(user)) { - return res.redirect('/'); - } - const { eligibility, supportingInformation = {} } = deal; const allEligibilityValidationErrors = mergeEligibilityValidationErrors(deal.eligibility, deal.supportingInformation); @@ -307,17 +292,12 @@ router.get('/contract/:_id/eligibility-documentation/:fieldname/:filename', asyn fileData.pipe(readStream).pipe(res); }); -router.get('/contract/:_id/eligibility/check-your-answers', provide([DEAL]), async (req, res) => { +router.get('/contract/:_id/eligibility/check-your-answers', [validateRole({ role: [MAKER] }), provide([DEAL])], async (req, res) => { const { deal } = req.apiData; - const { user } = req.session; - - if (!userCanAccessEligibility(user)) { - return res.redirect('/'); - } const allEligibilityValidationErrors = mergeEligibilityValidationErrors(deal.eligibility, deal.supportingInformation); - const validationErrors = generateErrorSummary(elgibilityCheckYourAnswersValidationErrors(allEligibilityValidationErrors, deal._id)); + const validationErrors = generateErrorSummary(eligibilityCheckYourAnswersValidationErrors(allEligibilityValidationErrors, deal._id)); const completedForms = completedEligibilityForms(deal.eligibility.status, validationErrors); diff --git a/portal/server/routes/contract/index.js b/portal/server/routes/contract/index.js index 26b869d838..334f700069 100644 --- a/portal/server/routes/contract/index.js +++ b/portal/server/routes/contract/index.js @@ -19,6 +19,7 @@ const userCanSubmitDeal = require('./userCanSubmitDeal'); const dealHasIssuedFacilitiesToSubmit = require('./dealHasIssuedFacilitiesToSubmit'); const dealWithCanIssueOrEditIssueFacilityFlags = require('./dealWithCanIssueOrEditIssueFacilityFlags'); const { validateToken, validateBank, validateRole } = require('../middleware'); +const { CHECKER, MAKER } = require('../../constants/roles'); const router = express.Router(); @@ -92,7 +93,7 @@ router.get('/contract/:_id/submission-details', [provide([DEAL]), validateBank], }); }); -router.get('/contract/:_id/delete', [provide([DEAL]), validateBank, validateRole({ role: ['maker'] })], async (req, res) => { +router.get('/contract/:_id/delete', [validateRole({ role: [MAKER] }), provide([DEAL]), validateBank], async (req, res) => { const { deal } = req.apiData; return res.render('contract/contract-delete.njk', { deal, @@ -100,7 +101,7 @@ router.get('/contract/:_id/delete', [provide([DEAL]), validateBank, validateRole }); }); -router.post('/contract/:_id/delete', [validateBank, validateRole({ role: ['maker'] })], async (req, res) => { +router.post('/contract/:_id/delete', [validateRole({ role: [MAKER] }), validateBank], async (req, res) => { const { _id, userToken } = requestParams(req); const { comments } = req.body; @@ -134,7 +135,7 @@ router.post('/contract/:_id/delete', [validateBank, validateRole({ role: ['maker return res.redirect('/dashboard'); }); -router.get('/contract/:_id/ready-for-review', [provide([DEAL]), validateBank, validateRole({ role: ['maker'] })], async (req, res) => { +router.get('/contract/:_id/ready-for-review', [validateRole({ role: [MAKER] }), provide([DEAL]), validateBank], async (req, res) => { const { deal } = req.apiData; return res.render('contract/contract-ready-for-review.njk', { @@ -143,7 +144,7 @@ router.get('/contract/:_id/ready-for-review', [provide([DEAL]), validateBank, va }); }); -router.post('/contract/:_id/ready-for-review', [provide([DEAL]), validateBank, validateRole({ role: ['maker'] })], async (req, res) => { +router.post('/contract/:_id/ready-for-review', [validateRole({ role: [MAKER] }), provide([DEAL]), validateBank], async (req, res) => { const { _id, userToken } = requestParams(req); const { comments } = req.body; const { deal } = req.apiData; @@ -177,7 +178,7 @@ router.post('/contract/:_id/ready-for-review', [provide([DEAL]), validateBank, v return res.redirect('/dashboard'); }); -router.get('/contract/:_id/edit-name', [provide([DEAL]), validateBank, validateRole({ role: ['maker'] })], async (req, res) => { +router.get('/contract/:_id/edit-name', [validateRole({ role: [MAKER] }), provide([DEAL]), validateBank], async (req, res) => { const { deal } = req.apiData; return res.render('contract/contract-edit-name.njk', { @@ -186,7 +187,7 @@ router.get('/contract/:_id/edit-name', [provide([DEAL]), validateBank, validateR }); }); -router.post('/contract/:_id/edit-name', [validateBank, validateRole({ role: ['maker'] })], async (req, res) => { +router.post('/contract/:_id/edit-name', [validateRole({ role: [MAKER] }), validateBank], async (req, res) => { const { _id, userToken } = requestParams(req); const { additionalRefName } = req.body; @@ -213,7 +214,7 @@ router.post('/contract/:_id/edit-name', [validateBank, validateRole({ role: ['ma return res.redirect(`/contract/${_id}`); }); -router.get('/contract/:_id/return-to-maker', [validateBank, validateRole({ role: ['checker'] })], async (req, res) => { +router.get('/contract/:_id/return-to-maker', [validateRole({ role: [CHECKER] }), validateBank], async (req, res) => { const { _id } = req.params; return res.render('contract/contract-return-to-maker.njk', { @@ -222,7 +223,7 @@ router.get('/contract/:_id/return-to-maker', [validateBank, validateRole({ role: }); }); -router.post('/contract/:_id/return-to-maker', [validateBank, validateRole({ role: ['checker'] })], async (req, res) => { +router.post('/contract/:_id/return-to-maker', [validateRole({ role: [CHECKER] }), validateBank], async (req, res) => { const { _id, userToken } = requestParams(req); const { comments } = req.body; @@ -256,7 +257,7 @@ router.post('/contract/:_id/return-to-maker', [validateBank, validateRole({ role return res.redirect('/dashboard'); }); -router.get('/contract/:_id/confirm-submission', [validateBank, validateRole({ role: ['checker'] })], async (req, res) => { +router.get('/contract/:_id/confirm-submission', [validateRole({ role: [CHECKER] }), validateBank], async (req, res) => { const { _id } = req.params; return res.render('contract/contract-confirm-submission.njk', { @@ -265,7 +266,7 @@ router.get('/contract/:_id/confirm-submission', [validateBank, validateRole({ ro }); }); -router.post('/contract/:_id/confirm-submission', [provide([DEAL]), validateBank, validateRole({ role: ['checker'] })], async (req, res) => { +router.post('/contract/:_id/confirm-submission', [validateRole({ role: [CHECKER] }), provide([DEAL]), validateBank], async (req, res) => { const { _id, userToken } = requestParams(req); const { confirmSubmit } = req.body; @@ -309,7 +310,7 @@ router.post('/contract/:_id/confirm-submission', [provide([DEAL]), validateBank, return res.redirect('/dashboard'); }); -router.get('/contract/:_id/clone', [provide([DEAL]), validateBank, validateRole({ role: ['maker'] })], async (req, res) => { +router.get('/contract/:_id/clone', [validateRole({ role: [MAKER] }), provide([DEAL]), validateBank], async (req, res) => { const { deal } = req.apiData; const { bankInternalRefName, additionalRefName } = deal; @@ -321,7 +322,7 @@ router.get('/contract/:_id/clone', [provide([DEAL]), validateBank, validateRole( }); }); -router.post('/contract/:_id/clone', [validateBank, validateRole({ role: ['maker'] })], async (req, res) => { +router.post('/contract/:_id/clone', [validateRole({ role: [MAKER] }), validateBank], async (req, res) => { const { _id, userToken } = requestParams(req); const apiResponse = await postToApi(api.cloneDeal(_id, req.body, userToken), errorHref); @@ -347,7 +348,7 @@ router.post('/contract/:_id/clone', [validateBank, validateRole({ role: ['maker' return res.redirect('/dashboard'); }); -router.get('/contract/:_id/clone/before-you-start', [provide([MANDATORY_CRITERIA]), validateBank, validateRole({ role: ['maker'] })], async (req, res) => { +router.get('/contract/:_id/clone/before-you-start', [validateRole({ role: [MAKER] }), provide([MANDATORY_CRITERIA]), validateBank], async (req, res) => { const { mandatoryCriteria } = req.apiData; return res.render('before-you-start/before-you-start.njk', { mandatoryCriteria, @@ -355,7 +356,7 @@ router.get('/contract/:_id/clone/before-you-start', [provide([MANDATORY_CRITERIA }); }); -router.post('/contract/:_id/clone/before-you-start', [validateBank, validateRole({ role: ['maker'] })], async (req, res) => { +router.post('/contract/:_id/clone/before-you-start', [validateRole({ role: [MAKER] }), validateBank], async (req, res) => { const { _id } = requestParams(req); const { criteriaMet } = req.body; diff --git a/portal/server/routes/contract/isDealEditable.test.js b/portal/server/routes/contract/isDealEditable.test.js index 0c5df2b101..3d1361b4ef 100644 --- a/portal/server/routes/contract/isDealEditable.test.js +++ b/portal/server/routes/contract/isDealEditable.test.js @@ -1,7 +1,8 @@ +import { CHECKER, MAKER } from '../../constants/roles'; import isDealEditable from './isDealEditable'; describe('isDealEditable', () => { - const mockMakerUser = { roles: ['maker'] }; + const mockMakerUser = { roles: [MAKER] }; describe('when user is NOT maker', () => { it('should return false', () => { @@ -10,7 +11,7 @@ describe('isDealEditable', () => { details: {}, }; - const checkerUser = { roles: ['checker'] }; + const checkerUser = { roles: [CHECKER] }; const result = isDealEditable(mockDeal, checkerUser); expect(result).toEqual(false); diff --git a/portal/server/routes/contract/loan/index.js b/portal/server/routes/contract/loan/index.js index 88597248dd..bdeb1e5a50 100644 --- a/portal/server/routes/contract/loan/index.js +++ b/portal/server/routes/contract/loan/index.js @@ -29,14 +29,12 @@ const canIssueOrEditIssueFacility = require('../canIssueOrEditIssueFacility'); const isDealEditable = require('../isDealEditable'); const premiumFrequencyField = require('./premiumFrequencyField'); const { FACILITY_STAGE, STATUS } = require('../../../constants'); +const { validateRole } = require('../../middleware'); +const { MAKER } = require('../../../constants/roles'); const router = express.Router(); -const userCanAccessLoan = (user, deal) => { - if (!user.roles.includes('maker')) { - return false; - } - +const loanCanBeAccessed = (deal) => { const { status } = deal.details; if (status === STATUS.READY_FOR_APPROVAL @@ -50,14 +48,6 @@ const userCanAccessLoan = (user, deal) => { return true; }; -const userCanAccessLoanPreview = (user) => { - if (!user.roles.includes('maker')) { - return false; - } - - return true; -}; - const handleNameField = (loanBody) => { const modifiedLoan = loanBody; const { @@ -84,16 +74,14 @@ router.get('/contract/:_id/loan/create', async (req, res) => { return res.redirect(`/contract/${dealId}/loan/${loanId}/guarantee-details`); }); -router.get('/contract/:_id/loan/:loanId/guarantee-details', provide([LOAN, DEAL]), async (req, res) => { +router.get('/contract/:_id/loan/:loanId/guarantee-details', [validateRole({ role: [MAKER] }), provide([LOAN, DEAL])], async (req, res) => { const { dealId, loan, validationErrors, } = req.apiData.loan; - const { user } = req.session; - - if (!userCanAccessLoan(user, req.apiData.deal)) { + if (!loanCanBeAccessed(req.apiData.deal)) { return res.redirect('/'); } @@ -163,7 +151,7 @@ router.post('/contract/:_id/loan/:loanId/guarantee-details/save-go-back', provid return saveFacilityAndGoBackToDeal(req, res, modifiedBody); }); -router.get('/contract/:_id/loan/:loanId/financial-details', provide([LOAN, DEAL, CURRENCIES]), async (req, res) => { +router.get('/contract/:_id/loan/:loanId/financial-details', [validateRole({ role: [MAKER] }), provide([LOAN, DEAL, CURRENCIES])], async (req, res) => { const { dealId, loan, @@ -171,9 +159,7 @@ router.get('/contract/:_id/loan/:loanId/financial-details', provide([LOAN, DEAL, } = req.apiData.loan; const { currencies } = req.apiData; - const { user } = req.session; - - if (!userCanAccessLoan(user, req.apiData.deal)) { + if (!loanCanBeAccessed(req.apiData.deal)) { return res.redirect('/'); } @@ -241,16 +227,14 @@ router.post('/contract/:_id/loan/:loanId/financial-details/save-go-back', provid return saveFacilityAndGoBackToDeal(req, res, sanitizedPayload); }); -router.get('/contract/:_id/loan/:loanId/dates-repayments', provide([LOAN, DEAL]), async (req, res) => { +router.get('/contract/:_id/loan/:loanId/dates-repayments', [validateRole({ role: [MAKER] }), provide([LOAN, DEAL])], async (req, res) => { const { dealId, loan, validationErrors, } = req.apiData.loan; - const { user } = req.session; - - if (!userCanAccessLoan(user, req.apiData.deal)) { + if (!loanCanBeAccessed(req.apiData.deal)) { return res.redirect('/'); } @@ -300,7 +284,7 @@ router.post('/contract/:_id/loan/:loanId/dates-repayments/save-go-back', provide return saveFacilityAndGoBackToDeal(req, res, modifiedBody); }); -router.get('/contract/:_id/loan/:loanId/check-your-answers', provide([LOAN]), async (req, res) => { +router.get('/contract/:_id/loan/:loanId/check-your-answers', [validateRole({ role: [MAKER] }), provide([LOAN])], async (req, res) => { const { loanId, userToken } = requestParams(req); const { dealId, @@ -308,12 +292,6 @@ router.get('/contract/:_id/loan/:loanId/check-your-answers', provide([LOAN]), as validationErrors, } = req.apiData.loan; - const { user } = req.session; - - if (!userCanAccessLoanPreview(user)) { - return res.redirect('/'); - } - // POST to api to flag that we have viewed preview page. // this is required specifically for other Loan forms/pages, to match the existing UX/UI. @@ -356,7 +334,7 @@ router.get('/contract/:_id/loan/:loanId/check-your-answers', provide([LOAN]), as }); }); -router.get('/contract/:_id/loan/:loanId/issue-facility', provide([LOAN, DEAL]), async (req, res) => { +router.get('/contract/:_id/loan/:loanId/issue-facility', [validateRole({ role: [MAKER] }), provide([LOAN, DEAL])], async (req, res) => { const { _id: dealId } = requestParams(req); const { loan } = req.apiData.loan; const { user } = req.session; @@ -541,9 +519,9 @@ router.post('/contract/:_id/loan/:loanId/confirm-requested-cover-start-date', pr return res.redirect(redirectUrl); }); -router.get('/contract/:_id/loan/:loanId/delete', provide([DEAL, LOAN]), async (req, res) => { - const { user } = req.session; +router.get('/contract/:_id/loan/:loanId/delete', [validateRole({ role: [MAKER] }, (req) => `/contract/${req.params._id}`), provide([DEAL, LOAN])], async (req, res) => { const { loan } = req.apiData.loan; + const { user } = req.session; if (isDealEditable(req.apiData.deal, user)) { return res.render('loan/loan-delete.njk', { diff --git a/portal/server/routes/contract/userCanSubmitDeal.test.js b/portal/server/routes/contract/userCanSubmitDeal.test.js index 2af8f85ffb..26d3d93fc6 100644 --- a/portal/server/routes/contract/userCanSubmitDeal.test.js +++ b/portal/server/routes/contract/userCanSubmitDeal.test.js @@ -1,3 +1,4 @@ +import { CHECKER, MAKER } from '../../constants/roles'; import userCanSubmitDeal from './userCanSubmitDeal'; describe('userCanSubmitDeal', () => { @@ -32,7 +33,7 @@ describe('userCanSubmitDeal', () => { }; const user = { - roles: ['maker'], + roles: [MAKER], _id: '1234', }; @@ -50,7 +51,7 @@ describe('userCanSubmitDeal', () => { }; const user = { - roles: ['maker', 'checker'], + roles: [MAKER, CHECKER], _id: '1234', }; @@ -74,7 +75,7 @@ describe('userCanSubmitDeal', () => { }; const user = { - roles: ['maker'], + roles: [MAKER], _id: '1234', }; @@ -98,7 +99,7 @@ describe('userCanSubmitDeal', () => { }; const user = { - roles: ['maker', 'checker'], + roles: [MAKER, CHECKER], _id: '1234', }; @@ -122,7 +123,7 @@ describe('userCanSubmitDeal', () => { }; const user = { - roles: ['maker', 'checker'], + roles: [MAKER, CHECKER], _id: '1234', }; diff --git a/portal/server/routes/middleware/isMaker/index.js b/portal/server/routes/middleware/isMaker/index.js index e696bcb663..ff229c990e 100644 --- a/portal/server/routes/middleware/isMaker/index.js +++ b/portal/server/routes/middleware/isMaker/index.js @@ -1,7 +1,9 @@ +const { MAKER } = require('../../../constants/roles'); + const isMaker = async (req, res, next) => { const { user } = req.session; - if (!user || !user.roles.includes('maker')) { + if (!user || !user.roles.includes(MAKER)) { return res.redirect('/'); } diff --git a/portal/server/routes/middleware/isMaker/index.test.js b/portal/server/routes/middleware/isMaker/index.test.js index b9dbb4ec1f..033494c5ff 100644 --- a/portal/server/routes/middleware/isMaker/index.test.js +++ b/portal/server/routes/middleware/isMaker/index.test.js @@ -1,5 +1,6 @@ import mockResponse from '../../../helpers/responseMock'; import isMaker from '.'; +import { CHECKER, MAKER } from '../../../constants/roles'; describe('isMaker', () => { let req; @@ -22,7 +23,7 @@ describe('isMaker', () => { }); it('redirects to root if user is not a maker', () => { - req.session.user = { roles: ['checker', 'another-role'] }; + req.session.user = { roles: [CHECKER, 'another-role'] }; isMaker(req, res, next); @@ -31,7 +32,7 @@ describe('isMaker', () => { }); it('calls next if user has maker role', () => { - req.session.user = { roles: ['maker', 'another-role'] }; + req.session.user = { roles: [MAKER, 'another-role'] }; isMaker(req, res, next); diff --git a/portal/server/routes/middleware/validateBank/index.js b/portal/server/routes/middleware/validateBank/index.js index f592aa85bd..7bd03acb87 100644 --- a/portal/server/routes/middleware/validateBank/index.js +++ b/portal/server/routes/middleware/validateBank/index.js @@ -1,6 +1,7 @@ const api = require('../../../api'); +const { UKEF_OPERATIONS, ADMIN, UKEF_ADMIN } = require('../../../constants/roles'); -const ukefAdminRoles = ['ukef_operations', 'admin', 'ukef_admin']; +const ukefAdminRoles = [UKEF_OPERATIONS, ADMIN, UKEF_ADMIN]; const validateBank = async (req, res, next) => { const { _id: dealId } = req.params; diff --git a/portal/server/routes/middleware/validateRole/index.js b/portal/server/routes/middleware/validateRole/index.js index 008d8ad8cb..f9931bfd4d 100644 --- a/portal/server/routes/middleware/validateRole/index.js +++ b/portal/server/routes/middleware/validateRole/index.js @@ -1,5 +1,3 @@ -const ukefAdminRoles = ['ukef_operations', 'admin', 'ukef_admin']; - /** * * @param {array} requiredRoles (i.e. ['maker']) @@ -15,8 +13,7 @@ const userRoleIsValid = (requiredRoles, user) => { return false; } - const userHasOneOfTheRequiredRoles = ukefAdminRoles.some((adminRole) => user.roles.includes(adminRole)) - || requiredRoles.some((role) => user.roles.includes(role)); + const userHasOneOfTheRequiredRoles = requiredRoles.some((role) => user.roles.includes(role)); return userHasOneOfTheRequiredRoles; }; /** @@ -24,14 +21,14 @@ const userRoleIsValid = (requiredRoles, user) => { * @param {object} opts (i.e. { role: ['maker'] }) * */ -const validateRole = (opts) => { +const validateRole = (opts, getRedirectUrl = () => '/') => { const requiredRoles = opts ? opts.role : null; return (req, res, next) => { if (userRoleIsValid(requiredRoles, req.session.user)) { next(); } else { - res.redirect('/'); + res.redirect(getRedirectUrl(req)); } }; }; diff --git a/portal/server/routes/reports.route.js b/portal/server/routes/reports.route.js index 3f074cae63..aa6851584f 100644 --- a/portal/server/routes/reports.route.js +++ b/portal/server/routes/reports.route.js @@ -1,15 +1,16 @@ const express = require('express'); const reportsController = require('../controllers/dashboard/reports.controller'); const { validateToken, validateRole } = require('./middleware'); +const { MAKER, CHECKER } = require('../constants/roles'); const reportsRouter = express.Router(); -reportsRouter.get('/reports', [validateToken, validateRole({ role: ['maker', 'checker'] })], reportsController.getPortalReports); -reportsRouter.get('/reports/review-unissued-facilities', [validateToken, validateRole({ role: ['maker', 'checker'] })], reportsController.getUnissuedFacilitiesReport); -reportsRouter.get('/reports/review-unconditional-decision', [validateToken, validateRole({ role: ['maker', 'checker'] })], reportsController.getUnconditionalDecisionReport); -reportsRouter.get('/reports/review-conditional-decision', [validateToken, validateRole({ role: ['maker', 'checker'] })], reportsController.getConditionalDecisionReport); -reportsRouter.get('/reports/download-unissued-facilities-report', [validateToken, validateRole({ role: ['maker', 'checker'] })], reportsController.downloadUnissuedFacilitiesReport); -reportsRouter.get('/reports/download-unconditional-decision-report', [validateToken, validateRole({ role: ['maker', 'checker'] })], reportsController.downloadUnconditionalDecisionReport); -reportsRouter.get('/reports/download-conditional-decision-report', [validateToken, validateRole({ role: ['maker', 'checker'] })], reportsController.downloadConditionalDecisionReport); +reportsRouter.get('/reports', [validateToken, validateRole({ role: [MAKER, CHECKER] })], reportsController.getPortalReports); +reportsRouter.get('/reports/review-unissued-facilities', [validateToken, validateRole({ role: [MAKER, CHECKER] })], reportsController.getUnissuedFacilitiesReport); +reportsRouter.get('/reports/review-unconditional-decision', [validateToken, validateRole({ role: [MAKER, CHECKER] })], reportsController.getUnconditionalDecisionReport); +reportsRouter.get('/reports/review-conditional-decision', [validateToken, validateRole({ role: [MAKER, CHECKER] })], reportsController.getConditionalDecisionReport); +reportsRouter.get('/reports/download-unissued-facilities-report', [validateToken, validateRole({ role: [MAKER, CHECKER] })], reportsController.downloadUnissuedFacilitiesReport); +reportsRouter.get('/reports/download-unconditional-decision-report', [validateToken, validateRole({ role: [MAKER, CHECKER] })], reportsController.downloadUnconditionalDecisionReport); +reportsRouter.get('/reports/download-conditional-decision-report', [validateToken, validateRole({ role: [MAKER, CHECKER] })], reportsController.downloadConditionalDecisionReport); module.exports = reportsRouter; diff --git a/portal/server/routes/schemeType/index.js b/portal/server/routes/schemeType/index.js index 2dfe4da493..3ad002156c 100644 --- a/portal/server/routes/schemeType/index.js +++ b/portal/server/routes/schemeType/index.js @@ -1,10 +1,11 @@ const express = require('express'); const { validateToken, validateRole } = require('../middleware'); const { getSchemeType, postSchemeType } = require('../../controllers/schemeType'); +const { MAKER, CHECKER } = require('../../constants/roles'); const router = express.Router(); -router.use('/select-scheme/*', [validateToken, validateRole({ role: ['maker'] })]); -router.get('/select-scheme', getSchemeType); -router.post('/select-scheme', postSchemeType); +router.use('/select-scheme', validateToken); +router.get('/select-scheme', [validateRole({ role: [MAKER, CHECKER] }), getSchemeType]); +router.post('/select-scheme', [validateRole({ role: [MAKER] }), postSchemeType]); module.exports = router; diff --git a/portal/server/routes/schemeType/index.test.js b/portal/server/routes/schemeType/index.test.js index 1b5f6dcdaf..cc048f82d4 100644 --- a/portal/server/routes/schemeType/index.test.js +++ b/portal/server/routes/schemeType/index.test.js @@ -19,11 +19,11 @@ describe('routes/site-notices', () => { }); it('should define the expected routes', () => { - expect(use).toHaveBeenCalledWith('/select-scheme/*', [validateToken, expect.any(Function)]); + expect(use).toHaveBeenCalledWith('/select-scheme', validateToken); - expect(get).toHaveBeenCalledWith('/select-scheme', getSchemeType); + expect(get).toHaveBeenCalledWith('/select-scheme', [expect.any(Function), getSchemeType]); - expect(post).toHaveBeenCalledWith('/select-scheme', postSchemeType); + expect(post).toHaveBeenCalledWith('/select-scheme', [expect.any(Function), postSchemeType]); }); }); }); diff --git a/portal/server/routes/start.js b/portal/server/routes/start.js index cd21c8b7c6..b5ae96548f 100644 --- a/portal/server/routes/start.js +++ b/portal/server/routes/start.js @@ -4,11 +4,12 @@ const { requestParams, generateErrorSummary, errorHref, postToApi, constructPayl const { validateToken, validateRole } = require('./middleware'); const { provide, MANDATORY_CRITERIA } = require('./api-data-provider'); const beforeYouStartValidation = require('../validation/before-you-start'); +const { MAKER } = require('../constants/roles'); const router = express.Router(); router.use('/before-you-start/*', validateToken); -router.get('/before-you-start', [provide([MANDATORY_CRITERIA]), validateRole({ role: ['maker'] })], async (req, res) => { +router.get('/before-you-start', [validateRole({ role: [MAKER] }), provide([MANDATORY_CRITERIA])], async (req, res) => { const { mandatoryCriteria } = req.apiData; res.render('before-you-start/before-you-start.njk', { mandatoryCriteria, @@ -16,7 +17,7 @@ router.get('/before-you-start', [provide([MANDATORY_CRITERIA]), validateRole({ r }); }); -router.post('/before-you-start', [provide([MANDATORY_CRITERIA]), validateRole({ role: ['maker'] })], async (req, res) => { +router.post('/before-you-start', [validateRole({ role: [MAKER] }), provide([MANDATORY_CRITERIA])], async (req, res) => { const { mandatoryCriteria } = req.apiData; const validationErrors = generateErrorSummary(beforeYouStartValidation(req.body), errorHref); @@ -35,13 +36,13 @@ router.post('/before-you-start', [provide([MANDATORY_CRITERIA]), validateRole({ return res.redirect('/before-you-start/bank-deal'); }); -router.get('/before-you-start/bank-deal', validateRole({ role: ['maker'] }), async (req, res) => { +router.get('/before-you-start/bank-deal', validateRole({ role: [MAKER] }), async (req, res) => { res.render('before-you-start/before-you-start-bank-deal.njk', { user: req.session.user, }); }); -router.post('/before-you-start/bank-deal', [provide([MANDATORY_CRITERIA]), validateRole({ role: ['maker'] })], async (req, res) => { +router.post('/before-you-start/bank-deal', [validateRole({ role: [MAKER] }), provide([MANDATORY_CRITERIA])], async (req, res) => { const { userToken } = requestParams(req); const allowedFields = [ From 8563e2d0881d7af20efe7e0df64893d6f36d632a Mon Sep 17 00:00:00 2001 From: lmarrai-sw <44811960+lmarrai-sw@users.noreply.github.com> Date: Thu, 14 Sep 2023 13:47:43 +0100 Subject: [PATCH 014/130] feat(DTFS2-6647): forbid read only users from having another role (#2051) Co-authored-by: AlexBramhill <47955140+AlexBramhill@users.noreply.github.com> --- .../admin/create-user/create-a-user.spec.js | 23 +++- .../api-tests/v1/users/users.api-test.js | 126 ++++++++++++++++-- portal-api/src/v1/roles/roles.js | 26 ++-- portal-api/src/v1/users/validation/index.js | 19 ++- .../current-password-must-match.test.js} | 4 +- .../passwords-at-least-8-characters.test.js} | 8 +- .../passwords-at-least-one-lowercase.test.js} | 2 +- .../passwords-at-least-one-number.test.js} | 2 +- ...ds-at-least-one-special-character.test.js} | 2 +- .../passwords-at-least-one-uppercase.test.js} | 2 +- .../rules/passwords-cannot-be-reused.test.js} | 6 +- .../rules/passwords-must-match.test.js} | 2 +- ...ole-cannot-be-assigned-with-other-roles.js | 14 ++ ...annot-be-assigned-with-other-roles.test.js | 68 ++++++++++ portal-api/test-helpers/common-role-lists.js | 12 ++ .../admin/user-edit.component-test.js | 84 +++++++++--- portal/server/routes/admin/users.js | 22 +-- portal/templates/admin/user-edit.njk | 101 ++++++++------ 18 files changed, 400 insertions(+), 123 deletions(-) rename portal-api/{api-tests/v1/users/validation/rules/current-password-must-match.api-test.js => src/v1/users/validation/rules/current-password-must-match.test.js} (92%) rename portal-api/{api-tests/v1/users/validation/rules/passwords-at-least-8-characters.api-test.js => src/v1/users/validation/rules/passwords-at-least-8-characters.test.js} (76%) rename portal-api/{api-tests/v1/users/validation/rules/passwords-at-least-one-lowercase.api-test.js => src/v1/users/validation/rules/passwords-at-least-one-lowercase.test.js} (88%) rename portal-api/{api-tests/v1/users/validation/rules/passwords-at-least-one-number.api-test.js => src/v1/users/validation/rules/passwords-at-least-one-number.test.js} (88%) rename portal-api/{api-tests/v1/users/validation/rules/passwords-at-least-one-special-character.api-test.js => src/v1/users/validation/rules/passwords-at-least-one-special-character.test.js} (87%) rename portal-api/{api-tests/v1/users/validation/rules/passwords-at-least-one-uppercase.api-test.js => src/v1/users/validation/rules/passwords-at-least-one-uppercase.test.js} (88%) rename portal-api/{api-tests/v1/users/validation/rules/passwords-cannot-be-reused.api-test.js => src/v1/users/validation/rules/passwords-cannot-be-reused.test.js} (80%) rename portal-api/{api-tests/v1/users/validation/rules/passwords-must-match.api-test.js => src/v1/users/validation/rules/passwords-must-match.test.js} (89%) create mode 100644 portal-api/src/v1/users/validation/rules/read-only-role-cannot-be-assigned-with-other-roles.js create mode 100644 portal-api/src/v1/users/validation/rules/read-only-role-cannot-be-assigned-with-other-roles.test.js create mode 100644 portal-api/test-helpers/common-role-lists.js diff --git a/e2e-tests/portal/cypress/e2e/journeys/admin/create-user/create-a-user.spec.js b/e2e-tests/portal/cypress/e2e/journeys/admin/create-user/create-a-user.spec.js index a2aebf5192..a67d2acf01 100644 --- a/e2e-tests/portal/cypress/e2e/journeys/admin/create-user/create-a-user.spec.js +++ b/e2e-tests/portal/cypress/e2e/journeys/admin/create-user/create-a-user.spec.js @@ -1,7 +1,7 @@ const { header, users, createUser } = require('../../../pages'); const relative = require('../../../relativeURL'); const MOCK_USERS = require('../../../../fixtures/users'); -const { USER_ROLES: { MAKER, READ_ONLY } } = require('../../../../fixtures/constants'); +const { USER_ROLES: { MAKER, READ_ONLY, CHECKER } } = require('../../../../fixtures/constants'); const { ADMIN: AN_ADMIN, USER_WITH_INJECTION } = MOCK_USERS; @@ -201,6 +201,27 @@ context('Admin user creates a new user', () => { expect(text.trim()).to.equal(READ_ONLY); }); }); + + it('should unselect other roles if the read-only role is selected', () => { + createUser.role(MAKER).click(); + createUser.role(CHECKER).click(); + createUser.role(MAKER).should('be.checked'); + createUser.role(CHECKER).should('be.checked'); + + createUser.role(READ_ONLY).click(); + createUser.role(READ_ONLY).should('be.checked'); + createUser.role(MAKER).should('not.be.checked'); + createUser.role(CHECKER).should('not.be.checked'); + }); + + it('should unselect the read-only role if another role is selected', () => { + createUser.role(READ_ONLY).click(); + createUser.role(READ_ONLY).should('be.checked'); + + createUser.role(MAKER).click(); + createUser.role(MAKER).should('be.checked'); + createUser.role(READ_ONLY).should('not.be.checked'); + }); }); // TODO: ADD lighthouse checks DTFS2-4994 }); diff --git a/portal-api/api-tests/v1/users/users.api-test.js b/portal-api/api-tests/v1/users/users.api-test.js index 9e217557ea..b288946d2b 100644 --- a/portal-api/api-tests/v1/users/users.api-test.js +++ b/portal-api/api-tests/v1/users/users.api-test.js @@ -5,13 +5,15 @@ const app = require('../../../src/createApp'); const { as } = require('../../api')(app); const users = require('./test-data'); -const { MAKER, CHECKER } = require('../../../src/v1/roles/roles'); +const { READ_ONLY, MAKER, CHECKER } = require('../../../src/v1/roles/roles'); +const { NON_READ_ONLY_ROLES } = require('../../../test-helpers/common-role-lists'); const aMaker = users.find((user) => user.username === 'MAKER'); const MOCK_USER = { ...aMaker, username: 'TEMPORARY_USER' }; const PASSWORD_ERROR = { text: 'Your password must be at least 8 characters long and include at least one number, at least one upper-case character, at least one lower-case character and at least one special character. Passwords cannot be re-used.' }; const EMAIL_ERROR = { text: 'Enter an email address in the correct format, for example, name@example.com' }; +const READ_ONLY_ROLE_EXCLUSIVE_ERROR = { text: "You cannot combine 'Read-only' with any of the other roles" }; describe('a user', () => { let loggedInUser; @@ -141,22 +143,124 @@ describe('a user', () => { ], }); }); + + it.each(NON_READ_ONLY_ROLES)('rejects if the user creation request has the read-only role and the %s role', async (otherRole) => { + const newUser = { + ...MOCK_USER, + roles: [ + READ_ONLY, + otherRole, + ] + }; + + const { status, body } = await as(loggedInUser).post(newUser).to('/v1/users'); + + expect(status).toEqual(400); + expect(body.success).toEqual(false); + expect(body.errors.errorList.roles).toStrictEqual(READ_ONLY_ROLE_EXCLUSIVE_ERROR); + }); + + it('creates the user if the user creation request has the read-only role repeated', async () => { + const newUser = { + ...MOCK_USER, + roles: [ + READ_ONLY, + READ_ONLY, + ] + }; + + await as(loggedInUser).post(newUser).to('/v1/users'); + const { status, body } = await as(loggedInUser).get('/v1/users'); + + expect(status).toEqual(200); + expect(body.users[1].roles).toStrictEqual([READ_ONLY, READ_ONLY]); + }); + + it('creates the user the user creation request has the read-only role only', async () => { + const newUser = { + ...MOCK_USER, + roles: [ + READ_ONLY, + ] + }; + + await as(loggedInUser).post(newUser).to('/v1/users'); + const { status, body } = await as(loggedInUser).get('/v1/users'); + + expect(status).toEqual(200); + expect(body.users[1].roles).toStrictEqual([READ_ONLY]); + }); }); - it('a user can be updated', async () => { - const response = await as(loggedInUser).post(MOCK_USER).to('/v1/users'); - const createdUser = response.body.user; + describe('updating a user', () => { + it('a user can be updated', async () => { + const response = await as(loggedInUser).post(MOCK_USER).to('/v1/users'); + const createdUser = response.body.user; - const updatedUserCredentials = { - roles: [CHECKER, MAKER], - }; + const updatedUserCredentials = { + roles: [CHECKER, MAKER], + }; - await as(loggedInUser).put(updatedUserCredentials).to(`/v1/users/${createdUser._id}`); + await as(loggedInUser).put(updatedUserCredentials).to(`/v1/users/${createdUser._id}`); - const { status, body } = await as(loggedInUser).get(`/v1/users/${createdUser._id}`); + const { status, body } = await as(loggedInUser).get(`/v1/users/${createdUser._id}`); - expect(status).toEqual(200); - expect(body.roles).toEqual([CHECKER, MAKER]); + expect(status).toEqual(200); + expect(body.roles).toEqual([CHECKER, MAKER]); + }); + + it.each(NON_READ_ONLY_ROLES)('rejects if the user update request has the read-only role with the %s role', async (otherRole) => { + const response = await as(loggedInUser).post(MOCK_USER).to('/v1/users'); + const createdUser = response.body.user; + + const updatedUserCredentials = { + roles: [ + READ_ONLY, + otherRole, + ], + }; + + const { status, body } = await as(loggedInUser).put(updatedUserCredentials).to(`/v1/users/${createdUser._id}`); + + expect(status).toEqual(400); + expect(body.success).toEqual(false); + expect(body.errors.errorList.roles).toStrictEqual(READ_ONLY_ROLE_EXCLUSIVE_ERROR); + }); + + it('updates the user if the user update request has the read-only role only', async () => { + const response = await as(loggedInUser).post(MOCK_USER).to('/v1/users'); + const createdUser = response.body.user; + + const updatedUserCredentials = { + roles: [READ_ONLY], + }; + + await as(loggedInUser).put(updatedUserCredentials).to(`/v1/users/${createdUser._id}`); + + const { status, body } = await as(loggedInUser).get(`/v1/users/${createdUser._id}`); + + expect(status).toEqual(200); + expect(body.roles).toEqual([READ_ONLY]); + }); + + it('updates the user if the user update request has the read-only role repeated', async () => { + const response = await as(loggedInUser).post(MOCK_USER).to('/v1/users'); + const createdUser = response.body.user; + + const updatedUserCredentials = { + roles: [ + READ_ONLY, + READ_ONLY, + ] + }; + + await as(loggedInUser).put(updatedUserCredentials).to(`/v1/users/${createdUser._id}`); + + const { status, body } = await as(loggedInUser).get(`/v1/users/${createdUser._id}`); + + expect(status).toEqual(200); + expect(body.roles).toStrictEqual([READ_ONLY, READ_ONLY]); + }); }); it('a user can be deleted', async () => { diff --git a/portal-api/src/v1/roles/roles.js b/portal-api/src/v1/roles/roles.js index 0932f56429..563414aa39 100644 --- a/portal-api/src/v1/roles/roles.js +++ b/portal-api/src/v1/roles/roles.js @@ -1,11 +1,17 @@ -const ROLES = { - MAKER: 'maker', - CHECKER: 'checker', - ADMIN: 'admin', - READ_ONLY: 'read-only', - EDITOR: 'editor', - DATA_ADMIN: 'data-admin', - INTERFACE: 'interface', -}; +const MAKER = 'maker'; +const CHECKER = 'checker'; +const ADMIN = 'admin'; +const READ_ONLY = 'read-only'; +const EDITOR = 'editor'; +const DATA_ADMIN = 'data-admin'; +const INTERFACE = 'interface'; -module.exports = ROLES; +module.exports = { + MAKER, + CHECKER, + ADMIN, + READ_ONLY, + EDITOR, + DATA_ADMIN, + INTERFACE, +}; diff --git a/portal-api/src/v1/users/validation/index.js b/portal-api/src/v1/users/validation/index.js index a8deb8c32b..0ff9d24895 100644 --- a/portal-api/src/v1/users/validation/index.js +++ b/portal-api/src/v1/users/validation/index.js @@ -6,6 +6,7 @@ const passwordAtLeastOneSpecialCharacter = require('./rules/passwordAtLeastOneSp const passwordsCannotBeReUsed = require('./rules/passwordsCannotBeReUsed'); const passwordsMustMatch = require('./rules/passwordsMustMatch'); const currentPasswordMustMatch = require('./rules/currentPasswordMustMatch'); +const readOnlyRoleCannotBeAssignedWithOtherRoles = require('./rules/read-only-role-cannot-be-assigned-with-other-roles'); const createRules = [ passwordAtLeast8Characters, @@ -13,9 +14,10 @@ const createRules = [ passwordAtLeastOneUppercase, passwordAtLeastOneLowercase, passwordAtLeastOneSpecialCharacter, + readOnlyRoleCannotBeAssignedWithOtherRoles, ]; -const adminUpdateRules = [ +const updateWithoutCurrentPasswordRules = [ passwordAtLeast8Characters, passwordAtLeastOneNumber, passwordAtLeastOneUppercase, @@ -23,16 +25,11 @@ const adminUpdateRules = [ passwordAtLeastOneSpecialCharacter, passwordsMustMatch, passwordsCannotBeReUsed, + readOnlyRoleCannotBeAssignedWithOtherRoles, ]; -const updateRules = [ - passwordAtLeast8Characters, - passwordAtLeastOneNumber, - passwordAtLeastOneUppercase, - passwordAtLeastOneLowercase, - passwordAtLeastOneSpecialCharacter, - passwordsMustMatch, - passwordsCannotBeReUsed, +const updateWithCurrentPasswordRules = [ + ...updateWithoutCurrentPasswordRules, currentPasswordMustMatch, ]; @@ -45,8 +42,8 @@ const applyCreateRules = (candidateChange) => applyRules(createRules, null, cand const applyUpdateRules = (existingUser, candidateChange) => { const rule = !candidateChange.currentPassword - ? adminUpdateRules - : updateRules; + ? updateWithoutCurrentPasswordRules + : updateWithCurrentPasswordRules; return applyRules(rule, existingUser, candidateChange); }; diff --git a/portal-api/api-tests/v1/users/validation/rules/current-password-must-match.api-test.js b/portal-api/src/v1/users/validation/rules/current-password-must-match.test.js similarity index 92% rename from portal-api/api-tests/v1/users/validation/rules/current-password-must-match.api-test.js rename to portal-api/src/v1/users/validation/rules/current-password-must-match.test.js index bb5deb5025..0b5a4de593 100644 --- a/portal-api/api-tests/v1/users/validation/rules/current-password-must-match.api-test.js +++ b/portal-api/src/v1/users/validation/rules/current-password-must-match.test.js @@ -1,5 +1,5 @@ -const currentPasswordMustMatch = require('../../../../../src/v1/users/validation/rules/currentPasswordMustMatch'); -const utils = require('../../../../../src/crypto/utils'); +const currentPasswordMustMatch = require('./currentPasswordMustMatch'); +const utils = require('../../../../crypto/utils'); const password = 'AbC!2345'; diff --git a/portal-api/api-tests/v1/users/validation/rules/passwords-at-least-8-characters.api-test.js b/portal-api/src/v1/users/validation/rules/passwords-at-least-8-characters.test.js similarity index 76% rename from portal-api/api-tests/v1/users/validation/rules/passwords-at-least-8-characters.api-test.js rename to portal-api/src/v1/users/validation/rules/passwords-at-least-8-characters.test.js index 25c7396227..917e9295a5 100644 --- a/portal-api/api-tests/v1/users/validation/rules/passwords-at-least-8-characters.api-test.js +++ b/portal-api/src/v1/users/validation/rules/passwords-at-least-8-characters.test.js @@ -1,4 +1,4 @@ -const passwordAtLeast8Characters = require('../../../../../src/v1/users/validation/rules/passwordAtLeast8Characters'); +const passwordAtLeast8Characters = require('./passwordAtLeast8Characters'); const user = { hash: 'mock_hash', @@ -8,7 +8,7 @@ const user = { describe('at least 8 characters', () => { it('should return error for passwords with less than 8 characters', () => { const change = { - password: 'AAAA', + password: '1234', }; const expectedResult = [{ @@ -22,9 +22,9 @@ describe('at least 8 characters', () => { expect(matchTest).toEqual(expectedResult); }); - it('should not return error for passwords with uppercase', () => { + it('should not return error for passwords with 8 characters', () => { const change = { - password: 'aaaabbbb', + password: '12345678', }; const matchTest = passwordAtLeast8Characters(user, change); diff --git a/portal-api/api-tests/v1/users/validation/rules/passwords-at-least-one-lowercase.api-test.js b/portal-api/src/v1/users/validation/rules/passwords-at-least-one-lowercase.test.js similarity index 88% rename from portal-api/api-tests/v1/users/validation/rules/passwords-at-least-one-lowercase.api-test.js rename to portal-api/src/v1/users/validation/rules/passwords-at-least-one-lowercase.test.js index c97b17716d..d824d8051c 100644 --- a/portal-api/api-tests/v1/users/validation/rules/passwords-at-least-one-lowercase.api-test.js +++ b/portal-api/src/v1/users/validation/rules/passwords-at-least-one-lowercase.test.js @@ -1,4 +1,4 @@ -const passwordAtLeastOneLowercase = require('../../../../../src/v1/users/validation/rules/passwordAtLeastOneLowercase'); +const passwordAtLeastOneLowercase = require('./passwordAtLeastOneLowercase'); const user = { hash: 'mock_hash', diff --git a/portal-api/api-tests/v1/users/validation/rules/passwords-at-least-one-number.api-test.js b/portal-api/src/v1/users/validation/rules/passwords-at-least-one-number.test.js similarity index 88% rename from portal-api/api-tests/v1/users/validation/rules/passwords-at-least-one-number.api-test.js rename to portal-api/src/v1/users/validation/rules/passwords-at-least-one-number.test.js index c3fcae43cb..752d042fbd 100644 --- a/portal-api/api-tests/v1/users/validation/rules/passwords-at-least-one-number.api-test.js +++ b/portal-api/src/v1/users/validation/rules/passwords-at-least-one-number.test.js @@ -1,4 +1,4 @@ -const passwordAtLeastOneNumber = require('../../../../../src/v1/users/validation/rules/passwordAtLeastOneNumber'); +const passwordAtLeastOneNumber = require('./passwordAtLeastOneNumber'); const user = { hash: 'mock_hash', diff --git a/portal-api/api-tests/v1/users/validation/rules/passwords-at-least-one-special-character.api-test.js b/portal-api/src/v1/users/validation/rules/passwords-at-least-one-special-character.test.js similarity index 87% rename from portal-api/api-tests/v1/users/validation/rules/passwords-at-least-one-special-character.api-test.js rename to portal-api/src/v1/users/validation/rules/passwords-at-least-one-special-character.test.js index db52fc94b6..59e6367745 100644 --- a/portal-api/api-tests/v1/users/validation/rules/passwords-at-least-one-special-character.api-test.js +++ b/portal-api/src/v1/users/validation/rules/passwords-at-least-one-special-character.test.js @@ -1,4 +1,4 @@ -const passwordAtLeastOneSpecialCharacter = require('../../../../../src/v1/users/validation/rules/passwordAtLeastOneSpecialCharacter'); +const passwordAtLeastOneSpecialCharacter = require('./passwordAtLeastOneSpecialCharacter'); const user = { hash: 'mock_hash', diff --git a/portal-api/api-tests/v1/users/validation/rules/passwords-at-least-one-uppercase.api-test.js b/portal-api/src/v1/users/validation/rules/passwords-at-least-one-uppercase.test.js similarity index 88% rename from portal-api/api-tests/v1/users/validation/rules/passwords-at-least-one-uppercase.api-test.js rename to portal-api/src/v1/users/validation/rules/passwords-at-least-one-uppercase.test.js index 4615c938fb..6a48d1e3a7 100644 --- a/portal-api/api-tests/v1/users/validation/rules/passwords-at-least-one-uppercase.api-test.js +++ b/portal-api/src/v1/users/validation/rules/passwords-at-least-one-uppercase.test.js @@ -1,4 +1,4 @@ -const passwordAtLeastOneUppercase = require('../../../../../src/v1/users/validation/rules/passwordAtLeastOneUppercase'); +const passwordAtLeastOneUppercase = require('./passwordAtLeastOneUppercase'); const user = { hash: 'mock_hash', diff --git a/portal-api/api-tests/v1/users/validation/rules/passwords-cannot-be-reused.api-test.js b/portal-api/src/v1/users/validation/rules/passwords-cannot-be-reused.test.js similarity index 80% rename from portal-api/api-tests/v1/users/validation/rules/passwords-cannot-be-reused.api-test.js rename to portal-api/src/v1/users/validation/rules/passwords-cannot-be-reused.test.js index 796cebbef1..b328e10592 100644 --- a/portal-api/api-tests/v1/users/validation/rules/passwords-cannot-be-reused.api-test.js +++ b/portal-api/src/v1/users/validation/rules/passwords-cannot-be-reused.test.js @@ -1,6 +1,6 @@ -const utils = require('../../../../../src/crypto/utils'); +const utils = require('../../../../crypto/utils'); -const passwordsCannotBeReused = require('../../../../../src/v1/users/validation/rules/passwordsCannotBeReUsed'); +const passwordsCannotBeReused = require('./passwordsCannotBeReUsed'); const user = { hash: 'mock_hash', @@ -8,7 +8,7 @@ const user = { }; describe('passwords cannot be reused', () => { - it('should return error for passwords that have alrady been used', () => { + it('should return error for passwords that have already been used', () => { const change = { password: 'AAAA', }; diff --git a/portal-api/api-tests/v1/users/validation/rules/passwords-must-match.api-test.js b/portal-api/src/v1/users/validation/rules/passwords-must-match.test.js similarity index 89% rename from portal-api/api-tests/v1/users/validation/rules/passwords-must-match.api-test.js rename to portal-api/src/v1/users/validation/rules/passwords-must-match.test.js index 0b2314cf7a..bbfaf2f9a2 100644 --- a/portal-api/api-tests/v1/users/validation/rules/passwords-must-match.api-test.js +++ b/portal-api/src/v1/users/validation/rules/passwords-must-match.test.js @@ -1,4 +1,4 @@ -const passwordsMustMatch = require('../../../../../src/v1/users/validation/rules/passwordsMustMatch'); +const passwordsMustMatch = require('./passwordsMustMatch'); const user = { hash: 'mock_hash', diff --git a/portal-api/src/v1/users/validation/rules/read-only-role-cannot-be-assigned-with-other-roles.js b/portal-api/src/v1/users/validation/rules/read-only-role-cannot-be-assigned-with-other-roles.js new file mode 100644 index 0000000000..e5a803c8ee --- /dev/null +++ b/portal-api/src/v1/users/validation/rules/read-only-role-cannot-be-assigned-with-other-roles.js @@ -0,0 +1,14 @@ +const { READ_ONLY } = require('../../../roles/roles'); + +const error = { + roles: { + text: "You cannot combine 'Read-only' with any of the other roles" + }, +}; + +const hasANonReadOnlyRole = (target) => target?.roles?.some((role) => role !== READ_ONLY); +const hasReadOnlyRole = (target) => target?.roles?.includes(READ_ONLY); + +module.exports = (_user, change) => (hasReadOnlyRole(change) && hasANonReadOnlyRole(change) + ? [error] + : []); diff --git a/portal-api/src/v1/users/validation/rules/read-only-role-cannot-be-assigned-with-other-roles.test.js b/portal-api/src/v1/users/validation/rules/read-only-role-cannot-be-assigned-with-other-roles.test.js new file mode 100644 index 0000000000..dd44f3dc33 --- /dev/null +++ b/portal-api/src/v1/users/validation/rules/read-only-role-cannot-be-assigned-with-other-roles.test.js @@ -0,0 +1,68 @@ +const readOnlyRoleCannotBeAssignedWithOtherRoles = require('./read-only-role-cannot-be-assigned-with-other-roles'); +const { READ_ONLY } = require('../../../roles/roles'); +const { ALL_ROLES, NON_READ_ONLY_ROLES } = require('../../../../../test-helpers/common-role-lists'); + +describe('readOnlyRoleCannotBeAssignedWithOtherRoles', () => { + const user = {}; + const allPairsOfNonReadOnlyRoles = NON_READ_ONLY_ROLES.flatMap( + (leftRole) => NON_READ_ONLY_ROLES.map( + (rightRole) => ({ leftRole, rightRole }) + ) + ); + + it('returns no errors if the change is undefined', () => { + const change = undefined; + const errors = readOnlyRoleCannotBeAssignedWithOtherRoles(user, change); + expect(errors).toStrictEqual([]); + }); + + it('returns no errors if the change does not have a roles field', () => { + const change = {}; + const errors = readOnlyRoleCannotBeAssignedWithOtherRoles(user, change); + expect(errors).toStrictEqual([]); + }); + + it('returns no errors if the change has an empty array of roles', () => { + const change = { + roles: [] + }; + const errors = readOnlyRoleCannotBeAssignedWithOtherRoles(user, change); + expect(errors).toStrictEqual([]); + }); + + it.each(ALL_ROLES)('returns no errors if the change has the %s role assigned only', (role) => { + const change = { + roles: [role], + }; + const errors = readOnlyRoleCannotBeAssignedWithOtherRoles(user, change); + expect(errors).toStrictEqual([]); + }); + + it.each(allPairsOfNonReadOnlyRoles)('returns no errors if the change has the $leftRole and $rightRole roles assigned', ({ leftRole, rightRole }) => { + const change = { + roles: [leftRole, rightRole], + }; + const errors = readOnlyRoleCannotBeAssignedWithOtherRoles(user, change); + expect(errors).toStrictEqual([]); + }); + + it.each(NON_READ_ONLY_ROLES)('returns a role error if the change has the read-only role assigned with the %s role', (role) => { + const change = { + roles: [READ_ONLY, role], + }; + const errors = readOnlyRoleCannotBeAssignedWithOtherRoles(user, change); + expect(errors).toStrictEqual([{ + roles: { + text: "You cannot combine 'Read-only' with any of the other roles" + } + }]); + }); + + it('returns no errors if the change has the read-only role assigned twice and no other roles', () => { + const change = { + roles: [READ_ONLY, READ_ONLY], + }; + const errors = readOnlyRoleCannotBeAssignedWithOtherRoles(user, change); + expect(errors).toStrictEqual([]); + }); +}); diff --git a/portal-api/test-helpers/common-role-lists.js b/portal-api/test-helpers/common-role-lists.js new file mode 100644 index 0000000000..55149583ca --- /dev/null +++ b/portal-api/test-helpers/common-role-lists.js @@ -0,0 +1,12 @@ +const ROLES = require('../src/v1/roles/roles'); + +const ALL_ROLES = Object.values(ROLES); + +const getRolesListExcluding = (rolesToExclude) => ALL_ROLES.filter((role) => !rolesToExclude.includes(role)); + +const COMMON_ROLE_LISTS = { + ALL_ROLES, + NON_READ_ONLY_ROLES: getRolesListExcluding([ROLES.READ_ONLY]), +}; + +module.exports = COMMON_ROLE_LISTS; diff --git a/portal/component-tests/admin/user-edit.component-test.js b/portal/component-tests/admin/user-edit.component-test.js index ed9f096856..25c9938e7e 100644 --- a/portal/component-tests/admin/user-edit.component-test.js +++ b/portal/component-tests/admin/user-edit.component-test.js @@ -22,38 +22,41 @@ describe(page, () => { }]; const roles = [{ - roleName: 'Maker/Checker', - roleDataAttribute: 'maker/checker', - roleValue: 'maker/checker', - }, { - roleName: 'Checker', - roleDataAttribute: 'checker', - roleValue: 'checker', - }, { roleName: 'Maker', roleDataAttribute: 'maker', roleValue: 'maker', }, { - roleName: 'UKEF Operations', - roleDataAttribute: 'ukef_operations', - roleValue: 'ukef_operations', + roleName: 'Checker', + roleDataAttribute: 'checker', + roleValue: 'checker', }, { - roleName: 'EFM', - roleDataAttribute: 'efm', - roleValue: 'EFM', + roleName: 'Admin', + roleDataAttribute: 'admin', + roleValue: 'admin', }, { - roleName: 'Read Only', + roleName: 'Read-only', roleDataAttribute: 'read-only', roleValue: 'read-only', }]; let wrapper; - describe('the role selectors', () => { + describe('the back button', () => { + it('should link to /admin/users', () => { + wrapper = render({ + banks, + user: adminUser, + displayedUser: newUser, + }); + wrapper.expectLink('[data-cy="back-link"]').toLinkTo('/admin/users', 'Back'); + }); + }); + + describe('the roles selector', () => { const roleAttributeSelector = (role) => `[data-cy="role-${role}"]`; - describe.each(roles)('for $roleName', ({ roleDataAttribute, roleValue }) => { - it('should render', () => { + describe.each(roles)('the checkbox to select $roleName', ({ roleDataAttribute, roleValue }) => { + it(`should have value ${roleValue}`, () => { wrapper = render({ banks, user: adminUser, @@ -86,5 +89,50 @@ describe(page, () => { wrapper.expectInput(roleAttributeSelector(roleDataAttribute)).toBeChecked(); }); }); + + describe('error message', () => { + const paramsToRenderWithoutError = { + banks, + user: adminUser, + displayedUser: { + ...newUser, + roles: [], + }, + }; + + it('displays if there is a validation error for the roles', () => { + const rolesErrorMessage = "You cannot combine 'Read-only' with any of the other roles"; + wrapper = render({ + ...paramsToRenderWithoutError, + validationErrors: { + errorList: { + roles: { + text: rolesErrorMessage, + }, + }, + }, + }); + wrapper.expectText('[data-cy="roles-error-message"]').toRead(`Error: ${rolesErrorMessage}`); + }); + + it('does not display if there are no validation errors', () => { + wrapper = render(paramsToRenderWithoutError); + wrapper.expectText('[data-cy="roles-error-message"]').notToExist(); + }); + + it('does not display if there are validation errors for other inputs but not for roles', () => { + wrapper = render({ + ...paramsToRenderWithoutError, + validationErrors: { + errorList: { + otherError: { + text: 'some text', + }, + }, + }, + }); + wrapper.expectText('[data-cy="roles-error-message"]').notToExist(); + }); + }); }); }); diff --git a/portal/server/routes/admin/users.js b/portal/server/routes/admin/users.js index 9387a1a6b3..4313b37c92 100644 --- a/portal/server/routes/admin/users.js +++ b/portal/server/routes/admin/users.js @@ -7,7 +7,6 @@ const { generateErrorSummary, constructPayload, } = require('../../helpers'); -const { MAKER, CHECKER } = require('../../constants/roles'); const router = express.Router(); @@ -41,24 +40,9 @@ router.get('/users/create', async (req, res) => { // roles are fed in = require(checkboxes, so we either get a string or an array.). // -so if we don't get an array, put it into an array.. -// if 'maker/checker' value is submitted, remove this and add 'maker' and 'checker' to the array. -const handleRoles = (roles) => { - let result = []; - if (Array.isArray(roles)) { - result = [...roles]; - } else { - result = [roles]; - } - - if (result.includes('maker/checker')) { - const makerCheckerIndex = result.findIndex((i) => i === 'maker/checker'); - result.splice(makerCheckerIndex, 1); - result.push(MAKER); - result.push(CHECKER); - } - - return result; -}; +const handleRoles = (roles) => (Array.isArray(roles) + ? [...roles] + : [roles]); // Admin - user create router.post('/users/create', async (req, res) => { diff --git a/portal/templates/admin/user-edit.njk b/portal/templates/admin/user-edit.njk index 2b936dae27..487e628273 100644 --- a/portal/templates/admin/user-edit.njk +++ b/portal/templates/admin/user-edit.njk @@ -3,6 +3,8 @@ {% from "govuk/components/radios/macro.njk" import govukRadios %} {% from "govuk/components/button/macro.njk" import govukButton %} {% from "govuk/components/select/macro.njk" import govukSelect %} +{% from "govuk/components/back-link/macro.njk" import govukBackLink %} + {% extends "index.njk" %} @@ -10,17 +12,25 @@ {% if _id %} Edit user {{ displayedUser.username }} {% else %} - User create + Create user {% endif %} {% endblock %} {% block content %} + {{ govukBackLink({ + text: "Back", + href: "/admin/users", + attributes: { + 'data-cy': 'back-link' + } + }) }} +

    {% if _id %} Edit user {{ displayedUser.username }} {% else %} - User create + Create user {% endif %}

    @@ -30,7 +40,8 @@ {{ govukInput({ attributes: {"data-cy": "firstname"}, label: { - text: "First name" + text: "First name", + classes: "govuk-label--s" }, classes: "govuk-!-width-one-third", id: "firstname", @@ -41,7 +52,8 @@ {{ govukInput({ attributes: {"data-cy": "surname"}, label: { - text: "Surname" + text: "Surname", + classes: "govuk-label--s" }, classes: "govuk-!-width-one-third", id: "surname", @@ -52,47 +64,49 @@ {{ govukCheckboxes({ idPrefix: "roles", name: "roles", - classes: "govuk-checkboxes--small", fieldset: { legend: { text: "Roles", classes: "govuk-fieldset__legend--s" } }, + hint: { + text: "Select the role or multiple roles of the person you’re adding as a user" + }, + errorMessage: validationErrors and validationErrors.errorList and validationErrors.errorList.roles and { + text: validationErrors.errorList.roles.text, + attributes: { "data-cy": "roles-error-message" } + }, items: [ { - value: "maker/checker", - text: "Maker/Checker", - checked: displayedUser.roles.includes("maker/checker"), - attributes: {"data-cy": "role-maker/checker"} + value: "maker", + text: "Maker", + hint: { text: "Creates the UKEF application on behalf of the bank" }, + checked: displayedUser.roles.includes("maker"), + attributes: {"data-cy": "role-maker"} }, { value: "checker", text: "Checker", + hint: { text: "Independently reviews applications" }, checked: displayedUser.roles.includes("checker"), attributes: {"data-cy": "role-checker"} }, { - value: "maker", - text: "Maker", - checked: displayedUser.roles.includes("maker"), - attributes: {"data-cy": "role-maker"} - }, - { - value: "ukef_operations", - text: "UK Export Finance Operations", - checked: displayedUser.roles.includes("ukef_operations"), - attributes: {"data-cy": "role-ukef_operations"} + value: "admin", + text: "Admin", + hint: { text: "Creates, updates, and removes user accounts" }, + checked: displayedUser.roles.includes("admin"), + attributes: {"data-cy": "role-admin"} }, { - value: "EFM", - text: "Export Finance Manager (EFM)", - checked: displayedUser.roles.includes("EFM"), - attributes: {"data-cy": "role-efm"} + divider: 'or' }, { value: "read-only", - text: "Read Only", + text: "Read-only", + hint: { text: "Views applications but cannot make edits" }, + behaviour: "exclusive", checked: displayedUser.roles.includes("read-only"), attributes: {"data-cy": "role-read-only"} } @@ -108,12 +122,13 @@ attributes: { "data-cy": "username", "autocapitalize": "off" - }, + }, label: { - text: "Email address" + text: "Email address", + classes: "govuk-label--s" }, hint: { - text: "A valid email address. All emails from the system will be sent to this address. The email address is not made public and will only be used if you wish to receive a new password or wish to receive certain news or notifications by email." + text: "A valid email address. All emails from the system will be sent to this address. The email address is not made public and will only be used if you wish to receive a new password or wish to receive certain news or notifications by email" }, classes: "govuk-!-width-one-third", id: "email", @@ -128,7 +143,10 @@ {{ govukRadios({ fieldset: { - legend: { text: "Auto-create a valid password?" } + legend: { + text: "Auto-create a valid password?", + classes: "govuk-fieldset__legend--s" + } }, idPrefix: "autoCreatePassword-", name: "autoCreatePassword", @@ -168,10 +186,11 @@ "autocomplete": "off" }, label: { - text: "New password" + text: "New password", + classes: "govuk-label--s" }, formGroup: { - classes: "govuk-!-width-one-third govuk-!-margin-bottom-1" + classes: "govuk-!-width-one-third" }, id: "password", name: "password", @@ -185,10 +204,11 @@ "autocomplete": "off" }, label: { - text: "Confirm password" + text: "Confirm password", + classes: "govuk-label--s" }, formGroup: { - classes: "govuk-!-width-one-third govuk-!-margin-bottom-1" + classes: "govuk-!-width-one-third" }, id: "passwordConfirm", name: "passwordConfirm", @@ -200,14 +220,16 @@ {% endif %} -
    - Status -
    - {{ govukRadios({ - classes: "govuk-radios--inline", + fieldset: { + legend: { + text: "Status", + classes: "govuk-fieldset__legend--s" + } + }, idPrefix: "user-status", name: "user-status", + classes: "govuk-radios--inline", items: [ { value: "blocked", @@ -254,10 +276,11 @@ id: "bank", name: "bank", label: { - text: "Bank" + text: "Bank", + classes: "govuk-label--s" }, hint: { - text: "Applicable for Bank Staff users only." + text: "Applicable for Bank Staff users only" }, attributes: { "data-cy": "bank" From 3463cc3d630c23eb94b4c00c9802ffa452d42a6e Mon Sep 17 00:00:00 2001 From: AlexBramhill <47955140+AlexBramhill@users.noreply.github.com> Date: Fri, 15 Sep 2023 09:35:57 +0100 Subject: [PATCH 015/130] feat(DTFS2-6624): portal UI add read only limitation on UI elements (#1974) --- .prettierrc.json | 34 +- azure-functions/acbs-function/.eslintrc.js | 6 + .../number-generator-function/.eslintrc.js | 6 + cspell.json | 2 + dtfs-central-api/.eslintrc.js | 6 + .../v1/swagger-definitions/portal/deal-bss.js | 4 +- e2e-tests/.eslintrc.js | 6 + .../restrict-access/restrict-access.spec.js | 4 +- .../currency-conversion-error.spec.js | 4 + ...it-MIN-deal-with-issued-facilities.spec.js | 2 + ...al-with-issued-facilities-to-maker.spec.js | 2 + .../dealWithInvalidBondCoverStartDate.js | 2 +- .../dealWithInvalidLoanCoverStartDate.js | 2 +- ...ttedDealWithBondCoverStartDateInThePast.js | 2 +- ...ttedDealWithLoanCoverStartDateInThePast.js | 2 +- .../submit-a-deal/test-data/template.json | 2 +- .../dealWithSecondPageComplete.json | 2 +- ...ill-in-about-buyer-page-happy-path.spec.js | 2 +- .../fill-in-buyer-page-create-element.spec.js | 2 +- .../maker/clone-deal/clone-deal.spec.js | 2 + ...tart-date-validation-past-3-months.spec.js | 4 + ...issued-facilities-cover-start-date.spec.js | 8 +- ...ilities-does-not-update-if-invalid.spec.js | 2 + ...-with-cover-start-date-in-the-past.spec.js | 2 + ...urns-to-maker-after-submit-to-ukef.spec.js | 2 + .../maker/fixtures/dealFullyCompleted.js | 2 +- ...and-resubmit-after-checker-returns.spec.js | 4 +- .../dealThatJustNeedsConversionDate.json | 2 +- .../dealWithIncompleteEligibility.json | 2 +- ...r-review-without-cover-start-dates.spec.js | 4 +- ...r-review-without-cover-start-dates.spec.js | 4 +- ...w-deal-status-acknowledged-by-ukef.spec.js | 4 +- ...al-status-approved-with-conditions.spec.js | 4 +- ...status-approved-without-conditions.spec.js | 4 +- ...l-with-tfm-bank-generates-ukef-ids.spec.js | 4 +- .../number-generator/test-data/baseBssDeal.js | 2 +- .../cannot-abandon-a-deal.spec.js | 27 ++ .../clone-deal/cannot-clone-a-deal.spec.js | 53 +++ .../deal/cannot-abandon-a-deal.spec.js | 27 ++ .../cannot-modify-an-unissued-deal.spec.js | 34 ++ .../read-only/fixtures/dealFullyCompleted.js | 295 ++++++++++++++++ .../read-only/fixtures/dealReadyToSubmit.js | 24 ++ .../dealThatJustNeedsConversionDate.js | 11 + .../dealWithInvalidBondCoverStartDate.js | 17 + .../dealWithInvalidLoanCoverStartDate.js | 18 + ...ttedDealWithBondCoverStartDateInThePast.js | 21 ++ ...ttedDealWithLoanCoverStartDateInThePast.js | 21 ++ .../journeys/read-only/fixtures/template.json | 168 +++++++++ .../cypress/e2e/journeys/skip-link.spec.js | 2 +- e2e-tests/portal/cypress/fixtures/users.js | 34 +- .../test-data/dealThatJustNeedsDates.json | 2 +- .../test-data/dealThatJustNeedsDates.json | 2 +- .../dealThatJustNeedsConversionDate.json | 2 +- .../dealThatJustNeedsConversionDate.json | 2 +- .../AIN-deal/dealThatJustNeedsDates.json | 2 +- .../MIA-deal/dealThatJustNeedsDates.json | 2 +- .../dealThatJustNeedsDates.json | 2 +- .../MIN-deal/dealThatJustNeedsDates.json | 2 +- external-api/.eslintrc.js | 6 + external-api/.prettierrc.json | 34 +- .../swagger-definitions/portal-bss-deal.ts | 2 +- gef-ui/.eslintrc.js | 6 + portal-api/.eslintrc.js | 6 + portal-api/.prettierrc.json | 34 +- .../fixtures/deal-fully-completed.js | 2 +- .../deal-with-complete-about-section.json | 2 +- portal/.eslintrc.js | 6 + .../bond-submission-details.component-test.js | 3 +- .../abandon-deal-link.component-test.js | 35 +- .../bond-transactions-table.component-test.js | 207 +++++++---- .../clone-deal-link.component-test.js | 58 ++- .../contract-actions.component-test.js | 112 ++++++ .../abandon-deal-button.component-test.js | 103 +++--- ...proceed-to-review-button.component-test.js | 98 +++--- ...proceed-to-submit-button.component-test.js | 215 ++++++------ .../return-to-maker-button.component-test.js | 206 +++++------ ...igibility-checklist-link.component-test.js | 43 +-- .../edit-deal-name-link.component-test.js | 38 +- .../forms-incomplete-text.component-test.js | 16 +- ...-or-delete-facility-link.component-test.js | 248 +++++++++++-- .../components/loan-link.component-test.js | 116 ++++++ .../loan-transactions-table.component-test.js | 194 ++++++---- ...equested-start-date-link.component-test.js | 93 +++++ ...tract-submission-details.component-test.js | 6 +- .../contract/contract-view.component-test.js | 330 +++++++++++------- ...js => feedback-thankyou.component-test.js} | 0 .../fixtures/deal-fully-completed.js | 2 +- .../loan-submission-details.component-test.js | 3 +- .../partials/footer.component-test.js | 5 +- .../primary-navigation.component-test.js | 80 +++++ .../deals/deals-filters-query.test.js | 5 +- .../controllers/dashboard/deals/index.test.js | 3 +- .../facilities-filters-query.test.js | 5 +- .../dashboard/facilities/index.test.js | 3 +- .../controllers/dashboard/reports.test.js | 13 +- .../server/helpers/constructPayload.test.js | 3 +- portal/server/helpers/getUserRoles.js | 6 +- portal/server/helpers/getUserRoles.test.js | 35 +- portal/server/helpers/isChecker.helper.js | 3 +- portal/server/helpers/isChecker.test.js | 9 +- .../contract/canIssueOrEditIssueFacility.js | 4 +- .../server/routes/contract/isDealEditable.js | 3 +- .../routes/contract/isDealEditable.test.js | 97 ++--- .../_partials/primary-navigation.njk | 65 ++-- .../components/bond-transactions-table.njk | 3 +- .../issue-or-delete-facility-link.njk | 49 +-- .../contract/components/loan-link.njk | 35 +- .../components/loan-transactions-table.njk | 10 +- .../components/requested-start-date-link.njk | 30 +- portal/test-helpers/common-role-lists.js | 15 + trade-finance-manager-api/.eslintrc.js | 6 + trade-finance-manager-ui/.eslintrc.js | 6 + utils/data-migration/.eslintrc.js | 6 + utils/mock-data-loader/.eslintrc.js | 6 + utils/mock-data-loader/portal/users.js | 32 ++ utils/reporting/tfm/.eslintrc.js | 6 + 116 files changed, 2689 insertions(+), 994 deletions(-) create mode 100644 e2e-tests/portal/cypress/e2e/journeys/read-only/abandon-deal/cannot-abandon-a-deal.spec.js create mode 100644 e2e-tests/portal/cypress/e2e/journeys/read-only/clone-deal/cannot-clone-a-deal.spec.js create mode 100644 e2e-tests/portal/cypress/e2e/journeys/read-only/deal/cannot-abandon-a-deal.spec.js create mode 100644 e2e-tests/portal/cypress/e2e/journeys/read-only/deal/cannot-modify-an-unissued-deal.spec.js create mode 100644 e2e-tests/portal/cypress/e2e/journeys/read-only/fixtures/dealFullyCompleted.js create mode 100644 e2e-tests/portal/cypress/e2e/journeys/read-only/fixtures/dealReadyToSubmit.js create mode 100644 e2e-tests/portal/cypress/e2e/journeys/read-only/fixtures/dealThatJustNeedsConversionDate.js create mode 100644 e2e-tests/portal/cypress/e2e/journeys/read-only/fixtures/dealWithInvalidBondCoverStartDate.js create mode 100644 e2e-tests/portal/cypress/e2e/journeys/read-only/fixtures/dealWithInvalidLoanCoverStartDate.js create mode 100644 e2e-tests/portal/cypress/e2e/journeys/read-only/fixtures/submittedDealWithBondCoverStartDateInThePast.js create mode 100644 e2e-tests/portal/cypress/e2e/journeys/read-only/fixtures/submittedDealWithLoanCoverStartDateInThePast.js create mode 100644 e2e-tests/portal/cypress/e2e/journeys/read-only/fixtures/template.json create mode 100644 portal/component-tests/contract/components/contract-actions.component-test.js create mode 100644 portal/component-tests/contract/components/loan-link.component-test.js create mode 100644 portal/component-tests/contract/components/requested-start-date-link.component-test.js rename portal/component-tests/feedback/{feedback-thankyou.component.test.js => feedback-thankyou.component-test.js} (100%) create mode 100644 portal/component-tests/partials/primary-navigation.component-test.js create mode 100644 portal/test-helpers/common-role-lists.js diff --git a/.prettierrc.json b/.prettierrc.json index a44a738767..3c5d0a81fd 100644 --- a/.prettierrc.json +++ b/.prettierrc.json @@ -1,18 +1,18 @@ { - "arrowParens": "always", - "bracketSameLine": false, - "bracketSpacing": true, - "embeddedLanguageFormatting": "auto", - "htmlWhitespaceSensitivity": "css", - "insertPragma": false, - "jsxSingleQuote": false, - "printWidth": 160, - "proseWrap": "preserve", - "quoteProps": "as-needed", - "requirePragma": false, - "semi": true, - "singleQuote": true, - "tabWidth": 2, - "trailingComma": "all", - "useTabs": false -} \ No newline at end of file + "arrowParens": "always", + "bracketSameLine": false, + "bracketSpacing": true, + "embeddedLanguageFormatting": "auto", + "htmlWhitespaceSensitivity": "css", + "insertPragma": false, + "jsxSingleQuote": false, + "printWidth": 160, + "proseWrap": "preserve", + "quoteProps": "as-needed", + "requirePragma": false, + "semi": true, + "singleQuote": true, + "tabWidth": 2, + "trailingComma": "all", + "useTabs": false +} diff --git a/azure-functions/acbs-function/.eslintrc.js b/azure-functions/acbs-function/.eslintrc.js index e56403e496..13e7b3884b 100644 --- a/azure-functions/acbs-function/.eslintrc.js +++ b/azure-functions/acbs-function/.eslintrc.js @@ -20,6 +20,12 @@ module.exports = { 'object-curly-newline': ['error', { consistent: true, }], + 'no-use-before-define': [ + 'error', + { + functions: false, + }, + ], }, parserOptions: { ecmaVersion: 2020, diff --git a/azure-functions/number-generator-function/.eslintrc.js b/azure-functions/number-generator-function/.eslintrc.js index 041d4a0f0b..0a30511bfd 100644 --- a/azure-functions/number-generator-function/.eslintrc.js +++ b/azure-functions/number-generator-function/.eslintrc.js @@ -21,6 +21,12 @@ module.exports = { consistent: true, }], 'unicode-bom': 'off', + 'no-use-before-define': [ + 'error', + { + functions: false, + }, + ], }, parserOptions: { ecmaVersion: 2020, diff --git a/cspell.json b/cspell.json index 56da067409..74dcd379dc 100644 --- a/cspell.json +++ b/cspell.json @@ -29,6 +29,7 @@ "BBALIBOR", "behaviour", "Bloggs", + "bson", "centralised", "CICD", "CILC", @@ -38,6 +39,7 @@ "codeql", "commitlintrc", "creds", + "crsf", "Curncy", "datafixes", "Dockerised", diff --git a/dtfs-central-api/.eslintrc.js b/dtfs-central-api/.eslintrc.js index 8183ac1d31..be91fd9130 100644 --- a/dtfs-central-api/.eslintrc.js +++ b/dtfs-central-api/.eslintrc.js @@ -27,6 +27,12 @@ module.exports = { 'no-loop-func': 'off', 'no-await-in-loop': 'off', 'no-restricted-syntax': 'off', + 'no-use-before-define': [ + 'error', + { + functions: false + } + ] }, parserOptions: { ecmaVersion: 2020, diff --git a/dtfs-central-api/src/v1/swagger-definitions/portal/deal-bss.js b/dtfs-central-api/src/v1/swagger-definitions/portal/deal-bss.js index 8c6fad4683..24b2a9b7d0 100644 --- a/dtfs-central-api/src/v1/swagger-definitions/portal/deal-bss.js +++ b/dtfs-central-api/src/v1/swagger-definitions/portal/deal-bss.js @@ -40,7 +40,7 @@ * example: '1632389070727' * submissionCount: * type: integer - * emample: 1 + * example: 1 * checker: * $ref: '#/definitions/User' * submissionDate: @@ -272,7 +272,7 @@ * example: United States * buyer-name: * type: string - * example: Huggy Bear + * example: Harry Bear * destinationOfGoodsAndServices: * type: object * properties: diff --git a/e2e-tests/.eslintrc.js b/e2e-tests/.eslintrc.js index 5c4c0bb584..3c7566e749 100644 --- a/e2e-tests/.eslintrc.js +++ b/e2e-tests/.eslintrc.js @@ -29,6 +29,12 @@ module.exports = { 'cypress/no-async-tests': 'error', 'cypress/no-pause': 'error', 'cypress/unsafe-to-chain-command': 'warn', + 'no-use-before-define': [ + 'error', + { + functions: false, + }, + ], }, parserOptions: { ecmaVersion: 12, // es2021 diff --git a/e2e-tests/portal/cypress/e2e/journeys/admin/restrict-access/restrict-access.spec.js b/e2e-tests/portal/cypress/e2e/journeys/admin/restrict-access/restrict-access.spec.js index acb1ee5342..799b921d0e 100644 --- a/e2e-tests/portal/cypress/e2e/journeys/admin/restrict-access/restrict-access.spec.js +++ b/e2e-tests/portal/cypress/e2e/journeys/admin/restrict-access/restrict-access.spec.js @@ -5,7 +5,7 @@ const { BANK1_MAKER1, BANK1_CHECKER1, EDITOR, - BANK1_READ_ONLY, + BANK1_READ_ONLY1, } = require('../../../../fixtures/users'); context('Only allow authorised users to access admin pages', () => { @@ -39,7 +39,7 @@ context('Only allow authorised users to access admin pages', () => { expectedRedirectLocation: '/login', }, { roleName: 'Read Only users', - userWithRole: BANK1_READ_ONLY, + userWithRole: BANK1_READ_ONLY1, expectedRedirectLocation: '/dashboard/deals/0', }]; diff --git a/e2e-tests/portal/cypress/e2e/journeys/checker/currency-conversion-date/currency-conversion-error.spec.js b/e2e-tests/portal/cypress/e2e/journeys/checker/currency-conversion-date/currency-conversion-error.spec.js index 1ee879c286..92c40829cd 100644 --- a/e2e-tests/portal/cypress/e2e/journeys/checker/currency-conversion-date/currency-conversion-error.spec.js +++ b/e2e-tests/portal/cypress/e2e/journeys/checker/currency-conversion-date/currency-conversion-error.spec.js @@ -39,6 +39,8 @@ context('First submission with currency conversion date more than 30 days in the }); after(() => { + cy.deleteDeals(ADMIN); + dealFacilities.bonds.forEach((facility) => { cy.deleteFacility(facility._id, BANK1_MAKER1); }); @@ -95,6 +97,8 @@ context('Second submission (has submissionDate) with currency conversion date mo }); after(() => { + cy.deleteDeals(ADMIN); + dealFacilities.bonds.forEach((facility) => { cy.deleteFacility(facility._id, BANK1_MAKER1); }); diff --git a/e2e-tests/portal/cypress/e2e/journeys/checker/issued-specs-new/submit-MIN-deal-with-issued-facility/submit-MIN-deal-with-issued-facilities.spec.js b/e2e-tests/portal/cypress/e2e/journeys/checker/issued-specs-new/submit-MIN-deal-with-issued-facility/submit-MIN-deal-with-issued-facilities.spec.js index 30bb42fd15..dc49acc13f 100644 --- a/e2e-tests/portal/cypress/e2e/journeys/checker/issued-specs-new/submit-MIN-deal-with-issued-facility/submit-MIN-deal-with-issued-facilities.spec.js +++ b/e2e-tests/portal/cypress/e2e/journeys/checker/issued-specs-new/submit-MIN-deal-with-issued-facility/submit-MIN-deal-with-issued-facilities.spec.js @@ -43,6 +43,8 @@ context('A maker issues facilities, submits to checker; checker submits deal to }); after(() => { + cy.deleteDeals(ADMIN); + dealFacilities.bonds.forEach((facility) => { cy.deleteFacility(facility._id, BANK1_MAKER1); }); diff --git a/e2e-tests/portal/cypress/e2e/journeys/checker/return-a-deal-to-maker/return-deal-with-issued-facilities-to-maker.spec.js b/e2e-tests/portal/cypress/e2e/journeys/checker/return-a-deal-to-maker/return-deal-with-issued-facilities-to-maker.spec.js index d0ca5d0223..70c8646b56 100644 --- a/e2e-tests/portal/cypress/e2e/journeys/checker/return-a-deal-to-maker/return-deal-with-issued-facilities-to-maker.spec.js +++ b/e2e-tests/portal/cypress/e2e/journeys/checker/return-a-deal-to-maker/return-deal-with-issued-facilities-to-maker.spec.js @@ -39,6 +39,8 @@ context('A checker selects to return a deal (with some issued facilities) to mak }); after(() => { + cy.deleteDeals(ADMIN); + dealFacilities.bonds.forEach((facility) => { cy.deleteFacility(facility._id, BANK1_MAKER1); }); diff --git a/e2e-tests/portal/cypress/e2e/journeys/checker/submit-a-deal/test-data/dealWithInvalidBondCoverStartDate.js b/e2e-tests/portal/cypress/e2e/journeys/checker/submit-a-deal/test-data/dealWithInvalidBondCoverStartDate.js index 9f9977f2bb..cd084706ae 100644 --- a/e2e-tests/portal/cypress/e2e/journeys/checker/submit-a-deal/test-data/dealWithInvalidBondCoverStartDate.js +++ b/e2e-tests/portal/cypress/e2e/journeys/checker/submit-a-deal/test-data/dealWithInvalidBondCoverStartDate.js @@ -2,7 +2,7 @@ const dealReadyToSubmitForReview = require('./dealReadyToSubmit'); const dateConstants = require('../../../../../../../e2e-fixtures/dateConstants'); module.exports = () => { - const invalidCoverStartDate = `${dateConstants.yesterdayUnix}000`; + const invalidCoverStartDate = `${dateConstants.yesterdayUnix}000`; // TODO: Standardise this coding style const dealWithBadCoverStartDate = { ...dealReadyToSubmitForReview() }; diff --git a/e2e-tests/portal/cypress/e2e/journeys/checker/submit-a-deal/test-data/dealWithInvalidLoanCoverStartDate.js b/e2e-tests/portal/cypress/e2e/journeys/checker/submit-a-deal/test-data/dealWithInvalidLoanCoverStartDate.js index 9515141011..bb75e25fa5 100644 --- a/e2e-tests/portal/cypress/e2e/journeys/checker/submit-a-deal/test-data/dealWithInvalidLoanCoverStartDate.js +++ b/e2e-tests/portal/cypress/e2e/journeys/checker/submit-a-deal/test-data/dealWithInvalidLoanCoverStartDate.js @@ -2,7 +2,7 @@ const dateConstants = require('../../../../../../../e2e-fixtures/dateConstants') const dealReadyToSubmitForReview = require('./dealReadyToSubmit'); module.exports = () => { - const invalidCoverStartDate = `${dateConstants.yesterdayUnix}000`; + const invalidCoverStartDate = `${dateConstants.yesterdayUnix}000`; // TODO: Standardise this coding style const dealWithBadCoverStartDate = { ...dealReadyToSubmitForReview() }; diff --git a/e2e-tests/portal/cypress/e2e/journeys/checker/submit-a-deal/test-data/submittedDealWithBondCoverStartDateInThePast.js b/e2e-tests/portal/cypress/e2e/journeys/checker/submit-a-deal/test-data/submittedDealWithBondCoverStartDateInThePast.js index b7dac3f021..5c291b9016 100644 --- a/e2e-tests/portal/cypress/e2e/journeys/checker/submit-a-deal/test-data/submittedDealWithBondCoverStartDateInThePast.js +++ b/e2e-tests/portal/cypress/e2e/journeys/checker/submit-a-deal/test-data/submittedDealWithBondCoverStartDateInThePast.js @@ -2,7 +2,7 @@ const dateConstants = require('../../../../../../../e2e-fixtures/dateConstants') const dealReadyToSubmitForReview = require('./dealReadyToSubmit'); module.exports = () => { - const dealSubmissionDate = `${dateConstants.yesterdayUnix}000`; + const dealSubmissionDate = `${dateConstants.yesterdayUnix}000`; // TODO: Standardise this coding style const coverStartDateBeforeDealSubmissionDate = `${dateConstants.sevenDaysAgoUnix}000`; const deal = { ...dealReadyToSubmitForReview() }; diff --git a/e2e-tests/portal/cypress/e2e/journeys/checker/submit-a-deal/test-data/submittedDealWithLoanCoverStartDateInThePast.js b/e2e-tests/portal/cypress/e2e/journeys/checker/submit-a-deal/test-data/submittedDealWithLoanCoverStartDateInThePast.js index 309080627e..7a8149a71f 100644 --- a/e2e-tests/portal/cypress/e2e/journeys/checker/submit-a-deal/test-data/submittedDealWithLoanCoverStartDateInThePast.js +++ b/e2e-tests/portal/cypress/e2e/journeys/checker/submit-a-deal/test-data/submittedDealWithLoanCoverStartDateInThePast.js @@ -2,7 +2,7 @@ const dealReadyToSubmitForReview = require('./dealReadyToSubmit'); const dateConstants = require('../../../../../../../e2e-fixtures/dateConstants'); module.exports = () => { - const dealSubmissionDate = `${dateConstants.yesterdayUnix}000`; + const dealSubmissionDate = `${dateConstants.yesterdayUnix}000`; // TODO: Standardise this coding style const coverStartDateBeforeDealSubmissionDate = `${dateConstants.sevenDaysAgoUnix}000`; const deal = { ...dealReadyToSubmitForReview() }; diff --git a/e2e-tests/portal/cypress/e2e/journeys/checker/submit-a-deal/test-data/template.json b/e2e-tests/portal/cypress/e2e/journeys/checker/submit-a-deal/test-data/template.json index 9293bbd74d..30a8328670 100644 --- a/e2e-tests/portal/cypress/e2e/journeys/checker/submit-a-deal/test-data/template.json +++ b/e2e-tests/portal/cypress/e2e/journeys/checker/submit-a-deal/test-data/template.json @@ -69,7 +69,7 @@ "buyer-address-line-3" : "The Bronx", "buyer-address-postcode" : "no-idea", "buyer-address-town" : "New York", - "buyer-name" : "Huggy Bear", + "buyer-name" : "Harry Bear", "destinationOfGoodsAndServices" : { "code": "USA", "name": "United States" diff --git a/e2e-tests/portal/cypress/e2e/journeys/maker/about-supply-contract/dealWithSecondPageComplete.json b/e2e-tests/portal/cypress/e2e/journeys/maker/about-supply-contract/dealWithSecondPageComplete.json index 5b0cd8adad..31344d9c5c 100644 --- a/e2e-tests/portal/cypress/e2e/journeys/maker/about-supply-contract/dealWithSecondPageComplete.json +++ b/e2e-tests/portal/cypress/e2e/journeys/maker/about-supply-contract/dealWithSecondPageComplete.json @@ -131,7 +131,7 @@ "buyer-address-line-3" : "The Bronx", "buyer-address-postcode" : "no-idea", "buyer-address-town" : "New York", - "buyer-name" : "Huggy Bear", + "buyer-name" : "Harry Bear", "destinationOfGoodsAndServices" : { "code": "USA", "name": "United States" diff --git a/e2e-tests/portal/cypress/e2e/journeys/maker/about-supply-contract/fill-in-about-buyer-page-happy-path.spec.js b/e2e-tests/portal/cypress/e2e/journeys/maker/about-supply-contract/fill-in-about-buyer-page-happy-path.spec.js index 5a868f9b60..8a74f57907 100644 --- a/e2e-tests/portal/cypress/e2e/journeys/maker/about-supply-contract/fill-in-about-buyer-page-happy-path.spec.js +++ b/e2e-tests/portal/cypress/e2e/journeys/maker/about-supply-contract/fill-in-about-buyer-page-happy-path.spec.js @@ -26,7 +26,7 @@ context('about-supply-contract', () => { cy.title().should('eq', `Buyer information - ${deal.additionalRefName}${defaults.pageTitleAppend}`); // fill in the fields - contractAboutBuyer.buyerName().type('Huggy Bear'); + contractAboutBuyer.buyerName().type('Harry Bear'); contractAboutBuyer.buyerAddress().country().select('USA'); contractAboutBuyer.buyerAddress().line1().type('Corner of East and Main'); contractAboutBuyer.buyerAddress().line3().type('The Bronx'); diff --git a/e2e-tests/portal/cypress/e2e/journeys/maker/about-supply-contract/fill-in-buyer-page-create-element.spec.js b/e2e-tests/portal/cypress/e2e/journeys/maker/about-supply-contract/fill-in-buyer-page-create-element.spec.js index bddd7cee24..d7991976f8 100644 --- a/e2e-tests/portal/cypress/e2e/journeys/maker/about-supply-contract/fill-in-buyer-page-create-element.spec.js +++ b/e2e-tests/portal/cypress/e2e/journeys/maker/about-supply-contract/fill-in-buyer-page-create-element.spec.js @@ -25,7 +25,7 @@ context('Buyer form - create element and check if inserted into deal', () => { cy.title().should('eq', `Buyer information - ${deal.additionalRefName}${defaults.pageTitleAppend}`); // fill in the fields - contractAboutBuyer.buyerName().type('Huggy Bear'); + contractAboutBuyer.buyerName().type('Harry Bear'); contractAboutBuyer.buyerAddress().country().select('USA'); contractAboutBuyer.buyerAddress().line1().type('Corner of East and Main'); contractAboutBuyer.buyerAddress().line3().type('The Bronx'); diff --git a/e2e-tests/portal/cypress/e2e/journeys/maker/clone-deal/clone-deal.spec.js b/e2e-tests/portal/cypress/e2e/journeys/maker/clone-deal/clone-deal.spec.js index 2878a81779..c9415d9aa7 100644 --- a/e2e-tests/portal/cypress/e2e/journeys/maker/clone-deal/clone-deal.spec.js +++ b/e2e-tests/portal/cypress/e2e/journeys/maker/clone-deal/clone-deal.spec.js @@ -52,6 +52,8 @@ context('Clone a deal', () => { }); after(() => { + cy.deleteDeals(ADMIN); + dealFacilities.bonds.forEach((facility) => { cy.deleteFacility(facility._id, BANK1_MAKER1); }); diff --git a/e2e-tests/portal/cypress/e2e/journeys/maker/facilities/AIN-facility-cover-start-date-validation-past-3-months.spec.js b/e2e-tests/portal/cypress/e2e/journeys/maker/facilities/AIN-facility-cover-start-date-validation-past-3-months.spec.js index 476b7b0a73..c67696dc6b 100644 --- a/e2e-tests/portal/cypress/e2e/journeys/maker/facilities/AIN-facility-cover-start-date-validation-past-3-months.spec.js +++ b/e2e-tests/portal/cypress/e2e/journeys/maker/facilities/AIN-facility-cover-start-date-validation-past-3-months.spec.js @@ -43,6 +43,8 @@ context('Issue facilities beyond 3 months of submission - errors', () => { }); after(() => { + cy.deleteDeals(ADMIN); + dealFacilities.bonds.forEach((facility) => { cy.deleteFacility(facility._id, BANK1_MAKER1); }); @@ -161,6 +163,8 @@ context('Issue facilities beyond 3 months of submission specialIssuePermission - }); after(() => { + cy.deleteDeals(ADMIN); + dealFacilities.bonds.forEach((facility) => { cy.deleteFacility(facility._id, BANK1_MAKER1); }); diff --git a/e2e-tests/portal/cypress/e2e/journeys/maker/facilities/MIA-accepted-deal-status-maker-cannot-resubmit-until-confirmed-all-issued-facilities-cover-start-date/MIA-accepted-deal-status-maker-cannot-resubmit-until-confirmed-all-issued-facilities-cover-start-date.spec.js b/e2e-tests/portal/cypress/e2e/journeys/maker/facilities/MIA-accepted-deal-status-maker-cannot-resubmit-until-confirmed-all-issued-facilities-cover-start-date/MIA-accepted-deal-status-maker-cannot-resubmit-until-confirmed-all-issued-facilities-cover-start-date.spec.js index 3bb9d46943..1ccadc5dc8 100644 --- a/e2e-tests/portal/cypress/e2e/journeys/maker/facilities/MIA-accepted-deal-status-maker-cannot-resubmit-until-confirmed-all-issued-facilities-cover-start-date/MIA-accepted-deal-status-maker-cannot-resubmit-until-confirmed-all-issued-facilities-cover-start-date.spec.js +++ b/e2e-tests/portal/cypress/e2e/journeys/maker/facilities/MIA-accepted-deal-status-maker-cannot-resubmit-until-confirmed-all-issued-facilities-cover-start-date/MIA-accepted-deal-status-maker-cannot-resubmit-until-confirmed-all-issued-facilities-cover-start-date.spec.js @@ -37,6 +37,8 @@ context('Given a deal that has `Accepted` status with Issued, Unissued, Uncondit }); after(() => { + cy.deleteDeals(ADMIN); + dealFacilities.bonds.forEach((facility) => { cy.deleteFacility(facility._id, BANK1_MAKER1); }); @@ -46,7 +48,7 @@ context('Given a deal that has `Accepted` status with Issued, Unissued, Uncondit }); }); - const coverStartDateInputsShouldNotBeVisibile = () => { + const coverStartDateInputsShouldNotBeVisible = () => { pages.facilityConfirmCoverStartDate.coverStartDateDay().should('not.be.visible'); pages.facilityConfirmCoverStartDate.coverStartDateMonth().should('not.be.visible'); pages.facilityConfirmCoverStartDate.coverStartDateYear().should('not.be.visible'); @@ -208,7 +210,7 @@ context('Given a deal that has `Accepted` status with Issued, Unissued, Uncondit secondIssuedSubmittedBondRow.changeOrConfirmCoverStartDateLink().click(); pages.facilityConfirmCoverStartDate.needToChangeCoverStartDateNo().click(); - coverStartDateInputsShouldNotBeVisibile(); + coverStartDateInputsShouldNotBeVisible(); pages.facilityConfirmCoverStartDate.submit().click(); @@ -222,7 +224,7 @@ context('Given a deal that has `Accepted` status with Issued, Unissued, Uncondit secondUnconditionalSubmittedLoanRow.changeOrConfirmCoverStartDateLink().click(); pages.facilityConfirmCoverStartDate.needToChangeCoverStartDateNo().click(); - coverStartDateInputsShouldNotBeVisibile(); + coverStartDateInputsShouldNotBeVisible(); pages.facilityConfirmCoverStartDate.submit().click(); //--------------------------------------------------------------- diff --git a/e2e-tests/portal/cypress/e2e/journeys/maker/facilities/MIA-accepted-deal-status-maker-changing-cover-start-date-on-facilities-does-not-update-if-invalid.spec.js b/e2e-tests/portal/cypress/e2e/journeys/maker/facilities/MIA-accepted-deal-status-maker-changing-cover-start-date-on-facilities-does-not-update-if-invalid.spec.js index 9bf0fcd73b..3722cbfb75 100644 --- a/e2e-tests/portal/cypress/e2e/journeys/maker/facilities/MIA-accepted-deal-status-maker-changing-cover-start-date-on-facilities-does-not-update-if-invalid.spec.js +++ b/e2e-tests/portal/cypress/e2e/journeys/maker/facilities/MIA-accepted-deal-status-maker-changing-cover-start-date-on-facilities-does-not-update-if-invalid.spec.js @@ -34,6 +34,8 @@ context('Given a deal that has `Accepted` status with Issued, Unissued, Uncondit }); after(() => { + cy.deleteDeals(ADMIN); + dealFacilities.bonds.forEach((facility) => { cy.deleteFacility(facility._id, BANK1_MAKER1); }); diff --git a/e2e-tests/portal/cypress/e2e/journeys/maker/facilities/MIA-accepted-deal-status-maker-must-change-cover-start-date-on-facilities-with-cover-start-date-in-the-past.spec.js b/e2e-tests/portal/cypress/e2e/journeys/maker/facilities/MIA-accepted-deal-status-maker-must-change-cover-start-date-on-facilities-with-cover-start-date-in-the-past.spec.js index 0a539030cd..0bd101b123 100644 --- a/e2e-tests/portal/cypress/e2e/journeys/maker/facilities/MIA-accepted-deal-status-maker-must-change-cover-start-date-on-facilities-with-cover-start-date-in-the-past.spec.js +++ b/e2e-tests/portal/cypress/e2e/journeys/maker/facilities/MIA-accepted-deal-status-maker-must-change-cover-start-date-on-facilities-with-cover-start-date-in-the-past.spec.js @@ -34,6 +34,8 @@ context('Given a deal that has `Accepted` status with Issued, Unissued, Uncondit }); after(() => { + cy.deleteDeals(ADMIN); + dealFacilities.bonds.forEach((facility) => { cy.deleteFacility(facility._id, BANK1_MAKER1); }); diff --git a/e2e-tests/portal/cypress/e2e/journeys/maker/facilities/maker-can-edit-issued-facilities-after-checker-returns-to-maker-after-submit-to-ukef/maker-can-edit-issued-facilities-after-checker-returns-to-maker-after-submit-to-ukef.spec.js b/e2e-tests/portal/cypress/e2e/journeys/maker/facilities/maker-can-edit-issued-facilities-after-checker-returns-to-maker-after-submit-to-ukef/maker-can-edit-issued-facilities-after-checker-returns-to-maker-after-submit-to-ukef.spec.js index cfc1968254..98d98b1a09 100644 --- a/e2e-tests/portal/cypress/e2e/journeys/maker/facilities/maker-can-edit-issued-facilities-after-checker-returns-to-maker-after-submit-to-ukef/maker-can-edit-issued-facilities-after-checker-returns-to-maker-after-submit-to-ukef.spec.js +++ b/e2e-tests/portal/cypress/e2e/journeys/maker/facilities/maker-can-edit-issued-facilities-after-checker-returns-to-maker-after-submit-to-ukef/maker-can-edit-issued-facilities-after-checker-returns-to-maker-after-submit-to-ukef.spec.js @@ -34,6 +34,8 @@ context('Given an MIA deal that has been submitted to UKEF, maker has issued fac }); after(() => { + cy.deleteDeals(ADMIN); + dealFacilities.bonds.forEach((facility) => { cy.deleteFacility(facility._id, BANK1_MAKER1); }); diff --git a/e2e-tests/portal/cypress/e2e/journeys/maker/fixtures/dealFullyCompleted.js b/e2e-tests/portal/cypress/e2e/journeys/maker/fixtures/dealFullyCompleted.js index 4dbdfbc1f5..fc13d32544 100644 --- a/e2e-tests/portal/cypress/e2e/journeys/maker/fixtures/dealFullyCompleted.js +++ b/e2e-tests/portal/cypress/e2e/journeys/maker/fixtures/dealFullyCompleted.js @@ -263,7 +263,7 @@ const deal = { 'buyer-address-line-3': 'The Bronx', 'buyer-address-postcode': 'no-idea', 'buyer-address-town': 'New York', - 'buyer-name': 'Huggy Bear', + 'buyer-name': 'Harry Bear', destinationOfGoodsAndServices: { name: 'United States', code: 'USA', diff --git a/e2e-tests/portal/cypress/e2e/journeys/maker/submit-a-deal-for-review-with-issued-and-unissued-facilities-and-resubmit-after-checker-returns/submit-a-deal-for-review-with-multiple-facility-types-and-resubmit-after-checker-returns.spec.js b/e2e-tests/portal/cypress/e2e/journeys/maker/submit-a-deal-for-review-with-issued-and-unissued-facilities-and-resubmit-after-checker-returns/submit-a-deal-for-review-with-multiple-facility-types-and-resubmit-after-checker-returns.spec.js index 4b5b768961..2e42ece33a 100644 --- a/e2e-tests/portal/cypress/e2e/journeys/maker/submit-a-deal-for-review-with-issued-and-unissued-facilities-and-resubmit-after-checker-returns/submit-a-deal-for-review-with-multiple-facility-types-and-resubmit-after-checker-returns.spec.js +++ b/e2e-tests/portal/cypress/e2e/journeys/maker/submit-a-deal-for-review-with-issued-and-unissued-facilities-and-resubmit-after-checker-returns/submit-a-deal-for-review-with-multiple-facility-types-and-resubmit-after-checker-returns.spec.js @@ -2,7 +2,7 @@ const pages = require('../../../pages'); const MOCK_USERS = require('../../../../fixtures/users'); const dealReadyToSubmitToChecker = require('./dealReadyToSubmitToChecker'); -const { BANK1_MAKER1, BANK1_CHECKER1 } = MOCK_USERS; +const { BANK1_MAKER1, BANK1_CHECKER1, ADMIN } = MOCK_USERS; context('A maker and checker can submit and re-submit a deal to each other multiple times', () => { let deal; @@ -31,6 +31,8 @@ context('A maker and checker can submit and re-submit a deal to each other mult }); after(() => { + cy.deleteDeals(ADMIN); + dealFacilities.bonds.forEach((facility) => { cy.deleteFacility(facility._id, BANK1_MAKER1); }); diff --git a/e2e-tests/portal/cypress/e2e/journeys/maker/submit-a-deal-for-review/dealThatJustNeedsConversionDate.json b/e2e-tests/portal/cypress/e2e/journeys/maker/submit-a-deal-for-review/dealThatJustNeedsConversionDate.json index 1c59b3c229..f98d8b2ae4 100644 --- a/e2e-tests/portal/cypress/e2e/journeys/maker/submit-a-deal-for-review/dealThatJustNeedsConversionDate.json +++ b/e2e-tests/portal/cypress/e2e/journeys/maker/submit-a-deal-for-review/dealThatJustNeedsConversionDate.json @@ -74,7 +74,7 @@ "buyer-address-line-3" : "The Bronx", "buyer-address-postcode" : "no-idea", "buyer-address-town" : "New York", - "buyer-name" : "Huggy Bear", + "buyer-name" : "Harry Bear", "destinationOfGoodsAndServices" : { "code": "USA", "name": "United States" diff --git a/e2e-tests/portal/cypress/e2e/journeys/maker/submit-a-deal-for-review/dealWithIncompleteEligibility.json b/e2e-tests/portal/cypress/e2e/journeys/maker/submit-a-deal-for-review/dealWithIncompleteEligibility.json index 1be2d18a8b..309954ea43 100644 --- a/e2e-tests/portal/cypress/e2e/journeys/maker/submit-a-deal-for-review/dealWithIncompleteEligibility.json +++ b/e2e-tests/portal/cypress/e2e/journeys/maker/submit-a-deal-for-review/dealWithIncompleteEligibility.json @@ -60,7 +60,7 @@ "buyer-address-line-3" : "The Bronx", "buyer-address-postcode" : "no-idea", "buyer-address-town" : "New York", - "buyer-name" : "Huggy Bear", + "buyer-name" : "Harry Bear", "destinationOfGoodsAndServices" : "USA", "viewedPreviewPage" : true, "supplyContractConversionDate" : "undefined/undefined/undefined", diff --git a/e2e-tests/portal/cypress/e2e/journeys/maker/submit-issued-facilities-for-review/submit-AIN-deal-with-issued-facilities-for-review-without-cover-start-dates.spec.js b/e2e-tests/portal/cypress/e2e/journeys/maker/submit-issued-facilities-for-review/submit-AIN-deal-with-issued-facilities-for-review-without-cover-start-dates.spec.js index 62b0c9a5a8..9fcf10684d 100644 --- a/e2e-tests/portal/cypress/e2e/journeys/maker/submit-issued-facilities-for-review/submit-AIN-deal-with-issued-facilities-for-review-without-cover-start-dates.spec.js +++ b/e2e-tests/portal/cypress/e2e/journeys/maker/submit-issued-facilities-for-review/submit-AIN-deal-with-issued-facilities-for-review-without-cover-start-dates.spec.js @@ -11,7 +11,7 @@ const { ISSUED_LOAN_DATE_VALUE, } = require('../fill-and-submit-issue-facility-form/fillAndSubmitIssueLoanFacilityForm'); -const { BANK1_MAKER1 } = MOCK_USERS; +const { BANK1_MAKER1, ADMIN } = MOCK_USERS; context('Maker fills in bond & loan issue facility forms without requested cover start date and submits the deal for checker review', () => { let deal; @@ -40,6 +40,8 @@ context('Maker fills in bond & loan issue facility forms without requested cover }); after(() => { + cy.deleteDeals(ADMIN); + dealFacilities.bonds.forEach((facility) => { cy.deleteFacility(facility._id, BANK1_MAKER1); }); diff --git a/e2e-tests/portal/cypress/e2e/journeys/maker/submit-issued-facilities-for-review/submit-MIN-deal-with-issued-facilities-for-review-without-cover-start-dates/submit-MIN-deal-with-issued-facilities-for-review-without-cover-start-dates.spec.js b/e2e-tests/portal/cypress/e2e/journeys/maker/submit-issued-facilities-for-review/submit-MIN-deal-with-issued-facilities-for-review-without-cover-start-dates/submit-MIN-deal-with-issued-facilities-for-review-without-cover-start-dates.spec.js index b6964e36b8..072a3f6e91 100644 --- a/e2e-tests/portal/cypress/e2e/journeys/maker/submit-issued-facilities-for-review/submit-MIN-deal-with-issued-facilities-for-review-without-cover-start-dates/submit-MIN-deal-with-issued-facilities-for-review-without-cover-start-dates.spec.js +++ b/e2e-tests/portal/cypress/e2e/journeys/maker/submit-issued-facilities-for-review/submit-MIN-deal-with-issued-facilities-for-review-without-cover-start-dates/submit-MIN-deal-with-issued-facilities-for-review-without-cover-start-dates.spec.js @@ -11,7 +11,7 @@ const { ISSUED_LOAN_DATE_VALUE, } = require('../../fill-and-submit-issue-facility-form/fillAndSubmitIssueLoanFacilityForm'); -const { BANK1_MAKER1 } = MOCK_USERS; +const { BANK1_MAKER1, ADMIN } = MOCK_USERS; context('Maker fills in bond & loan issue facility forms without requested cover start date and submits the deal for checker review', () => { let deal; @@ -39,6 +39,8 @@ context('Maker fills in bond & loan issue facility forms without requested cover }); after(() => { + cy.deleteDeals(ADMIN); + dealFacilities.bonds.forEach((facility) => { cy.deleteFacility(facility._id, BANK1_MAKER1); }); diff --git a/e2e-tests/portal/cypress/e2e/journeys/maker/submit-issued-facilities-for-review/submit-issued-facilities-for-review-deal-status-acknowledged-by-ukef.spec.js b/e2e-tests/portal/cypress/e2e/journeys/maker/submit-issued-facilities-for-review/submit-issued-facilities-for-review-deal-status-acknowledged-by-ukef.spec.js index b019b74dcc..31b75e78a8 100644 --- a/e2e-tests/portal/cypress/e2e/journeys/maker/submit-issued-facilities-for-review/submit-issued-facilities-for-review-deal-status-acknowledged-by-ukef.spec.js +++ b/e2e-tests/portal/cypress/e2e/journeys/maker/submit-issued-facilities-for-review/submit-issued-facilities-for-review-deal-status-acknowledged-by-ukef.spec.js @@ -5,7 +5,7 @@ const MOCK_USERS = require('../../../../fixtures/users'); const { fillAndSubmitIssueBondFacilityForm } = require('../fill-and-submit-issue-facility-form/fillAndSubmitIssueBondFacilityForm'); const { fillAndSubmitIssueLoanFacilityForm } = require('../fill-and-submit-issue-facility-form/fillAndSubmitIssueLoanFacilityForm'); -const { BANK1_MAKER1 } = MOCK_USERS; +const { BANK1_MAKER1, ADMIN } = MOCK_USERS; context('A maker can issue and submit issued bond and loan facilities with a deal in `Acknowledged` status', () => { let deal; @@ -34,6 +34,8 @@ context('A maker can issue and submit issued bond and loan facilities with a dea }); after(() => { + cy.deleteDeals(ADMIN); + dealFacilities.bonds.forEach((facility) => { cy.deleteFacility(facility._id, BANK1_MAKER1); }); diff --git a/e2e-tests/portal/cypress/e2e/journeys/maker/submit-issued-facilities-for-review/submit-issued-facilities-for-review-deal-status-approved-with-conditions.spec.js b/e2e-tests/portal/cypress/e2e/journeys/maker/submit-issued-facilities-for-review/submit-issued-facilities-for-review-deal-status-approved-with-conditions.spec.js index f09ab99b2c..0b1e72d184 100644 --- a/e2e-tests/portal/cypress/e2e/journeys/maker/submit-issued-facilities-for-review/submit-issued-facilities-for-review-deal-status-approved-with-conditions.spec.js +++ b/e2e-tests/portal/cypress/e2e/journeys/maker/submit-issued-facilities-for-review/submit-issued-facilities-for-review-deal-status-approved-with-conditions.spec.js @@ -5,7 +5,7 @@ const MOCK_USERS = require('../../../../fixtures/users'); const { fillAndSubmitIssueBondFacilityForm } = require('../fill-and-submit-issue-facility-form/fillAndSubmitIssueBondFacilityForm'); const { fillAndSubmitIssueLoanFacilityForm } = require('../fill-and-submit-issue-facility-form/fillAndSubmitIssueLoanFacilityForm'); -const { BANK1_MAKER1 } = MOCK_USERS; +const { BANK1_MAKER1, ADMIN } = MOCK_USERS; const dealWithStatus = { ...dealWithNotStartedFacilityStatuses, @@ -39,6 +39,8 @@ context('A maker can issue and submit issued bond & loan facilities with a deal }); after(() => { + cy.deleteDeals(ADMIN); + dealFacilities.bonds.forEach((facility) => { cy.deleteFacility(facility._id, BANK1_MAKER1); }); diff --git a/e2e-tests/portal/cypress/e2e/journeys/maker/submit-issued-facilities-for-review/submit-issued-facilities-for-review-deal-status-approved-without-conditions.spec.js b/e2e-tests/portal/cypress/e2e/journeys/maker/submit-issued-facilities-for-review/submit-issued-facilities-for-review-deal-status-approved-without-conditions.spec.js index 9f94d52862..b25ea04825 100644 --- a/e2e-tests/portal/cypress/e2e/journeys/maker/submit-issued-facilities-for-review/submit-issued-facilities-for-review-deal-status-approved-without-conditions.spec.js +++ b/e2e-tests/portal/cypress/e2e/journeys/maker/submit-issued-facilities-for-review/submit-issued-facilities-for-review-deal-status-approved-without-conditions.spec.js @@ -5,7 +5,7 @@ const MOCK_USERS = require('../../../../fixtures/users'); const { fillAndSubmitIssueBondFacilityForm } = require('../fill-and-submit-issue-facility-form/fillAndSubmitIssueBondFacilityForm'); const { fillAndSubmitIssueLoanFacilityForm } = require('../fill-and-submit-issue-facility-form/fillAndSubmitIssueLoanFacilityForm'); -const { BANK1_MAKER1 } = MOCK_USERS; +const { BANK1_MAKER1, ADMIN } = MOCK_USERS; const dealWithStatus = { ...dealWithNotStartedFacilityStatuses, @@ -39,6 +39,8 @@ context('A maker can issue and submit issued bond & loan facilities with a deal }); after(() => { + cy.deleteDeals(ADMIN); + dealFacilities.bonds.forEach((facility) => { cy.deleteFacility(facility._id, BANK1_MAKER1); }); diff --git a/e2e-tests/portal/cypress/e2e/journeys/number-generator/submitting-a-deal-with-tfm-bank-generates-ukef-ids.spec.js b/e2e-tests/portal/cypress/e2e/journeys/number-generator/submitting-a-deal-with-tfm-bank-generates-ukef-ids.spec.js index a86494ec08..580a14ad18 100644 --- a/e2e-tests/portal/cypress/e2e/journeys/number-generator/submitting-a-deal-with-tfm-bank-generates-ukef-ids.spec.js +++ b/e2e-tests/portal/cypress/e2e/journeys/number-generator/submitting-a-deal-with-tfm-bank-generates-ukef-ids.spec.js @@ -2,7 +2,7 @@ const pages = require('../../pages'); const MOCK_USERS = require('../../../fixtures/users'); const dealReadyToSubmit = require('./test-data/dealReadyToSubmit'); -const { BANK1_MAKER1, BANK1_CHECKER1 } = MOCK_USERS; +const { BANK1_MAKER1, BANK1_CHECKER1, ADMIN } = MOCK_USERS; // NOTE: disabled because it fails in github PR actions. context.skip('A TFM checker submits a deal', () => { @@ -32,6 +32,8 @@ context.skip('A TFM checker submits a deal', () => { }); after(() => { + cy.deleteDeals(ADMIN); + dealFacilities.bonds.forEach((facility) => { cy.deleteFacility(facility._id, BANK1_MAKER1); }); diff --git a/e2e-tests/portal/cypress/e2e/journeys/number-generator/test-data/baseBssDeal.js b/e2e-tests/portal/cypress/e2e/journeys/number-generator/test-data/baseBssDeal.js index 9ae01cd348..567f22ec3b 100644 --- a/e2e-tests/portal/cypress/e2e/journeys/number-generator/test-data/baseBssDeal.js +++ b/e2e-tests/portal/cypress/e2e/journeys/number-generator/test-data/baseBssDeal.js @@ -90,7 +90,7 @@ exports.BASE_DEAL = { 'buyer-address-line-3': 'The Bronx', 'buyer-address-postcode': 'no-idea', 'buyer-address-town': 'New York', - 'buyer-name': 'Huggy Bear', + 'buyer-name': 'Harry Bear', destinationOfGoodsAndServices: { code: 'USA', name: 'United States', diff --git a/e2e-tests/portal/cypress/e2e/journeys/read-only/abandon-deal/cannot-abandon-a-deal.spec.js b/e2e-tests/portal/cypress/e2e/journeys/read-only/abandon-deal/cannot-abandon-a-deal.spec.js new file mode 100644 index 0000000000..82441b3862 --- /dev/null +++ b/e2e-tests/portal/cypress/e2e/journeys/read-only/abandon-deal/cannot-abandon-a-deal.spec.js @@ -0,0 +1,27 @@ +const MOCK_USERS = require('../../../../fixtures/users'); +const relative = require('../../../relativeURL'); +const deals = require('../../../../fixtures/deal-dashboard-data'); +const { contract } = require('../../../pages'); + +const { BANK1_READ_ONLY1, BANK1_MAKER1, ADMIN } = MOCK_USERS; + +context('Abandon a deal', () => { + let deal; + + before(() => { + const aDealInStatus = (status) => deals.filter((aDeal) => status === aDeal.status)[0]; + + cy.deleteDeals(ADMIN); + cy.insertOneDeal(aDealInStatus('Draft'), BANK1_MAKER1).then((insertedDeal) => { + deal = insertedDeal; + }); + }); + + describe('when a read-only user views a draft deal', () => { + it('should have no "abandon deal" link', () => { + cy.loginGoToDealPage(BANK1_READ_ONLY1, deal); + cy.url().should('eq', relative(`/contract/${deal._id}`)); + contract.abandonLink().should('not.exist'); + }); + }); +}); diff --git a/e2e-tests/portal/cypress/e2e/journeys/read-only/clone-deal/cannot-clone-a-deal.spec.js b/e2e-tests/portal/cypress/e2e/journeys/read-only/clone-deal/cannot-clone-a-deal.spec.js new file mode 100644 index 0000000000..b275683b78 --- /dev/null +++ b/e2e-tests/portal/cypress/e2e/journeys/read-only/clone-deal/cannot-clone-a-deal.spec.js @@ -0,0 +1,53 @@ +const { contract } = require('../../../pages'); +const fullyCompletedDeal = require('../fixtures/dealFullyCompleted'); +const MOCK_USERS = require('../../../../fixtures/users'); +const relative = require('../../../relativeURL'); + +const { BANK1_READ_ONLY1, BANK1_MAKER1, ADMIN } = MOCK_USERS; + +context('Clone a deal', () => { + let deal; + let dealId; + const dealFacilities = { + bonds: [], + loans: [], + }; + + beforeEach(() => { + cy.deleteDeals(ADMIN); + cy.insertOneDeal(fullyCompletedDeal, BANK1_MAKER1).then((insertedDeal) => { + deal = insertedDeal; + dealId = deal._id; + + const { mockFacilities } = fullyCompletedDeal; + + cy.createFacilities(dealId, mockFacilities, BANK1_MAKER1).then((createdFacilities) => { + const bonds = createdFacilities.filter((f) => f.type === 'Bond'); + const loans = createdFacilities.filter((f) => f.type === 'Loan'); + + dealFacilities.bonds = bonds; + dealFacilities.loans = loans; + }); + }); + }); + + after(() => { + cy.deleteDeals(ADMIN); + + dealFacilities.bonds.forEach((facility) => { + cy.deleteFacility(facility._id, BANK1_MAKER1); + }); + + dealFacilities.loans.forEach((facility) => { + cy.deleteFacility(facility._id, BANK1_MAKER1); + }); + }); + + describe('when a read-only user creates a deal', () => { + it('should have no "clone deal" link', () => { + cy.loginGoToDealPage(BANK1_READ_ONLY1, deal); + cy.url().should('eq', relative(`/contract/${deal._id}`)); + contract.cloneDealLink().should('not.exist'); + }); + }); +}); diff --git a/e2e-tests/portal/cypress/e2e/journeys/read-only/deal/cannot-abandon-a-deal.spec.js b/e2e-tests/portal/cypress/e2e/journeys/read-only/deal/cannot-abandon-a-deal.spec.js new file mode 100644 index 0000000000..82441b3862 --- /dev/null +++ b/e2e-tests/portal/cypress/e2e/journeys/read-only/deal/cannot-abandon-a-deal.spec.js @@ -0,0 +1,27 @@ +const MOCK_USERS = require('../../../../fixtures/users'); +const relative = require('../../../relativeURL'); +const deals = require('../../../../fixtures/deal-dashboard-data'); +const { contract } = require('../../../pages'); + +const { BANK1_READ_ONLY1, BANK1_MAKER1, ADMIN } = MOCK_USERS; + +context('Abandon a deal', () => { + let deal; + + before(() => { + const aDealInStatus = (status) => deals.filter((aDeal) => status === aDeal.status)[0]; + + cy.deleteDeals(ADMIN); + cy.insertOneDeal(aDealInStatus('Draft'), BANK1_MAKER1).then((insertedDeal) => { + deal = insertedDeal; + }); + }); + + describe('when a read-only user views a draft deal', () => { + it('should have no "abandon deal" link', () => { + cy.loginGoToDealPage(BANK1_READ_ONLY1, deal); + cy.url().should('eq', relative(`/contract/${deal._id}`)); + contract.abandonLink().should('not.exist'); + }); + }); +}); diff --git a/e2e-tests/portal/cypress/e2e/journeys/read-only/deal/cannot-modify-an-unissued-deal.spec.js b/e2e-tests/portal/cypress/e2e/journeys/read-only/deal/cannot-modify-an-unissued-deal.spec.js new file mode 100644 index 0000000000..422ddf0ca6 --- /dev/null +++ b/e2e-tests/portal/cypress/e2e/journeys/read-only/deal/cannot-modify-an-unissued-deal.spec.js @@ -0,0 +1,34 @@ +const pages = require('../../../pages'); +const relative = require('../../../relativeURL'); +const MOCK_USERS = require('../../../../fixtures/users'); +const deals = require('../../../../fixtures/deal-dashboard-data'); + +const { BANK1_READ_ONLY1, BANK1_MAKER1, ADMIN } = MOCK_USERS; +const { DEALS } = require('../../../../fixtures/constants'); + +context('A read-only role viewing a bond that can be issued', () => { + let deal; + + before(() => { + const aDealInStatus = (status) => deals.filter((aDeal) => status === aDeal.status)[0]; + + cy.deleteDeals(ADMIN); + cy.insertOneDeal(aDealInStatus(DEALS.DEAL_STATUS.READY_FOR_APPROVAL), BANK1_MAKER1).then((insertedDeal) => { + deal = insertedDeal; + }); + }); + + after(() => { + cy.deleteDeals(ADMIN); + }); + + it('should not allow for any publishing actions', () => { + cy.login(BANK1_READ_ONLY1); + pages.contract.visit(deal); + + cy.url().should('eq', relative(`/contract/${deal._id}`)); + + pages.contract.proceedToSubmit().should('not.exist'); + pages.contract.proceedToReview().should('not.exist'); + }); +}); diff --git a/e2e-tests/portal/cypress/e2e/journeys/read-only/fixtures/dealFullyCompleted.js b/e2e-tests/portal/cypress/e2e/journeys/read-only/fixtures/dealFullyCompleted.js new file mode 100644 index 0000000000..fc13d32544 --- /dev/null +++ b/e2e-tests/portal/cypress/e2e/journeys/read-only/fixtures/dealFullyCompleted.js @@ -0,0 +1,295 @@ +const { mandatoryCriteria } = require('../../../../../../e2e-fixtures'); +const dateConstants = require('../../../../../../e2e-fixtures/dateConstants'); + +const nowDay = (dateConstants.todayDay).toString(); +const nowMonth = (dateConstants.todayMonth).toString(); +const nowYear = (dateConstants.todayYear).toString(); + +const nowPlusMonthDay = (dateConstants.oneMonthDay).toString(); +const nowPlusMonthMonth = (dateConstants.oneMonthMonth).toString(); +const nowPlusMonthYear = (dateConstants.oneMonthYear).toString(); + +const nowMinusDayDay = (dateConstants.yesterdayDay).toString(); +const nowMinusDayMonth = (dateConstants.yesterdayMonth).toString(); +const nowMinusDayYear = (dateConstants.yesterdayYear).toString(); + +const deal = { + submissionType: 'Automatic Inclusion Notice', + updatedAt: Date.now(), + additionalRefName: 'mock name', + bankInternalRefName: 'mock id', + status: 'Ready for Checker\'s approval', + previousStatus: 'Draft', + comments: [{ + username: 'bananaman', + timestamp: '1984/12/25 00:00:00:001', + text: 'Merry Christmas from the 80s', + }, { + username: 'supergran', + timestamp: '1982/12/25 00:00:00:001', + text: 'Also Merry Christmas from the 80s', + }], + mockFacilities: [ + { + type: 'Bond', + bondIssuer: 'my issuer', + bondType: 'Retention bond', + facilityStage: 'Issued', + hasBeenIssued: true, + ukefGuaranteeInMonths: '12', + 'requestedCoverStartDate-day': nowDay, + 'requestedCoverStartDate-month': nowMonth, + 'requestedCoverStartDate-year': nowYear, + 'coverEndDate-day': nowPlusMonthDay, + 'coverEndDate-month': nowPlusMonthMonth, + 'coverEndDate-year': nowPlusMonthYear, + name: '1234567890', + bondBeneficiary: 'test', + value: '1234', + currencySameAsSupplyContractCurrency: 'false', + currency: { + text: 'GBP - UK Sterling', + id: 'GBP', + }, + conversionRate: '100', + 'conversionRateDate-day': nowMinusDayDay, + 'conversionRateDate-month': nowMinusDayMonth, + 'conversionRateDate-year': nowMinusDayYear, + riskMarginFee: '12', + coveredPercentage: '24', + minimumRiskMarginFee: '1', + feeType: 'In advance', + feeFrequency: 'Quarterly', + dayCountBasis: '360', + guaranteeFeePayableByBank: '12.345', + ukefExposure: '1,234.56', + }, + { + type: 'Bond', + bondIssuer: 'my issuer', + bondType: 'Retention bond', + facilityStage: 'Issued', + hasBeenIssued: true, + ukefGuaranteeInMonths: '12', + 'requestedCoverStartDate-day': nowDay, + 'requestedCoverStartDate-month': nowMonth, + 'requestedCoverStartDate-year': nowYear, + 'coverEndDate-day': nowPlusMonthDay, + 'coverEndDate-month': nowPlusMonthMonth, + 'coverEndDate-year': nowPlusMonthYear, + name: '1234567890', + bondBeneficiary: 'test', + value: '5678', + currencySameAsSupplyContractCurrency: 'true', + currency: { + text: 'CAD - Canadian Dollars', + id: 'CAD', + }, + riskMarginFee: '12', + coveredPercentage: '24', + minimumRiskMarginFee: '1', + feeType: 'In arrear', + feeFrequency: 'Monthly', + dayCountBasis: '360', + guaranteeFeePayableByBank: '12.345', + ukefExposure: '1,234.56', + }, + { + type: 'Loan', + facilityStage: 'Conditional', + hasBeenIssued: false, + ukefGuaranteeInMonths: '12', + name: '123456', + guaranteeFeePayableByBank: '10.8000', + ukefExposure: '2,469,135.60', + value: '12345678', + currencySameAsSupplyContractCurrency: 'true', + interestMarginFee: '12', + coveredPercentage: '20', + minimumQuarterlyFee: '20', + premiumFrequency: 'Monthly', + premiumType: 'In advance', + dayCountBasis: '365', + currency: { + text: 'GBP - UK Sterling', + id: 'GBP', + }, + }, + { + type: 'Loan', + facilityStage: 'Unconditional', + hasBeenIssued: true, + 'requestedCoverStartDate-day': nowDay, + 'requestedCoverStartDate-month': nowMonth, + 'requestedCoverStartDate-year': nowYear, + 'coverEndDate-day': nowPlusMonthDay, + 'coverEndDate-month': nowPlusMonthMonth, + 'coverEndDate-year': nowPlusMonthYear, + name: '12345678', + guaranteeFeePayableByBank: '10.8000', + ukefExposure: '3,703,703.40', + value: '12345678', + currencySameAsSupplyContractCurrency: 'false', + currency: { + text: 'AUD - Australian Dollars', + id: 'AUD', + }, + conversionRate: '80', + 'conversionRateDate-day': nowMinusDayDay, + 'conversionRateDate-month': nowMinusDayMonth, + 'conversionRateDate-year': nowMinusDayYear, + disbursementAmount: '10', + interestMarginFee: '12', + coveredPercentage: '30', + minimumQuarterlyFee: '123456', + premiumFrequency: 'Quarterly', + premiumType: 'In advance', + dayCountBasis: '365', + }, + ], + eligibility: { + version: 5, + criteria: [ + { + id: 11, + description: 'The Supplier has confirmed in its Supplier Declaration that the Supply Contract does not involve agents and the Bank is not aware that any of the information contained within it is inaccurate.', + answer: true, + }, + { + id: 12, + description: 'The cover period for each Transaction does not exceed 5 years, or such other period approved by UKEF (that has not lapsed or been withdrawn) in relation to bonds and/or loans for this Obligor.', + answer: true, + }, + { + id: 13, + description: 'The total UKEF exposure, across all short-term schemes (including bond support, export working capital and general export facility transactions), for this Obligor (including this Transaction) does not exceed £5 million, or such other limit approved by UKEF (that has not lapsed or been withdrawn).', + answer: true, + }, + { + id: 14, + description: 'For a bond Transaction, the bond has not yet been issued or, where the bond has been issued, this was done no more than 3 months prior to the submission of this Inclusion Notice. For a loan Transaction, the loan has not yet been advanced.', + answer: true, + }, + { + id: 15, + description: 'The Requested Cover Start Date is no more than three months from the date of submission.', + answer: true, + }, + { + id: 16, + description: 'The Supplier has confirmed in its Supplier Declaration that the Supply Contract does not involve any of the following Controlled Sectors: sharp arms defence, nuclear, radiological, biological, human cloning, pornography, tobacco, gambling, coal, oil, gas or fossil fuel energy and the Bank is not aware that any of the information contained within it is inaccurate.', + answer: true, + }, + { + id: 17, + description: 'The Bank has completed its Bank Due Diligence to its satisfaction in accordance with its policies and procedures without having to escalate to any Relevant Person.', + answer: true, + }, + { + id: 18, + description: 'The fees and/or interest apply to the whole Cover Period, and have been set in accordance with the Bank’s normal pricing policies and, if any, minimum or overall pricing requirements set by UKEF.', + answer: true, + }, + ], + agentAddressLine1: 'ADDR 1', + agentAddressLine2: 'Addr 2', + agentAddressLine3: 'Addr 3', + agentAddressCountry: 'GBR', + agentName: 'AGENT NAME', + agentAddressPostcode: 'CF64 5SH', + agentAddressTown: 'City', + }, + submissionDetails: { + 'indemnifier-address-country': { + code: 'GBR', + name: 'United Kingdom', + }, + 'indemnifier-address-line-3': '', + 'indemnifier-address-line-1': '1A', + 'indemnifier-address-line-2': 'Test Road', + 'indemnifier-address-postcode': 'test', + 'indemnifier-address-town': 'London', + 'indemnifier-companies-house-registration-number': '06771815', + 'indemnifier-correspondence-address-country': { + code: 'GBR', + name: 'United Kingdom', + }, + 'indemnifier-correspondence-address-line-3': 'Essex', + 'indemnifier-correspondence-address-line-1': 'Test address', + 'indemnifier-correspondence-address-line-2': '', + 'indemnifier-correspondence-address-postcode': 'test', + 'indemnifier-correspondence-address-town': 'Chelmsford', + 'indemnifier-name': 'Test Trading Limited', + indemnifierCorrespondenceAddressDifferent: 'true', + 'industry-sector': { + code: '1008', + name: 'Accommodation and food service activities', + }, + 'industry-class': { + code: '56101', + name: 'Licensed restaurants', + }, + legallyDistinct: 'true', + 'sme-type': 'Small', + 'supplier-address-country': { + code: 'GBR', + name: 'United Kingdom', + }, + 'supplier-address-line-3': 'London', + 'supplier-address-line-1': '1 Horseguards Road', + 'supplier-address-line-2': '', + 'supplier-address-postcode': 'test', + 'supplier-address-town': 'Westminster', + 'supplier-companies-house-registration-number': '', + 'supplier-correspondence-address-country': { + code: 'GBR', + name: 'United Kingdom', + }, + 'supplier-correspondence-address-line-3': 'Edinburgh', + 'supplier-correspondence-address-line-1': '2 Horseguards Road', + 'supplier-correspondence-address-line-2': '', + 'supplier-correspondence-address-postcode': 'ED1 23S', + 'supplier-correspondence-address-town': 'Eastminster', + 'supplier-name': 'UKEF', + 'supplier-type': 'Exporter', + 'supplier-correspondence-address-is-different': 'true', + 'supply-contract-description': 'Description.', + 'buyer-address-country': { + code: 'GBR', + name: 'United Kingdom', + }, + 'buyer-address-line-1': 'Corner of East and Main', + 'buyer-address-line-2': '', + 'buyer-address-line-3': 'The Bronx', + 'buyer-address-postcode': 'no-idea', + 'buyer-address-town': 'New York', + 'buyer-name': 'Harry Bear', + destinationOfGoodsAndServices: { + name: 'United States', + code: 'USA', + }, + viewedPreviewPage: true, + supplyContractConversionRateToGBP: '1.123456', + supplyContractCurrency: { + id: 'USD', + }, + supplyContractValue: '10,000', + 'supplyContractConversionDate-day': nowMinusDayDay, + 'supplyContractConversionDate-month': nowMinusDayMonth, + 'supplyContractConversionDate-year': nowMinusDayYear, + }, + summary: { + totalValue: { + dealInDealCurrency: '10,000', + dealInGbp: '12,000', + bondInDealCurrency: '8,000', + bondInGbp: '16,000', + loanInDealCurrency: '4,000', + loanInGbp: '8,000', + }, + }, + mandatoryCriteria, + supportingInformation: { }, +}; + +module.exports = deal; diff --git a/e2e-tests/portal/cypress/e2e/journeys/read-only/fixtures/dealReadyToSubmit.js b/e2e-tests/portal/cypress/e2e/journeys/read-only/fixtures/dealReadyToSubmit.js new file mode 100644 index 0000000000..07d0157ebe --- /dev/null +++ b/e2e-tests/portal/cypress/e2e/journeys/read-only/fixtures/dealReadyToSubmit.js @@ -0,0 +1,24 @@ +const dealThatJustNeedsConversionDate = require('./dealThatJustNeedsConversionDate'); +const dateConstants = require('../../../../../../e2e-fixtures/dateConstants'); + +module.exports = () => { + const now = new Date(); + + // doing a complete serialize+deserialize here... + // ran into issues destructuring things into our new object; cypress was keeping references + // between my bits of test data, so updating 1 deal would cause the other to update.. + const deal = JSON.parse(JSON.stringify(dealThatJustNeedsConversionDate())); + + deal.details.submissionCount = 0; + + deal.submissionDetails['supplyContractConversionDate-day'] = dateConstants.todayDay; + deal.submissionDetails['supplyContractConversionDate-month'] = dateConstants.todayMonth; + deal.submissionDetails['supplyContractConversionDate-year'] = dateConstants.todayYear; + + deal.loanTransactions.items[0].requestedCoverStartDate = now.valueOf(); + + deal.loanTransactions.items[0]['coverEndDate-day'] = (dateConstants.oneMonthDay).toString(); + deal.loanTransactions.items[0]['coverEndDate-month'] = (dateConstants.oneMonthMonth).toString(); + deal.loanTransactions.items[0]['coverEndDate-year'] = (dateConstants.oneMonthYear).toString(); + return deal; +}; diff --git a/e2e-tests/portal/cypress/e2e/journeys/read-only/fixtures/dealThatJustNeedsConversionDate.js b/e2e-tests/portal/cypress/e2e/journeys/read-only/fixtures/dealThatJustNeedsConversionDate.js new file mode 100644 index 0000000000..8639f12b7f --- /dev/null +++ b/e2e-tests/portal/cypress/e2e/journeys/read-only/fixtures/dealThatJustNeedsConversionDate.js @@ -0,0 +1,11 @@ +const { ObjectID } = require('bson'); +const template = require('./template.json'); + +module.exports = () => { + const deal = { ...template }; + + deal.loanTransactions.items[0]._id = ObjectID(); + deal.bondTransactions.items[0]._id = ObjectID(); + + return deal; +}; diff --git a/e2e-tests/portal/cypress/e2e/journeys/read-only/fixtures/dealWithInvalidBondCoverStartDate.js b/e2e-tests/portal/cypress/e2e/journeys/read-only/fixtures/dealWithInvalidBondCoverStartDate.js new file mode 100644 index 0000000000..319de14831 --- /dev/null +++ b/e2e-tests/portal/cypress/e2e/journeys/read-only/fixtures/dealWithInvalidBondCoverStartDate.js @@ -0,0 +1,17 @@ +const dealReadyToSubmitForReview = require('./dealReadyToSubmit'); +const dateConstants = require('../../../../../../e2e-fixtures/dateConstants'); + +module.exports = () => { + const invalidCoverStartDate = `${dateConstants.yesterdayUnix}000`; // TODO: Standardise this coding style + + const dealWithBadCoverStartDate = { ...dealReadyToSubmitForReview() }; + + dealWithBadCoverStartDate.bondTransactions.items[0].requestedCoverStartDate = invalidCoverStartDate; + + dealWithBadCoverStartDate.bondTransactions.items[0]['coverEndDate-day'] = (dateConstants.oneMonthDay).toString(); + dealWithBadCoverStartDate.bondTransactions.items[0]['coverEndDate-month'] = (dateConstants.oneMonthMonth).toString(); + dealWithBadCoverStartDate.bondTransactions.items[0]['coverEndDate-year'] = (dateConstants.oneMonthYear).toString(); + dealWithBadCoverStartDate.bondTransactions.items[0].facilityStage = 'Issued'; + + return dealWithBadCoverStartDate; +}; diff --git a/e2e-tests/portal/cypress/e2e/journeys/read-only/fixtures/dealWithInvalidLoanCoverStartDate.js b/e2e-tests/portal/cypress/e2e/journeys/read-only/fixtures/dealWithInvalidLoanCoverStartDate.js new file mode 100644 index 0000000000..bceda772d0 --- /dev/null +++ b/e2e-tests/portal/cypress/e2e/journeys/read-only/fixtures/dealWithInvalidLoanCoverStartDate.js @@ -0,0 +1,18 @@ +const dateConstants = require('../../../../../../e2e-fixtures/dateConstants'); +const dealReadyToSubmitForReview = require('./dealReadyToSubmit'); + +module.exports = () => { + const invalidCoverStartDate = `${dateConstants.yesterdayUnix}000`; // TODO: Standardise this coding style + + const dealWithBadCoverStartDate = { ...dealReadyToSubmitForReview() }; + + dealWithBadCoverStartDate.loanTransactions.items[0].requestedCoverStartDate = invalidCoverStartDate; + + dealWithBadCoverStartDate.loanTransactions.items[0]['coverEndDate-day'] = (dateConstants.oneMonthDay).toString(); + dealWithBadCoverStartDate.loanTransactions.items[0]['coverEndDate-month'] = (dateConstants.oneMonthMonth).toString(); + dealWithBadCoverStartDate.loanTransactions.items[0]['coverEndDate-year'] = (dateConstants.oneMonthYear).toString(); + dealWithBadCoverStartDate.loanTransactions.items[0].facilityStage = 'Unconditional'; + dealWithBadCoverStartDate.loanTransactions.items[0].hasBeenIssued = true; + + return dealWithBadCoverStartDate; +}; diff --git a/e2e-tests/portal/cypress/e2e/journeys/read-only/fixtures/submittedDealWithBondCoverStartDateInThePast.js b/e2e-tests/portal/cypress/e2e/journeys/read-only/fixtures/submittedDealWithBondCoverStartDateInThePast.js new file mode 100644 index 0000000000..279da9b5ca --- /dev/null +++ b/e2e-tests/portal/cypress/e2e/journeys/read-only/fixtures/submittedDealWithBondCoverStartDateInThePast.js @@ -0,0 +1,21 @@ +const dateConstants = require('../../../../../../e2e-fixtures/dateConstants'); +const dealReadyToSubmitForReview = require('./dealReadyToSubmit'); + +module.exports = () => { + const dealSubmissionDate = `${dateConstants.yesterdayUnix}000`; // TODO: Standardise this coding style + const coverStartDateBeforeDealSubmissionDate = `${dateConstants.sevenDaysAgoUnix}000`; + + const deal = { ...dealReadyToSubmitForReview() }; + + deal.details.submissionDate = dealSubmissionDate; + + deal.bondTransactions.items[0].requestedCoverStartDate = coverStartDateBeforeDealSubmissionDate; + + deal.bondTransactions.items[0]['coverEndDate-day'] = (dateConstants.oneMonthDay).toString(); + deal.bondTransactions.items[0]['coverEndDate-month'] = (dateConstants.oneMonthMonth).toString(); + deal.bondTransactions.items[0]['coverEndDate-year'] = (dateConstants.oneMonthYear).toString(); + deal.bondTransactions.items[0].facilityStage = 'Issued'; + deal.bondTransactions.items[0].name = '1234'; + + return deal; +}; diff --git a/e2e-tests/portal/cypress/e2e/journeys/read-only/fixtures/submittedDealWithLoanCoverStartDateInThePast.js b/e2e-tests/portal/cypress/e2e/journeys/read-only/fixtures/submittedDealWithLoanCoverStartDateInThePast.js new file mode 100644 index 0000000000..e45f8e3ec7 --- /dev/null +++ b/e2e-tests/portal/cypress/e2e/journeys/read-only/fixtures/submittedDealWithLoanCoverStartDateInThePast.js @@ -0,0 +1,21 @@ +const dealReadyToSubmitForReview = require('./dealReadyToSubmit'); +const dateConstants = require('../../../../../../e2e-fixtures/dateConstants'); + +module.exports = () => { + const dealSubmissionDate = `${dateConstants.yesterdayUnix}000`; // TODO: Standardise this coding style + const coverStartDateBeforeDealSubmissionDate = `${dateConstants.sevenDaysAgoUnix}000`; + + const deal = { ...dealReadyToSubmitForReview() }; + + deal.details.submissionDate = dealSubmissionDate; + + deal.loanTransactions.items[0].requestedCoverStartDate = coverStartDateBeforeDealSubmissionDate; + + deal.loanTransactions.items[0]['coverEndDate-day'] = (dateConstants.oneMonthDay).toString(); + deal.loanTransactions.items[0]['coverEndDate-month'] = (dateConstants.oneMonthMonth).toString(); + deal.loanTransactions.items[0]['coverEndDate-year'] = (dateConstants.oneMonthYear).toString(); + deal.loanTransactions.items[0].facilityStage = 'Unconditional'; + deal.loanTransactions.items[0].hasBeenIssued = true; + + return deal; +}; diff --git a/e2e-tests/portal/cypress/e2e/journeys/read-only/fixtures/template.json b/e2e-tests/portal/cypress/e2e/journeys/read-only/fixtures/template.json new file mode 100644 index 0000000000..30a8328670 --- /dev/null +++ b/e2e-tests/portal/cypress/e2e/journeys/read-only/fixtures/template.json @@ -0,0 +1,168 @@ +{ + "submissionType": "Automatic Inclusion Notice", + "bankInternalRefName": "abc-1-def", + "additionalRefName": "Tibettan submarine acquisition scheme", + "status": "Ready for Checker's approval", + "previousStatus": "Draft", + "details": {}, + "submissionDetails" : { + "indemnifier-address-country" : { + "code": "GBR", + "name": "United Kingdom" + }, + "indemnifier-address-line-3" : "", + "indemnifier-address-line-1" : "1A", + "indemnifier-address-line-2" : "Test Road", + "indemnifier-address-postcode" : "SW1A 2HQ", + "indemnifier-address-town" : "London", + "indemnifier-companies-house-registration-number" : "06771815", + "indemnifier-correspondence-address-country" : { + "code": "GBR", + "name": "United Kingdom" + }, + "indemnifier-correspondence-address-line-3" : "Essex", + "indemnifier-correspondence-address-line-1" : "Test address", + "indemnifier-correspondence-address-line-2" : "", + "indemnifier-correspondence-address-postcode" : "SW1A 2HQ", + "indemnifier-correspondence-address-town" : "Chelmsford", + "indemnifier-name" : "Test Trading Limited", + "indemnifierCorrespondenceAddressDifferent" : "true", + "industry-sector": { + "code": "1008", + "name": "Accommodation and food service activities" +}, + "industry-class": { + "code": "56101", + "name": "Licensed restaurants" +}, + "legallyDistinct" : "true", + "sme-type" : "Small", + "supplier-address-country": { + "code": "GBR", + "name": "United Kingdom" + }, + "supplier-address-line-3" : "London", + "supplier-address-line-1" : "1 Horseguards Road", + "supplier-address-line-2" : "", + "supplier-address-postcode" : "SW1A 2HQ", + "supplier-address-town" : "Westminster", + "supplier-companies-house-registration-number" : "", + "supplier-correspondence-address-country": { + "code": "GBR", + "name": "United Kingdom" + }, + "supplier-correspondence-address-line-3" : "Edinburgh", + "supplier-correspondence-address-line-1" : "2 Horseguards Road", + "supplier-correspondence-address-line-2" : "", + "supplier-correspondence-address-postcode" : "ED1 23S", + "supplier-correspondence-address-town" : "Eastminster", + "supplier-name" : "UKEF", + "supplier-type" : "Exporter", + "supplier-correspondence-address-is-different" : "true", + "supply-contract-description" : "Description.", + "buyer-address-country": { + "code": "GBR", + "name": "United Kingdom" + }, + "buyer-address-line-1" : "Corner of East and Main", + "buyer-address-line-2" : "", + "buyer-address-line-3" : "The Bronx", + "buyer-address-postcode" : "no-idea", + "buyer-address-town" : "New York", + "buyer-name" : "Harry Bear", + "destinationOfGoodsAndServices" : { + "code": "USA", + "name": "United States" + }, + "viewedPreviewPage" : true, + "supplyContractConversionRateToGBP" : "1.123456", + "supplyContractCurrency" : { + "id" : "USD", + "text": "USD - US Dollars" + }, + "supplyContractValue" : "10,000" +}, + "eligibility": { + "status": "Completed", + "version": 5, + "criteria": [ + { "id": 11, "answer": true + }, + { "id": 12, "answer": true + }, + { "id": 13, "answer": true + }, + { "id": 14, "answer": true + }, + { "id": 15, "answer": true + }, + { "id": 16, "answer": true + }, + { "id": 17, "answer": true + }, + { "id": 18, "answer": true + } + ] + }, + "bondTransactions": { + "items": [ + { + "type": "Bond", + "bondIssuer": "Issuer", + "bondType": "Advance payment guarantee", + "facilityStage": "Unissued", + "hasBeenIssued": false, + "ukefGuaranteeInMonths": "10", + "bondBeneficiary": "", + "guaranteeFeePayableByBank": "9.0000", + "value": "12345.00", + "currencySameAsSupplyContractCurrency": "true", + "riskMarginFee": "10", + "coveredPercentage": "20", + "minimumRiskMarginFee": "30", + "ukefExposure": "2,469.00", + "feeType": "At maturity", + "dayCountBasis": "365", + "currency": { + "text": "GBP - UK Sterling", + "id": "GBP" + } + } + ] + }, + "loanTransactions": { + "items": [ + { + "type": "Loan", + "facilityStage": "Unconditional", + "hasBeenIssued": true, + "name": "8888888", + "guaranteeFeePayableByBank": "18.0000", + "value": "44444.00", + "currencySameAsSupplyContractCurrency": "true", + "disbursementAmount": "100.00", + "interestMarginFee": "20", + "coveredPercentage": "21", + "minimumQuarterlyFee": "22", + "ukefExposure": "9,333.24", + "premiumFrequency": "Annually", + "premiumType": "In advance", + "dayCountBasis": "365", + "currency": { + "text": "GBP - UK Sterling", + "id": "GBP" + } + } + ] + }, + "summary": { + "totalValue": { + "dealInDealCurrency": "10,000", + "dealInGbp": "12,000", + "bondInDealCurrency": "8,000", + "bondInGbp": "16,000", + "loanInDealCurrency": "4,000", + "loanInGbp": "8,000" + } + } +} diff --git a/e2e-tests/portal/cypress/e2e/journeys/skip-link.spec.js b/e2e-tests/portal/cypress/e2e/journeys/skip-link.spec.js index 58d4980c09..e4331fb2a3 100644 --- a/e2e-tests/portal/cypress/e2e/journeys/skip-link.spec.js +++ b/e2e-tests/portal/cypress/e2e/journeys/skip-link.spec.js @@ -13,7 +13,7 @@ context('Skip link should take user to the main content of a page', () => { // unfortunately, cypress currently does not natively support keyboard tabbing. // therefore, when tabbing to display the 'skip link', // the skip link does not 'appear' as it would in a regular browser outside of cypress. - // we therefore cannot reliably test if the element is 'visibile' or 'in viewport'. + // we therefore cannot reliably test if the element is 'visible' or 'in viewport'. // however, in this case, the link works, as it's a DOM element that is on the page. // so, we can only test that the link goes to the right place after tabbing to it. diff --git a/e2e-tests/portal/cypress/fixtures/users.js b/e2e-tests/portal/cypress/fixtures/users.js index cac71d3986..8255e07771 100644 --- a/e2e-tests/portal/cypress/fixtures/users.js +++ b/e2e-tests/portal/cypress/fixtures/users.js @@ -1,35 +1,27 @@ const MOCK_USERS = require('../../../../utils/mock-data-loader/portal/users'); const MOCK_TFM_USERS = require('../../../../utils/mock-data-loader/tfm/mocks/users'); +const { USER_ROLES } = require('./constants'); -const BANK1_MAKER1 = MOCK_USERS.find((user) => - (user.roles.includes('maker') && user.username === 'BANK1_MAKER1')); +const BANK1_MAKER1 = MOCK_USERS.find((user) => user.roles.includes(USER_ROLES.MAKER) && user.username === 'BANK1_MAKER1'); -const BANK1_MAKER2 = MOCK_USERS.find((user) => - (user.roles.includes('maker')) && user.username === 'BANK1_MAKER2'); +const BANK1_MAKER2 = MOCK_USERS.find((user) => user.roles.includes(USER_ROLES.MAKER) && user.username === 'BANK1_MAKER2'); -const BANK2_MAKER2 = MOCK_USERS.find((user) => - (user.roles.includes('maker')) && user.username === 'BANK2_MAKER2'); +const BANK2_MAKER2 = MOCK_USERS.find((user) => user.roles.includes(USER_ROLES.MAKER) && user.username === 'BANK2_MAKER2'); -const BANK1_READ_ONLY = MOCK_USERS.find((user) => user.username === 'BANK1_READ_ONLY'); +const BANK3_GEF_MAKER1 = MOCK_USERS.find((user) => user.roles.includes(USER_ROLES.MAKER) && user.username === 'BANK3_GEF_MAKER1'); -const BANK3_GEF_MAKER1 = MOCK_USERS.find((user) => - (user.roles.includes('maker') && user.username === 'BANK3_GEF_MAKER1')); +const BANK1_CHECKER1 = MOCK_USERS.find((user) => user.roles.includes(USER_ROLES.CHECKER) && user.username === 'BANK1_CHECKER1'); -const BANK1_CHECKER1 = MOCK_USERS.find((user) => - (user.roles.includes('checker')) && user.username === 'BANK1_CHECKER1'); +const BANK1_READ_ONLY1 = MOCK_USERS.find((user) => user.roles.includes(USER_ROLES.READ_ONLY) && user.username === 'BANK1_READ_ONLY1'); -const ADMIN = MOCK_USERS.find((user) => - user.username === 'ADMIN'); +const ADMIN = MOCK_USERS.find((user) => user.username === 'ADMIN'); -const UKEF_OPERATIONS = MOCK_USERS.find((user) => - user.username === 'UKEF_OPERATIONS'); +const UKEF_OPERATIONS = MOCK_USERS.find((user) => user.username === 'UKEF_OPERATIONS'); -const EDITOR = MOCK_USERS.find((user) => - user.username === 'EDITOR'); +const EDITOR = MOCK_USERS.find((user) => user.username === 'EDITOR'); // TFM -const UNDERWRITER_MANAGER = MOCK_TFM_USERS.find((user) => - user.teams.includes('UNDERWRITER_MANAGERS')); +const UNDERWRITER_MANAGER = MOCK_TFM_USERS.find((user) => user.teams.includes('UNDERWRITER_MANAGERS')); const USER_WITH_INJECTION = { username: '{ "$gt": "" }', @@ -38,16 +30,16 @@ const USER_WITH_INJECTION = { firstname: 'test', surname: 'injection', bank: 'HSBC', - roles: ['maker'], + roles: [USER_ROLES.MAKER], }; module.exports = { BANK1_MAKER1, BANK1_MAKER2, - BANK1_READ_ONLY, BANK2_MAKER2, BANK3_GEF_MAKER1, BANK1_CHECKER1, + BANK1_READ_ONLY1, ADMIN, UKEF_OPERATIONS, EDITOR, diff --git a/e2e-tests/submit-to-trade-finance-manager/cypress/e2e/journeys/portal/submit-deal-with-issued-facilities/test-data/dealThatJustNeedsDates.json b/e2e-tests/submit-to-trade-finance-manager/cypress/e2e/journeys/portal/submit-deal-with-issued-facilities/test-data/dealThatJustNeedsDates.json index 9ca73a3073..1c0fc24f53 100644 --- a/e2e-tests/submit-to-trade-finance-manager/cypress/e2e/journeys/portal/submit-deal-with-issued-facilities/test-data/dealThatJustNeedsDates.json +++ b/e2e-tests/submit-to-trade-finance-manager/cypress/e2e/journeys/portal/submit-deal-with-issued-facilities/test-data/dealThatJustNeedsDates.json @@ -74,7 +74,7 @@ "buyer-address-line-3" : "The Bronx", "buyer-address-postcode" : "no-idea", "buyer-address-town" : "New York", - "buyer-name" : "Huggy Bear", + "buyer-name" : "Harry Bear", "destinationOfGoodsAndServices" : { "code": "USA", "name": "United States" diff --git a/e2e-tests/submit-to-trade-finance-manager/cypress/e2e/journeys/portal/submit-deal-with-non-gbp-facilities/test-data/dealThatJustNeedsDates.json b/e2e-tests/submit-to-trade-finance-manager/cypress/e2e/journeys/portal/submit-deal-with-non-gbp-facilities/test-data/dealThatJustNeedsDates.json index 08c5bf21ad..fe180d6ae2 100644 --- a/e2e-tests/submit-to-trade-finance-manager/cypress/e2e/journeys/portal/submit-deal-with-non-gbp-facilities/test-data/dealThatJustNeedsDates.json +++ b/e2e-tests/submit-to-trade-finance-manager/cypress/e2e/journeys/portal/submit-deal-with-non-gbp-facilities/test-data/dealThatJustNeedsDates.json @@ -74,7 +74,7 @@ "buyer-address-line-3" : "The Bronx", "buyer-address-postcode" : "no-idea", "buyer-address-town" : "New York", - "buyer-name" : "Huggy Bear", + "buyer-name" : "Harry Bear", "destinationOfGoodsAndServices" : { "code": "USA", "name": "United States" diff --git a/e2e-tests/submit-to-trade-finance-manager/cypress/e2e/journeys/portal/submit-deal-with-unissued-facilities-and-resubmit-as-issued/submit-deal-with-unissued-bond-and-resubmit-as-issued/test-data/dealThatJustNeedsConversionDate.json b/e2e-tests/submit-to-trade-finance-manager/cypress/e2e/journeys/portal/submit-deal-with-unissued-facilities-and-resubmit-as-issued/submit-deal-with-unissued-bond-and-resubmit-as-issued/test-data/dealThatJustNeedsConversionDate.json index 311ead9053..72dda9243d 100644 --- a/e2e-tests/submit-to-trade-finance-manager/cypress/e2e/journeys/portal/submit-deal-with-unissued-facilities-and-resubmit-as-issued/submit-deal-with-unissued-bond-and-resubmit-as-issued/test-data/dealThatJustNeedsConversionDate.json +++ b/e2e-tests/submit-to-trade-finance-manager/cypress/e2e/journeys/portal/submit-deal-with-unissued-facilities-and-resubmit-as-issued/submit-deal-with-unissued-bond-and-resubmit-as-issued/test-data/dealThatJustNeedsConversionDate.json @@ -74,7 +74,7 @@ "buyer-address-line-3" : "The Bronx", "buyer-address-postcode" : "no-idea", "buyer-address-town" : "New York", - "buyer-name" : "Huggy Bear", + "buyer-name" : "Harry Bear", "destinationOfGoodsAndServices" : { "code": "USA", "name": "United States" diff --git a/e2e-tests/submit-to-trade-finance-manager/cypress/e2e/journeys/portal/submit-deal-with-unissued-facilities-and-resubmit-as-issued/submit-deal-with-unissued-loan-and-resubmit-as-issued/test-data/dealThatJustNeedsConversionDate.json b/e2e-tests/submit-to-trade-finance-manager/cypress/e2e/journeys/portal/submit-deal-with-unissued-facilities-and-resubmit-as-issued/submit-deal-with-unissued-loan-and-resubmit-as-issued/test-data/dealThatJustNeedsConversionDate.json index bbe5f9a2c5..1d1fa88208 100644 --- a/e2e-tests/submit-to-trade-finance-manager/cypress/e2e/journeys/portal/submit-deal-with-unissued-facilities-and-resubmit-as-issued/submit-deal-with-unissued-loan-and-resubmit-as-issued/test-data/dealThatJustNeedsConversionDate.json +++ b/e2e-tests/submit-to-trade-finance-manager/cypress/e2e/journeys/portal/submit-deal-with-unissued-facilities-and-resubmit-as-issued/submit-deal-with-unissued-loan-and-resubmit-as-issued/test-data/dealThatJustNeedsConversionDate.json @@ -74,7 +74,7 @@ "buyer-address-line-3" : "The Bronx", "buyer-address-postcode" : "no-idea", "buyer-address-town" : "New York", - "buyer-name" : "Huggy Bear", + "buyer-name" : "Harry Bear", "destinationOfGoodsAndServices" : { "code": "USA", "name": "United States" diff --git a/e2e-tests/submit-to-trade-finance-manager/cypress/e2e/journeys/portal/test-data/AIN-deal/dealThatJustNeedsDates.json b/e2e-tests/submit-to-trade-finance-manager/cypress/e2e/journeys/portal/test-data/AIN-deal/dealThatJustNeedsDates.json index 461ebe7acc..c531a4e848 100644 --- a/e2e-tests/submit-to-trade-finance-manager/cypress/e2e/journeys/portal/test-data/AIN-deal/dealThatJustNeedsDates.json +++ b/e2e-tests/submit-to-trade-finance-manager/cypress/e2e/journeys/portal/test-data/AIN-deal/dealThatJustNeedsDates.json @@ -74,7 +74,7 @@ "buyer-address-line-3" : "The Bronx", "buyer-address-postcode" : "no-idea", "buyer-address-town" : "New York", - "buyer-name" : "Huggy Bear", + "buyer-name" : "Harry Bear", "destinationOfGoodsAndServices" : { "code": "USA", "name": "United States" diff --git a/e2e-tests/submit-to-trade-finance-manager/cypress/e2e/journeys/portal/test-data/MIA-deal/dealThatJustNeedsDates.json b/e2e-tests/submit-to-trade-finance-manager/cypress/e2e/journeys/portal/test-data/MIA-deal/dealThatJustNeedsDates.json index f2a64ed8c4..4ea62c2110 100644 --- a/e2e-tests/submit-to-trade-finance-manager/cypress/e2e/journeys/portal/test-data/MIA-deal/dealThatJustNeedsDates.json +++ b/e2e-tests/submit-to-trade-finance-manager/cypress/e2e/journeys/portal/test-data/MIA-deal/dealThatJustNeedsDates.json @@ -74,7 +74,7 @@ "buyer-address-line-3" : "The Bronx", "buyer-address-postcode" : "no-idea", "buyer-address-town" : "New York", - "buyer-name" : "Huggy Bear", + "buyer-name" : "Harry Bear", "destinationOfGoodsAndServices" : { "code": "USA", "name": "United States" diff --git a/e2e-tests/submit-to-trade-finance-manager/cypress/e2e/journeys/portal/test-data/MIN-deal-unissued-facilities/dealThatJustNeedsDates.json b/e2e-tests/submit-to-trade-finance-manager/cypress/e2e/journeys/portal/test-data/MIN-deal-unissued-facilities/dealThatJustNeedsDates.json index 03dffaea7d..7c008b7c8b 100644 --- a/e2e-tests/submit-to-trade-finance-manager/cypress/e2e/journeys/portal/test-data/MIN-deal-unissued-facilities/dealThatJustNeedsDates.json +++ b/e2e-tests/submit-to-trade-finance-manager/cypress/e2e/journeys/portal/test-data/MIN-deal-unissued-facilities/dealThatJustNeedsDates.json @@ -74,7 +74,7 @@ "buyer-address-line-3" : "The Bronx", "buyer-address-postcode" : "no-idea", "buyer-address-town" : "New York", - "buyer-name" : "Huggy Bear", + "buyer-name" : "Harry Bear", "destinationOfGoodsAndServices" : { "code": "USA", "name": "United States" diff --git a/e2e-tests/submit-to-trade-finance-manager/cypress/e2e/journeys/portal/test-data/MIN-deal/dealThatJustNeedsDates.json b/e2e-tests/submit-to-trade-finance-manager/cypress/e2e/journeys/portal/test-data/MIN-deal/dealThatJustNeedsDates.json index d808b0a677..664f8373f5 100644 --- a/e2e-tests/submit-to-trade-finance-manager/cypress/e2e/journeys/portal/test-data/MIN-deal/dealThatJustNeedsDates.json +++ b/e2e-tests/submit-to-trade-finance-manager/cypress/e2e/journeys/portal/test-data/MIN-deal/dealThatJustNeedsDates.json @@ -74,7 +74,7 @@ "buyer-address-line-3" : "The Bronx", "buyer-address-postcode" : "no-idea", "buyer-address-town" : "New York", - "buyer-name" : "Huggy Bear", + "buyer-name" : "Harry Bear", "destinationOfGoodsAndServices" : { "code": "USA", "name": "United States" diff --git a/external-api/.eslintrc.js b/external-api/.eslintrc.js index a87ebc783d..f38e0608cd 100644 --- a/external-api/.eslintrc.js +++ b/external-api/.eslintrc.js @@ -69,5 +69,11 @@ module.exports = { '@typescript-eslint/no-unused-vars': 'off', '@typescript-eslint/ban-ts-comment': 'off', '@typescript-eslint/no-explicit-any': 'off', + 'no-use-before-define': [ + 'error', + { + functions: false, + }, + ], }, }; diff --git a/external-api/.prettierrc.json b/external-api/.prettierrc.json index a44a738767..3c5d0a81fd 100644 --- a/external-api/.prettierrc.json +++ b/external-api/.prettierrc.json @@ -1,18 +1,18 @@ { - "arrowParens": "always", - "bracketSameLine": false, - "bracketSpacing": true, - "embeddedLanguageFormatting": "auto", - "htmlWhitespaceSensitivity": "css", - "insertPragma": false, - "jsxSingleQuote": false, - "printWidth": 160, - "proseWrap": "preserve", - "quoteProps": "as-needed", - "requirePragma": false, - "semi": true, - "singleQuote": true, - "tabWidth": 2, - "trailingComma": "all", - "useTabs": false -} \ No newline at end of file + "arrowParens": "always", + "bracketSameLine": false, + "bracketSpacing": true, + "embeddedLanguageFormatting": "auto", + "htmlWhitespaceSensitivity": "css", + "insertPragma": false, + "jsxSingleQuote": false, + "printWidth": 160, + "proseWrap": "preserve", + "quoteProps": "as-needed", + "requirePragma": false, + "semi": true, + "singleQuote": true, + "tabWidth": 2, + "trailingComma": "all", + "useTabs": false +} diff --git a/external-api/src/utils/swagger-definitions/portal-bss-deal.ts b/external-api/src/utils/swagger-definitions/portal-bss-deal.ts index 9b83cc447d..a6c89667db 100644 --- a/external-api/src/utils/swagger-definitions/portal-bss-deal.ts +++ b/external-api/src/utils/swagger-definitions/portal-bss-deal.ts @@ -272,7 +272,7 @@ * example: United States * buyer-name: * type: string - * example: Huggy Bear + * example: Harry Bear * destinationOfGoodsAndServices: * type: object * properties: diff --git a/gef-ui/.eslintrc.js b/gef-ui/.eslintrc.js index 10f190dfeb..74e465984b 100644 --- a/gef-ui/.eslintrc.js +++ b/gef-ui/.eslintrc.js @@ -18,6 +18,12 @@ module.exports = { 'import/no-named-as-default': 'off', 'implicit-arrow-linebreak': 'off', 'import/no-extraneous-dependencies': ['error', { devDependencies: ['**/*.test.js', '**/*.spec.js', '**/webpack.*.js', '**/api-tests/**'] }], + 'no-use-before-define': [ + 'error', + { + functions: false, + }, + ], }, ignorePatterns: ['**/node_modules/**', '**/public/**'], parserOptions: { diff --git a/portal-api/.eslintrc.js b/portal-api/.eslintrc.js index 3dc3d9042c..8cffe76cc4 100644 --- a/portal-api/.eslintrc.js +++ b/portal-api/.eslintrc.js @@ -26,6 +26,12 @@ module.exports = { }], 'no-restricted-syntax': 'off', 'no-await-in-loop': 'off', + 'no-use-before-define': [ + 'error', + { + functions: false + } + ] }, parserOptions: { ecmaVersion: 2020, diff --git a/portal-api/.prettierrc.json b/portal-api/.prettierrc.json index a44a738767..3c5d0a81fd 100644 --- a/portal-api/.prettierrc.json +++ b/portal-api/.prettierrc.json @@ -1,18 +1,18 @@ { - "arrowParens": "always", - "bracketSameLine": false, - "bracketSpacing": true, - "embeddedLanguageFormatting": "auto", - "htmlWhitespaceSensitivity": "css", - "insertPragma": false, - "jsxSingleQuote": false, - "printWidth": 160, - "proseWrap": "preserve", - "quoteProps": "as-needed", - "requirePragma": false, - "semi": true, - "singleQuote": true, - "tabWidth": 2, - "trailingComma": "all", - "useTabs": false -} \ No newline at end of file + "arrowParens": "always", + "bracketSameLine": false, + "bracketSpacing": true, + "embeddedLanguageFormatting": "auto", + "htmlWhitespaceSensitivity": "css", + "insertPragma": false, + "jsxSingleQuote": false, + "printWidth": 160, + "proseWrap": "preserve", + "quoteProps": "as-needed", + "requirePragma": false, + "semi": true, + "singleQuote": true, + "tabWidth": 2, + "trailingComma": "all", + "useTabs": false +} diff --git a/portal-api/api-tests/fixtures/deal-fully-completed.js b/portal-api/api-tests/fixtures/deal-fully-completed.js index dbe9445969..ce49ae5558 100644 --- a/portal-api/api-tests/fixtures/deal-fully-completed.js +++ b/portal-api/api-tests/fixtures/deal-fully-completed.js @@ -468,7 +468,7 @@ const deal = { 'buyer-address-line-3': 'The Bronx', 'buyer-address-postcode': 'no-idea', 'buyer-address-town': 'New York', - 'buyer-name': 'Huggy Bear', + 'buyer-name': 'Harry Bear', destinationOfGoodsAndServices: { name: 'United States', code: 'USA', diff --git a/portal-api/api-tests/fixtures/deal-with-complete-about-section.json b/portal-api/api-tests/fixtures/deal-with-complete-about-section.json index 2f6f4b2345..4223ce6fd5 100644 --- a/portal-api/api-tests/fixtures/deal-with-complete-about-section.json +++ b/portal-api/api-tests/fixtures/deal-with-complete-about-section.json @@ -131,7 +131,7 @@ "buyer-address-line-3" : "The Bronx", "buyer-address-postcode" : "no-idea", "buyer-address-town" : "New York", - "buyer-name" : "Huggy Bear", + "buyer-name" : "Harry Bear", "destinationOfGoodsAndServices" : { "name": "United States", "code": "USA" diff --git a/portal/.eslintrc.js b/portal/.eslintrc.js index 87e87c736f..485be13200 100644 --- a/portal/.eslintrc.js +++ b/portal/.eslintrc.js @@ -22,6 +22,12 @@ module.exports = { consistent: true, }], 'no-restricted-syntax': 'off', + 'no-use-before-define': [ + 'error', + { + functions: false, + }, + ], }, ignorePatterns: ['**/node_modules/**', '**/public/**'], parserOptions: { diff --git a/portal/component-tests/bond/_macros/bond-submission-details.component-test.js b/portal/component-tests/bond/_macros/bond-submission-details.component-test.js index 3891cfcceb..d5a40ae596 100644 --- a/portal/component-tests/bond/_macros/bond-submission-details.component-test.js +++ b/portal/component-tests/bond/_macros/bond-submission-details.component-test.js @@ -1,5 +1,6 @@ const componentRenderer = require('../../componentRenderer'); const deal = require('../../fixtures/deal-fully-completed'); +const { MAKER } = require('../../../server/constants/roles'); const component = 'bond/_macros/bond-submission-details.njk'; const render = componentRenderer(component); @@ -7,7 +8,7 @@ const render = componentRenderer(component); describe(component, () => { let wrapper; const user = { - roles: ['maker'], + roles: [MAKER], timezone: 'Europe/London', }; diff --git a/portal/component-tests/contract/components/abandon-deal-link.component-test.js b/portal/component-tests/contract/components/abandon-deal-link.component-test.js index 133ef08566..adae85d5ef 100644 --- a/portal/component-tests/contract/components/abandon-deal-link.component-test.js +++ b/portal/component-tests/contract/components/abandon-deal-link.component-test.js @@ -2,11 +2,16 @@ const componentRenderer = require('../../componentRenderer'); const component = 'contract/components/abandon-deal-link.njk'; const render = componentRenderer(component); +const { MAKER } = require('../../../server/constants/roles'); +const { NON_MAKER_ROLES } = require('../../../test-helpers/common-role-lists'); describe(component, () => { describe('when viewed by a maker', () => { + const roles = [MAKER]; + + const mockUser = { _id: 123, roles }; + it("should be enabled for deals in status=Draft and status=Further Maker's input required", () => { - const user = { _id: 123, roles: ['maker'] }; const deals = [ { _id: '61f6fbaea2460c018a4189d7', @@ -15,20 +20,18 @@ describe(component, () => { }, { _id: '61f6fbaea2460c018a4189d7', - status: 'Further Maker\'s input required', + status: "Further Maker's input required", maker: { _id: 123 }, }, ]; for (const deal of deals) { - const wrapper = render({ user, deal }); - wrapper.expectLink('[data-cy="AbandonLink"]') - .toLinkTo(`/contract/${deal._id}/delete`, 'Abandon'); + const wrapper = render({ user: mockUser, deal }); + wrapper.expectLink('[data-cy="AbandonLink"]').toLinkTo(`/contract/${deal._id}/delete`, 'Abandon'); } }); it('should not render at all for deals in any other status', () => { - const user = { _id: 123, roles: ['maker'] }; const deals = [ { status: 'Submitted', @@ -55,38 +58,36 @@ describe(component, () => { maker: { _id: 123 }, }, { - status: 'Ready for Checker\'s approval', + status: "Ready for Checker's approval", maker: { _id: 123 }, }, ]; for (const deal of deals) { - const wrapper = render({ user, deal }); - wrapper.expectLink('[data-cy="AbandonLink"]') - .notToExist(); + const wrapper = render({ user: mockUser, deal }); + wrapper.expectLink('[data-cy="AbandonLink"]').notToExist(); } }); }); - describe('when viewed by a checker', () => { + describe.each(NON_MAKER_ROLES)('when viewed with the role %s', (nonMakerRole) => { it('should not render at all', () => { - const user = { roles: ['checker'] }; + const mockUser = { roles: [nonMakerRole] }; const deals = [ { status: 'Draft' }, - { status: 'Further Maker\'s input required' }, + { status: "Further Maker's input required" }, { status: 'Submitted' }, { status: 'Rejected by UKEF' }, { status: 'Abandoned' }, { status: 'Acknowledged' }, { status: 'Accepted by UKEF (without conditions)' }, { status: 'Accepted by UKEF (with conditions)' }, - { status: 'Ready for Checker\'s approval' }, + { status: "Ready for Checker's approval" }, ]; for (const deal of deals) { - const wrapper = render({ user, deal }); - wrapper.expectLink('[data-cy="AbandonLink"]') - .notToExist(); + const wrapper = render({ user: mockUser, deal }); + wrapper.expectLink('[data-cy="AbandonLink"]').notToExist(); } }); }); diff --git a/portal/component-tests/contract/components/bond-transactions-table.component-test.js b/portal/component-tests/contract/components/bond-transactions-table.component-test.js index a23bba6c0c..dafd0bc0e5 100644 --- a/portal/component-tests/contract/components/bond-transactions-table.component-test.js +++ b/portal/component-tests/contract/components/bond-transactions-table.component-test.js @@ -1,4 +1,8 @@ import moment from 'moment'; +import { READY_FOR_APPROVAL, UKEF_ACKNOWLEDGED } from '../../../server/constants/status'; + +const { MAKER, CHECKER } = require('../../../server/constants/roles'); +const { NON_MAKER_OR_CHECKER_ROLES } = require('../../../test-helpers/common-role-lists'); const componentRenderer = require('../../componentRenderer'); @@ -6,11 +10,9 @@ const component = 'contract/components/bond-transactions-table.njk'; const render = componentRenderer(component); describe(component, () => { - const user = { roles: ['maker'], timezone: 'Europe/London' }; - const deal = { submissionType: 'Manual Inclusion Application', - status: 'Ready for Checker\'s approval', + status: READY_FOR_APPROVAL, bondTransactions: { items: [ { @@ -41,102 +43,181 @@ describe(component, () => { }, }; - describe('table headings', () => { - it('should be rendered', () => { - const wrapper = render({ user, deal, confirmedRequestedCoverStartDates: [] }); - - wrapper.expectText('[data-cy="bonds-table-header-unique-number"]').toRead('Bond\'s unique number'); - wrapper.expectText('[data-cy="bonds-table-header-ukef-facility-id"]').toRead('UKEF facility ID'); - wrapper.expectText('[data-cy="bonds-table-header-status"]').toRead('Status'); - wrapper.expectText('[data-cy="bonds-table-header-value"]').toRead('Value'); - wrapper.expectText('[data-cy="bonds-table-header-stage"]').toRead('Stage'); - wrapper.expectText('[data-cy="bonds-table-header-start-date"]').toRead('Start date'); - wrapper.expectText('[data-cy="bonds-table-header-end-date"]').toRead('End date'); - wrapper.expectText('[data-cy="bonds-table-header-action"]').toRead('Action'); - }); - }); + const dealWithBondsThatCanChangeCoverDate = JSON.parse(JSON.stringify(deal)); + dealWithBondsThatCanChangeCoverDate.status = UKEF_ACKNOWLEDGED; + dealWithBondsThatCanChangeCoverDate.bondTransactions.items[0].facilityStage = 'Issued'; + dealWithBondsThatCanChangeCoverDate.bondTransactions.items[0].hasBeenIssued = true; + dealWithBondsThatCanChangeCoverDate.bondTransactions.items[0].issueFacilityDetailsSubmitted = true; + + dealWithBondsThatCanChangeCoverDate.bondTransactions.items[1].facilityStage = 'Issued'; + dealWithBondsThatCanChangeCoverDate.bondTransactions.items[1].hasBeenIssued = true; + dealWithBondsThatCanChangeCoverDate.bondTransactions.items[1].issueFacilityDetailsSubmitted = true; + + describe('when user is maker', () => { + const user = { roles: [MAKER], timezone: 'Europe/London' }; - describe('table rows', () => { - it('should render columns/elements/text for each bond', () => { - const wrapper = render({ - user, deal, confirmedRequestedCoverStartDates: [], editable: true, + commonTests(user); + + describe('table rows', () => { + it('should render columns/elements/text for each bond', () => { + const wrapper = render({ + user, + deal, + confirmedRequestedCoverStartDates: [], + editable: true, + }); + + deal.bondTransactions.items.forEach((facility) => { + const facilityIdSelector = `[data-cy="bond-${facility._id}"]`; + + wrapper.expectElement(`${facilityIdSelector} [data-cy="bond-issue-facility-${facility._id}"]`).toExist(); + }); }); + }); - deal.bondTransactions.items.forEach((facility) => { - const facilityIdSelector = `[data-cy="bond-${facility._id}"]`; + describe('when a bond Cover Date can be modified', () => { + it.only('should render `change or confirm cover start date` link and NOT `issue facility`', () => { + const wrapper = render({ + user, + deal: dealWithBondsThatCanChangeCoverDate, + confirmedRequestedCoverStartDates: [], + }); - wrapper.expectElement(`${facilityIdSelector} [data-cy="name-link-${facility._id}"]`).toExist(); + dealWithBondsThatCanChangeCoverDate.bondTransactions.items.forEach((facility) => { + const facilityIdSelector = `[data-cy="bond-${facility._id}"]`; - wrapper.expectText(`${facilityIdSelector} [data-cy="bond-ukef-facility-id-${facility._id}"]`).toRead(facility.ukefFacilityId); + wrapper.expectElement(`${facilityIdSelector} [data-cy="bond-change-or-confirm-cover-start-date-${facility._id}"]`).toExist(); - wrapper.expectText(`${facilityIdSelector} [data-cy="bond-status-${facility._id}"] [data-cy="status-tag"]`).toRead(facility.status); + wrapper.expectElement(`${facilityIdSelector} [data-cy="bond-issue-facility-${facility._id}"]`).notToExist(); + }); + }); + }); + }); - wrapper.expectText(`${facilityIdSelector} [data-cy="bond-facility-value"]`).toRead(`${facility.currency.id} ${facility.value}`); + describe('when user is checker', () => { + const user = { roles: [CHECKER], timezone: 'Europe/London' }; - wrapper.expectText(`${facilityIdSelector} [data-cy="facility-stage-${facility._id}"]`).toRead(facility.facilityStage); + commonTests(user); - wrapper.expectElement(`${facilityIdSelector} [data-cy="bond-requested-cover-start-date"]`).toExist(); + describe('table rows', () => { + it('should NOT render columns/elements/text for each bond', () => { + const wrapper = render({ + user, + deal, + confirmedRequestedCoverStartDates: [], + editable: true, + }); - wrapper.expectElement(`${facilityIdSelector} [data-cy="bond-cover-end-date"]`).toExist(); + deal.bondTransactions.items.forEach((facility) => { + const facilityIdSelector = `[data-cy="bond-${facility._id}"]`; - wrapper.expectElement(`${facilityIdSelector} [data-cy="bond-issue-facility-${facility._id}"]`).toExist(); + wrapper.expectElement(`${facilityIdSelector} [data-cy="bond-issue-facility-${facility._id}"]`).notToExist(); + }); }); }); describe('when a bond Cover Date can be modified', () => { - it('should render `change start date` link and NOT `issue facility link', () => { - const dealWithBondsThatCanChangeCoverDate = deal; - dealWithBondsThatCanChangeCoverDate.status = 'Acknowledged'; - dealWithBondsThatCanChangeCoverDate.bondTransactions.items[0].facilityStage = 'Issued'; - dealWithBondsThatCanChangeCoverDate.bondTransactions.items[0].hasBeenIssued = true; - dealWithBondsThatCanChangeCoverDate.bondTransactions.items[0].issueFacilityDetailsSubmitted = true; + it('should NOT render `issue facility` link and NOT `change or confirm cover start date`', () => { + const wrapper = render({ + user, + deal: dealWithBondsThatCanChangeCoverDate, + confirmedRequestedCoverStartDates: [], + }); + + dealWithBondsThatCanChangeCoverDate.bondTransactions.items.forEach((facility) => { + const facilityIdSelector = `[data-cy="bond-${facility._id}"]`; + + wrapper.expectElement(`${facilityIdSelector} [data-cy="bond-change-or-confirm-cover-start-date-${facility._id}"]`).notToExist(); + + wrapper.expectElement(`${facilityIdSelector} [data-cy="bond-issue-facility-${facility._id}"]`).notToExist(); + }); + }); + }); + }); + + describe.each(NON_MAKER_OR_CHECKER_ROLES)('when user is %s', (nonMakerOrCheckerRole) => { + const user = { roles: [nonMakerOrCheckerRole], timezone: 'Europe/London' }; - dealWithBondsThatCanChangeCoverDate.bondTransactions.items[1].facilityStage = 'Issued'; - dealWithBondsThatCanChangeCoverDate.bondTransactions.items[1].hasBeenIssued = true; - dealWithBondsThatCanChangeCoverDate.bondTransactions.items[1].issueFacilityDetailsSubmitted = true; + commonTests(user); + describe('table rows', () => { + it('should NOT render columns/elements/text for each bond', () => { const wrapper = render({ user, - deal: dealWithBondsThatCanChangeCoverDate, + deal, confirmedRequestedCoverStartDates: [], + editable: true, }); deal.bondTransactions.items.forEach((facility) => { const facilityIdSelector = `[data-cy="bond-${facility._id}"]`; - wrapper.expectElement(`${facilityIdSelector} [data-cy="bond-change-or-confirm-cover-start-date-${facility._id}"]`).toExist(); + wrapper.expectElement(`${facilityIdSelector} [data-cy="bond-issue-facility-${facility._id}"]`).notToExist(); + }); + }); + }); + + describe('when a bond Cover Date can be modified', () => { + it('should NOT render `issue facility` link and NOT `change or confirm cover start date`', () => { + const wrapper = render({ + user, + deal: dealWithBondsThatCanChangeCoverDate, + confirmedRequestedCoverStartDates: [], + }); + + dealWithBondsThatCanChangeCoverDate.bondTransactions.items.forEach((facility) => { + const facilityIdSelector = `[data-cy="bond-${facility._id}"]`; + + wrapper.expectElement(`${facilityIdSelector} [data-cy="bond-change-or-confirm-cover-start-date-${facility._id}"]`).notToExist(); wrapper.expectElement(`${facilityIdSelector} [data-cy="bond-issue-facility-${facility._id}"]`).notToExist(); }); }); + }); + }); - describe('when viewed by maker-checker role', () => { - const makerCheckerUser = { roles: ['maker', 'checker'], timezone: 'Europe/London' }; + function commonTests(user) { + describe('table headings', () => { + it('should be rendered', () => { + const wrapper = render({ user, deal, confirmedRequestedCoverStartDates: [] }); + wrapper.expectText('[data-cy="bonds-table-header-unique-number"]').toRead("Bond's unique number"); + wrapper.expectText('[data-cy="bonds-table-header-ukef-facility-id"]').toRead('UKEF facility ID'); + wrapper.expectText('[data-cy="bonds-table-header-status"]').toRead('Status'); + wrapper.expectText('[data-cy="bonds-table-header-value"]').toRead('Value'); + wrapper.expectText('[data-cy="bonds-table-header-stage"]').toRead('Stage'); + wrapper.expectText('[data-cy="bonds-table-header-start-date"]').toRead('Start date'); + wrapper.expectText('[data-cy="bonds-table-header-end-date"]').toRead('End date'); + wrapper.expectText('[data-cy="bonds-table-header-action"]').toRead('Action'); + }); + }); - it('should render `change start date` link', () => { - const dealWithBondsThatCanChangeCoverDate = deal; - dealWithBondsThatCanChangeCoverDate.status = 'Acknowledged'; - dealWithBondsThatCanChangeCoverDate.bondTransactions.items[0].facilityStage = 'Issued'; - dealWithBondsThatCanChangeCoverDate.bondTransactions.items[0].hasBeenIssued = true; - dealWithBondsThatCanChangeCoverDate.bondTransactions.items[0].issueFacilityDetailsSubmitted = true; + describe('table rows', () => { + it('should render columns/elements/text for each bond', () => { + const wrapper = render({ + user, + deal, + confirmedRequestedCoverStartDates: [], + editable: true, + }); + + deal.bondTransactions.items.forEach((facility) => { + const facilityIdSelector = `[data-cy="bond-${facility._id}"]`; + + wrapper.expectElement(`${facilityIdSelector} [data-cy="name-link-${facility._id}"]`).toExist(); + + wrapper.expectText(`${facilityIdSelector} [data-cy="bond-ukef-facility-id-${facility._id}"]`).toRead(facility.ukefFacilityId); - dealWithBondsThatCanChangeCoverDate.bondTransactions.items[1].facilityStage = 'Issued'; - dealWithBondsThatCanChangeCoverDate.bondTransactions.items[1].hasBeenIssued = true; - dealWithBondsThatCanChangeCoverDate.bondTransactions.items[1].issueFacilityDetailsSubmitted = true; + wrapper.expectText(`${facilityIdSelector} [data-cy="bond-status-${facility._id}"] [data-cy="status-tag"]`).toRead(facility.status); - const wrapper = render({ - user: makerCheckerUser, - deal: dealWithBondsThatCanChangeCoverDate, - confirmedRequestedCoverStartDates: [], - }); + wrapper.expectText(`${facilityIdSelector} [data-cy="bond-facility-value"]`).toRead(`${facility.currency.id} ${facility.value}`); - deal.bondTransactions.items.forEach((facility) => { - const facilityIdSelector = `[data-cy="bond-${facility._id}"]`; + wrapper.expectText(`${facilityIdSelector} [data-cy="facility-stage-${facility._id}"]`).toRead(facility.facilityStage); - wrapper.expectElement(`${facilityIdSelector} [data-cy="bond-change-or-confirm-cover-start-date-${facility._id}"]`).toExist(); - }); + wrapper.expectElement(`${facilityIdSelector} [data-cy="bond-requested-cover-start-date"]`).toExist(); + + wrapper.expectElement(`${facilityIdSelector} [data-cy="bond-cover-end-date"]`).toExist(); }); }); }); - }); + } }); diff --git a/portal/component-tests/contract/components/clone-deal-link.component-test.js b/portal/component-tests/contract/components/clone-deal-link.component-test.js index 62f3323fe8..3744a2f82a 100644 --- a/portal/component-tests/contract/components/clone-deal-link.component-test.js +++ b/portal/component-tests/contract/components/clone-deal-link.component-test.js @@ -2,50 +2,42 @@ const componentRenderer = require('../../componentRenderer'); const component = 'contract/components/clone-deal-link.njk'; const render = componentRenderer(component); +const { MAKER } = require('../../../server/constants/roles'); +const { NON_MAKER_ROLES } = require('../../../test-helpers/common-role-lists'); +const { DRAFT, CHANGES_REQUIRED, SUBMITTED_TO_UKEF, UKEF_REFUSED, ABANDONED, UKEF_ACKNOWLEDGED, UKEF_APPROVED_WITHOUT_CONDITIONS, UKEF_APPROVED_WITH_CONDITIONS, READY_FOR_APPROVAL } = require('../../../server/constants/status'); describe(component, () => { - describe('when viewed a maker', () => { - it('should be enabled', () => { - const user = { roles: ['maker'] }; - const deals = [ - { _id: '61f6fbaea2460c018a4189d1', status: 'Draft' }, - { _id: '61f6fbaea2460c018a4189d2', status: "Further Maker's input required" }, - { _id: '61f6fbaea2460c018a4189d3', status: 'Submitted' }, - { _id: '61f6fbaea2460c018a4189d4', status: 'Rejected by UKEF' }, - { _id: '61f6fbaea2460c018a4189d5', status: 'Abandoned' }, - { _id: '61f6fbaea2460c018a4189d6', status: 'Acknowledged' }, - { _id: '61f6fbaea2460c018a4189d7', status: 'Accepted by UKEF (without conditions)' }, - { _id: '61f6fbaea2460c018a4189d8', status: 'Accepted by UKEF (with conditions)' }, - { _id: '61f6fbaea2460c018a4189d9', status: "Ready for Checker's approval" }, - ]; + const deals = [ + { _id: '61f6fbaea2460c018a4189d1', status: DRAFT }, + { _id: '61f6fbaea2460c018a4189d2', status: CHANGES_REQUIRED }, + { _id: '61f6fbaea2460c018a4189d3', status: SUBMITTED_TO_UKEF }, + { _id: '61f6fbaea2460c018a4189d4', status: UKEF_REFUSED }, + { _id: '61f6fbaea2460c018a4189d5', status: ABANDONED }, + { _id: '61f6fbaea2460c018a4189d6', status: UKEF_ACKNOWLEDGED }, + { _id: '61f6fbaea2460c018a4189d7', status: UKEF_APPROVED_WITHOUT_CONDITIONS }, + { _id: '61f6fbaea2460c018a4189d8', status: UKEF_APPROVED_WITH_CONDITIONS }, + { _id: '61f6fbaea2460c018a4189d9', status: READY_FOR_APPROVAL }, + ]; + + describe('when viewed with the role maker', () => { + const roles = [MAKER]; + const mockUser = { roles }; + it('should be enabled', () => { for (const deal of deals) { - const wrapper = render({ user, deal }); - wrapper.expectLink('[data-cy="clone-deal-link"]') - .toLinkTo(`/contract/${deal._id}/clone/before-you-start`, 'Clone'); + const wrapper = render({ user: mockUser, deal }); + wrapper.expectLink('[data-cy="clone-deal-link"]').toLinkTo(`/contract/${deal._id}/clone/before-you-start`, 'Clone'); } }); }); - describe('when viewed by a checker', () => { + describe.each(NON_MAKER_ROLES)('when viewed with the role %s', (nonMakerRole) => { it('should not render at all', () => { - const user = { roles: ['checker'] }; - const deals = [ - { _id: '61f6fbaea2460c018a4189d1', status: 'Draft' }, - { _id: '61f6fbaea2460c018a4189d2', status: "Further Maker's input required" }, - { _id: '61f6fbaea2460c018a4189d3', status: 'Submitted' }, - { _id: '61f6fbaea2460c018a4189d4', status: 'Rejected by UKEF' }, - { _id: '61f6fbaea2460c018a4189d5', status: 'Abandoned' }, - { _id: '61f6fbaea2460c018a4189d6', status: 'Acknowledged' }, - { _id: '61f6fbaea2460c018a4189d7', status: 'Accepted by UKEF (without conditions)' }, - { _id: '61f6fbaea2460c018a4189d8', status: 'Accepted by UKEF (with conditions)' }, - { _id: '61f6fbaea2460c018a4189d9', status: "Ready for Checker's approval" }, - ]; + const mockUser = { roles: [nonMakerRole] }; for (const deal of deals) { - const wrapper = render({ user, deal }); - wrapper.expectLink('[data-cy="clone-deal-link"]') - .notToExist(); + const wrapper = render({ user: mockUser, deal }); + wrapper.expectLink('[data-cy="clone-deal-link"]').notToExist(); } }); }); diff --git a/portal/component-tests/contract/components/contract-actions.component-test.js b/portal/component-tests/contract/components/contract-actions.component-test.js new file mode 100644 index 0000000000..c6c601a3a4 --- /dev/null +++ b/portal/component-tests/contract/components/contract-actions.component-test.js @@ -0,0 +1,112 @@ +const { MAKER, CHECKER } = require('../../../server/constants/roles'); +const { NON_MAKER_OR_CHECKER_ROLES } = require('../../../test-helpers/common-role-lists'); + +const componentRenderer = require('../../componentRenderer'); + +const component = 'contract/components/contract-actions.njk'; +const render = componentRenderer(component); + +describe(component, () => { + const draftAndFurtherInputRequiredDeals = [ + { _id: 1, status: 'Draft', submissionType: 'Draft submission' }, + { _id: 2, status: "Further Maker's input required", submissionType: "Further Maker's input required submission" }, + ]; + + const readyForCheckerApprovalDeals = [{ _id: 3, status: "Ready for Checker's approval", submissionType: "Ready for Checker's approval submission" }]; + + const otherDeals = [ + { _id: 4, status: 'Rejected by UKEF', submissionType: 'Rejected by UKEF submission' }, + { _id: 5, status: 'Abandoned', submissionType: 'Abandoned submission' }, + { _id: 6, status: 'Acknowledged', submissionType: 'Acknowledged submission' }, + { _id: 7, status: 'Accepted by UKEF (without conditions)', submissionType: 'Accepted by UKEF (without conditions) submission' }, + { _id: 8, status: 'Accepted by UKEF (with conditions)', submissionType: 'Accepted by UKEF (with conditions) submission' }, + { _id: 9, status: 'Rejected by UKEF', submissionType: 'Rejected by UKEF submission' }, + { _id: 10, status: 'Submitted', submissionType: 'Submitted submission' }, + { _id: 11, status: 'In progress by UKEF', submissionType: 'In progress by UKEF submission' }, + ]; + + describe('when viewed by a maker', () => { + const user = { roles: [MAKER] }; + + describe('When dealFormsCompleted is true', () => { + const dealFormsCompleted = true; + + it('should render proceed to submit link', () => { + for (const deal of draftAndFurtherInputRequiredDeals) { + const wrapper = render({ user, dealFormsCompleted, deal }); + wrapper.expectText('[data-cy="canProceed"]').toRead(`You may now proceed to submit an ${deal.submissionType}.`); + } + }); + + it('should be disabled for deals in all other states', () => { + for (const deal of [...readyForCheckerApprovalDeals, ...otherDeals]) { + const wrapper = render({ user, dealFormsCompleted, deal }); + wrapper.expectText('[data-cy="canProceed"]').notToExist(); + } + }); + }); + + describe('When dealFormsCompleted is false', () => { + const dealFormsCompleted = false; + + it('should render please complete all form sections', () => { + for (const deal of draftAndFurtherInputRequiredDeals) { + const wrapper = render({ user, dealFormsCompleted, deal }); + wrapper.expectText('[data-cy="canProceed"]').toRead('Please complete all form sections in order to submit your Supply Contract.'); + } + }); + + it('should be disabled for deals in all other states', () => { + for (const deal of [...readyForCheckerApprovalDeals, ...otherDeals]) { + const wrapper = render({ user, dealFormsCompleted, deal }); + wrapper.expectText('[data-cy="canProceed"]').notToExist(); + } + }); + }); + }); + + describe('when viewed by a checker', () => { + const user = { roles: [CHECKER] }; + + describe('When dealFormsCompleted is true', () => { + const dealFormsCompleted = true; + + it('should render proceed to submit link', () => { + for (const deal of readyForCheckerApprovalDeals) { + const wrapper = render({ user, dealFormsCompleted, deal }); + wrapper.expectText('[data-cy="canProceed"]').toRead(`You may now proceed to submit an ${deal.submissionType}.`); + } + }); + + it('should be disabled for deals in all other states', () => { + for (const deal of [...draftAndFurtherInputRequiredDeals, ...otherDeals]) { + const wrapper = render({ user, dealFormsCompleted, deal }); + wrapper.expectText('[data-cy="canProceed"]').notToExist(); + } + }); + }); + + describe('When dealFormsCompleted is false', () => { + const dealFormsCompleted = false; + + it('should be disabled for deals in any state', () => { + for (const deal of [...readyForCheckerApprovalDeals, ...draftAndFurtherInputRequiredDeals, ...otherDeals]) { + const wrapper = render({ user, dealFormsCompleted, deal }); + wrapper.expectText('[data-cy="canProceed"]').notToExist(); + } + }); + }); + }); + + describe.each(NON_MAKER_OR_CHECKER_ROLES)('when viewed with the role %s', (otherRole) => { + const user = { roles: otherRole }; + describe.each([true, false])('when dealFormsCompleted is %s', (dealFormsCompleted) => { + it('should be disabled for deals in any state', () => { + for (const deal of [...readyForCheckerApprovalDeals, ...draftAndFurtherInputRequiredDeals, ...otherDeals]) { + const wrapper = render({ user, dealFormsCompleted, deal }); + wrapper.expectText('[data-cy="canProceed"]').notToExist(); + } + }); + }); + }); +}); diff --git a/portal/component-tests/contract/components/contract-actions/abandon-deal-button.component-test.js b/portal/component-tests/contract/components/contract-actions/abandon-deal-button.component-test.js index 034ed6a9a0..d20109f638 100644 --- a/portal/component-tests/contract/components/contract-actions/abandon-deal-button.component-test.js +++ b/portal/component-tests/contract/components/contract-actions/abandon-deal-button.component-test.js @@ -1,56 +1,56 @@ const componentRenderer = require('../../../componentRenderer'); +const { MAKER } = require('../../../../server/constants/roles'); +const { NON_MAKER_ROLES } = require('../../../../test-helpers/common-role-lists'); const component = 'contract/components/contract-actions/abandon-deal-button.njk'; const render = componentRenderer(component); describe(component, () => { + const dealsDraftAndFurtherMakersInputRequired = [ + { + _id: 1, + status: 'Draft', + maker: { _id: 123 }, + }, + { + _id: 2, + status: "Further Maker's input required", + maker: { _id: 123 }, + }, + ]; + + const dealsSubmittedAndRejectedByUKEF = [ + { + _id: 1, + status: 'Submitted', + maker: { _id: 123 }, + }, + { + _id: 2, + status: 'Rejected by UKEF', + maker: { _id: 123 }, + }, + ]; + describe('when viewed by a maker', () => { - it("should be enabled for deals in status=Draft and status=Further Maker's input required", () => { - const user = { _id: 123, roles: ['maker'] }; - const deals = [ - { - _id: 1, - status: 'Draft', - maker: { _id: 123 }, - }, - { - _id: 2, - status: "Further Maker's input required", - maker: { _id: 123 }, - }, - ]; + const roles = [MAKER]; + const user = { _id: 123, roles }; - for (const deal of deals) { + it("should be enabled for deals in status=Draft and status=Further Maker's input required", () => { + for (const deal of dealsDraftAndFurtherMakersInputRequired) { const wrapper = render({ user, deal }); - wrapper.expectSecondaryButton('[data-cy="Abandon"]') - .toLinkTo(`/contract/${deal._id}/delete`, 'Abandon'); + wrapper.expectSecondaryButton('[data-cy="Abandon"]').toLinkTo(`/contract/${deal._id}/delete`, 'Abandon'); } }); it('should not render at all for deals in status=Submitted and status=Rejected by UKEF', () => { - const user = { _id: 123, roles: ['maker'] }; - const deals = [ - { - _id: 1, - status: 'Submitted', - maker: { _id: 123 }, - }, - { - _id: 2, - status: 'Rejected by UKEF', - maker: { _id: 123 }, - }, - ]; - - for (const deal of deals) { + for (const deal of dealsSubmittedAndRejectedByUKEF) { const wrapper = render({ user, deal }); - wrapper.expectSecondaryButton('[data-cy="Abandon"]') - .notToExist(); + wrapper.expectSecondaryButton('[data-cy="Abandon"]').notToExist(); } }); it('should be disabled for deals in all other states', () => { - const user = { _id: 123, roles: ['maker'] }; const deals = [ { _id: 1, @@ -81,40 +81,17 @@ describe(component, () => { for (const deal of deals) { const wrapper = render({ user, deal }); - wrapper.expectSecondaryButton('[data-cy="Abandon"]') - .toBeDisabled(); + wrapper.expectSecondaryButton('[data-cy="Abandon"]').toBeDisabled(); } }); }); - describe('when viewed by a checker', () => { + describe.each(NON_MAKER_ROLES)('when viewed with the role %s', (nonMakerRole) => { + const user = { _id: 123, roles: [nonMakerRole] }; it('should not render at all', () => { - const user = { _id: 123, roles: ['checker'] }; - const deals = [ - { _id: 1, status: 'Draft', maker: { _id: 123 } }, - { _id: 2, status: "Further Maker's input required", maker: { _id: 123 } }, - ]; - - for (const deal of deals) { - const wrapper = render({ user, deal }); - wrapper.expectSecondaryButton('[data-cy="Abandon"]') - .notToExist(); - } - }); - }); - - describe('when viewed by a user with maker AND checker role', () => { - it('should render', () => { - const user = { _id: 123, roles: ['maker', 'checker'] }; - const deals = [ - { _id: 1, status: 'Draft', maker: { _id: 123 } }, - { _id: 2, status: "Further Maker's input required", maker: { _id: 123 } }, - ]; - - for (const deal of deals) { + for (const deal of dealsDraftAndFurtherMakersInputRequired) { const wrapper = render({ user, deal }); - wrapper.expectSecondaryButton('[data-cy="Abandon"]') - .toLinkTo(`/contract/${deal._id}/delete`, 'Abandon'); + wrapper.expectSecondaryButton('[data-cy="Abandon"]').notToExist(); } }); }); diff --git a/portal/component-tests/contract/components/contract-actions/proceed-to-review-button.component-test.js b/portal/component-tests/contract/components/contract-actions/proceed-to-review-button.component-test.js index bad1c17285..e0cbc9f9b8 100644 --- a/portal/component-tests/contract/components/contract-actions/proceed-to-review-button.component-test.js +++ b/portal/component-tests/contract/components/contract-actions/proceed-to-review-button.component-test.js @@ -1,3 +1,5 @@ +const { MAKER, CHECKER } = require('../../../../server/constants/roles'); +const { NON_MAKER_ROLES } = require('../../../../test-helpers/common-role-lists'); const componentRenderer = require('../../../componentRenderer'); const component = 'contract/components/contract-actions/proceed-to-review-button.njk'; @@ -5,8 +7,9 @@ const render = componentRenderer(component); describe(component, () => { describe('when viewed by a maker', () => { + const user = { roles: [MAKER] }; + it("should be enabled for deals in status=Draft and status=Further Maker's input required and when dealFormsCompleted flag is true", () => { - const user = { roles: ['maker'] }; const deals = [ { _id: 1, status: 'Draft' }, { _id: 2, status: "Further Maker's input required" }, @@ -16,49 +19,46 @@ describe(component, () => { for (const deal of deals) { const wrapper = render({ user, deal, dealFormsCompleted }); - wrapper.expectPrimaryButton('[data-cy="ProceedToReview"]') - .toLinkTo(`/contract/${deal._id}/ready-for-review`, 'Proceed to review'); + wrapper.expectPrimaryButton('[data-cy="ProceedToReview"]').toLinkTo(`/contract/${deal._id}/ready-for-review`, 'Proceed to review'); } }); it('should be enabled for deals in status=Acknowledged with dealHasIssuedFacilitiesToSubmit flag set to true', () => { - const user = { roles: ['maker'] }; - const deals = [ - { _id: 1, status: 'Acknowledged' }, - ]; + const deals = [{ _id: 1, status: 'Acknowledged' }]; const dealFormsCompleted = true; const dealHasIssuedFacilitiesToSubmit = true; for (const deal of deals) { const wrapper = render({ - user, deal, dealFormsCompleted, dealHasIssuedFacilitiesToSubmit, + user, + deal, + dealFormsCompleted, + dealHasIssuedFacilitiesToSubmit, }); - wrapper.expectPrimaryButton('[data-cy="ProceedToReview"]') - .toLinkTo(`/contract/${deal._id}/ready-for-review`, 'Proceed to review'); + wrapper.expectPrimaryButton('[data-cy="ProceedToReview"]').toLinkTo(`/contract/${deal._id}/ready-for-review`, 'Proceed to review'); } }); - it('should be enabled for deals in status=`Acknowledged`, `Ready for Checker\'s approval`, `Further Maker\'s input required` when dealHasIssuedFacilitiesToSubmit flag set to true and dealFormsCompleted flag set to false', () => { - const user = { roles: ['maker'] }; + it("should be enabled for deals in status=`Acknowledged`, `Ready for Checker's approval`, `Further Maker's input required` when dealHasIssuedFacilitiesToSubmit flag set to true and dealFormsCompleted flag set to false", () => { const deals = [ { _id: 1, status: 'Acknowledged' }, - { _id: 4, status: 'Ready for Checker\'s approval' }, + { _id: 4, status: "Ready for Checker's approval" }, ]; const dealHasIssuedFacilitiesToSubmit = true; for (const deal of deals) { const wrapper = render({ - user, deal, dealHasIssuedFacilitiesToSubmit, + user, + deal, + dealHasIssuedFacilitiesToSubmit, }); - wrapper.expectPrimaryButton('[data-cy="ProceedToReview"]') - .toLinkTo(`/contract/${deal._id}/ready-for-review`, 'Proceed to review'); + wrapper.expectPrimaryButton('[data-cy="ProceedToReview"]').toLinkTo(`/contract/${deal._id}/ready-for-review`, 'Proceed to review'); } }); it('should not be enabled for deals in status=`Accepted by UKEF (with conditions)`, `Accepted by UKEF (without conditions)`, until facility start dates confirmed', () => { - const user = { roles: ['maker'] }; const deals = [ { _id: 1, status: 'Accepted by UKEF (with conditions)' }, { _id: 2, status: 'Accepted by UKEF (without conditions)' }, @@ -66,14 +66,16 @@ describe(component, () => { for (const deal of deals) { const wrapper = render({ - user, deal, dealFormsCompleted: true, allRequestedCoverStartDatesConfirmed: false, + user, + deal, + dealFormsCompleted: true, + allRequestedCoverStartDatesConfirmed: false, }); wrapper.expectPrimaryButton('[data-cy="ProceedToReview"]').toBeDisabled(); } }); it('should be enabled for deals in status=`Accepted by UKEF (with conditions)`, `Accepted by UKEF (without conditions)` and all facility start dates confirmed', () => { - const user = { roles: ['maker'] }; const deals = [ { _id: 1, status: 'Accepted by UKEF (with conditions)' }, { _id: 2, status: 'Accepted by UKEF (without conditions)' }, @@ -81,15 +83,16 @@ describe(component, () => { for (const deal of deals) { const wrapper = render({ - user, deal, dealFormsCompleted: true, allRequestedCoverStartDatesConfirmed: true, + user, + deal, + dealFormsCompleted: true, + allRequestedCoverStartDatesConfirmed: true, }); - wrapper.expectPrimaryButton('[data-cy="ProceedToReview"]') - .toLinkTo(`/contract/${deal._id}/ready-for-review`, 'Proceed to review'); + wrapper.expectPrimaryButton('[data-cy="ProceedToReview"]').toLinkTo(`/contract/${deal._id}/ready-for-review`, 'Proceed to review'); } }); it('should not be enabled for deals in status=`Accepted by UKEF (with conditions)`, `Accepted by UKEF (without conditions)` and no dealHasIssuedFacilitiesToSubmit', () => { - const user = { roles: ['maker'] }; const deals = [ { _id: 1, status: 'Accepted by UKEF (with conditions)' }, { _id: 2, status: 'Accepted by UKEF (without conditions)' }, @@ -97,14 +100,16 @@ describe(component, () => { for (const deal of deals) { const wrapper = render({ - user, deal, dealFormsCompleted: true, allRequestedCoverStartDatesConfirmed: false, + user, + deal, + dealFormsCompleted: true, + allRequestedCoverStartDatesConfirmed: false, }); wrapper.expectPrimaryButton('[data-cy="ProceedToReview"]').toBeDisabled(); } }); it('should be enabled for deals in status=`Accepted by UKEF (with conditions)`, `Accepted by UKEF (without conditions)` and dealHasIssuedFacilitiesToSubmit', () => { - const user = { roles: ['maker'] }; const deals = [ { _id: 1, status: 'Accepted by UKEF (with conditions)' }, { _id: 2, status: 'Accepted by UKEF (without conditions)' }, @@ -112,15 +117,16 @@ describe(component, () => { for (const deal of deals) { const wrapper = render({ - user, deal, dealFormsCompleted: true, dealHasIssuedFacilitiesToSubmit: true, + user, + deal, + dealFormsCompleted: true, + dealHasIssuedFacilitiesToSubmit: true, }); - wrapper.expectPrimaryButton('[data-cy="ProceedToReview"]') - .toLinkTo(`/contract/${deal._id}/ready-for-review`, 'Proceed to review'); + wrapper.expectPrimaryButton('[data-cy="ProceedToReview"]').toLinkTo(`/contract/${deal._id}/ready-for-review`, 'Proceed to review'); } }); it('should not render at all for deals in status=Submitted and status=Rejected by UKEF', () => { - const user = { roles: ['maker'] }; const deals = [ { _id: 1, status: 'Submitted' }, { _id: 2, status: 'Rejected by UKEF' }, @@ -128,13 +134,11 @@ describe(component, () => { for (const deal of deals) { const wrapper = render({ user, deal }); - wrapper.expectPrimaryButton('[data-cy="ProceedToReview"]') - .notToExist(); + wrapper.expectPrimaryButton('[data-cy="ProceedToReview"]').notToExist(); } }); it('should be disabled when dealFormsCompleted and dealHasIssuedFacilitiesToSubmit flags are false', () => { - const user = { roles: ['maker'] }; const deals = [ { _id: 1, status: 'Draft' }, { _id: 2, status: "Further Maker's input required" }, @@ -147,33 +151,34 @@ describe(component, () => { for (const deal of deals) { const wrapper = render({ - user, deal, dealFormsCompleted, dealHasIssuedFacilitiesToSubmit, + user, + deal, + dealFormsCompleted, + dealHasIssuedFacilitiesToSubmit, }); - wrapper.expectPrimaryButton('[data-cy="ProceedToReview"]') - .toBeDisabled(); + wrapper.expectPrimaryButton('[data-cy="ProceedToReview"]').toBeDisabled(); } }); it('should be disabled for deals in all other states', () => { - const user = { roles: ['maker'] }; const deals = [ { _id: 1, status: 'Draft' }, - { _id: 2, status: 'Further Maker\'s input required' }, + { _id: 2, status: "Further Maker's input required" }, { _id: 3, status: 'Abandoned' }, { _id: 4, status: 'Acknowledged' }, ]; for (const deal of deals) { const wrapper = render({ user, deal }); - wrapper.expectPrimaryButton('[data-cy="ProceedToReview"]') - .toBeDisabled(); + wrapper.expectPrimaryButton('[data-cy="ProceedToReview"]').toBeDisabled(); } }); }); - describe('when viewed by a checker', () => { + describe.each(NON_MAKER_ROLES)('when viewed with roles %s', (nonMakerRole) => { + const user = { roles: nonMakerRole }; + it('should not render at all', () => { - const user = { roles: ['checker'] }; const deals = [ { _id: 1, status: 'Draft' }, { _id: 2, status: "Further Maker's input required" }, @@ -188,21 +193,20 @@ describe(component, () => { for (const deal of deals) { const wrapper = render({ user, deal }); - wrapper.expectPrimaryButton('[data-cy="ProceedToReview"]') - .notToExist(); + wrapper.expectPrimaryButton('[data-cy="ProceedToReview"]').notToExist(); } }); }); + // TODO DTFS2-6508: Remove maker checker role describe('when viewed by a maker checker', () => { - it('should not render at all for deals in status=Ready for Checker\'s approval with dealFormsCompleted flag set to true', () => { - const user = { roles: ['maker', 'checker'] }; + it("should not render at all for deals in status=Ready for Checker's approval with dealFormsCompleted flag set to true", () => { + const user = { roles: [MAKER, CHECKER] }; const deal = { _id: 4, status: "Ready for Checker's approval" }; const dealFormsCompleted = true; const wrapper = render({ user, deal, dealFormsCompleted }); - wrapper.expectPrimaryButton('[data-cy="ProceedToReview"]') - .notToExist(); + wrapper.expectPrimaryButton('[data-cy="ProceedToReview"]').notToExist(); }); }); }); diff --git a/portal/component-tests/contract/components/contract-actions/proceed-to-submit-button.component-test.js b/portal/component-tests/contract/components/contract-actions/proceed-to-submit-button.component-test.js index 0547356778..d089945d47 100644 --- a/portal/component-tests/contract/components/contract-actions/proceed-to-submit-button.component-test.js +++ b/portal/component-tests/contract/components/contract-actions/proceed-to-submit-button.component-test.js @@ -1,62 +1,116 @@ +const { CHECKER, MAKER } = require('../../../../server/constants/roles'); +const { NON_CHECKER_ROLES } = require('../../../../test-helpers/common-role-lists'); + const componentRenderer = require('../../../componentRenderer'); const component = 'contract/components/contract-actions/proceed-to-submit-button.njk'; const render = componentRenderer(component); describe(component, () => { - describe('when viewed by a checker with userCanSubmit param set to true', () => { - it("should be enabled for deals in status=Ready for Checker's approval", () => { - const user = { roles: ['checker'] }; - const deals = [ - { _id: 1, status: "Ready for Checker's approval" }, - ]; - const userCanSubmit = true; + const checkerRoleTests = () => { + const user = { roles: [CHECKER] }; + + describe('when userCanSubmit param set to false', () => { + it('should not render at all', () => { + const deals = [ + { _id: 1, status: "Ready for Checker's approval" }, + { _id: 2, status: 'Submitted' }, + { _id: 3, status: 'Rejected by UKEF' }, + { _id: 4, status: 'Draft' }, + { _id: 5, status: "Further Maker's input required" }, + { _id: 6, status: 'Abandoned' }, + { _id: 7, status: 'Acknowledged' }, + { _id: 8, status: 'Accepted by UKEF (without conditions)' }, + { _id: 9, status: 'Accepted by UKEF (with conditions)' }, + ]; + const userCanSubmit = false; + + for (const deal of deals) { + const wrapper = render({ user, deal, userCanSubmit }); + wrapper.expectPrimaryButton('[data-cy="ProceedToSubmit"]').notToExist(); + } + }); + }); - for (const deal of deals) { - const wrapper = render({ user, deal, userCanSubmit }); - wrapper.expectPrimaryButton('[data-cy="ProceedToSubmit"]') - .toLinkTo(`/contract/${deal._id}/confirm-submission`, 'Proceed to submit'); - } + describe('when userCanSubmit param is true', () => { + it("should be enabled for deals in status=Ready for Checker's approval", () => { + const deals = [{ _id: 1, status: "Ready for Checker's approval" }]; + const userCanSubmit = true; + + for (const deal of deals) { + const wrapper = render({ user, deal, userCanSubmit }); + wrapper.expectPrimaryButton('[data-cy="ProceedToSubmit"]').toLinkTo(`/contract/${deal._id}/confirm-submission`, 'Proceed to submit'); + } + }); + + it('should not render at all for deals in status=Submitted and status=Rejected by UKEF', () => { + const deals = [ + { _id: 1, status: 'Submitted' }, + { _id: 2, status: 'Rejected by UKEF' }, + ]; + const userCanSubmit = true; + + for (const deal of deals) { + const wrapper = render({ user, deal, userCanSubmit }); + wrapper.expectPrimaryButton('[data-cy="ProceedToSubmit"]').notToExist(); + } + }); + + it('should be disabled for deals in all other states', () => { + const deals = [ + { _id: 1, status: 'Draft' }, + { _id: 2, status: 'Abandoned' }, + { _id: 3, status: 'Acknowledged' }, + { _id: 4, status: 'Accepted by UKEF (without conditions)' }, + { _id: 5, status: 'Accepted by UKEF (with conditions)' }, + { _id: 6, status: 'In progress by UKEF' }, + ]; + const userCanSubmit = true; + + for (const deal of deals) { + const wrapper = render({ user, deal, userCanSubmit }); + wrapper.expectPrimaryButton('[data-cy="ProceedToSubmit"]').toBeDisabled(); + } + }); }); + }; - it('should not render at all for deals in status=Submitted and status=Rejected by UKEF', () => { - const user = { roles: ['checker'] }; + function nonCheckerRoleTests(nonCheckerRole) { + it('should not render at all', () => { + const user = { roles: nonCheckerRole }; const deals = [ - { _id: 1, status: 'Submitted' }, + { _id: 1, status: 'Draft' }, { _id: 2, status: 'Rejected by UKEF' }, + { _id: 3, status: 'Abandoned' }, + { _id: 4, status: 'Acknowledged' }, + { _id: 5, status: 'Accepted by UKEF (without conditions)' }, + { _id: 6, status: 'Accepted by UKEF (with conditions)' }, + { _id: 7, status: "Ready for Checker's approval" }, + { _id: 8, status: 'Rejected by UKEF' }, + { _id: 9, status: 'Submitted' }, + { _id: 10, status: 'In progress by UKEF' }, + ]; - const userCanSubmit = true; for (const deal of deals) { - const wrapper = render({ user, deal, userCanSubmit }); - wrapper.expectPrimaryButton('[data-cy="ProceedToSubmit"]') - .notToExist(); + const wrapper = render({ user, deal }); + wrapper.expectPrimaryButton('[data-cy="ProceedToSubmit"]').notToExist(); } }); + } - it('should be disabled for deals in all other states', () => { - const user = { roles: ['checker'] }; - const deals = [ - { _id: 1, status: 'Draft' }, - { _id: 2, status: 'Abandoned' }, - { _id: 3, status: 'Acknowledged' }, - { _id: 4, status: 'Accepted by UKEF (without conditions)' }, - { _id: 5, status: 'Accepted by UKEF (with conditions)' }, - { _id: 6, status: 'In progress by UKEF' }, - ]; - const userCanSubmit = true; + describe('when viewed by a checker', () => { + checkerRoleTests(); + }); - for (const deal of deals) { - const wrapper = render({ user, deal, userCanSubmit }); - wrapper.expectPrimaryButton('[data-cy="ProceedToSubmit"]') - .toBeDisabled(); - } - }); + describe.each(NON_CHECKER_ROLES)('when viewed with the role %s', (nonCheckerRole) => { + nonCheckerRoleTests(nonCheckerRole); }); + // TODO DTFS2-6508: Remove maker checker role describe('when viewed by a user with checker AND maker roles, with userCanSubmit param set to true', () => { it('should be enabled', () => { - const user = { roles: ['maker', 'checker'] }; + const user = { roles: [MAKER, CHECKER] }; const deals = [ { _id: 1, status: 'Submitted' }, { _id: 2, status: 'Rejected by UKEF' }, @@ -65,16 +119,13 @@ describe(component, () => { for (const deal of deals) { const wrapper = render({ user, deal, userCanSubmit }); - wrapper.expectPrimaryButton('[data-cy="ProceedToSubmit"]') - .toLinkTo(`/contract/${deal._id}/confirm-submission`, 'Proceed to submit'); + wrapper.expectPrimaryButton('[data-cy="ProceedToSubmit"]').toLinkTo(`/contract/${deal._id}/confirm-submission`, 'Proceed to submit'); } }); it('should NOT render when deal status is `Draft`', () => { - const user = { roles: ['maker', 'checker'] }; - const deals = [ - { _id: 1, status: 'Draft' }, - ]; + const user = { roles: [MAKER, CHECKER] }; + const deals = [{ _id: 1, status: 'Draft' }]; const userCanSubmit = true; for (const deal of deals) { @@ -83,11 +134,9 @@ describe(component, () => { } }); - it('should NOT render when deal status is `Further Maker\'s input required`', () => { - const user = { roles: ['maker', 'checker'] }; - const deals = [ - { _id: 1, status: 'Further Maker\'s input required' }, - ]; + it("should NOT render when deal status is `Further Maker's input required`", () => { + const user = { roles: [MAKER, CHECKER] }; + const deals = [{ _id: 1, status: "Further Maker's input required" }]; const userCanSubmit = true; for (const deal of deals) { @@ -97,10 +146,8 @@ describe(component, () => { }); it('should NOT render when deal status is `Acknowledged`', () => { - const user = { roles: ['maker', 'checker'] }; - const deals = [ - { _id: 1, status: 'Further Maker\'s input required' }, - ]; + const user = { roles: [MAKER, CHECKER] }; + const deals = [{ _id: 1, status: "Further Maker's input required" }]; const userCanSubmit = true; for (const deal of deals) { @@ -110,10 +157,8 @@ describe(component, () => { }); it('should NOT render when deal status is `In progress by UKEF`', () => { - const user = { roles: ['maker', 'checker'] }; - const deals = [ - { _id: 1, status: 'In progress by UKEF' }, - ]; + const user = { roles: [MAKER, CHECKER] }; + const deals = [{ _id: 1, status: 'In progress by UKEF' }]; const userCanSubmit = true; for (const deal of deals) { @@ -123,10 +168,8 @@ describe(component, () => { }); it('should NOT render when deal status is `Accepted by UKEF (without conditions)`', () => { - const user = { roles: ['maker', 'checker'] }; - const deals = [ - { _id: 1, status: 'Accepted by UKEF (without conditions)' }, - ]; + const user = { roles: [MAKER, CHECKER] }; + const deals = [{ _id: 1, status: 'Accepted by UKEF (without conditions)' }]; const userCanSubmit = true; for (const deal of deals) { @@ -136,10 +179,8 @@ describe(component, () => { }); it('should NOT render when deal status is `Accepted by UKEF (with conditions)`', () => { - const user = { roles: ['maker', 'checker'] }; - const deals = [ - { _id: 1, status: 'Accepted by UKEF (with conditions)' }, - ]; + const user = { roles: [MAKER, CHECKER] }; + const deals = [{ _id: 1, status: 'Accepted by UKEF (with conditions)' }]; const userCanSubmit = true; for (const deal of deals) { @@ -148,50 +189,4 @@ describe(component, () => { } }); }); - - describe('when viewed by a checker with userCanSubmit param set to false', () => { - it('should not render at all', () => { - const user = { roles: ['checker'] }; - const deals = [ - { _id: 1, status: 'Ready for Checker\'s approval' }, - { _id: 2, status: 'Submitted' }, - { _id: 3, status: 'Rejected by UKEF' }, - { _id: 4, status: 'Draft' }, - { _id: 5, status: 'Further Maker\'s input required' }, - { _id: 6, status: 'Abandoned' }, - { _id: 7, status: 'Acknowledged' }, - { _id: 8, status: 'Accepted by UKEF (without conditions)' }, - { _id: 9, status: 'Accepted by UKEF (with conditions)' }, - ]; - const userCanSubmit = false; - - for (const deal of deals) { - const wrapper = render({ user, deal, userCanSubmit }); - wrapper.expectPrimaryButton('[data-cy="ProceedToSubmit"]').notToExist(); - } - }); - }); - - describe('when viewed by a maker', () => { - it('should not render at all', () => { - const user = { roles: ['maker'] }; - const deals = [ - { _id: 1, status: 'Submitted' }, - { _id: 2, status: 'Rejected by UKEF' }, - { _id: 3, status: 'Abandoned' }, - { _id: 4, status: 'Acknowledged' }, - { _id: 5, status: 'Accepted by UKEF (without conditions)' }, - { _id: 6, status: 'Accepted by UKEF (with conditions)' }, - { _id: 7, status: "Ready for Checker's approval" }, - { _id: 8, status: 'Submitted' }, - { _id: 9, status: 'Rejected by UKEF' }, - ]; - - for (const deal of deals) { - const wrapper = render({ user, deal }); - wrapper.expectPrimaryButton('[data-cy="ProceedToSubmit"]') - .notToExist(); - } - }); - }); }); diff --git a/portal/component-tests/contract/components/contract-actions/return-to-maker-button.component-test.js b/portal/component-tests/contract/components/contract-actions/return-to-maker-button.component-test.js index b5cebc41bf..2a08161c2c 100644 --- a/portal/component-tests/contract/components/contract-actions/return-to-maker-button.component-test.js +++ b/portal/component-tests/contract/components/contract-actions/return-to-maker-button.component-test.js @@ -1,62 +1,105 @@ +const { MAKER, CHECKER } = require('../../../../server/constants/roles'); +const { NON_CHECKER_ROLES } = require('../../../../test-helpers/common-role-lists'); const componentRenderer = require('../../../componentRenderer'); const component = 'contract/components/contract-actions/return-to-maker-button.njk'; const render = componentRenderer(component); describe(component, () => { - describe('when viewed by a checker with userCanSubmit param set to true', () => { - it("should be enabled for deals in status=Ready for Checker's approval", () => { - const user = { roles: ['checker'] }; - const deals = [ - { _id: 1, status: "Ready for Checker's approval" }, - ]; - const userCanSubmit = true; + describe('when viewed by a checker', () => { + const user = { roles: [CHECKER] }; + + describe('when userCanSubmit param set to true', () => { + it("should be enabled for deals in status=Ready for Checker's approval", () => { + const deals = [{ _id: 1, status: "Ready for Checker's approval" }]; + const userCanSubmit = true; + + for (const deal of deals) { + const wrapper = render({ user, deal, userCanSubmit }); + wrapper.expectSecondaryButton('[data-cy="ReturnToMaker"]').toLinkTo(`/contract/${deal._id}/return-to-maker`, 'Return to Maker'); + } + }); + + it('should not render at all for deals in status=Submitted and status=Rejected by UKEF', () => { + const deals = [ + { _id: 1, status: 'Submitted' }, + { _id: 2, status: 'Rejected by UKEF' }, + ]; + const userCanSubmit = true; + + for (const deal of deals) { + const wrapper = render({ user, deal, userCanSubmit }); + wrapper.expectSecondaryButton('[data-cy="ReturnToMaker"]').notToExist(); + } + }); + + it('should be disabled for deals in all other states', () => { + const deals = [ + { _id: 1, status: 'Draft' }, + { _id: 2, status: 'Abandoned' }, + { _id: 3, status: 'Acknowledged' }, + { _id: 4, status: 'Accepted by UKEF (without conditions)' }, + { _id: 5, status: 'Accepted by UKEF (with conditions)' }, + { _id: 6, status: 'In progress by UKEF' }, + ]; + const userCanSubmit = true; + + for (const deal of deals) { + const wrapper = render({ user, deal, userCanSubmit }); + wrapper.expectSecondaryButton('[data-cy="ReturnToMaker"]').toBeDisabled(); + } + }); + }); - for (const deal of deals) { - const wrapper = render({ user, deal, userCanSubmit }); - wrapper.expectSecondaryButton('[data-cy="ReturnToMaker"]') - .toLinkTo(`/contract/${deal._id}/return-to-maker`, 'Return to Maker'); - } + describe('when userCanSubmit param set to false', () => { + it('should not render at all', () => { + const deals = [ + { _id: 1, status: "Ready for Checker's approval" }, + { _id: 2, status: 'Submitted' }, + { _id: 3, status: 'Rejected by UKEF' }, + { _id: 4, status: 'Draft' }, + { _id: 5, status: "Further Maker's input required" }, + { _id: 6, status: 'Abandoned' }, + { _id: 7, status: 'Acknowledged' }, + { _id: 8, status: 'Accepted by UKEF (without conditions)' }, + { _id: 9, status: 'Accepted by UKEF (with conditions)' }, + ]; + const userCanSubmit = false; + + for (const deal of deals) { + const wrapper = render({ user, deal, userCanSubmit }); + wrapper.expectPrimaryButton('[data-cy="ProceedToSubmit"]').notToExist(); + } + }); }); + }); - it('should not render at all for deals in status=Submitted and status=Rejected by UKEF', () => { - const user = { roles: ['checker'] }; + describe.each(NON_CHECKER_ROLES)('when viewed with the role %s', (nonCheckerRole) => { + const user = { roles: nonCheckerRole }; + it('should not render at all', () => { const deals = [ { _id: 1, status: 'Submitted' }, { _id: 2, status: 'Rejected by UKEF' }, + { _id: 3, status: 'Abandoned' }, + { _id: 4, status: 'Acknowledged' }, + { _id: 5, status: 'Accepted by UKEF (without conditions)' }, + { _id: 6, status: 'Accepted by UKEF (with conditions)' }, + { _id: 7, status: "Ready for Checker's approval" }, + { _id: 8, status: 'Submitted' }, + { _id: 9, status: 'Rejected by UKEF' }, ]; - const userCanSubmit = true; - - for (const deal of deals) { - const wrapper = render({ user, deal, userCanSubmit }); - wrapper.expectSecondaryButton('[data-cy="ReturnToMaker"]') - .notToExist(); - } - }); - - it('should be disabled for deals in all other states', () => { - const user = { roles: ['checker'] }; - const deals = [ - { _id: 1, status: 'Draft' }, - { _id: 2, status: 'Abandoned' }, - { _id: 3, status: 'Acknowledged' }, - { _id: 4, status: 'Accepted by UKEF (without conditions)' }, - { _id: 5, status: 'Accepted by UKEF (with conditions)' }, - { _id: 6, status: 'In progress by UKEF' }, - ]; - const userCanSubmit = true; for (const deal of deals) { - const wrapper = render({ user, deal, userCanSubmit }); - wrapper.expectSecondaryButton('[data-cy="ReturnToMaker"]') - .toBeDisabled(); + const wrapper = render({ user, deal }); + wrapper.expectSecondaryButton('[data-cy="ReturnToMaker"]').notToExist(); } }); }); + // TODO DTFS2-6508: Remove maker checker role describe('when viewed by a user with checker AND maker roles, with userCanSubmit param set to true', () => { it('should be enabled', () => { - const user = { roles: ['maker', 'checker'] }; + const user = { roles: [MAKER, CHECKER] }; const deals = [ { _id: 1, status: 'Submitted' }, { _id: 2, status: 'Rejected by UKEF' }, @@ -65,16 +108,13 @@ describe(component, () => { for (const deal of deals) { const wrapper = render({ user, deal, userCanSubmit }); - wrapper.expectSecondaryButton('[data-cy="ReturnToMaker"]') - .toLinkTo(`/contract/${deal._id}/return-to-maker`, 'Return to Maker'); + wrapper.expectSecondaryButton('[data-cy="ReturnToMaker"]').toLinkTo(`/contract/${deal._id}/return-to-maker`, 'Return to Maker'); } }); it('should NOT render when deal status is `Draft`', () => { - const user = { roles: ['maker', 'checker'] }; - const deals = [ - { _id: 1, status: 'Draft' }, - ]; + const user = { roles: [MAKER, CHECKER] }; + const deals = [{ _id: 1, status: 'Draft' }]; const userCanSubmit = true; for (const deal of deals) { @@ -83,11 +123,9 @@ describe(component, () => { } }); - it('should NOT render when deal status is `Further Maker\'s input required`', () => { - const user = { roles: ['maker', 'checker'] }; - const deals = [ - { _id: 1, status: 'Further Maker\'s input required' }, - ]; + it("should NOT render when deal status is `Further Maker's input required`", () => { + const user = { roles: [MAKER, CHECKER] }; + const deals = [{ _id: 1, status: "Further Maker's input required" }]; const userCanSubmit = true; for (const deal of deals) { @@ -97,10 +135,8 @@ describe(component, () => { }); it('should NOT render when deal status is `Acknowledged`', () => { - const user = { roles: ['maker', 'checker'] }; - const deals = [ - { _id: 1, status: 'Further Maker\'s input required' }, - ]; + const user = { roles: [MAKER, CHECKER] }; + const deals = [{ _id: 1, status: "Further Maker's input required" }]; const userCanSubmit = true; for (const deal of deals) { @@ -110,10 +146,8 @@ describe(component, () => { }); it('should NOT render when deal status is `In progress by UKEF`', () => { - const user = { roles: ['maker', 'checker'] }; - const deals = [ - { _id: 1, status: 'In progress by UKEF' }, - ]; + const user = { roles: [MAKER, CHECKER] }; + const deals = [{ _id: 1, status: 'In progress by UKEF' }]; const userCanSubmit = true; for (const deal of deals) { @@ -123,10 +157,8 @@ describe(component, () => { }); it('should NOT render when deal status is `Accepted by UKEF (without conditions)`', () => { - const user = { roles: ['maker', 'checker'] }; - const deals = [ - { _id: 1, status: 'Accepted by UKEF (without conditions)' }, - ]; + const user = { roles: [MAKER, CHECKER] }; + const deals = [{ _id: 1, status: 'Accepted by UKEF (without conditions)' }]; const userCanSubmit = true; for (const deal of deals) { @@ -136,10 +168,8 @@ describe(component, () => { }); it('should NOT render when deal status is `Accepted by UKEF (out conditions)`', () => { - const user = { roles: ['maker', 'checker'] }; - const deals = [ - { _id: 1, status: 'Accepted by UKEF (with conditions)' }, - ]; + const user = { roles: [MAKER, CHECKER] }; + const deals = [{ _id: 1, status: 'Accepted by UKEF (with conditions)' }]; const userCanSubmit = true; for (const deal of deals) { @@ -148,50 +178,4 @@ describe(component, () => { } }); }); - - describe('when viewed by a checker with userCanSubmit param set to false', () => { - it('should not render at all', () => { - const user = { roles: ['checker'] }; - const deals = [ - { _id: 1, status: 'Ready for Checker\'s approval' }, - { _id: 2, status: 'Submitted' }, - { _id: 3, status: 'Rejected by UKEF' }, - { _id: 4, status: 'Draft' }, - { _id: 5, status: 'Further Maker\'s input required' }, - { _id: 6, status: 'Abandoned' }, - { _id: 7, status: 'Acknowledged' }, - { _id: 8, status: 'Accepted by UKEF (without conditions)' }, - { _id: 9, status: 'Accepted by UKEF (with conditions)' }, - ]; - const userCanSubmit = false; - - for (const deal of deals) { - const wrapper = render({ user, deal, userCanSubmit }); - wrapper.expectPrimaryButton('[data-cy="ProceedToSubmit"]').notToExist(); - } - }); - }); - - describe('when viewed by a maker', () => { - it('should not render at all', () => { - const user = { roles: ['maker'] }; - const deals = [ - { _id: 1, status: 'Submitted' }, - { _id: 2, status: 'Rejected by UKEF' }, - { _id: 3, status: 'Abandoned' }, - { _id: 4, status: 'Acknowledged' }, - { _id: 5, status: 'Accepted by UKEF (without conditions)' }, - { _id: 6, status: 'Accepted by UKEF (with conditions)' }, - { _id: 7, status: "Ready for Checker's approval" }, - { _id: 8, status: 'Submitted' }, - { _id: 9, status: 'Rejected by UKEF' }, - ]; - - for (const deal of deals) { - const wrapper = render({ user, deal }); - wrapper.expectSecondaryButton('[data-cy="ReturnToMaker"]') - .notToExist(); - } - }); - }); }); diff --git a/portal/component-tests/contract/components/contract-actions/review-eligibility-checklist-link.component-test.js b/portal/component-tests/contract/components/contract-actions/review-eligibility-checklist-link.component-test.js index 9801ee8096..9f2e307749 100644 --- a/portal/component-tests/contract/components/contract-actions/review-eligibility-checklist-link.component-test.js +++ b/portal/component-tests/contract/components/contract-actions/review-eligibility-checklist-link.component-test.js @@ -1,25 +1,28 @@ +const { CHECKER, MAKER } = require('../../../../server/constants/roles'); +const { NON_MAKER_OR_CHECKER_ROLES } = require('../../../../test-helpers/common-role-lists'); const componentRenderer = require('../../../componentRenderer'); const component = 'contract/components/contract-actions/review-eligibility-checklist-link.njk'; const render = componentRenderer(component); describe(component, () => { - describe('when viewed by a checker', () => { + const checkerOrMakerRoles = [CHECKER, MAKER]; + + describe.each(checkerOrMakerRoles)('when viewed with the role %s', (checkerOrMakerRole) => { + const user = { roles: checkerOrMakerRole }; + it("should display for deals in status=Ready for Checker's approval", () => { - const user = { roles: ['checker'] }; - const deals = [ - { _id: 1, status: "Ready for Checker's approval" }, - ]; + const deals = [{ _id: 1, status: "Ready for Checker's approval" }]; for (const deal of deals) { const wrapper = render({ user, deal }); - wrapper.expectLink('[data-cy="reviewEligibilityChecklistForm"]') + wrapper + .expectLink('[data-cy="reviewEligibilityChecklistForm"]') .toLinkTo(`/contract/${deal._id}/submission-details#eligibility-criteria`, 'Review your eligibility checklist form'); } }); it('should not render at all for deals in any other status', () => { - const user = { roles: ['checker'] }; const deals = [ { _id: 1, status: 'Draft' }, { _id: 2, status: "Further Maker's input required" }, @@ -33,28 +36,14 @@ describe(component, () => { for (const deal of deals) { const wrapper = render({ user, deal }); - wrapper.expectText('[data-cy="reviewEligibilityChecklistForm"]') - .notToExist(); + wrapper.expectText('[data-cy="reviewEligibilityChecklistForm"]').notToExist(); } }); }); - describe('when viewed by a maker', () => { - it("should display for deals in status=Ready for Checker's approval", () => { - const user = { roles: ['maker'] }; - const deals = [ - { _id: 1, status: "Ready for Checker's approval" }, - ]; - - for (const deal of deals) { - const wrapper = render({ user, deal }); - wrapper.expectLink('[data-cy="reviewEligibilityChecklistForm"]') - .toLinkTo(`/contract/${deal._id}/submission-details#eligibility-criteria`, 'Review your eligibility checklist form'); - } - }); - - it('should not render at all for deals in any other status', () => { - const user = { roles: ['checker'] }; + describe.each(NON_MAKER_OR_CHECKER_ROLES)('when viewed with the role %s', (nonCheckerOrMakerRole) => { + const user = { roles: nonCheckerOrMakerRole }; + it('should not render at all for deals in any status', () => { const deals = [ { _id: 1, status: 'Draft' }, { _id: 2, status: "Further Maker's input required" }, @@ -64,12 +53,12 @@ describe(component, () => { { _id: 6, status: 'Acknowledged' }, { _id: 7, status: 'Accepted by UKEF (without conditions)' }, { _id: 8, status: 'Accepted by UKEF (with conditions)' }, + { _id: 9, status: "Ready for Checker's approval" }, ]; for (const deal of deals) { const wrapper = render({ user, deal }); - wrapper.expectText('[data-cy="reviewEligibilityChecklistForm"]') - .notToExist(); + wrapper.expectText('[data-cy="reviewEligibilityChecklistForm"]').notToExist(); } }); }); diff --git a/portal/component-tests/contract/components/edit-deal-name-link.component-test.js b/portal/component-tests/contract/components/edit-deal-name-link.component-test.js index 041e017ac5..fc29a4b04e 100644 --- a/portal/component-tests/contract/components/edit-deal-name-link.component-test.js +++ b/portal/component-tests/contract/components/edit-deal-name-link.component-test.js @@ -1,3 +1,6 @@ +const { MAKER } = require('../../../server/constants/roles'); +const { NON_MAKER_ROLES } = require('../../../test-helpers/common-role-lists'); + const componentRenderer = require('../../componentRenderer'); const component = 'contract/components/edit-deal-name-link.njk'; @@ -5,8 +8,9 @@ const render = componentRenderer(component); describe(component, () => { describe('when viewed by the maker who created the deal', () => { + const user = { _id: 123, roles: [MAKER] }; + it("should be enabled for deals in status=Draft and status=Further Maker's input required", () => { - const user = { _id: 123, roles: ['maker'] }; const deals = [ { _id: '61f6fbaea2460c018a4189d7', @@ -15,20 +19,18 @@ describe(component, () => { }, { _id: '61f6fbaea2460c018a4189d8', - status: 'Further Maker\'s input required', + status: "Further Maker's input required", maker: { _id: 123 }, }, ]; for (const deal of deals) { const wrapper = render({ user, deal }); - wrapper.expectLink('[data-cy="EditDealName"]') - .toLinkTo(`/contract/${deal._id}/edit-name`, 'Edit deal name'); + wrapper.expectLink('[data-cy="EditDealName"]').toLinkTo(`/contract/${deal._id}/edit-name`, 'Edit deal name'); } }); it('should not render at all for deals in any other status', () => { - const user = { _id: 123, roles: ['maker'] }; const deals = [ { status: 'Submitted', @@ -59,29 +61,29 @@ describe(component, () => { }, { _id: 7, - status: 'Ready for Checker\'s approval', + status: "Ready for Checker's approval", maker: { _id: 123 }, }, ]; for (const deal of deals) { const wrapper = render({ user, deal }); - wrapper.expectLink('[data-cy="EditDealName"]') - .notToExist(); + wrapper.expectLink('[data-cy="EditDealName"]').notToExist(); } }); }); describe('when viewed by a maker who did not create the deal', () => { + const user = { _id: 987, roles: [MAKER] }; + it('should not render at all', () => { - const user = { _id: 666, roles: ['maker'] }; const deals = [ { status: 'Draft', maker: { _id: 123 }, }, { - status: 'Further Maker\'s input required', + status: "Further Maker's input required", maker: { _id: 123 }, }, { @@ -109,38 +111,36 @@ describe(component, () => { maker: { _id: 123 }, }, { - status: 'Ready for Checker\'s approval', + status: "Ready for Checker's approval", maker: { _id: 123 }, }, ]; for (const deal of deals) { const wrapper = render({ user, deal }); - wrapper.expectLink('[data-cy="EditDealName"]') - .notToExist(); + wrapper.expectLink('[data-cy="EditDealName"]').notToExist(); } }); }); - describe('when viewed by a checker', () => { + describe.each(NON_MAKER_ROLES)('when viewed by a %s', (nonMakerRole) => { it('should not render at all', () => { - const user = { roles: ['checker'] }; + const user = { roles: [nonMakerRole] }; const deals = [ { status: 'Draft' }, - { status: 'Further Maker\'s input required' }, + { status: "Further Maker's input required" }, { status: 'Submitted' }, { status: 'Rejected by UKEF' }, { status: 'Abandoned' }, { status: 'Acknowledged' }, { status: 'Accepted by UKEF (without conditions)' }, { status: 'Accepted by UKEF (with conditions)' }, - { status: 'Ready for Checker\'s approval' }, + { status: "Ready for Checker's approval" }, ]; for (const deal of deals) { const wrapper = render({ user, deal }); - wrapper.expectLink('[data-cy="EditDealName"]') - .notToExist(); + wrapper.expectLink('[data-cy="EditDealName"]').notToExist(); } }); }); diff --git a/portal/component-tests/contract/components/forms-incomplete-text.component-test.js b/portal/component-tests/contract/components/forms-incomplete-text.component-test.js index 1fd99930a6..c7b9b189cd 100644 --- a/portal/component-tests/contract/components/forms-incomplete-text.component-test.js +++ b/portal/component-tests/contract/components/forms-incomplete-text.component-test.js @@ -1,3 +1,6 @@ +const { MAKER } = require('../../../server/constants/roles'); +const { NON_MAKER_ROLES } = require('../../../test-helpers/common-role-lists'); + const componentRenderer = require('../../componentRenderer'); const component = 'contract/components/forms-incomplete-text.njk'; @@ -6,7 +9,7 @@ const render = componentRenderer(component); describe(component, () => { describe('when viewed by a maker', () => { it("should display when deal status=Draft and status=Further Maker's input required and canFullyCalculateDealSummary flag is false", () => { - const user = { roles: ['maker'] }; + const user = { roles: [MAKER] }; const deals = [ { _id: 1, status: 'Draft' }, { _id: 2, status: "Further Maker's input required" }, @@ -21,4 +24,15 @@ describe(component, () => { } }); }); + + describe.each(NON_MAKER_ROLES)('when viewed by a %s', (nonMakerRole) => { + it('should not display', () => { + const user = { roles: [nonMakerRole] }; + const deal = { _id: 1, status: 'Draft' }; + const canFullyCalculateDealSummary = false; + + const wrapper = render({ user, deal, canFullyCalculateDealSummary }); + wrapper.expectElement('[data-cy="forms-incomplete"]').notToExist(); + }); + }); }); diff --git a/portal/component-tests/contract/components/issue-or-delete-facility-link.component-test.js b/portal/component-tests/contract/components/issue-or-delete-facility-link.component-test.js index 0c7bbb3716..f086e5d7c4 100644 --- a/portal/component-tests/contract/components/issue-or-delete-facility-link.component-test.js +++ b/portal/component-tests/contract/components/issue-or-delete-facility-link.component-test.js @@ -1,24 +1,32 @@ const componentRenderer = require('../../componentRenderer'); +const { MAKER } = require('../../../server/constants/roles'); +const { NON_MAKER_ROLES } = require('../../../test-helpers/common-role-lists'); const component = 'contract/components/issue-or-delete-facility-link.njk'; const render = componentRenderer(component); describe(component, () => { - describe('when viewed a maker', () => { + const facilityName = 'Loan'; + + describe('when viewed as a maker', () => { + const user = { roles: [MAKER] }; + describe('with facility.canIssueOrEditIssueFacility', () => { - const user = { roles: ['maker'] }; const deal = { _id: '5f3ab3f705e6630007dcfb20' }; const facility = { _id: '5f3ab3f705e6630007dcfb21', canIssueOrEditIssueFacility: true, }; - const facilityName = 'Loan'; it('should render a link to issue facility page', () => { const wrapper = render({ - user, deal, facility, facilityName, + user, + deal, + facility, + facilityName, }); - wrapper.expectLink(`[data-cy="${facilityName}-issue-facility-${facility._id}"]`) + wrapper + .expectLink(`[data-cy="${facilityName}-issue-facility-${facility._id}"]`) .toLinkTo(`/contract/${deal._id}/${facilityName}/${facility._id}/issue-facility`, 'Issue facility'); }); @@ -27,32 +35,214 @@ describe(component, () => { facility.issueFacilityDetailsStarted = true; facility.issueFacilityDetailsProvided = true; const wrapper = render({ - user, deal, facility, facilityName, + user, + deal, + facility, + facilityName, }); - wrapper.expectLink(`[data-cy="${facilityName}-issue-facility-${facility._id}"]`) + wrapper + .expectLink(`[data-cy="${facilityName}-issue-facility-${facility._id}"]`) .toLinkTo(`/contract/${deal._id}/${facilityName}/${facility._id}/issue-facility`, 'Facility issued'); }); }); }); - describe('when facility or deal status is Submitted/Ready for check/Acknowledged/Ready for Checker\'s approval and facility.issueFacilityDetailsProvided', () => { - it('should render a link to submission details page with facility anchor', () => { - const user = { roles: ['maker'] }; + describe("when facility or deal status is Submitted/Ready for check/Acknowledged/Ready for Checker's approval", () => { + describe('when facility.issueFacilityDetailsProvided', () => { const mockFacility = { _id: '5f3ab3f705e6630007dcfb22', issueFacilityDetailsProvided: true, }; - const facilityName = 'Loan'; + it('should render a link to submission details page with facility anchor', () => { + const deals = [{ _id: '5f3ab3f705e6630007dcfb20', status: "Ready for Checker's approval" }]; + + deals.forEach((deal) => { + const wrapper = render({ + user, + deal, + facility: mockFacility, + facilityName, + }); + wrapper + .expectLink(`[data-cy="${facilityName}-issue-facility-${mockFacility._id}"]`) + .toLinkTo(`/contract/${deal._id}/submission-details#${facilityName}-${mockFacility._id}`, 'Facility issued'); + }); + + const facilities = [ + { _id: '5f3ab3f705e6630007dcfb24', status: 'Submitted', issueFacilityDetailsProvided: true }, + { _id: '5f3ab3f705e6630007dcfb25', status: 'Ready for check', issueFacilityDetailsProvided: true }, + { _id: '5f3ab3f705e6630007dcfb26', status: 'Acknowledged', issueFacilityDetailsProvided: true }, + ]; + + const deal = { _id: '5f3ab3f705e6630007dcfb22' }; + + facilities.forEach((facility) => { + const wrapper = render({ + user, + deal, + facility, + facilityName, + }); + wrapper + .expectLink(`[data-cy="${facilityName}-issue-facility-${facility._id}"]`) + .toLinkTo(`/contract/${deal._id}/submission-details#${facilityName}-${facility._id}`, 'Facility issued'); + }); + }); + }); + + describe('when facility.issueFacilityDetailsProvided is false', () => { + const mockFacility = { + _id: '5f3ab3f705e6630007dcfb22', + issueFacilityDetailsProvided: false, + }; + it('should NOT render any text', () => { + const deals = [{ _id: '5f3ab3f705e6630007dcfb20', status: "Ready for Checker's approval" }]; + + deals.forEach((deal) => { + const wrapper = render({ + user, + deal, + facility: mockFacility, + facilityName, + }); + wrapper.expectText(`[data-cy="${facilityName}-issue-facility-${mockFacility._id}"]`).notToExist(); + }); + + const facilities = [ + { _id: '5f3ab3f705e6630007dcfb24', status: 'Submitted', issueFacilityDetailsProvided: true }, + { _id: '5f3ab3f705e6630007dcfb25', status: 'Ready for check', issueFacilityDetailsProvided: true }, + { _id: '5f3ab3f705e6630007dcfb26', status: 'Acknowledged', issueFacilityDetailsProvided: true }, + ]; + + const deal = { _id: '5f3ab3f705e6630007dcfb22' }; + + facilities.forEach((facility) => { + const wrapper = render({ + user, + deal, + facility, + facilityName, + }); + wrapper + .expectLink(`[data-cy="${facilityName}-issue-facility-${facility._id}"]`) + .toLinkTo(`/contract/${deal._id}/submission-details#${facilityName}-${facility._id}`, 'Facility issued'); + }); + }); + }); + }); + + describe("when deal has not been submitted, is editable, and has `Draft` or `Further Maker's input required` status", () => { + it('should render a link to delete with text using Delete Name if name present', () => { + const facility = { _id: '5f3ab3f705e6630007dcfb22', type: 'Loan', name: 'test name' }; + + const facilityTableIndex = 1; const deals = [ - { _id: '5f3ab3f705e6630007dcfb20', status: 'Ready for Checker\'s approval' }, + { _id: '5f3ab3f705e6630007dcfb21', status: 'Draft' }, + { _id: '5f3ab3f705e6630007dcfb22', status: "Further Maker's input required" }, ]; deals.forEach((deal) => { const wrapper = render({ - user, deal, facility: mockFacility, facilityName, + user, + deal, + facility, + facilityName, + facilityTableIndex, + editable: true, }); - wrapper.expectLink(`[data-cy="${facilityName}-issue-facility-${mockFacility._id}"]`) + wrapper + .expectLink(`[data-cy="${facilityName}-delete-${facility._id}"]`) + .toLinkTo(`/contract/${deal._id}/${facilityName}/${facility._id}/delete`, `Delete ${facility.name}`); + // add facility name / facility type tests + wrapper.expectAriaLabel(`[data-cy="${facilityName}-delete-${facility._id}"]`).toEqual(`Delete ${facility.type} ${facility.name}`); + }); + }); + + it('should render a link to delete with text using Delete Type if name not present', () => { + const facility = { _id: '5f3ab3f705e6630007dcfb22', type: 'Loan' }; + + const facilityTableIndex = 1; + + const deals = [ + { _id: '5f3ab3f705e6630007dcfb21', status: 'Draft' }, + { _id: '5f3ab3f705e6630007dcfb22', status: "Further Maker's input required" }, + ]; + + deals.forEach((deal) => { + const wrapper = render({ + user, + deal, + facility, + facilityName, + facilityTableIndex, + editable: true, + }); + wrapper + .expectLink(`[data-cy="${facilityName}-delete-${facility._id}"]`) + .toLinkTo(`/contract/${deal._id}/${facilityName}/${facility._id}/delete`, `Delete ${facility.type.toLowerCase()}`); + // add facility name / facility type tests + wrapper.expectAriaLabel(`[data-cy="${facilityName}-delete-${facility._id}"]`).toEqual(`Delete ${facility.type} ${facilityTableIndex}`); + }); + }); + }); + }); + + describe.each(NON_MAKER_ROLES)('when viewed as %s', (nonMakerRole) => { + const user = { roles: [nonMakerRole] }; + + describe('with facility.canIssueOrEditIssueFacility', () => { + const deal = { _id: '5f3ab3f705e6630007dcfb20' }; + const facility = { + _id: '5f3ab3f705e6630007dcfb21', + canIssueOrEditIssueFacility: true, + }; + + it('should NOT render any text', () => { + const wrapper = render({ + user, + deal, + facility, + facilityName, + }); + wrapper.expectText(`[data-cy="${facilityName}-issue-facility-${facility._id}"]`).notToExist(); + }); + + describe('with facility.issueFacilityDetailsStarted and facility.issueFacilityDetailsProvided', () => { + it('should NOT render a link to issue facility page with `Facility issued` text', () => { + facility.issueFacilityDetailsStarted = true; + facility.issueFacilityDetailsProvided = true; + const wrapper = render({ + user, + deal, + facility, + facilityName, + }); + wrapper + .expectLink(`[data-cy="${facilityName}-issue-facility-${facility._id}"]`) + .toLinkTo(`/contract/${deal._id}/submission-details#${facilityName}-${facility._id}`, 'Facility issued'); + }); + }); + }); + + describe("when facility or deal status is Submitted/Ready for check/Acknowledged/Ready for Checker's approval and facility.issueFacilityDetailsProvided", () => { + it('should render a link to submission details page with facility anchor', () => { + const mockFacility = { + _id: '5f3ab3f705e6630007dcfb22', + issueFacilityDetailsProvided: true, + }; + + const deals = [{ _id: '5f3ab3f705e6630007dcfb20', status: "Ready for Checker's approval" }]; + + deals.forEach((deal) => { + const wrapper = render({ + user, + deal, + facility: mockFacility, + facilityName, + }); + wrapper + .expectLink(`[data-cy="${facilityName}-issue-facility-${mockFacility._id}"]`) .toLinkTo(`/contract/${deal._id}/submission-details#${facilityName}-${mockFacility._id}`, 'Facility issued'); }); @@ -66,35 +256,39 @@ describe(component, () => { facilities.forEach((facility) => { const wrapper = render({ - user, deal, facility, facilityName, + user, + deal, + facility, + facilityName, }); - wrapper.expectLink(`[data-cy="${facilityName}-issue-facility-${facility._id}"]`) + wrapper + .expectLink(`[data-cy="${facilityName}-issue-facility-${facility._id}"]`) .toLinkTo(`/contract/${deal._id}/submission-details#${facilityName}-${facility._id}`, 'Facility issued'); }); }); }); - describe('when deal has not been submitted, is editable, and has `Draft` or `Further Maker\'s input required` status', () => { - it('should render a link to delete', () => { - const user = { roles: ['maker'] }; + describe("when deal has not been submitted, is editable, and has `Draft` or `Further Maker's input required` status", () => { + it('should NOT render a link to delete', () => { const facility = { _id: '5f3ab3f705e6630007dcfb22', type: 'Loan' }; - const facilityName = 'Loan'; + const facilityTableIndex = 1; const deals = [ { _id: '5f3ab3f705e6630007dcfb21', status: 'Draft' }, - { _id: '5f3ab3f705e6630007dcfb22', status: 'Further Maker\'s input required' }, + { _id: '5f3ab3f705e6630007dcfb22', status: "Further Maker's input required" }, ]; deals.forEach((deal) => { const wrapper = render({ - user, deal, facility, facilityName, facilityTableIndex, editable: true, + user, + deal, + facility, + facilityName, + facilityTableIndex, + editable: true, }); - wrapper.expectLink(`[data-cy="${facilityName}-delete-${facility._id}"]`) - .toLinkTo(`/contract/${deal._id}/${facilityName}/${facility._id}/delete`, 'Delete loan'); - - wrapper.expectAriaLabel(`[data-cy="${facilityName}-delete-${facility._id}"]`) - .toEqual(`Delete ${facilityName} ${facilityTableIndex}`); + wrapper.expectLink(`[data-cy="${facilityName}-delete-${facility._id}"]`).notToExist(); }); }); }); diff --git a/portal/component-tests/contract/components/loan-link.component-test.js b/portal/component-tests/contract/components/loan-link.component-test.js new file mode 100644 index 0000000000..1df9d13494 --- /dev/null +++ b/portal/component-tests/contract/components/loan-link.component-test.js @@ -0,0 +1,116 @@ +const { MAKER } = require('../../../server/constants/roles'); +const { NON_MAKER_ROLES } = require('../../../test-helpers/common-role-lists'); + +const componentRenderer = require('../../componentRenderer'); + +const component = 'contract/components/loan-link.njk'; +const render = componentRenderer(component); + +describe(component, () => { + const deal = { _id: '61f6fbaea2460c018a4189d7' }; + const loanWithName = { _id: '61f6fbaea2460c018a4189da', name: 'Test Loan Name' }; + const loanWithoutName = { _id: '61f6fbaea2460c018a4189db' }; + + describe('when viewed as a maker', () => { + const user = { roles: [MAKER] }; + + describe('when loan.name is present', () => { + describe('when loan is editable', () => { + itShouldRenderLoanNameAndHyperlink({ + loan: loanWithName, + user, + deal, + editable: true, + }); + }); + + describe('when loan is not editable', () => { + itShouldRenderLoanName({ + loan: loanWithName, + user, + deal, + editable: false, + }); + }); + }); + + describe('when loan.name is not present', () => { + describe('when loan is editable', () => { + itShouldRenderLoanRefNotEnteredAndHyperlink({ loan: loanWithoutName, user, deal, editable: true }); + }); + + describe('when loan is not editable', () => { + itShouldRenderLoanRefNotEntered({ loan: loanWithoutName, user, deal, editable: false }); + }); + }); + }); + + describe.each(NON_MAKER_ROLES)('when viewed as a %s', (nonMakerRole) => { + const user = { roles: [nonMakerRole] }; + describe('when loan.name is present', () => { + describe('when loan is editable', () => { + itShouldRenderLoanName({ + loan: loanWithName, + user, + deal, + editable: true, + }); + }); + + describe('when loan is not editable', () => { + itShouldRenderLoanName({ + loan: loanWithName, + user, + deal, + editable: false, + }); + }); + }); + + describe('when loan.name is not present', () => { + describe('when loan is editable', () => { + itShouldRenderLoanRefNotEntered({ loan: loanWithoutName, user, deal, editable: true }); + }); + + describe('when loan is not editable', () => { + itShouldRenderLoanRefNotEntered({ loan: loanWithoutName, user, deal, editable: false }); + }); + }); + }); + + function itShouldRenderLoanNameAndHyperlink(params) { + it('should render loan name and hyperlink', () => { + const wrapper = render(params); + + wrapper + .expectLink(`[data-cy="loan-bank-reference-number-link-${params.loan._id}"]`) + .toLinkTo(`/contract/${params.deal._id}/loan/${params.loan._id}/guarantee-details`, params.loan.name); + }); + } + + function itShouldRenderLoanName(params) { + it('should render loan name', () => { + const wrapper = render(params); + + wrapper.expectText(`[data-cy="loan-bank-reference-number-${params.loan._id}"]`).toRead(params.loan.name); + }); + } + + function itShouldRenderLoanRefNotEnteredAndHyperlink(params) { + it('should render "Loan’s reference number not entered" and hyperlink', () => { + const wrapper = render(params); + + wrapper + .expectLink(`[data-cy="loan-bank-reference-number-link-${params.loan._id}"]`) + .toLinkTo(`/contract/${params.deal._id}/loan/${params.loan._id}/guarantee-details`, 'Loan’s reference number not entered'); + }); + } + + function itShouldRenderLoanRefNotEntered(params) { + it('should render "Loan’s reference number not entered"', () => { + const wrapper = render(params); + + wrapper.expectText(`[data-cy="loan-bank-reference-number-${params.loan._id}"]`).toRead('Loan’s reference number not entered'); + }); + } +}); diff --git a/portal/component-tests/contract/components/loan-transactions-table.component-test.js b/portal/component-tests/contract/components/loan-transactions-table.component-test.js index 56f3198683..d1a84d899c 100644 --- a/portal/component-tests/contract/components/loan-transactions-table.component-test.js +++ b/portal/component-tests/contract/components/loan-transactions-table.component-test.js @@ -1,4 +1,8 @@ import moment from 'moment'; +import { UNCONDITIONAL } from '../../../server/constants/facility-stage'; + +const { MAKER } = require('../../../server/constants/roles'); +const { NON_MAKER_ROLES } = require('../../../test-helpers/common-role-lists'); const componentRenderer = require('../../componentRenderer'); @@ -6,11 +10,9 @@ const component = 'contract/components/loan-transactions-table.njk'; const render = componentRenderer(component); describe(component, () => { - const user = { roles: ['maker'], timezone: 'Europe/London' }; - const deal = { submissionType: 'Manual Inclusion Application', - status: 'Ready for Checker\'s approval', + status: "Ready for Checker's approval", loanTransactions: { items: [ { @@ -41,104 +43,174 @@ describe(component, () => { }, }; - describe('table headings', () => { - it('should be rendered', () => { - const wrapper = render({ user, deal, confirmedRequestedCoverStartDates: [] }); - - wrapper.expectText('[data-cy="loans-table-header-bank-reference-number"]').toRead('Bank reference number'); - wrapper.expectText('[data-cy="loans-table-header-ukef-facility-id"]').toRead('UKEF facility ID'); - wrapper.expectText('[data-cy="loans-table-header-status"]').toRead('Status'); - wrapper.expectText('[data-cy="loans-table-header-value"]').toRead('Value'); - wrapper.expectText('[data-cy="loans-table-header-stage"]').toRead('Stage'); - wrapper.expectText('[data-cy="loans-table-header-start-date"]').toRead('Start date'); - wrapper.expectText('[data-cy="loans-table-header-end-date"]').toRead('End date'); - wrapper.expectText('[data-cy="loans-table-header-action"]').toRead('Action'); - }); - }); + const dealWithLoansThatCanChangeCoverDate = JSON.parse(JSON.stringify(deal)); + dealWithLoansThatCanChangeCoverDate.status = 'Acknowledged'; + dealWithLoansThatCanChangeCoverDate.loanTransactions.items[0].facilityStage = UNCONDITIONAL; + dealWithLoansThatCanChangeCoverDate.loanTransactions.items[0].hasBeenIssued = true; + dealWithLoansThatCanChangeCoverDate.loanTransactions.items[0].issueFacilityDetailsSubmitted = true; + + dealWithLoansThatCanChangeCoverDate.loanTransactions.items[1].facilityStage = UNCONDITIONAL; + dealWithLoansThatCanChangeCoverDate.loanTransactions.items[1].hasBeenIssued = true; + dealWithLoansThatCanChangeCoverDate.loanTransactions.items[1].issueFacilityDetailsSubmitted = true; + + describe('as a maker', () => { + const user = { roles: [MAKER], timezone: 'Europe/London' }; + + commonTests(user); + + describe('table rows', () => { + it('should render columns/elements/text for each loan', () => { + const wrapper = render({ + user, + deal, + confirmedRequestedCoverStartDates: [], + editable: true, + }); + + deal.loanTransactions.items.forEach((facility) => { + const facilityIdSelector = `[data-cy="loan-${facility._id}"]`; - describe('table rows', () => { - it('should render columns/elements/text for each loan', () => { - const wrapper = render({ - user, deal, confirmedRequestedCoverStartDates: [], editable: true, + wrapper.expectElement(`${facilityIdSelector} [data-cy="loan-issue-facility-${facility._id}"]`).toExist(); + }); }); - deal.loanTransactions.items.forEach((facility) => { - const facilityIdSelector = `[data-cy="loan-${facility._id}"]`; + it('should render a hyperlink for the start date of each loan', () => { + const wrapper = render({ + user, + deal, + confirmedRequestedCoverStartDates: [], + editable: true, + }); - wrapper.expectElement(`${facilityIdSelector} [data-cy="loan-bank-reference-number-link-${facility._id}"]`).toExist(); + deal.loanTransactions.items.forEach((facility) => { + const facilityIdSelector = `[data-cy="loan-${facility._id}"]`; + + wrapper.expectElement(`${facilityIdSelector} [data-cy="loan-bank-reference-number-link-${facility._id}"]`).toExist(); + wrapper.expectElement(`${facilityIdSelector} [data-cy="loan-bank-reference-number-${facility._id}"]`).notToExist(); + }); + }); - wrapper.expectText(`${facilityIdSelector} [data-cy="loan-ukef-facility-id-${facility._id}"]`).toRead(facility.ukefFacilityId); + describe('when a loan Cover Date cannot be modified', () => { + it('should render `issue facility link` link and NOT `change or confirm start date`', () => { + const dealWithLoansThatCannotChangeCoverDate = deal; + dealWithLoansThatCannotChangeCoverDate.status = "Maker's input required"; - wrapper.expectText(`${facilityIdSelector} [data-cy="loan-status-${facility._id}"] [data-cy="status-tag"]`).toRead(facility.status); + const wrapper = render({ + user, + deal: dealWithLoansThatCannotChangeCoverDate, + confirmedRequestedCoverStartDates: [], + }); - wrapper.expectText(`${facilityIdSelector} [data-cy="loan-facility-value"]`).toRead(`${facility.currency.id} ${facility.value}`); + deal.loanTransactions.items.forEach((facility) => { + const facilityIdSelector = `[data-cy="loan-${facility._id}"]`; - wrapper.expectText(`${facilityIdSelector} [data-cy="loan-facility-stage-${facility._id}"]`).toRead(facility.facilityStage); + wrapper.expectElement(`${facilityIdSelector} [data-cy="loan-change-or-confirm-cover-start-date-${facility._id}"]`).notToExist(); + wrapper.expectElement(`${facilityIdSelector} [data-cy="loan-issue-facility-${facility._id}"]`).toExist(); + }); + }); + }); - wrapper.expectElement(`${facilityIdSelector} [data-cy="loan-requested-cover-start-date"]`).toExist(); + describe('when a loan Cover Date can be modified', () => { + it('should render `change or confirm start date` link and NOT `issue facility link`', () => { + const wrapper = render({ + user, + deal: dealWithLoansThatCanChangeCoverDate, + confirmedRequestedCoverStartDates: [], + }); - wrapper.expectElement(`${facilityIdSelector} [data-cy="loan-cover-end-date"]`).toExist(); + dealWithLoansThatCanChangeCoverDate.loanTransactions.items.forEach((facility) => { + const facilityIdSelector = `[data-cy="loan-${facility._id}"]`; - wrapper.expectElement(`${facilityIdSelector} [data-cy="loan-issue-facility-${facility._id}"]`).toExist(); + wrapper.expectElement(`${facilityIdSelector} [data-cy="loan-change-or-confirm-cover-start-date-${facility._id}"]`).toExist(); + wrapper.expectElement(`${facilityIdSelector} [data-cy="loan-issue-facility-${facility._id}"]`).notToExist(); + }); + }); }); }); + }); - describe('when a loan Cover Date can be modified', () => { - it('should render `change start date` link and NOT `issue facility link', () => { - const dealWithLoansThatCanChangeCoverDate = deal; - dealWithLoansThatCanChangeCoverDate.status = 'Acknowledged'; - dealWithLoansThatCanChangeCoverDate.loanTransactions.items[0].facilityStage = 'Unconditional'; - dealWithLoansThatCanChangeCoverDate.loanTransactions.items[0].hasBeenIssued = true; - dealWithLoansThatCanChangeCoverDate.loanTransactions.items[0].issueFacilityDetailsSubmitted = true; + describe.each(NON_MAKER_ROLES)('when viewed with the role %s', (nonMakerRole) => { + const user = { roles: [nonMakerRole], timezone: 'Europe/London' }; - dealWithLoansThatCanChangeCoverDate.loanTransactions.items[1].facilityStage = 'Unconditional'; - dealWithLoansThatCanChangeCoverDate.loanTransactions.items[1].hasBeenIssued = true; - dealWithLoansThatCanChangeCoverDate.loanTransactions.items[1].issueFacilityDetailsSubmitted = true; + commonTests(user); + describe('table rows', () => { + it('should not render columns/elements/text for each loan', () => { const wrapper = render({ user, - deal: dealWithLoansThatCanChangeCoverDate, + deal, confirmedRequestedCoverStartDates: [], + editable: true, }); deal.loanTransactions.items.forEach((facility) => { const facilityIdSelector = `[data-cy="loan-${facility._id}"]`; - wrapper.expectElement(`${facilityIdSelector} [data-cy="loan-change-or-confirm-cover-start-date-${facility._id}"]`).toExist(); - wrapper.expectElement(`${facilityIdSelector} [data-cy="loan-issue-facility-${facility._id}"]`).notToExist(); }); }); - }); - describe('when viewed by maker-checker role', () => { - const makerCheckerUser = { roles: ['maker', 'checker'], timezone: 'Europe/London' }; + it('should not render a hyperlink for the start date of each loan', () => { + const wrapper = render({ + user, + deal, + confirmedRequestedCoverStartDates: [], + editable: true, + }); + + deal.loanTransactions.items.forEach((facility) => { + const facilityIdSelector = `[data-cy="loan-${facility._id}"]`; - it('should render `change start date` link', () => { - const dealWithLoansThatCanChangeCoverDate = deal; - dealWithLoansThatCanChangeCoverDate.status = 'Acknowledged'; - dealWithLoansThatCanChangeCoverDate.loanTransactions.items[0].facilityStage = 'Unconditional'; - dealWithLoansThatCanChangeCoverDate.loanTransactions.items[0].hasBeenIssued = true; - dealWithLoansThatCanChangeCoverDate.loanTransactions.items[0].issueFacilityDetailsSubmitted = true; + wrapper.expectElement(`${facilityIdSelector} [data-cy="loan-bank-reference-number-link-${facility._id}"]`).notToExist(); + wrapper.expectElement(`${facilityIdSelector} [data-cy="loan-bank-reference-number-${facility._id}"]`).toExist(); + }); + }); + }); + }); - dealWithLoansThatCanChangeCoverDate.loanTransactions.items[1].facilityStage = 'Unconditional'; - dealWithLoansThatCanChangeCoverDate.loanTransactions.items[1].hasBeenIssued = true; - dealWithLoansThatCanChangeCoverDate.loanTransactions.items[1].issueFacilityDetailsSubmitted = true; + function commonTests(user) { + describe('table headings', () => { + it('should be rendered', () => { + const wrapper = render({ user, deal, confirmedRequestedCoverStartDates: [] }); + + wrapper.expectText('[data-cy="loans-table-header-bank-reference-number"]').toRead('Bank reference number'); + wrapper.expectText('[data-cy="loans-table-header-ukef-facility-id"]').toRead('UKEF facility ID'); + wrapper.expectText('[data-cy="loans-table-header-status"]').toRead('Status'); + wrapper.expectText('[data-cy="loans-table-header-value"]').toRead('Value'); + wrapper.expectText('[data-cy="loans-table-header-stage"]').toRead('Stage'); + wrapper.expectText('[data-cy="loans-table-header-start-date"]').toRead('Start date'); + wrapper.expectText('[data-cy="loans-table-header-end-date"]').toRead('End date'); + wrapper.expectText('[data-cy="loans-table-header-action"]').toRead('Action'); + }); + }); + describe('table rows', () => { + it('should render columns/elements/text for each loan', () => { const wrapper = render({ - user: makerCheckerUser, - deal: dealWithLoansThatCanChangeCoverDate, + user, + deal, confirmedRequestedCoverStartDates: [], + editable: true, }); deal.loanTransactions.items.forEach((facility) => { const facilityIdSelector = `[data-cy="loan-${facility._id}"]`; - wrapper.expectElement(`${facilityIdSelector} [data-cy="loan-change-or-confirm-cover-start-date-${facility._id}"]`).toExist(); + wrapper.expectElement(); - wrapper.expectElement(`${facilityIdSelector} [data-cy="loan-issue-facility-${facility._id}"]`).notToExist(); + wrapper.expectText(`${facilityIdSelector} [data-cy="loan-ukef-facility-id-${facility._id}"]`).toRead(facility.ukefFacilityId); + + wrapper.expectText(`${facilityIdSelector} [data-cy="loan-status-${facility._id}"] [data-cy="status-tag"]`).toRead(facility.status); + + wrapper.expectText(`${facilityIdSelector} [data-cy="loan-facility-value"]`).toRead(`${facility.currency.id} ${facility.value}`); + + wrapper.expectText(`${facilityIdSelector} [data-cy="loan-facility-stage-${facility._id}"]`).toRead(facility.facilityStage); + + wrapper.expectElement(`${facilityIdSelector} [data-cy="loan-requested-cover-start-date"]`).toExist(); + + wrapper.expectElement(`${facilityIdSelector} [data-cy="loan-cover-end-date"]`).toExist(); }); }); }); - }); + } }); diff --git a/portal/component-tests/contract/components/requested-start-date-link.component-test.js b/portal/component-tests/contract/components/requested-start-date-link.component-test.js new file mode 100644 index 0000000000..d2e5716952 --- /dev/null +++ b/portal/component-tests/contract/components/requested-start-date-link.component-test.js @@ -0,0 +1,93 @@ +const { MAKER } = require('../../../server/constants/roles'); +const { NON_MAKER_ROLES } = require('../../../test-helpers/common-role-lists'); + +const componentRenderer = require('../../componentRenderer'); + +const component = 'contract/components/requested-start-date-link.njk'; +const render = componentRenderer(component); + +describe(component, () => { + const facility = { _id: '5f3ab3f705e6630007dcfb22' }; + const facilityName = 'Loan'; + + const deal = { _id: '5f3ab3f705e6630007dcfb20' }; + + describe('when viewed as a maker', () => { + const user = { roles: [MAKER] }; + + describe('when hasConfirmedCoverStartDate is true', () => { + const hasConfirmedCoverStartDate = true; + + it('should render a link and "Start date confirmed"', () => { + const wrapper = render({ + user, + deal, + facility, + facilityName, + hasConfirmedCoverStartDate, + }); + + wrapper + .expectLink(`[data-cy="${facilityName}-change-or-confirm-cover-start-date-${facility._id}"]`) + .toLinkTo(`/contract/${deal._id}/${facilityName}/${facility._id}/confirm-requested-cover-start-date`, 'Start date confirmed'); + }); + }); + + describe('when hasNotConfirmedCoverStartDate is false', () => { + const hasConfirmedCoverStartDate = false; + it('should render a link and "Confirm start date"', () => { + const wrapper = render({ + user, + deal, + facility, + facilityName, + hasConfirmedCoverStartDate, + }); + + wrapper + .expectLink(`[data-cy="${facilityName}-change-or-confirm-cover-start-date-${facility._id}"]`) + .toLinkTo(`/contract/${deal._id}/${facilityName}/${facility._id}/confirm-requested-cover-start-date`, 'Confirm start date'); + }); + }); + }); + + describe.each(NON_MAKER_ROLES)('when viewed with the role %s', (nonMakerRole) => { + const user = { roles: [nonMakerRole] }; + + describe('when hasConfirmedCoverStartDate is true', () => { + const hasConfirmedCoverStartDate = true; + + it('should render no link and "Start date confirmed"', () => { + const wrapper = render({ + user, + deal, + facility, + facilityName, + hasConfirmedCoverStartDate, + }); + + wrapper + .expectText(`[data-cy="${facilityName}-change-or-confirm-cover-start-date-${facility._id}"]`) + .toRead('Start date confirmed'); + }); + }); + + describe('when hasNotConfirmedCoverStartDate is false', () => { + const hasConfirmedCoverStartDate = false; + + it('should render no link and "Start date not confirmed"', () => { + const wrapper = render({ + user, + deal, + facility, + facilityName, + hasConfirmedCoverStartDate, + }); + + wrapper + .expectText(`[data-cy="${facilityName}-change-or-confirm-cover-start-date-${facility._id}"]`) + .toRead('Start date not confirmed'); + }); + }); + }); +}); diff --git a/portal/component-tests/contract/contract-submission-details.component-test.js b/portal/component-tests/contract/contract-submission-details.component-test.js index 35aa6e2830..64d80e522e 100644 --- a/portal/component-tests/contract/contract-submission-details.component-test.js +++ b/portal/component-tests/contract/contract-submission-details.component-test.js @@ -1,3 +1,5 @@ +const { MAKER } = require('../../server/constants/roles'); + const pageRenderer = require('../pageRenderer'); const dealFullyCompleted = require('../fixtures/deal-fully-completed'); @@ -17,7 +19,7 @@ describe(page, () => { deal, user: { timezone: 'Europe/London', - roles: ['maker'], + roles: [MAKER], }, editable: true, }); @@ -80,7 +82,7 @@ describe(page, () => { }, user: { timezone: 'Europe/London', - roles: ['maker'], + roles: [MAKER], }, editable: true, }); diff --git a/portal/component-tests/contract/contract-view.component-test.js b/portal/component-tests/contract/contract-view.component-test.js index effe9588fd..067c9dd924 100644 --- a/portal/component-tests/contract/contract-view.component-test.js +++ b/portal/component-tests/contract/contract-view.component-test.js @@ -5,6 +5,8 @@ const pageRenderer = require('../pageRenderer'); const page = 'contract/contract-view.njk'; const render = pageRenderer(page); const dealFullyCompleted = require('../fixtures/deal-fully-completed'); +const { MAKER, CHECKER } = require('../../server/constants/roles'); +const { NON_MAKER_ROLES } = require('../../test-helpers/common-role-lists'); const mockDeal = { _id: '61f6fbaea2460c018a4189d7', ...dealFullyCompleted }; mockDeal.bondTransactions.items[0]._id = '61f6fbaea2460c018a4189d8'; @@ -22,181 +24,269 @@ const oneDealInEachStatus = () => [ aDealInStatus(STATUS.SUBMITTED_TO_UKEF), aDealInStatus(STATUS.UKEF_ACKNOWLEDGED), aDealInStatus(STATUS.UKEF_APPROVED_WITHOUT_CONDITIONS), - aDealInStatus(STATUS.APPROVEDWithConditions), + aDealInStatus(STATUS.UKEF_APPROVED_WITH_CONDITIONS), aDealInStatus(STATUS.UKEF_REFUSED), ]; -const roles = ['maker', 'checker']; - const confirmedRequestStartDateParams = { confirmedRequestedCoverStartDates: [], allRequestedCoverStartDatesConfirmed: true, }; describe(page, () => { - describe('always', () => { - const wrappers = []; + describe("when viewed as a 'maker'", () => { + const user = { roles: [MAKER], timezone: 'Europe/London' }; + + commonTests(user); - beforeAll(() => { - for (const role of roles) { - const user = { roles: [role], timezone: 'Europe/London' }; + describe('when viewed with editable=true', () => { + const wrappers = []; + beforeAll(() => { for (const deal of oneDealInEachStatus()) { - wrappers.push(render({ - user, deal, ...confirmedRequestStartDateParams, - })); + wrappers.push( + render({ + user, + deal, + editable: true, + ...confirmedRequestStartDateParams, + }), + ); } - } + }); + + it('provides a link to the loan', () => { + const dealId = mockDeal._id; + const loanId = mockDeal.loanTransactions.items[0]._id; + + return wrappers.forEach((wrapper) => + wrapper + .expectLink(`[data-cy="loan-bank-reference-number-link-${loanId}"]`) + .toLinkTo(`/contract/${dealId}/loan/${loanId}/guarantee-details`, mockDeal.loanTransactions.items[0].name)); + }); }); + }); - it('displays additionalRefName', () => wrappers.forEach((wrapper) => wrapper.expectText('[data-cy="additionalRefName"]') - .toRead(mockDeal.additionalRefName))); + describe("when viewed as a 'checker'", () => { + const user = { roles: [CHECKER], timezone: 'Europe/London' }; - it('should render contract overview table', () => wrappers.forEach((wrapper) => - wrapper.expectElement('[data-cy="contract-overview-table"]').toExist())); + commonTests(user); - it('should render Summary Table component', () => wrappers.forEach((wrapper) => - wrapper.expectElement('[data-cy="summary-table"]').toExist())); + describe('when viewed with editable=true', () => { + const wrappers = []; + beforeAll(() => { + for (const deal of oneDealInEachStatus()) { + wrappers.push( + render({ + user, + deal, + editable: true, + ...confirmedRequestStartDateParams, + }), + ); + } + }); - it('should render Forms Incomplete text component', () => wrappers.forEach((wrapper) => - wrapper.expectElement('[data-cy="forms-incomplete-text"]').toExist())); + it('does not provide a link to the loan', () => { + const loanId = mockDeal.loanTransactions.items[0]._id; + + return wrappers.forEach((wrapper) => { + wrapper.expectLink(`[data-cy="loan-bank-reference-number-link-${loanId}"]`).notToExist(); + wrapper.expectText(`[data-cy="loan-bank-reference-number-${loanId}"]`).toRead(mockDeal.loanTransactions.items[0].name); + }); + }); + }); }); - describe('when viewed with editable=true', () => { - const wrappers = []; - beforeAll(() => { - for (const role of roles) { - const user = { roles: [role], timezone: 'Europe/London' }; + describe.each(NON_MAKER_ROLES)("when viewed as a '%s'", (nonMakerRole) => { + const user = { roles: [nonMakerRole], timezone: 'Europe/London' }; + + commonTests(user); + + describe('when viewed with editable=true', () => { + const wrappers = []; + beforeAll(() => { for (const deal of oneDealInEachStatus()) { - wrappers.push(render({ - user, deal, editable: true, ...confirmedRequestStartDateParams, - })); + wrappers.push( + render({ + user, + deal, + editable: true, + ...confirmedRequestStartDateParams, + }), + ); } - } + }); + + it('does not provide a link to the loan', () => { + const loanId = mockDeal.loanTransactions.items[0]._id; + + return wrappers.forEach((wrapper) => { + wrapper.expectLink(`[data-cy="loan-bank-reference-number-link-${loanId}"]`).notToExist(); + wrapper.expectText(`[data-cy="loan-bank-reference-number-${loanId}"]`).toRead(mockDeal.loanTransactions.items[0].name); + }); + }); }); + }); - it('links to the about supply contract section', () => wrappers.forEach((wrapper) => wrapper.expectLink('[data-cy="ViewAboutSupplierDetails"]') - .toLinkTo(`/contract/${mockDeal._id}/about/supplier`, 'View details'))); + function commonTests(user) { + describe('always', () => { + const wrappers = []; - it('links to the eligibility criteria section', () => wrappers.forEach((wrapper) => wrapper.expectLink('[data-cy="ViewDetails"]') - .toLinkTo(`/contract/${mockDeal._id}/eligibility/criteria`, 'View details'))); + beforeAll(() => { + for (const deal of oneDealInEachStatus()) { + wrappers.push( + render({ + user, + deal, + ...confirmedRequestStartDateParams, + }), + ); + } + }); - it('allows the user to add a bond', () => wrappers.forEach((wrapper) => wrapper.expectLink('[data-cy="link-add-bond"]') - .toLinkTo(`/contract/${mockDeal._id}/bond/create`, 'Add a Bond'))); + it('displays additionalRefName', () => + wrappers.forEach((wrapper) => wrapper.expectText('[data-cy="additionalRefName"]').toRead(mockDeal.additionalRefName))); - it('provides a link to the bond', () => { - const dealId = mockDeal._id; - const bondId = mockDeal.bondTransactions.items[0]._id; + it('should render contract overview table', () => wrappers.forEach((wrapper) => wrapper.expectElement('[data-cy="contract-overview-table"]').toExist())); - return wrappers.forEach((wrapper) => wrapper.expectLink(`[data-cy="name-link-${bondId}"]`) - .toLinkTo(`/contract/${dealId}/bond/${bondId}/details`, mockDeal.bondTransactions.items[0].name)); + it('should render Summary Table component', () => wrappers.forEach((wrapper) => wrapper.expectElement('[data-cy="summary-table"]').toExist())); + + it('should render Forms Incomplete text component', () => + wrappers.forEach((wrapper) => wrapper.expectElement('[data-cy="forms-incomplete-text"]').toExist())); }); - it('renders bond transactions table', () => - wrappers.forEach((wrapper) => wrapper.expectElement('[data-cy="bond-transactions-table"]').toExist())); + describe('when viewed with editable=true', () => { + const wrappers = []; + beforeAll(() => { + for (const deal of oneDealInEachStatus()) { + wrappers.push( + render({ + user, + deal, + editable: true, + ...confirmedRequestStartDateParams, + }), + ); + } + }); + + it('links to the about supply contract section', () => + wrappers.forEach((wrapper) => + wrapper.expectLink('[data-cy="ViewAboutSupplierDetails"]').toLinkTo(`/contract/${mockDeal._id}/about/supplier`, 'View details'))); - it('allows the user to add a loan', () => wrappers.forEach((wrapper) => wrapper.expectLink('[data-cy="link-add-loan"]') - .toLinkTo(`/contract/${mockDeal._id}/loan/create`, 'Add a Loan'))); + it('links to the eligibility criteria section', () => + wrappers.forEach((wrapper) => + wrapper.expectLink('[data-cy="ViewDetails"]').toLinkTo(`/contract/${mockDeal._id}/eligibility/criteria`, 'View details'))); - it('provides a link to the loan', () => { - const dealId = mockDeal._id; - const loanId = mockDeal.loanTransactions.items[0]._id; + it('allows the user to add a bond', () => + wrappers.forEach((wrapper) => wrapper.expectLink('[data-cy="link-add-bond"]').toLinkTo(`/contract/${mockDeal._id}/bond/create`, 'Add a Bond'))); - return wrappers.forEach((wrapper) => wrapper.expectLink(`[data-cy="loan-bank-reference-number-link-${loanId}"]`) - .toLinkTo(`/contract/${dealId}/loan/${loanId}/guarantee-details`, mockDeal.loanTransactions.items[0].name)); - }); + it('provides a link to the bond', () => { + const dealId = mockDeal._id; + const bondId = mockDeal.bondTransactions.items[0]._id; - it('renders loan transactions table', () => - wrappers.forEach((wrapper) => wrapper.expectElement('[data-cy="loan-transactions-table"]').toExist())); - }); + return wrappers.forEach((wrapper) => + wrapper.expectLink(`[data-cy="name-link-${bondId}"]`).toLinkTo(`/contract/${dealId}/bond/${bondId}/details`, mockDeal.bondTransactions.items[0].name)); + }); + + it('renders bond transactions table', () => wrappers.forEach((wrapper) => wrapper.expectElement('[data-cy="bond-transactions-table"]').toExist())); - describe('when viewed with editable=false', () => { - const wrappers = []; + it('allows the user to add a loan', () => + wrappers.forEach((wrapper) => wrapper.expectLink('[data-cy="link-add-loan"]').toLinkTo(`/contract/${mockDeal._id}/loan/create`, 'Add a Loan'))); - beforeAll(() => { - for (const role of roles) { - const user = { roles: [role], timezone: 'Europe/London' }; + it('renders loan transactions table', () => wrappers.forEach((wrapper) => wrapper.expectElement('[data-cy="loan-transactions-table"]').toExist())); + }); + + describe('when viewed with editable=false', () => { + const wrappers = []; + + beforeAll(() => { for (const deal of oneDealInEachStatus()) { - wrappers.push(render({ - user, deal, editable: false, ...confirmedRequestStartDateParams, - })); + wrappers.push( + render({ + user, + deal, + editable: false, + ...confirmedRequestStartDateParams, + }), + ); } - } - }); + }); - it('hides the link to the about supply contract section', () => wrappers.forEach((wrapper) => wrapper.expectLink('[data-cy="ViewAboutSupplierDetails"]').notToExist())); + it('hides the link to the about supply contract section', () => + wrappers.forEach((wrapper) => wrapper.expectLink('[data-cy="ViewAboutSupplierDetails"]').notToExist())); - it('hides the link to the eligibility criteria section', () => wrappers.forEach((wrapper) => wrapper.expectLink('[data-cy="ViewDetails"]').notToExist())); + it('hides the link to the eligibility criteria section', () => wrappers.forEach((wrapper) => wrapper.expectLink('[data-cy="ViewDetails"]').notToExist())); - it('hides the link to add a bond', () => wrappers.forEach((wrapper) => wrapper.expectLink('[data-cy="link-add-bond"]').notToExist())); + it('hides the link to add a bond', () => wrappers.forEach((wrapper) => wrapper.expectLink('[data-cy="link-add-bond"]').notToExist())); - it('hides the link to delete a bond', () => { - const bondId = mockDeal.bondTransactions.items[0]._id; - return wrappers.forEach((wrapper) => wrapper.expectLink(`[data-cy="delete-bond-${bondId}"]`).notToExist()); - }); + it('hides the link to delete a bond', () => { + const bondId = mockDeal.bondTransactions.items[0]._id; + return wrappers.forEach((wrapper) => wrapper.expectLink(`[data-cy="delete-bond-${bondId}"]`).notToExist()); + }); - it('hides the link to the bond', () => { - const bondId = mockDeal.bondTransactions.items[0]._id; - return wrappers.forEach((wrapper) => wrapper.expectLink(`[data-cy="name-link-${bondId}"]`).notToExist()); - }); + it('hides the link to the bond', () => { + const bondId = mockDeal.bondTransactions.items[0]._id; + return wrappers.forEach((wrapper) => wrapper.expectLink(`[data-cy="name-link-${bondId}"]`).notToExist()); + }); - it('hides the link to add a loan', () => wrappers.forEach((wrapper) => wrapper.expectLink('[data-cy="link-add-loan"]').notToExist())); + it('hides the link to add a loan', () => wrappers.forEach((wrapper) => wrapper.expectLink('[data-cy="link-add-loan"]').notToExist())); - it('hides the link to the loan', () => { - const loanId = mockDeal.loanTransactions.items[0]._id; + it('hides the link to the loan', () => { + const loanId = mockDeal.loanTransactions.items[0]._id; - return wrappers.forEach((wrapper) => wrapper.expectLink(`[data-cy="loan-bank-reference-number-link-${loanId}"]`).notToExist()); + return wrappers.forEach((wrapper) => wrapper.expectLink(`[data-cy="loan-bank-reference-number-link-${loanId}"]`).notToExist()); + }); }); - }); - describe('when viewed with no bonds', () => { - const wrappers = []; - const dealWithNoBonds = { - ...mockDeal, - bondTransactions: { - items: [], - }, - }; - - beforeAll(() => { - for (const role of roles) { - const user = { roles: [role], timezone: 'Europe/London' }; + describe('when viewed with no bonds', () => { + const wrappers = []; + const dealWithNoBonds = { + ...mockDeal, + bondTransactions: { + items: [], + }, + }; + + beforeAll(() => { // eslint-disable-next-line no-unused-vars for (const deal of oneDealInEachStatus()) { - wrappers.push(render({ - user, - dealWithNoBonds, - })); + wrappers.push( + render({ + user, + dealWithNoBonds, + }), + ); } - } + }); + + it('should NOT render bond transactions table', () => + wrappers.forEach((wrapper) => wrapper.expectElement('[data-cy="bond-transactions-table"]').notToExist())); }); - it('should NOT render bond transactions table', () => - wrappers.forEach((wrapper) => wrapper.expectElement('[data-cy="bond-transactions-table"]').notToExist())); - }); + describe('when viewed with no loans', () => { + const wrappers = []; + const dealWithNoLoans = { + ...mockDeal, + loanTransactions: { + items: [], + }, + }; - describe('when viewed with no loans', () => { - const wrappers = []; - const dealWithNoLoans = { - ...mockDeal, - loanTransactions: { - items: [], - }, - }; - - beforeAll(() => { - for (const role of roles) { - const user = { roles: [role], timezone: 'Europe/London' }; + beforeAll(() => { // eslint-disable-next-line no-unused-vars for (const deal of oneDealInEachStatus()) { - wrappers.push(render({ - user, - dealWithNoLoans, - })); + wrappers.push( + render({ + user, + dealWithNoLoans, + }), + ); } - } - }); + }); - it('should NOT render loan transactions table', () => - wrappers.forEach((wrapper) => wrapper.expectElement('[data-cy="loan-transactions-table"]').notToExist())); - }); + it('should NOT render loan transactions table', () => + wrappers.forEach((wrapper) => wrapper.expectElement('[data-cy="loan-transactions-table"]').notToExist())); + }); + } }); diff --git a/portal/component-tests/feedback/feedback-thankyou.component.test.js b/portal/component-tests/feedback/feedback-thankyou.component-test.js similarity index 100% rename from portal/component-tests/feedback/feedback-thankyou.component.test.js rename to portal/component-tests/feedback/feedback-thankyou.component-test.js diff --git a/portal/component-tests/fixtures/deal-fully-completed.js b/portal/component-tests/fixtures/deal-fully-completed.js index a5fd09d902..ab28412be5 100644 --- a/portal/component-tests/fixtures/deal-fully-completed.js +++ b/portal/component-tests/fixtures/deal-fully-completed.js @@ -278,7 +278,7 @@ const deal = { 'buyer-address-line-3': 'The Bronx', 'buyer-address-postcode': 'no-idea', 'buyer-address-town': 'New York', - 'buyer-name': 'Huggy Bear', + 'buyer-name': 'Harry Bear', destinationOfGoodsAndServices: { name: 'United States', code: 'USA', diff --git a/portal/component-tests/loan/_macros/loan-submission-details.component-test.js b/portal/component-tests/loan/_macros/loan-submission-details.component-test.js index 1b1ab13617..6247abb111 100644 --- a/portal/component-tests/loan/_macros/loan-submission-details.component-test.js +++ b/portal/component-tests/loan/_macros/loan-submission-details.component-test.js @@ -1,3 +1,4 @@ +const { MAKER } = require('../../../server/constants/roles'); const componentRenderer = require('../../componentRenderer'); const deal = require('../../fixtures/deal-fully-completed'); @@ -7,7 +8,7 @@ const render = componentRenderer(component); describe(component, () => { let wrapper; const user = { - roles: ['maker'], + roles: [MAKER], timezone: 'Europe/London', }; diff --git a/portal/component-tests/partials/footer.component-test.js b/portal/component-tests/partials/footer.component-test.js index 43ec01eea4..8b9f572b27 100644 --- a/portal/component-tests/partials/footer.component-test.js +++ b/portal/component-tests/partials/footer.component-test.js @@ -1,3 +1,4 @@ +const { MAKER, CHECKER } = require('../../server/constants/roles'); const pageRenderer = require('../pageRenderer'); const page = '_partials/footer.njk'; @@ -8,7 +9,7 @@ describe(page, () => { describe('viewed by a maker', () => { const user = { - roles: ['maker'], + roles: [MAKER], }; beforeAll(() => { @@ -22,7 +23,7 @@ describe(page, () => { describe('viewed by a checker', () => { const user = { - roles: ['checker'], + roles: [CHECKER], }; beforeAll(() => { diff --git a/portal/component-tests/partials/primary-navigation.component-test.js b/portal/component-tests/partials/primary-navigation.component-test.js new file mode 100644 index 0000000000..8a1c64054d --- /dev/null +++ b/portal/component-tests/partials/primary-navigation.component-test.js @@ -0,0 +1,80 @@ +const { ADMIN, MAKER, CHECKER } = require('../../server/constants/roles'); +const { NON_MAKER_OR_CHECKER_OR_ADMIN_ROLES } = require('../../test-helpers/common-role-lists'); +const pageRenderer = require('../pageRenderer'); + +const page = '_partials/primary-navigation.njk'; +const render = pageRenderer(page); + +const rolesToDisplayAllNavigationItems = [ADMIN]; +const rolesToDisplayHomeAndReportsNavigationItems = [MAKER, CHECKER]; +const rolesToDisplayHomeNavigationItem = NON_MAKER_OR_CHECKER_OR_ADMIN_ROLES; + +describe(page, () => { + let wrapper; + + describe.each(rolesToDisplayAllNavigationItems)('viewed by a %s', (role) => { + const user = { roles: [role] }; + + beforeAll(() => { + wrapper = render({ user }); + }); + + itRendersAHomeLink(); + itRendersAReportsLink(); + itRendersAUsersLink(); + }); + + describe.each(rolesToDisplayHomeAndReportsNavigationItems)('viewed by a %s', (role) => { + const user = { roles: [role] }; + + beforeAll(() => { + wrapper = render({ user }); + }); + + itRendersAHomeLink(); + itRendersAReportsLink(); + itDoesNotRenderAUsersLink(); + }); + + describe.each(rolesToDisplayHomeNavigationItem)('viewed by a %s', (role) => { + const user = { roles: [role] }; + + beforeAll(() => { + wrapper = render({ user }); + }); + + itRendersAHomeLink(); + itDoesNotRenderAReportsLink(); + itDoesNotRenderAUsersLink(); + }); + + function itRendersAHomeLink() { + it('renders a home link', () => { + wrapper.expectLink('[data-cy="dashboard"]').toLinkTo('/dashboard', 'Home'); + }); + } + + function itRendersAReportsLink() { + it('renders a reports link', () => { + wrapper.expectLink('[data-cy="reports"]').toLinkTo('/reports', 'Reports'); + }); + } + + function itDoesNotRenderAReportsLink() { + it('does not render a reports link', () => { + wrapper.expectLink('[data-cy="reports"]').notToExist(); + }); + } + + function itRendersAUsersLink() { + it('renders a users link', () => { + wrapper.expectLink('[data-cy="users"]').toLinkTo('/admin/users', 'Users'); + }); + } + + function itDoesNotRenderAUsersLink() { + it('does not render a users link', () => { + wrapper.expectLink('[data-cy="users"]').notToExist(); + }); + } +}); diff --git a/portal/server/controllers/dashboard/deals/deals-filters-query.test.js b/portal/server/controllers/dashboard/deals/deals-filters-query.test.js index 211c3972a4..b93e225886 100644 --- a/portal/server/controllers/dashboard/deals/deals-filters-query.test.js +++ b/portal/server/controllers/dashboard/deals/deals-filters-query.test.js @@ -6,11 +6,12 @@ import { } from '../../../constants'; import CONTENT_STRINGS from '../../../content-strings'; import keywordQuery from './deals-filters-keyword-query'; +import { CHECKER, MAKER } from '../../../constants/roles'; describe('controllers/dashboard/deals - filters query', () => { const mockUser = { _id: '123', - roles: ['maker'], + roles: [MAKER], bank: { id: '9' }, }; @@ -87,7 +88,7 @@ describe('controllers/dashboard/deals - filters query', () => { describe('when user is a checker', () => { it(`should return ${STATUS.READY_FOR_APPROVAL} filter`, () => { const mockFilters = []; - mockUser.roles = ['checker']; + mockUser.roles = [CHECKER]; const result = dashboardDealsFiltersQuery( mockFilters, diff --git a/portal/server/controllers/dashboard/deals/index.test.js b/portal/server/controllers/dashboard/deals/index.test.js index d542d766bf..67af540a56 100644 --- a/portal/server/controllers/dashboard/deals/index.test.js +++ b/portal/server/controllers/dashboard/deals/index.test.js @@ -18,6 +18,7 @@ import { dashboardDealsFiltersQuery } from './deals-filters-query'; import { dealsTemplateFilters as templateFilters } from './template-filters'; import { selectedFilters } from './selected-filters'; import CONSTANTS from '../../../constants'; +import { MAKER, CHECKER } from '../../../constants/roles'; jest.mock('../../../api', () => ({ allDeals: jest.fn(), @@ -72,7 +73,7 @@ describe('controllers/dashboard/deals', () => { userToken: '1234', user: { _id: 'mock-user', - roles: ['maker', 'checker'], + roles: [MAKER, CHECKER], bank: { id: '9' }, }, }, diff --git a/portal/server/controllers/dashboard/facilities/facilities-filters-query.test.js b/portal/server/controllers/dashboard/facilities/facilities-filters-query.test.js index ffd7992828..ddddf9b86d 100644 --- a/portal/server/controllers/dashboard/facilities/facilities-filters-query.test.js +++ b/portal/server/controllers/dashboard/facilities/facilities-filters-query.test.js @@ -2,17 +2,18 @@ import { dashboardFacilitiesFiltersQuery } from './facilities-filters-query'; import CONSTANTS from '../../../constants'; import CONTENT_STRINGS from '../../../content-strings'; import keywordQuery from './facilities-filters-keyword-query'; +import { ADMIN, MAKER } from '../../../constants/roles'; describe('controllers/dashboard/facilities - filters query', () => { const mockUser = { _id: '123', - roles: ['maker'], + roles: [MAKER], bank: { id: '9' }, }; const mockUserAdmin = { _id: '123', - roles: ['admin'], + roles: [ADMIN], bank: { id: '*' }, }; diff --git a/portal/server/controllers/dashboard/facilities/index.test.js b/portal/server/controllers/dashboard/facilities/index.test.js index 8e4b1c218d..d4c6e04ebd 100644 --- a/portal/server/controllers/dashboard/facilities/index.test.js +++ b/portal/server/controllers/dashboard/facilities/index.test.js @@ -19,6 +19,7 @@ import { facilitiesTemplateFilters as templateFilters } from './template-filters import { selectedFilters } from './selected-filters'; import CONSTANTS from '../../../constants'; import { sanitiseBody } from './sanitise-body'; +import { CHECKER, MAKER } from '../../../constants/roles'; jest.mock('../../../api', () => ({ allFacilities: jest.fn(), @@ -60,7 +61,7 @@ describe('controllers/dashboard/facilities', () => { userToken: '1234', user: { _id: 'mock-user', - roles: ['maker', 'checker'], + roles: [MAKER, CHECKER], bank: { id: '9' }, }, }, diff --git a/portal/server/controllers/dashboard/reports.test.js b/portal/server/controllers/dashboard/reports.test.js index cc35819fad..b0037b5050 100644 --- a/portal/server/controllers/dashboard/reports.test.js +++ b/portal/server/controllers/dashboard/reports.test.js @@ -2,6 +2,7 @@ import { reportsController } from '.'; import api from '../../api'; import mockResponse from '../../helpers/responseMock'; import CONSTANTS from '../../constants'; +import { CHECKER, MAKER } from '../../constants/roles'; jest.mock('../../api'); @@ -65,7 +66,7 @@ const mockUkefUnconditionalDecisionReportResponse = [ describe('controllers/reports.controller', () => { let res; - const req = { session: { token: 'mock-token', user: { roles: ['maker'] } } }; + const req = { session: { token: 'mock-token', user: { roles: [MAKER] } } }; beforeEach(() => { res = mockResponse(); }); @@ -166,7 +167,7 @@ describe('controllers/reports.controller', () => { }); it('renders the unissued-facilities report page (Checker)', async () => { - req.session.user.roles = ['checker']; + req.session.user.roles = [CHECKER]; api.getUnissuedFacilitiesReport.mockResolvedValue([mockUnissuedFacilitiesReportResponse[1]]); await reportsController.getUnissuedFacilitiesReport(req, res); @@ -181,7 +182,7 @@ describe('controllers/reports.controller', () => { describe('getUnconditionalDecisionReport', () => { it('renders the unconditional decision page (Maker)', async () => { - req.session.user.roles = ['maker']; + req.session.user.roles = [MAKER]; api.getUkefDecisionReport.mockResolvedValue(mockUkefUnconditionalDecisionReportResponse); await reportsController.getUnconditionalDecisionReport(req, res); @@ -194,7 +195,7 @@ describe('controllers/reports.controller', () => { }); it('renders the unconditional decision page (Checker)', async () => { - req.session.user.roles = ['checker']; + req.session.user.roles = [CHECKER]; api.getUkefDecisionReport.mockResolvedValue(mockUkefUnconditionalDecisionReportResponse); await reportsController.getUnconditionalDecisionReport(req, res); @@ -209,7 +210,7 @@ describe('controllers/reports.controller', () => { describe('getConditionalDecisionReport', () => { it('renders the conditional decision page (Maker)', async () => { - req.session.user.roles = ['maker']; + req.session.user.roles = [MAKER]; api.getUkefDecisionReport.mockResolvedValue(mockUkefConditionalDecisionReportResponse); await reportsController.getConditionalDecisionReport(req, res); @@ -222,7 +223,7 @@ describe('controllers/reports.controller', () => { }); it('renders the conditional decision page (Checker)', async () => { - req.session.user.roles = ['checker']; + req.session.user.roles = [CHECKER]; api.getUkefDecisionReport.mockResolvedValue(mockUkefConditionalDecisionReportResponse); await reportsController.getConditionalDecisionReport(req, res); diff --git a/portal/server/helpers/constructPayload.test.js b/portal/server/helpers/constructPayload.test.js index 4501e93d14..8fc302befc 100644 --- a/portal/server/helpers/constructPayload.test.js +++ b/portal/server/helpers/constructPayload.test.js @@ -1,6 +1,7 @@ /** * Unit test cases for `constructPayload` method */ +import { CHECKER, EFM, MAKER, UKEF_OPERATIONS } from '../constants/roles'; import constructPayload from './constructPayload'; const mockBody = { @@ -11,7 +12,7 @@ const mockBody = { }; const mockExtraBody = { - roles: ['maker/checker', 'checker', 'maker', 'ukef_operations', 'EFM'], + roles: ['maker/checker', CHECKER, MAKER, UKEF_OPERATIONS, EFM], _csrf: '3YyRfYmT', currentPassword: 'AbC!2345', password: 'AbC!23456', diff --git a/portal/server/helpers/getUserRoles.js b/portal/server/helpers/getUserRoles.js index 7ae30eff1e..81e244cc69 100644 --- a/portal/server/helpers/getUserRoles.js +++ b/portal/server/helpers/getUserRoles.js @@ -1,6 +1,8 @@ +const { MAKER, CHECKER } = require('../constants/roles'); + const getUserRoles = (roles) => { - const isMaker = roles.includes('maker'); - const isChecker = roles.includes('checker'); + const isMaker = roles.includes(MAKER); + const isChecker = roles.includes(CHECKER); return { isMaker, diff --git a/portal/server/helpers/getUserRoles.test.js b/portal/server/helpers/getUserRoles.test.js index 8e955fd431..1dbc1836f1 100644 --- a/portal/server/helpers/getUserRoles.test.js +++ b/portal/server/helpers/getUserRoles.test.js @@ -1,31 +1,24 @@ +const { MAKER, CHECKER } = require('../constants/roles'); const getUserRoles = require('./getUserRoles'); describe('getUserRoles', () => { - describe('isMaker', () => { - it('should true when roles includes maker', () => { - const result = getUserRoles(['maker']); + function isRoleTests(isRole, role) { + describe(isRole, () => { + it(`should return true when roles includes ${role}`, () => { + const result = getUserRoles([role]); - expect(result.isMaker).toEqual(true); - }); + expect(result[isRole]).toEqual(true); + }); - it('should false when roles does NOT include maker', () => { - const result = getUserRoles(['']); + it(`should return false when roles does NOT include ${role}`, () => { + const result = getUserRoles(['']); - expect(result.isMaker).toEqual(false); + expect(result[isRole]).toEqual(false); + }); }); - }); - - describe('isChecker', () => { - it('should true when roles includes checker', () => { - const result = getUserRoles(['checker']); + } - expect(result.isChecker).toEqual(true); - }); + isRoleTests('isMaker', MAKER); - it('should false when roles does NOT include checker', () => { - const result = getUserRoles(['']); - - expect(result.isChecker).toEqual(false); - }); - }); + isRoleTests('isChecker', CHECKER); }); diff --git a/portal/server/helpers/isChecker.helper.js b/portal/server/helpers/isChecker.helper.js index 81af086198..a1569139b0 100644 --- a/portal/server/helpers/isChecker.helper.js +++ b/portal/server/helpers/isChecker.helper.js @@ -1,7 +1,8 @@ +const { CHECKER } = require('../constants/roles'); const { equalArrays } = require('./equalArrays.helper'); const isChecker = (roles) => { - const checker = ['checker']; + const checker = [CHECKER]; return equalArrays(roles, checker); }; diff --git a/portal/server/helpers/isChecker.test.js b/portal/server/helpers/isChecker.test.js index 514cdc9084..a1034b8f29 100644 --- a/portal/server/helpers/isChecker.test.js +++ b/portal/server/helpers/isChecker.test.js @@ -1,23 +1,24 @@ +import { ADMIN, CHECKER, MAKER } from '../constants/roles'; import { isChecker } from './isChecker.helper'; describe('isChecker', () => { it('should return `true` when the role is `checker`', () => { - const roles = ['checker']; + const roles = [CHECKER]; expect(isChecker(roles)).toEqual(true); }); it('should return `false` when the role is `maker`', () => { - const roles = ['maker']; + const roles = [MAKER]; expect(isChecker(roles)).toEqual(false); }); it('should return `false` when the role is `maker/checker`', () => { - const roles = ['maker', 'checker']; + const roles = [MAKER, CHECKER]; expect(isChecker(roles)).toEqual(false); }); it('should return `false` when the role is `admin`', () => { - const roles = ['admin']; + const roles = [ADMIN]; expect(isChecker(roles)).toEqual(false); }); diff --git a/portal/server/routes/contract/canIssueOrEditIssueFacility.js b/portal/server/routes/contract/canIssueOrEditIssueFacility.js index 1d63697379..c133744232 100644 --- a/portal/server/routes/contract/canIssueOrEditIssueFacility.js +++ b/portal/server/routes/contract/canIssueOrEditIssueFacility.js @@ -1,5 +1,7 @@ +const { MAKER } = require('../../constants/roles'); + const canIssueOrEditIssueFacility = (userRoles, deal, facility) => { - const isMaker = userRoles.includes('maker'); + const isMaker = userRoles.includes(MAKER); const { submissionType, diff --git a/portal/server/routes/contract/isDealEditable.js b/portal/server/routes/contract/isDealEditable.js index d5f9c229cb..d8ad0e4929 100644 --- a/portal/server/routes/contract/isDealEditable.js +++ b/portal/server/routes/contract/isDealEditable.js @@ -1,7 +1,8 @@ const { STATUS } = require('../../constants'); +const { MAKER } = require('../../constants/roles'); const isDealEditable = (deal, user) => { - if (!user.roles.includes('maker')) { + if (!user.roles.includes(MAKER)) { return false; } diff --git a/portal/server/routes/contract/isDealEditable.test.js b/portal/server/routes/contract/isDealEditable.test.js index 3d1361b4ef..7ddc1deec2 100644 --- a/portal/server/routes/contract/isDealEditable.test.js +++ b/portal/server/routes/contract/isDealEditable.test.js @@ -1,70 +1,75 @@ -import { CHECKER, MAKER } from '../../constants/roles'; +import { MAKER } from '../../constants/roles'; import isDealEditable from './isDealEditable'; -describe('isDealEditable', () => { - const mockMakerUser = { roles: [MAKER] }; +const { NON_MAKER_ROLES } = require('../../../test-helpers/common-role-lists'); - describe('when user is NOT maker', () => { - it('should return false', () => { - const mockDeal = { - status: 'Further Maker\'s input required', - details: {}, - }; +describe('isDealEditable', () => { + describe('when user is maker', () => { + const roles = [MAKER]; + const mockUser = { roles }; - const checkerUser = { roles: [CHECKER] }; + describe("when deal status is NOT `Draft` or `Further Maker's input required`", () => { + it('should return false', () => { + const mockAcceptedDeal = { + status: 'Accepted by UKEF (with conditions)', + details: {}, + }; - const result = isDealEditable(mockDeal, checkerUser); - expect(result).toEqual(false); + const result = isDealEditable(mockAcceptedDeal, mockUser); + expect(result).toEqual(false); + }); }); - }); - describe('when deal status is NOT `Draft` or `Further Maker\'s input required`', () => { - it('should return false', () => { - const mockAcceptedDeal = { - status: 'Accepted by UKEF (with conditions)', - details: {}, - }; + describe('when deal has been submitted', () => { + it('should return false', () => { + const mockDeal = { + status: 'Draft', + details: { + submissionDate: 12345678, + }, + }; - const result = isDealEditable(mockAcceptedDeal, mockMakerUser); - expect(result).toEqual(false); + const result = isDealEditable(mockDeal, mockUser); + expect(result).toEqual(false); + }); }); - }); - describe('when deal has been submitted', () => { - it('should return false', () => { - const mockDeal = { - status: 'Draft', - details: { - submissionDate: 12345678, - }, - }; + describe('deal status `Draft`, deal not submitted', () => { + it('should return true', () => { + const mockDeal = { + status: 'Draft', + details: {}, + }; - const result = isDealEditable(mockDeal, mockMakerUser); - expect(result).toEqual(false); + const result = isDealEditable(mockDeal, mockUser); + expect(result).toEqual(true); + }); }); - }); - describe('when user is maker, deal status `Draft`, deal not submitted', () => { - it('should return true', () => { - const mockDeal = { - status: 'Draft', - details: {}, - }; + describe("deal status `Further Maker's input required`, deal not submitted", () => { + it('should return true', () => { + const mockDeal = { + status: "Further Maker's input required", + details: {}, + }; - const result = isDealEditable(mockDeal, mockMakerUser); - expect(result).toEqual(true); + const result = isDealEditable(mockDeal, mockUser); + expect(result).toEqual(true); + }); }); }); - describe('when user is maker, deal status `Further Maker\'s input required`, deal not submitted', () => { - it('should return true', () => { + describe.each(NON_MAKER_ROLES)('when user is NOT maker (role: %s)', (nonMakerRole) => { + const user = { roles: [nonMakerRole] }; + + it('should return false', () => { const mockDeal = { - status: 'Further Maker\'s input required', + status: "Further Maker's input required", details: {}, }; - const result = isDealEditable(mockDeal, mockMakerUser); - expect(result).toEqual(true); + const result = isDealEditable(mockDeal, user); + expect(result).toEqual(false); }); }); }); diff --git a/portal/templates/_partials/primary-navigation.njk b/portal/templates/_partials/primary-navigation.njk index 33f7c5a3e8..8157c20e2a 100644 --- a/portal/templates/_partials/primary-navigation.njk +++ b/portal/templates/_partials/primary-navigation.njk @@ -1,59 +1,54 @@ {%- from "moj/components/primary-navigation/macro.njk" import mojPrimaryNavigation -%} - -{% if user and user.roles.includes("admin")%} - -{{ mojPrimaryNavigation({ - label: "Primary navigation", - items: [ - { +{% set isAdmin = user and user.roles.includes("admin") %} +{% set isChecker = user and user.roles.includes("checker") %} +{% set isMaker = user and user.roles.includes("maker") %} +{% set homeNavItem = { text: "Home", href: "/dashboard", active: primaryNav == "home", attributes: { "data-cy": "dashboard" } - }, - { + } %} +{% set reportsNavItem = { text: "Reports", href: "/reports", active: primaryNav == "reports", attributes: { "data-cy": "reports" } - }, - { + } %} +{% set usersNavItem = { text: "Users", href: "/admin/users", active: primaryNav == "users", attributes: { "data-cy": "users" } - } + } %} + +{% if isAdmin %} + {{ mojPrimaryNavigation({ + label: "Primary navigation", + items: [ + homeNavItem, + reportsNavItem, + usersNavItem + ] +}) }} +{% elif isChecker or isMaker %} + {{ mojPrimaryNavigation({ + label: "Primary navigation", + items: [ + homeNavItem, + reportsNavItem ] -}) }} - +}) }} {% elif user %} - -{{ mojPrimaryNavigation({ + {{ mojPrimaryNavigation({ label: "Primary navigation", items: [ - { - text: "Home", - href: "/dashboard", - active: primaryNav == "home", - attributes: { - "data-cy": "dashboard" - } - }, - { - text: "Reports", - href: "/reports", - active: primaryNav == "reports", - attributes: { - "data-cy": "reports" - } - } + homeNavItem ] -}) }} - -{% endif %} +}) }} +{% endif %} \ No newline at end of file diff --git a/portal/templates/contract/components/bond-transactions-table.njk b/portal/templates/contract/components/bond-transactions-table.njk index 80056a85e9..53b8074010 100644 --- a/portal/templates/contract/components/bond-transactions-table.njk +++ b/portal/templates/contract/components/bond-transactions-table.njk @@ -75,8 +75,7 @@ {% if requestedCoverDateCanEdit %} {{ requestedCoverStartDateLink.render(componentData) }} - - {% else %} + {% else %} {{ issueOrDeleteFacilityLink.render(componentData) }} {% endif %} diff --git a/portal/templates/contract/components/issue-or-delete-facility-link.njk b/portal/templates/contract/components/issue-or-delete-facility-link.njk index 8228ffeb96..89932f036f 100644 --- a/portal/templates/contract/components/issue-or-delete-facility-link.njk +++ b/portal/templates/contract/components/issue-or-delete-facility-link.njk @@ -1,37 +1,40 @@ {% macro render(params) %} - {% set userIsMaker = params.user.roles.includes('maker')%} - {% set userIsChecker = params.user.roles.includes('checker')%} - + {% set userIsMaker = params.user.roles.includes('maker') %} + {% set userIsChecker = params.user.roles.includes('checker') %} {% set dealId = params.deal._id %} {% set dealStatus = params.deal.status %} {% set dealSubmissionDate = params.deal.details.submissionDate %} {% set dealIsEditable = params.editable %} - {% set facility = params.facility %} {% set facilityName = params.facilityName %} {% set facilityTableIndex = params.facilityTableIndex %} - {% set canOnlyViewIssueFacilityDetails = facility.status === "Submitted" or facility.status === "Ready for check" or facility.status === "Acknowledged" or dealStatus === "Ready for Checker's approval" %} - {% if facility.canIssueOrEditIssueFacility %} - - - {% if facility.issueFacilityDetailsStarted and facility.issueFacilityDetailsProvided %} - Facility issued + {% if facility.canIssueOrEditIssueFacility and userIsMaker %} + + {% if facility.issueFacilityDetailsStarted and facility.issueFacilityDetailsProvided %} + Facility issued {% else %} - Issue facility - {% endif%} + Issue facility + {% endif %} - {% elseif canOnlyViewIssueFacilityDetails and facility.issueFacilityDetailsProvided %} - Facility issued - - {% elseif (userIsMaker and dealIsEditable) and (dealStatus === "Draft" or dealStatus === "Further Maker's input required") and not dealSubmissionDate %} - {% if facility.name %} - Delete {{ facility.name }} - {% else %} - Delete {{ facility.type | lower | safe }} - {% endif %} + {% elseif canOnlyViewIssueFacilityDetails or facility.canIssueOrEditIssueFacility %} + {% if facility.issueFacilityDetailsProvided %} + + Facility issued + + {% endif %} + + {% elseif (userIsMaker and dealIsEditable) and (dealStatus === "Draft" or dealStatus === "Further Maker's input required") and not dealSubmissionDate %} + {% if facility.name %} + + Delete {{ facility.name }} + + {% else %} + + Delete {{ facility.type | lower | safe }} + + {% endif %} {% endif %} - -{% endmacro %} +{% endmacro %} \ No newline at end of file diff --git a/portal/templates/contract/components/loan-link.njk b/portal/templates/contract/components/loan-link.njk index 38a3aee3a8..b9a9251628 100644 --- a/portal/templates/contract/components/loan-link.njk +++ b/portal/templates/contract/components/loan-link.njk @@ -1,27 +1,34 @@ -{% macro render(params, loan) %} +{% macro render(params) %} + {% set loan = params.loan %} {% set dealId = params.deal._id %} + {% set isMaker = params.user.roles.includes('maker') %} {% if loan.name %} - {% if params.editable %} - - {{ loan.name | safe }} + {% if params.editable and isMaker %} + + {{ loan.name | safe }} {% else %} - + {{ loan.name | safe }} {% endif %} {% else %} - {% if params.editable %} - Loan’s reference number not entered + {% if params.editable and isMaker %} + + Loan’s reference number not entered + {% else %} - + Loan’s reference number not entered {% endif %} {% endif %} - -{% endmacro %} +{% endmacro %} \ No newline at end of file diff --git a/portal/templates/contract/components/loan-transactions-table.njk b/portal/templates/contract/components/loan-transactions-table.njk index f457af9aa8..70db28d7df 100644 --- a/portal/templates/contract/components/loan-transactions-table.njk +++ b/portal/templates/contract/components/loan-transactions-table.njk @@ -29,9 +29,10 @@ {% for loan in loans %} + {% set loanLinkParams = { editable: params.editable, user: params.user, deal: params.deal, loan: loan } %} - {{ loanLink.render(params, loan) }} + {{ loanLink.render(loanLinkParams) }} @@ -67,16 +68,15 @@ {% set componentData = {user: params.user, deal: params.deal, editable: params.editable, facility: loan, facilityName: 'loan', hasConfirmedCoverStartDate: hasConfirmedCoverStartDate, facilityTableIndex: loop.index} %} - {% set userIsMaker = params.user.roles.includes('maker')%} - {% set dealSubmissionType = params.deal.submissionType %} + {% set userIsMaker = params.user.roles.includes('maker')%} + {% set requestedCoverDateCanEdit = userIsMaker and loan.status !== "Maker's input required" and dealStatusAllowsRequestedCoverDateChange and dealSubmissionType === 'Manual Inclusion Application' and loan.facilityStage === 'Unconditional' and loan.issueFacilityDetailsSubmitted %} {% if requestedCoverDateCanEdit %} {{ requestedCoverStartDateLink.render(componentData) }} - - {% else %} + {% else %} {{ issueOrDeleteFacilityLink.render(componentData) }} {% endif %} diff --git a/portal/templates/contract/components/requested-start-date-link.njk b/portal/templates/contract/components/requested-start-date-link.njk index 5ed3057c76..8cb41cc1ca 100644 --- a/portal/templates/contract/components/requested-start-date-link.njk +++ b/portal/templates/contract/components/requested-start-date-link.njk @@ -3,17 +3,27 @@ {% set dealId = params.deal._id %} {% set dealStatus = params.deal.status %} {% set dealSubmissionType = params.deal.submissionType %} - {% set dealPreviousStatus = params.deal.previousStatus %} + {% set userIsMaker = params.user.roles.includes('maker') %} - {% set facility = params.facility %} + {% set facilityId = params.facility._id %} {% set facilityName = params.facilityName %} - - - {% if params.hasConfirmedCoverStartDate %} - Start date confirmed - {% else %} - Confirm start date - {% endif %} - + + {% if userIsMaker %} + + {% if params.hasConfirmedCoverStartDate %} + Start date confirmed + {% else %} + Confirm start date + {% endif %} + + {% else %} + + {% if params.hasConfirmedCoverStartDate %} + Start date confirmed + {% else %} + Start date not confirmed + {% endif %} + + {% endif %} {% endmacro %} diff --git a/portal/test-helpers/common-role-lists.js b/portal/test-helpers/common-role-lists.js new file mode 100644 index 0000000000..28f188fb1d --- /dev/null +++ b/portal/test-helpers/common-role-lists.js @@ -0,0 +1,15 @@ +const ROLES = require('../server/constants/roles'); + +export const getRolesListExcluding = (rolesToExclude) => { + const roleValues = Object.values(ROLES); + return roleValues.filter((role) => rolesToExclude.includes(role) === false); +}; + +export const COMMON_ROLE_COMBINATIONS = { + NON_MAKER_ROLES: getRolesListExcluding([ROLES.MAKER]), + NON_CHECKER_ROLES: getRolesListExcluding([ROLES.CHECKER]), + NON_MAKER_OR_CHECKER_ROLES: getRolesListExcluding([ROLES.MAKER, ROLES.CHECKER]), + NON_MAKER_OR_CHECKER_OR_ADMIN_ROLES: getRolesListExcluding([ROLES.MAKER, ROLES.CHECKER, ROLES.ADMIN]), +}; + +module.exports = COMMON_ROLE_COMBINATIONS; diff --git a/trade-finance-manager-api/.eslintrc.js b/trade-finance-manager-api/.eslintrc.js index 791f8abf68..5718ccfe09 100644 --- a/trade-finance-manager-api/.eslintrc.js +++ b/trade-finance-manager-api/.eslintrc.js @@ -24,6 +24,12 @@ module.exports = { 'no-loop-func': 'off', 'no-unused-vars': ['error'], 'require-await': 'error', + 'no-use-before-define': [ + 'error', + { + functions: false + } + ] }, parserOptions: { ecmaVersion: 2020, diff --git a/trade-finance-manager-ui/.eslintrc.js b/trade-finance-manager-ui/.eslintrc.js index 9394a16536..5b477c69fa 100644 --- a/trade-finance-manager-ui/.eslintrc.js +++ b/trade-finance-manager-ui/.eslintrc.js @@ -23,6 +23,12 @@ module.exports = { }], 'no-unneeded-ternary': 'off', 'require-await': 'error', + 'no-use-before-define': [ + 'error', + { + functions: false, + }, + ], }, ignorePatterns: ['**/node_modules/**', '**/public/**'], parserOptions: { diff --git a/utils/data-migration/.eslintrc.js b/utils/data-migration/.eslintrc.js index c704ebb3d4..26001c542e 100644 --- a/utils/data-migration/.eslintrc.js +++ b/utils/data-migration/.eslintrc.js @@ -23,6 +23,12 @@ module.exports = { 'no-await-in-loop': 'off', 'import/extensions': 'off', 'no-restricted-syntax': 'off', + 'no-use-before-define': [ + 'error', + { + functions: false + } + ] }, parserOptions: { ecmaVersion: 2020, diff --git a/utils/mock-data-loader/.eslintrc.js b/utils/mock-data-loader/.eslintrc.js index 314bf8272d..df4357d66e 100644 --- a/utils/mock-data-loader/.eslintrc.js +++ b/utils/mock-data-loader/.eslintrc.js @@ -21,6 +21,12 @@ module.exports = { 'no-loop-func': 'off', 'no-await-in-loop': 'off', 'no-restricted-syntax': 'off', + 'no-use-before-define': [ + 'error', + { + functions: false + } + ] }, parserOptions: { ecmaVersion: 2020, diff --git a/utils/mock-data-loader/portal/users.js b/utils/mock-data-loader/portal/users.js index 6a34901695..16b614bda1 100644 --- a/utils/mock-data-loader/portal/users.js +++ b/utils/mock-data-loader/portal/users.js @@ -95,6 +95,16 @@ const USERS = [ roles: ['maker', 'checker'], bank: UKEF_TEST_BANK_1, }, + { + username: 'BANK1_READ_ONLY1', + password: 'AbC!2345', + firstname: 'Reid', + surname: 'Oakley', + email: 'readonly1@ukexportfinance.gov.uk', + timezone: 'Europe/London', + roles: ['read-only'], + bank: UKEF_TEST_BANK_1, + }, { username: 'BANK2_MAKER2', password: 'AbC!2345', @@ -125,6 +135,16 @@ const USERS = [ roles: ['checker'], bank: UKEF_TEST_BANK_2, }, + { + username: 'BANK2_READ_ONLY1', + password: 'AbC!2345', + firstname: 'Reid', + surname: 'Oakley', + email: 'readonly2@ukexportfinance.gov.uk', + timezone: 'Europe/London', + roles: ['read-only'], + bank: UKEF_TEST_BANK_2, + }, { username: 'NOBODY', password: 'AbC!2345', @@ -147,6 +167,18 @@ const USERS = [ id: '*', }, }, + { + username: 'READ_ONLY', + password: 'AbC!2345', + firstname: 'Reid', + surname: 'Oakley', + email: 'readonly@ukexportfinance.gov.uk', + timezone: 'Europe/London', + roles: ['read-only'], + bank: { + id: '*', + }, + }, { username: 'ADMINNOMAKER', password: 'AbC!2345', diff --git a/utils/reporting/tfm/.eslintrc.js b/utils/reporting/tfm/.eslintrc.js index e56403e496..13e7b3884b 100644 --- a/utils/reporting/tfm/.eslintrc.js +++ b/utils/reporting/tfm/.eslintrc.js @@ -20,6 +20,12 @@ module.exports = { 'object-curly-newline': ['error', { consistent: true, }], + 'no-use-before-define': [ + 'error', + { + functions: false, + }, + ], }, parserOptions: { ecmaVersion: 2020, From 8b7e0580f4d31d9d6861ce474fd4ce67b336c7d1 Mon Sep 17 00:00:00 2001 From: lmarrai-sw <44811960+lmarrai-sw@users.noreply.github.com> Date: Mon, 18 Sep 2023 16:58:08 +0100 Subject: [PATCH 016/130] feat(DTFS2-6637): remove unused roles from portal api (#2050) --- .nvmrc | 1 - cspell.json | 3 +- .../mocks/test-users/api-test-users.js | 10 --- .../restrict-access/restrict-access.spec.js | 24 +----- e2e-tests/portal/cypress/fixtures/users.js | 6 -- portal-api/api-tests/api-test-users.js | 62 +-------------- .../api-tests/v1/banks/banks.api-test.js | 68 ++++++++-------- ...deal-eligibility-documentation.api-test.js | 8 +- .../eligibility-criteria.api-test.js | 36 ++++----- .../v1/feedback/feedback.api-test.js | 34 ++++---- .../api-tests/v1/gef/address.api-test.js | 4 +- .../api-tests/v1/gef/application.api-test.js | 8 +- .../api-tests/v1/gef/company.api-test.js | 4 +- .../v1/gef/eligibility-criteria.api-test.js | 32 ++++---- .../api-tests/v1/gef/facilities.api-test.js | 6 +- portal-api/api-tests/v1/gef/files.api-test.js | 8 +- .../mandatory-criteria-versioned.api-test.js | 60 +++++++-------- .../mandatory-criteria.api-test.js | 8 +- portal-api/src/v1/gef/routes.js | 64 +++++++-------- portal-api/src/v1/roles/roles.js | 6 -- portal-api/src/v1/routes.js | 29 ++++--- .../data-migration/bss-ewcs/migrate-users.js | 3 +- utils/data-migration/constant/index.js | 2 + utils/data-migration/constant/roles.js | 8 ++ .../data-migration/temporary-token-handler.js | 3 +- utils/data-migration/tfm/migrate-tfm-users.js | 7 +- utils/mock-data-loader/bss/deals/1.js | 7 +- utils/mock-data-loader/bss/deals/10.js | 5 +- utils/mock-data-loader/bss/deals/11.js | 5 +- utils/mock-data-loader/bss/deals/2.js | 7 +- utils/mock-data-loader/bss/deals/3.js | 5 +- utils/mock-data-loader/bss/deals/4.js | 5 +- utils/mock-data-loader/bss/deals/5.js | 5 +- utils/mock-data-loader/bss/deals/6.js | 5 +- utils/mock-data-loader/bss/deals/7.js | 5 +- utils/mock-data-loader/bss/deals/8.js | 5 +- utils/mock-data-loader/bss/deals/9.js | 5 +- utils/mock-data-loader/gef/application.js | 11 +-- utils/mock-data-loader/portal/roles.js | 8 ++ utils/mock-data-loader/portal/users.js | 57 +++++--------- .../refresh-reference-data.js | 77 ------------------- utils/mock-data-loader/user-helper.js | 5 +- 42 files changed, 278 insertions(+), 443 deletions(-) delete mode 100644 .nvmrc create mode 100644 utils/data-migration/constant/roles.js create mode 100644 utils/mock-data-loader/portal/roles.js delete mode 100644 utils/mock-data-loader/refresh-reference-data.js diff --git a/.nvmrc b/.nvmrc deleted file mode 100644 index da2d3988d7..0000000000 --- a/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -14 \ No newline at end of file diff --git a/cspell.json b/cspell.json index 74dcd379dc..11ac269634 100644 --- a/cspell.json +++ b/cspell.json @@ -114,7 +114,8 @@ "ADMINNOMAKER", "MAKENCHECK", "unmock", - "unsubmitted" + "unsubmitted", + "wordprocessingml" ], "dictionaries": [ "en-gb", diff --git a/dtfs-central-api/api-tests/mocks/test-users/api-test-users.js b/dtfs-central-api/api-tests/mocks/test-users/api-test-users.js index bb61210751..c5756dacd7 100644 --- a/dtfs-central-api/api-tests/mocks/test-users/api-test-users.js +++ b/dtfs-central-api/api-tests/mocks/test-users/api-test-users.js @@ -32,7 +32,6 @@ const banks = { const testUsers = [ { username: 'no-roles', password: 'P@ssword1234', roles: [] }, - { username: 'an-editor', password: 'P@ssword1234', roles: ['editor'] }, { username: 'HSBC-maker-1', password: 'P@ssword1234', @@ -63,15 +62,6 @@ const testUsers = [ roles: ['maker'], bank: banks.any, }, - { - username: 'data-admin', - password: 'P@ssword1234', - firstname: 'Mister', - surname: 'Eight', - email: 'eight@email.com', - timezone: 'Europe/London', - roles: ['data-admin'], - }, { username: 'Barclays-maker-checker-1', password: 'P@ssword1234', diff --git a/e2e-tests/portal/cypress/e2e/journeys/admin/restrict-access/restrict-access.spec.js b/e2e-tests/portal/cypress/e2e/journeys/admin/restrict-access/restrict-access.spec.js index 799b921d0e..78401f5e34 100644 --- a/e2e-tests/portal/cypress/e2e/journeys/admin/restrict-access/restrict-access.spec.js +++ b/e2e-tests/portal/cypress/e2e/journeys/admin/restrict-access/restrict-access.spec.js @@ -1,28 +1,16 @@ const relative = require('../../../relativeURL'); const { ADMIN, - UKEF_OPERATIONS, BANK1_MAKER1, BANK1_CHECKER1, - EDITOR, BANK1_READ_ONLY1, } = require('../../../../fixtures/users'); context('Only allow authorised users to access admin pages', () => { - const authorisedRoles = [{ - roleName: 'Admins', - userWithRole: ADMIN, - }, { - roleName: 'UKEF Operations', - userWithRole: UKEF_OPERATIONS, - }]; - - authorisedRoles.forEach(({ roleName, userWithRole }) => { - it(`should allow ${roleName} access to restricted pages`, () => { - cy.login(userWithRole); - cy.visit('/admin/users/'); - cy.url().should('eq', relative('/admin/users/')); - }); + it('should allow admins access to restricted pages', () => { + cy.login(ADMIN); + cy.visit('/admin/users/'); + cy.url().should('eq', relative('/admin/users/')); }); const unauthorisedRoles = [{ @@ -33,10 +21,6 @@ context('Only allow authorised users to access admin pages', () => { roleName: 'Checkers', userWithRole: BANK1_CHECKER1, expectedRedirectLocation: '/dashboard/deals/0', - }, { - roleName: 'Editors', - userWithRole: EDITOR, - expectedRedirectLocation: '/login', }, { roleName: 'Read Only users', userWithRole: BANK1_READ_ONLY1, diff --git a/e2e-tests/portal/cypress/fixtures/users.js b/e2e-tests/portal/cypress/fixtures/users.js index 8255e07771..b4de3742fe 100644 --- a/e2e-tests/portal/cypress/fixtures/users.js +++ b/e2e-tests/portal/cypress/fixtures/users.js @@ -16,10 +16,6 @@ const BANK1_READ_ONLY1 = MOCK_USERS.find((user) => user.roles.includes(USER_ROLE const ADMIN = MOCK_USERS.find((user) => user.username === 'ADMIN'); -const UKEF_OPERATIONS = MOCK_USERS.find((user) => user.username === 'UKEF_OPERATIONS'); - -const EDITOR = MOCK_USERS.find((user) => user.username === 'EDITOR'); - // TFM const UNDERWRITER_MANAGER = MOCK_TFM_USERS.find((user) => user.teams.includes('UNDERWRITER_MANAGERS')); @@ -41,8 +37,6 @@ module.exports = { BANK1_CHECKER1, BANK1_READ_ONLY1, ADMIN, - UKEF_OPERATIONS, - EDITOR, UNDERWRITER_MANAGER, USER_WITH_INJECTION, }; diff --git a/portal-api/api-tests/api-test-users.js b/portal-api/api-tests/api-test-users.js index d7195e0585..1d1a8f3eda 100644 --- a/portal-api/api-tests/api-test-users.js +++ b/portal-api/api-tests/api-test-users.js @@ -2,7 +2,7 @@ const api = require('./api'); const db = require('../src/drivers/db-client'); const { genPassword } = require('../src/crypto/utils'); const wipeDB = require('./wipeDB'); -const { MAKER, CHECKER, DATA_ADMIN, ADMIN, READ_ONLY, EDITOR } = require('../src/v1/roles/roles'); +const { MAKER, CHECKER, ADMIN, READ_ONLY } = require('../src/v1/roles/roles'); const banks = { Barclays: { @@ -48,16 +48,6 @@ const testUsers = [ roles: [], bank: {}, }, - { - firstname: 'first', - surname: 'last', - timezone: 'Europe/London', - username: 'an-editor', - email: 'an-editor@ukexportfinance.gov.uk', - password: 'P@ssword1234', - roles: [EDITOR], - bank: {} - }, { username: 'HSBC-maker-1', password: 'P@ssword1234', @@ -138,36 +128,6 @@ const testUsers = [ roles: [], bank: banks.Barclays, }, - { - username: 'Barclays-data-admin', - password: 'P@ssword1234', - firstname: 'Data Admin', - surname: 'Barclays', - email: 'barclays-data-admin@email.com', - timezone: 'Europe/London', - roles: [DATA_ADMIN], - bank: banks.Barclays, - }, - { - username: 'Barclays-ukef-operations', - password: 'P@ssword1234', - firstname: 'UKEF Operations', - surname: 'Barclays', - email: 'barclays-ukef-operations@email.com', - timezone: 'Europe/London', - roles: ['ukef_operations'], - bank: banks.Barclays, - }, - { - username: 'Barclays-editor', - password: 'P@ssword1234', - firstname: 'Editor', - surname: 'Barclays', - email: 'barclays-editor@email.com', - timezone: 'Europe/London', - roles: [EDITOR], - bank: banks.Barclays, - }, { username: 'Ukef-maker-1', password: 'P@ssword1234', @@ -188,26 +148,6 @@ const testUsers = [ roles: [MAKER], bank: banks.any, }, - { - username: 'any-bank-ukef-operator', - password: 'P@ssword1234', - firstname: 'UKEF Operator', - surname: 'Any Bank', - email: 'any-bank-ukef-operator@email.com', - timezone: 'Europe/London', - roles: ['ukef_operations'], - bank: banks.any, - }, - { - username: 'data-admin', - password: 'P@ssword1234', - firstname: 'Mister', - surname: 'Eight', - email: 'eight@email.com', - timezone: 'Europe/London', - roles: [DATA_ADMIN], - bank: {}, - }, { username: 'Barclays-maker-checker-1', password: 'P@ssword1234', diff --git a/portal-api/api-tests/v1/banks/banks.api-test.js b/portal-api/api-tests/v1/banks/banks.api-test.js index 04120abfbf..8283d34677 100644 --- a/portal-api/api-tests/v1/banks/banks.api-test.js +++ b/portal-api/api-tests/v1/banks/banks.api-test.js @@ -5,7 +5,7 @@ const wipeDB = require('../../wipeDB'); const { as } = require('../../api')(app); const { expectMongoId, expectMongoIds } = require('../../expectMongoIds'); const bankController = require('../../../src/v1/controllers/banks.controller'); -const { EDITOR } = require('../../../src/v1/roles/roles'); +const { ADMIN } = require('../../../src/v1/roles/roles'); const aBank = require('./bank-builder'); @@ -18,13 +18,13 @@ const updatedBank = aBank({ // Disabled MGA tests as they remove banks from DB which other functionality now depends on // so other test will break if this is run before describe.skip('/v1/banks', () => { - let anEditor; - let aNonEditor; + let anAdmin; + let aNonAdmin; beforeAll(async () => { const testUsers = await testUserCache.initialise(app); - anEditor = testUsers().withRole(EDITOR).one(); - aNonEditor = testUsers().withoutRole(EDITOR).one(); + anAdmin = testUsers().withRole(ADMIN).one(); + aNonAdmin = testUsers().withoutRole(ADMIN).one(); }); beforeEach(async () => { @@ -39,7 +39,7 @@ describe.skip('/v1/banks', () => { }); it('accepts requests that present a valid Authorization token', async () => { - const { status } = await as(aNonEditor).get('/v1/banks'); + const { status } = await as(aNonAdmin).get('/v1/banks'); expect(status).toEqual(200); }); @@ -47,9 +47,9 @@ describe.skip('/v1/banks', () => { it('returns a list of banks', async () => { const banks = [aBank({ id: '1' }), aBank({ id: '2' }), aBank({ id: '3' })]; - await as(anEditor).postEach(banks).to('/v1/banks'); + await as(anAdmin).postEach(banks).to('/v1/banks'); - const { status, body } = await as(aNonEditor).get('/v1/banks'); + const { status, body } = await as(aNonAdmin).get('/v1/banks'); expect(status).toEqual(200); expect(body.banks).toEqual(expectMongoIds(banks)); @@ -64,15 +64,15 @@ describe.skip('/v1/banks', () => { }); it('accepts requests that do present a valid Authorization token', async () => { - const { status } = await as(aNonEditor).get('/v1/banks/123'); + const { status } = await as(aNonAdmin).get('/v1/banks/123'); expect(status).toEqual(200); }); it('returns a bank', async () => { - await as(anEditor).post(newBank).to('/v1/banks'); + await as(anAdmin).post(newBank).to('/v1/banks'); - const { status, body } = await as(aNonEditor).get('/v1/banks/112233'); + const { status, body } = await as(aNonAdmin).get('/v1/banks/112233'); expect(status).toEqual(200); expect(body).toEqual(expectMongoId(newBank)); @@ -86,14 +86,14 @@ describe.skip('/v1/banks', () => { expect(status).toEqual(401); }); - it('rejects requests that present a valid Authorization token but do not have "editor" role', async () => { - const { status } = await as(aNonEditor).post(newBank).to('/v1/banks'); + it('rejects requests that present a valid Authorization token but do not have "admin" role', async () => { + const { status } = await as(aNonAdmin).post(newBank).to('/v1/banks'); expect(status).toEqual(401); }); - it('accepts requests that present a valid Authorization token with "editor" role', async () => { - const { status } = await as(anEditor).post(newBank).to('/v1/banks'); + it('accepts requests that present a valid Authorization token with "admin" role', async () => { + const { status } = await as(anAdmin).post(newBank).to('/v1/banks'); expect(status).toEqual(200); }); @@ -106,25 +106,25 @@ describe.skip('/v1/banks', () => { expect(status).toEqual(401); }); - it('rejects requests that present a valid Authorization token but do not have "editor" role', async () => { - await as(anEditor).post(newBank).to('/v1/banks'); - const { status } = await as(aNonEditor).put(updatedBank).to('/v1/banks/112233'); + it('rejects requests that present a valid Authorization token but do not have "admin" role', async () => { + await as(anAdmin).post(newBank).to('/v1/banks'); + const { status } = await as(aNonAdmin).put(updatedBank).to('/v1/banks/112233'); expect(status).toEqual(401); }); - it('accepts requests that present a valid Authorization token with "editor" role', async () => { - await as(anEditor).post(newBank).to('/v1/banks'); - const { status } = await as(anEditor).put(updatedBank).to('/v1/banks/112233'); + it('accepts requests that present a valid Authorization token with "admin" role', async () => { + await as(anAdmin).post(newBank).to('/v1/banks'); + const { status } = await as(anAdmin).put(updatedBank).to('/v1/banks/112233'); expect(status).toEqual(200); }); it('updates the bank', async () => { - await as(anEditor).post(newBank).to('/v1/banks'); - await as(anEditor).put(updatedBank).to('/v1/banks/112233'); + await as(anAdmin).post(newBank).to('/v1/banks'); + await as(anAdmin).put(updatedBank).to('/v1/banks/112233'); - const { status, body } = await as(anEditor).get('/v1/banks/112233'); + const { status, body } = await as(anAdmin).get('/v1/banks/112233'); expect(status).toEqual(200); expect(body).toEqual(expectMongoId(updatedBank)); @@ -138,25 +138,25 @@ describe.skip('/v1/banks', () => { expect(status).toEqual(401); }); - it('rejects requests that present a valid Authorization token but do not have "editor" role', async () => { - await as(anEditor).post(newBank).to('/v1/banks'); - const { status } = await as(aNonEditor).remove('/v1/banks/112233'); + it('rejects requests that present a valid Authorization token but do not have "admin" role', async () => { + await as(anAdmin).post(newBank).to('/v1/banks'); + const { status } = await as(aNonAdmin).remove('/v1/banks/112233'); expect(status).toEqual(401); }); - it('accepts requests that present a valid Authorization token with "editor" role', async () => { - await as(anEditor).post(newBank).to('/v1/banks'); - const { status } = await as(anEditor).remove('/v1/banks/112233'); + it('accepts requests that present a valid Authorization token with "admin" role', async () => { + await as(anAdmin).post(newBank).to('/v1/banks'); + const { status } = await as(anAdmin).remove('/v1/banks/112233'); expect(status).toEqual(200); }); it('deletes the bank', async () => { - await as(anEditor).post(newBank).to('/v1/banks'); - await as(anEditor).remove('/v1/banks/112233'); + await as(anAdmin).post(newBank).to('/v1/banks'); + await as(anAdmin).remove('/v1/banks/112233'); - const { status, body } = await as(anEditor).get('/v1/banks/112233'); + const { status, body } = await as(anAdmin).get('/v1/banks/112233'); expect(status).toEqual(200); expect(body).toEqual({}); @@ -165,7 +165,7 @@ describe.skip('/v1/banks', () => { describe('Bank.Controller', () => { it('findOneBank returns a bank when no callback given', async () => { - await as(anEditor).post(newBank).to('/v1/banks'); + await as(anAdmin).post(newBank).to('/v1/banks'); const bank = await bankController.findOneBank(newBank.id); diff --git a/portal-api/api-tests/v1/deals/deal-eligibility-documentation.api-test.js b/portal-api/api-tests/v1/deals/deal-eligibility-documentation.api-test.js index c4a6137d0b..77c905019a 100644 --- a/portal-api/api-tests/v1/deals/deal-eligibility-documentation.api-test.js +++ b/portal-api/api-tests/v1/deals/deal-eligibility-documentation.api-test.js @@ -4,7 +4,7 @@ const aDeal = require('./deal-builder'); const app = require('../../../src/createApp'); const { withClientAuthenticationTests } = require('../../common-tests/client-authentication-tests'); const { withRoleAuthorisationTests } = require('../../common-tests/role-authorisation-tests'); -const { MAKER, CHECKER, READ_ONLY, ADMIN, EDITOR } = require('../../../src/v1/roles/roles'); +const { MAKER, CHECKER, READ_ONLY, ADMIN } = require('../../../src/v1/roles/roles'); const testUserCache = require('../../api-test-users'); const eligibilityCriteriaCache = require('../../api-test-eligibilityCriteria'); @@ -19,7 +19,7 @@ describe('/v1/deals/:id/eligibility-documentation', () => { let noRoles; let aBarclaysMaker; let anHSBCMaker; - let anEditor; + let anAdmin; let testUsers; beforeAll(async () => { @@ -27,9 +27,9 @@ describe('/v1/deals/:id/eligibility-documentation', () => { noRoles = testUsers().withoutAnyRoles().withBankName('Barclays Bank').one(); aBarclaysMaker = testUsers().withRole(MAKER).withBankName('Barclays Bank').one(); anHSBCMaker = testUsers().withRole(MAKER).withBankName('HSBC').one(); - anEditor = testUsers().withRole(EDITOR).one(); + anAdmin = testUsers().withRole(ADMIN).one(); - await eligibilityCriteriaCache.initialise(app, anEditor); + await eligibilityCriteriaCache.initialise(app, anAdmin); }); beforeEach(async () => { diff --git a/portal-api/api-tests/v1/eligibility-criteria/eligibility-criteria.api-test.js b/portal-api/api-tests/v1/eligibility-criteria/eligibility-criteria.api-test.js index b663b08731..503a56f19e 100644 --- a/portal-api/api-tests/v1/eligibility-criteria/eligibility-criteria.api-test.js +++ b/portal-api/api-tests/v1/eligibility-criteria/eligibility-criteria.api-test.js @@ -9,7 +9,7 @@ const { as, get, remove, put, post } = require('../../api')(app); const { expectMongoId, expectMongoIds } = require('../../expectMongoIds'); const allEligibilityCriteria = require('../../fixtures/eligibilityCriteria'); -const { EDITOR, ADMIN } = require('../../../src/v1/roles/roles'); +const { ADMIN } = require('../../../src/v1/roles/roles'); const newEligibilityCriteria = allEligibilityCriteria[0]; const updatedEligibilityCriteria = { @@ -24,13 +24,13 @@ const updatedEligibilityCriteria = { describe('/v1/eligibility-criteria', () => { let noRoles; - let anEditor; + let anAdmin; let testUsers; beforeAll(async () => { testUsers = await testUserCache.initialise(app); noRoles = testUsers().withoutAnyRoles().one(); - anEditor = testUsers().withRole(EDITOR).one(); + anAdmin = testUsers().withRole(ADMIN).one(); }); beforeEach(async () => { @@ -54,8 +54,8 @@ describe('/v1/eligibility-criteria', () => { it('returns a list of eligibility-criteria sorted by id', async () => { // randomise the order a bit on the way in... - await as(anEditor).post(allEligibilityCriteria[0]).to(eligibilityCriteriaUrl); - await as(anEditor).post(allEligibilityCriteria[1]).to(eligibilityCriteriaUrl); + await as(anAdmin).post(allEligibilityCriteria[0]).to(eligibilityCriteriaUrl); + await as(anAdmin).post(allEligibilityCriteria[1]).to(eligibilityCriteriaUrl); const { body } = await as(noRoles).get(eligibilityCriteriaUrl); expect(body).toEqual({ @@ -81,9 +81,9 @@ describe('/v1/eligibility-criteria', () => { }); it('returns the last created eligibility-criteria', async () => { - await as(anEditor).post(newEligibilityCriteria).to('/v1/eligibility-criteria'); + await as(anAdmin).post(newEligibilityCriteria).to('/v1/eligibility-criteria'); - const { status, body } = await as(anEditor).get(latestEligibilityCriteriaUrl); + const { status, body } = await as(anAdmin).get(latestEligibilityCriteriaUrl); expect(status).toEqual(200); expect(body).toEqual(expectMongoId(newEligibilityCriteria)); @@ -106,9 +106,9 @@ describe('/v1/eligibility-criteria', () => { }); it('returns an eligibility-criteria', async () => { - await as(anEditor).post(newEligibilityCriteria).to('/v1/eligibility-criteria'); + await as(anAdmin).post(newEligibilityCriteria).to('/v1/eligibility-criteria'); - const { status, body } = await as(anEditor).get(`/v1/eligibility-criteria/${newEligibilityCriteria.version}`); + const { status, body } = await as(anAdmin).get(`/v1/eligibility-criteria/${newEligibilityCriteria.version}`); expect(status).toEqual(200); expect(body).toEqual(expectMongoId(newEligibilityCriteria)); @@ -124,7 +124,7 @@ describe('/v1/eligibility-criteria', () => { }); withRoleAuthorisationTests({ - allowedRoles: [ADMIN, EDITOR], + allowedRoles: [ADMIN], getUserWithRole: (role) => testUsers().withRole(role).one(), getUserWithoutAnyRoles: () => noRoles, makeRequestAsUser: (user) => as(user).post(newEligibilityCriteria).to(eligibilityCriteriaUrl), @@ -141,7 +141,7 @@ describe('/v1/eligibility-criteria', () => { }); withRoleAuthorisationTests({ - allowedRoles: [ADMIN, EDITOR], + allowedRoles: [ADMIN], getUserWithRole: (role) => testUsers().withRole(role).one(), getUserWithoutAnyRoles: () => noRoles, makeRequestAsUser: (user) => as(user).put(updatedEligibilityCriteria).to(eligibilityCriteria1Url), @@ -156,10 +156,10 @@ describe('/v1/eligibility-criteria', () => { ], }; - await as(anEditor).post(eligibilityCriteria).to('/v1/eligibility-criteria'); - await as(anEditor).put(update).to(`/v1/eligibility-criteria/${eligibilityCriteria.version}`); + await as(anAdmin).post(eligibilityCriteria).to('/v1/eligibility-criteria'); + await as(anAdmin).put(update).to(`/v1/eligibility-criteria/${eligibilityCriteria.version}`); - const { status, body } = await as(anEditor).get(`/v1/eligibility-criteria/${eligibilityCriteria.version}`); + const { status, body } = await as(anAdmin).get(`/v1/eligibility-criteria/${eligibilityCriteria.version}`); expect(status).toEqual(200); expect(body).toEqual(expectMongoId({ @@ -178,7 +178,7 @@ describe('/v1/eligibility-criteria', () => { }); withRoleAuthorisationTests({ - allowedRoles: [ADMIN, EDITOR], + allowedRoles: [ADMIN], getUserWithRole: (role) => testUsers().withRole(role).one(), getUserWithoutAnyRoles: () => noRoles, makeRequestAsUser: (user) => as(user).remove(eligibilityCriteria1Url), @@ -186,10 +186,10 @@ describe('/v1/eligibility-criteria', () => { }); it('deletes the eligibility-criteria', async () => { - await as(anEditor).post(newEligibilityCriteria).to('/v1/eligibility-criteria'); - await as(anEditor).remove('/v1/eligibility-criteria/1'); + await as(anAdmin).post(newEligibilityCriteria).to('/v1/eligibility-criteria'); + await as(anAdmin).remove('/v1/eligibility-criteria/1'); - const { status, body } = await as(anEditor).get('/v1/eligibility-criteria/1'); + const { status, body } = await as(anAdmin).get('/v1/eligibility-criteria/1'); expect(status).toEqual(200); expect(body).toEqual({}); diff --git a/portal-api/api-tests/v1/feedback/feedback.api-test.js b/portal-api/api-tests/v1/feedback/feedback.api-test.js index 416252135c..bf02ade7bc 100644 --- a/portal-api/api-tests/v1/feedback/feedback.api-test.js +++ b/portal-api/api-tests/v1/feedback/feedback.api-test.js @@ -3,12 +3,12 @@ const app = require('../../../src/createApp'); const testUserCache = require('../../api-test-users'); const { withClientAuthenticationTests } = require('../../common-tests/client-authentication-tests'); const { withRoleAuthorisationTests } = require('../../common-tests/role-authorisation-tests'); -const { MAKER, CHECKER, ADMIN, DATA_ADMIN } = require('../../../src/v1/roles/roles'); +const { MAKER, CHECKER, ADMIN } = require('../../../src/v1/roles/roles'); const { as, get, remove } = require('../../api')(app); describe('/v1/feedback', () => { let noRoles; - let aDataAdmin; + let anAdmin; let aBarclaysMaker; let aBarclaysChecker; let testUsers; @@ -35,7 +35,7 @@ describe('/v1/feedback', () => { noRoles = testUsers().withoutAnyRoles().one(); aBarclaysMaker = testUsers().withRole(MAKER).withBankName('Barclays Bank').one(); aBarclaysChecker = testUsers().withRole(CHECKER).withBankName('Barclays Bank').one(); - aDataAdmin = testUsers().withRole(DATA_ADMIN).one(); + anAdmin = testUsers().withRole(ADMIN).one(); }); beforeEach(async () => { @@ -71,7 +71,7 @@ describe('/v1/feedback', () => { it('does not create a feedback when there are validation errors', async () => { await as(aBarclaysMaker).post({}).to('/v1/feedback'); - const { status, body } = await as(aDataAdmin).get('/v1/feedback'); + const { status, body } = await as(anAdmin).get('/v1/feedback'); expect(status).toEqual(200); expect(body).toEqual([]); }); @@ -83,7 +83,7 @@ describe('/v1/feedback', () => { expect(status).toEqual(200); expect(createdFeedback._id).toBeDefined(); - const { body: feedback } = await as(aDataAdmin).get(`/v1/feedback/${createdFeedback._id}`); + const { body: feedback } = await as(anAdmin).get(`/v1/feedback/${createdFeedback._id}`); expect(feedback).toEqual({ ...feedbackFormBody, @@ -107,7 +107,7 @@ describe('/v1/feedback', () => { }); withRoleAuthorisationTests({ - allowedRoles: [DATA_ADMIN, ADMIN], + allowedRoles: [ADMIN], getUserWithRole: (role) => testUsers().withRole(role).one(), getUserWithoutAnyRoles: () => noRoles, makeRequestAsUser: (user) => as(user).get(feedbackUrl), @@ -119,11 +119,11 @@ describe('/v1/feedback', () => { const { body: createdFeedback2 } = await postFeedback(); const { body: createdFeedback3 } = await postFeedback(); - const { body: feedback1 } = await as(aDataAdmin).get(`/v1/feedback/${createdFeedback1._id}`); - const { body: feedback2 } = await as(aDataAdmin).get(`/v1/feedback/${createdFeedback2._id}`); - const { body: feedback3 } = await as(aDataAdmin).get(`/v1/feedback/${createdFeedback3._id}`); + const { body: feedback1 } = await as(anAdmin).get(`/v1/feedback/${createdFeedback1._id}`); + const { body: feedback2 } = await as(anAdmin).get(`/v1/feedback/${createdFeedback2._id}`); + const { body: feedback3 } = await as(anAdmin).get(`/v1/feedback/${createdFeedback3._id}`); - const { status, body } = await as(aDataAdmin).get(feedbackUrl); + const { status, body } = await as(anAdmin).get(feedbackUrl); expect(status).toEqual(200); @@ -150,7 +150,7 @@ describe('/v1/feedback', () => { }); withRoleAuthorisationTests({ - allowedRoles: [DATA_ADMIN, ADMIN], + allowedRoles: [ADMIN], getUserWithRole: (role) => testUsers().withRole(role).one(), getUserWithoutAnyRoles: () => noRoles, makeRequestAsUser: (user) => as(user).get(aFeedbackUrl), @@ -158,12 +158,12 @@ describe('/v1/feedback', () => { }); it('404s requests for unknown resources', async () => { - const { status } = await as(aDataAdmin).get('/v1/feedback/620a1aa095a618b12da38c7b'); + const { status } = await as(anAdmin).get('/v1/feedback/620a1aa095a618b12da38c7b'); expect(status).toEqual(404); }); it('returns a feedback', async () => { - const { status, body } = await as(aDataAdmin).get(aFeedbackUrl); + const { status, body } = await as(anAdmin).get(aFeedbackUrl); expect(status).toEqual(200); expect(body).toEqual({ @@ -192,7 +192,7 @@ describe('/v1/feedback', () => { }); withRoleAuthorisationTests({ - allowedRoles: [DATA_ADMIN, ADMIN], + allowedRoles: [ADMIN], getUserWithRole: (role) => testUsers().withRole(role).one(), getUserWithoutAnyRoles: () => noRoles, makeRequestAsUser: (user) => as(user).remove(aFeedbackUrl), @@ -200,7 +200,7 @@ describe('/v1/feedback', () => { }); it('404s requests for unknown resources', async () => { - const { status } = await as(aDataAdmin).remove('/v1/feedback/620a1aa095a618b12da38c7b'); + const { status } = await as(anAdmin).remove('/v1/feedback/620a1aa095a618b12da38c7b'); expect(status).toEqual(404); }); @@ -208,10 +208,10 @@ describe('/v1/feedback', () => { const createdFeedback = await postFeedback(); const { _id } = createdFeedback.body; - const { status } = await as(aDataAdmin).remove(`/v1/feedback/${_id}`); + const { status } = await as(anAdmin).remove(`/v1/feedback/${_id}`); expect(status).toEqual(200); - const getResponse = await as(aDataAdmin).get(`/v1/feedback/${_id}`); + const getResponse = await as(anAdmin).get(`/v1/feedback/${_id}`); expect(getResponse.status).toEqual(404); }); }); diff --git a/portal-api/api-tests/v1/gef/address.api-test.js b/portal-api/api-tests/v1/gef/address.api-test.js index df149ab4f6..50b6cd67b2 100644 --- a/portal-api/api-tests/v1/gef/address.api-test.js +++ b/portal-api/api-tests/v1/gef/address.api-test.js @@ -1,5 +1,5 @@ const app = require('../../../src/createApp'); -const { MAKER, DATA_ADMIN, READ_ONLY, ADMIN } = require('../../../src/v1/roles/roles'); +const { MAKER, READ_ONLY, ADMIN } = require('../../../src/v1/roles/roles'); const testUserCache = require('../../api-test-users'); const { withClientAuthenticationTests } = require('../../common-tests/client-authentication-tests'); const { withRoleAuthorisationTests } = require('../../common-tests/role-authorisation-tests'); @@ -27,7 +27,7 @@ describe('GET /v1/gef/address/:postcode', () => { }); withRoleAuthorisationTests({ - allowedRoles: [MAKER, DATA_ADMIN, READ_ONLY, ADMIN], + allowedRoles: [MAKER, READ_ONLY, ADMIN], getUserWithRole: (role) => testUsers().withRole(role).one(), getUserWithoutAnyRoles: () => testUsers().withoutAnyRoles().one(), makeRequestAsUser: (user) => as(user).get(aPostcodeAddressUrl), diff --git a/portal-api/api-tests/v1/gef/application.api-test.js b/portal-api/api-tests/v1/gef/application.api-test.js index f7db33e389..7936baf9d7 100644 --- a/portal-api/api-tests/v1/gef/application.api-test.js +++ b/portal-api/api-tests/v1/gef/application.api-test.js @@ -5,7 +5,7 @@ const app = require('../../../src/createApp'); const testUserCache = require('../../api-test-users'); const { withClientAuthenticationTests } = require('../../common-tests/client-authentication-tests'); const { withRoleAuthorisationTests } = require('../../common-tests/role-authorisation-tests'); -const { MAKER, CHECKER, READ_ONLY, DATA_ADMIN, ADMIN } = require('../../../src/v1/roles/roles'); +const { MAKER, CHECKER, READ_ONLY, ADMIN } = require('../../../src/v1/roles/roles'); const { as, get } = require('../../api')(app); const { expectMongoId } = require('../../expectMongoIds'); @@ -63,7 +63,7 @@ describe(baseUrl, () => { }); withRoleAuthorisationTests({ - allowedRoles: [MAKER, CHECKER, READ_ONLY, DATA_ADMIN, ADMIN], + allowedRoles: [MAKER, CHECKER, READ_ONLY, ADMIN], getUserWithRole: (role) => testUsers().withRole(role).one(), getUserWithoutAnyRoles: () => testUsers().withoutAnyRoles().one(), makeRequestAsUser: (user) => as(user).get(baseUrl), @@ -142,7 +142,7 @@ describe(baseUrl, () => { }); withRoleAuthorisationTests({ - allowedRoles: [MAKER, CHECKER, READ_ONLY, DATA_ADMIN, ADMIN], + allowedRoles: [MAKER, CHECKER, READ_ONLY, ADMIN], getUserWithRole: (role) => testUsers().withRole(role).one(), getUserWithoutAnyRoles: () => testUsers().withoutAnyRoles().one(), makeRequestAsUser: (user) => as(user).get(oneApplicationUrl), @@ -207,7 +207,7 @@ describe(baseUrl, () => { }); withRoleAuthorisationTests({ - allowedRoles: [MAKER, CHECKER, READ_ONLY, DATA_ADMIN, ADMIN], + allowedRoles: [MAKER, CHECKER, READ_ONLY, ADMIN], getUserWithRole: (role) => testUsers().withRole(role).one(), getUserWithoutAnyRoles: () => testUsers().withoutAnyRoles().one(), makeRequestAsUser: (user) => as(user).get(oneApplicationStatusUrl), diff --git a/portal-api/api-tests/v1/gef/company.api-test.js b/portal-api/api-tests/v1/gef/company.api-test.js index ca26b5ec7f..a55d7fa753 100644 --- a/portal-api/api-tests/v1/gef/company.api-test.js +++ b/portal-api/api-tests/v1/gef/company.api-test.js @@ -1,5 +1,5 @@ const app = require('../../../src/createApp'); -const { MAKER, DATA_ADMIN, READ_ONLY, ADMIN } = require('../../../src/v1/roles/roles'); +const { MAKER, READ_ONLY, ADMIN } = require('../../../src/v1/roles/roles'); const testUserCache = require('../../api-test-users'); const { withClientAuthenticationTests } = require('../../common-tests/client-authentication-tests'); const { withRoleAuthorisationTests } = require('../../common-tests/role-authorisation-tests'); @@ -42,7 +42,7 @@ describe('GET /v1/gef/company/:number', () => { }); withRoleAuthorisationTests({ - allowedRoles: [MAKER, DATA_ADMIN, READ_ONLY, ADMIN], + allowedRoles: [MAKER, READ_ONLY, ADMIN], getUserWithRole: (role) => testUsers().withRole(role).one(), getUserWithoutAnyRoles: () => testUsers().withoutAnyRoles().one(), makeRequestAsUser: (user) => as(user).get(aCompanyNumberUrl), diff --git a/portal-api/api-tests/v1/gef/eligibility-criteria.api-test.js b/portal-api/api-tests/v1/gef/eligibility-criteria.api-test.js index 5516876155..5d735579e4 100644 --- a/portal-api/api-tests/v1/gef/eligibility-criteria.api-test.js +++ b/portal-api/api-tests/v1/gef/eligibility-criteria.api-test.js @@ -5,7 +5,7 @@ const app = require('../../../src/createApp'); const testUserCache = require('../../api-test-users'); const { withClientAuthenticationTests } = require('../../common-tests/client-authentication-tests'); const { withRoleAuthorisationTests } = require('../../common-tests/role-authorisation-tests'); -const { MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN } = require('../../../src/v1/roles/roles'); +const { MAKER, CHECKER, READ_ONLY, ADMIN } = require('../../../src/v1/roles/roles'); const { as, get, post, remove } = require('../../api')(app); const { expectMongoId } = require('../../expectMongoIds'); @@ -16,13 +16,13 @@ const baseUrl = '/v1/gef/eligibility-criteria'; describe(baseUrl, () => { let aMaker; - let anEditor; + let anAdmin; let testUsers; beforeAll(async () => { testUsers = await testUserCache.initialise(app); aMaker = testUsers().withRole(MAKER).one(); - anEditor = testUsers().withRole(EDITOR).one(); + anAdmin = testUsers().withRole(ADMIN).one(); }); beforeEach(async () => { @@ -36,7 +36,7 @@ describe(baseUrl, () => { }); withRoleAuthorisationTests({ - allowedRoles: [MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN], + allowedRoles: [MAKER, CHECKER, READ_ONLY, ADMIN], getUserWithRole: (role) => testUsers().withRole(role).one(), getUserWithoutAnyRoles: () => testUsers().withoutAnyRoles().one(), makeRequestAsUser: (user) => as(user).get(baseUrl), @@ -53,7 +53,7 @@ describe(baseUrl, () => { }); withRoleAuthorisationTests({ - allowedRoles: [MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN], + allowedRoles: [MAKER, CHECKER, READ_ONLY, ADMIN], getUserWithRole: (role) => testUsers().withRole(role).one(), getUserWithoutAnyRoles: () => testUsers().withoutAnyRoles().one(), makeRequestAsUser: (user) => as(user).get(latestEligibilityCriteriaUrl), @@ -61,9 +61,9 @@ describe(baseUrl, () => { }); it('returns the latest eligibility-criteria version', async () => { - await as(anEditor).post(items[0]).to(baseUrl); - await as(anEditor).post(items[1]).to(baseUrl); - await as(anEditor).post(items[2]).to(baseUrl); + await as(anAdmin).post(items[0]).to(baseUrl); + await as(anAdmin).post(items[1]).to(baseUrl); + await as(anAdmin).post(items[2]).to(baseUrl); const { body } = await as(aMaker).get(latestEligibilityCriteriaUrl); @@ -84,7 +84,7 @@ describe(baseUrl, () => { }); withRoleAuthorisationTests({ - allowedRoles: [MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN], + allowedRoles: [MAKER, CHECKER, READ_ONLY, ADMIN], getUserWithRole: (role) => testUsers().withRole(role).one(), getUserWithoutAnyRoles: () => testUsers().withoutAnyRoles().one(), makeRequestAsUser: (user) => as(user).get(eligibilityCriteria1Url), @@ -97,8 +97,8 @@ describe(baseUrl, () => { }); it('returns an eligibility criteria', async () => { - await as(anEditor).post(items[0]).to(baseUrl); - const { status, body } = await as(anEditor).get(`${baseUrl}/${items[0].version}`); + await as(anAdmin).post(items[0]).to(baseUrl); + const { status, body } = await as(anAdmin).get(`${baseUrl}/${items[0].version}`); expect(status).toEqual(200); const expected = { ...expectMongoId(items[0]), @@ -118,7 +118,7 @@ describe(baseUrl, () => { }); withRoleAuthorisationTests({ - allowedRoles: [ADMIN, EDITOR, DATA_ADMIN], + allowedRoles: [ADMIN], getUserWithRole: (role) => testUsers().withRole(role).one(), getUserWithoutAnyRoles: () => testUsers().withoutAnyRoles().one(), makeRequestAsUser: (user) => as(user).post(items[0]).to(baseUrl), @@ -135,7 +135,7 @@ describe(baseUrl, () => { }); withRoleAuthorisationTests({ - allowedRoles: [ADMIN, EDITOR, DATA_ADMIN], + allowedRoles: [ADMIN], getUserWithRole: (role) => testUsers().withRole(role).one(), getUserWithoutAnyRoles: () => testUsers().withoutAnyRoles().one(), makeRequestAsUser: (user) => as(user).remove(eligibilityCriteria1Url), @@ -144,10 +144,10 @@ describe(baseUrl, () => { it('deletes the eligibility-criteria', async () => { // eslint-disable-next-line no-unused-vars - await as(anEditor).post(items[0]).to(baseUrl); - const { body: item } = await as(anEditor).get(`${baseUrl}/${items[0].version}`); + await as(anAdmin).post(items[0]).to(baseUrl); + const { body: item } = await as(anAdmin).get(`${baseUrl}/${items[0].version}`); - const { status, body } = await as(anEditor).remove(`${baseUrl}/${items[0].version}`); + const { status, body } = await as(anAdmin).remove(`${baseUrl}/${items[0].version}`); expect(status).toEqual(200); expect(body).toEqual(item); }); diff --git a/portal-api/api-tests/v1/gef/facilities.api-test.js b/portal-api/api-tests/v1/gef/facilities.api-test.js index 7a926c69e8..581cbd3bc5 100644 --- a/portal-api/api-tests/v1/gef/facilities.api-test.js +++ b/portal-api/api-tests/v1/gef/facilities.api-test.js @@ -10,7 +10,7 @@ const app = require('../../../src/createApp'); const testUserCache = require('../../api-test-users'); const { withClientAuthenticationTests } = require('../../common-tests/client-authentication-tests'); const { withRoleAuthorisationTests } = require('../../common-tests/role-authorisation-tests'); -const { MAKER, CHECKER, READ_ONLY, DATA_ADMIN, ADMIN } = require('../../../src/v1/roles/roles'); +const { MAKER, CHECKER, READ_ONLY, ADMIN } = require('../../../src/v1/roles/roles'); const { as, get } = require('../../api')(app); @@ -113,7 +113,7 @@ describe(baseUrl, () => { }); withRoleAuthorisationTests({ - allowedRoles: [MAKER, CHECKER, READ_ONLY, DATA_ADMIN, ADMIN], + allowedRoles: [MAKER, CHECKER, READ_ONLY, ADMIN], getUserWithRole: (role) => testUsers().withRole(role).one(), getUserWithoutAnyRoles: () => testUsers().withoutAnyRoles().one(), makeRequestAsUser: (user) => as(user).get(facilitiesUrl), @@ -143,7 +143,7 @@ describe(baseUrl, () => { }); withRoleAuthorisationTests({ - allowedRoles: [MAKER, CHECKER, READ_ONLY, DATA_ADMIN, ADMIN], + allowedRoles: [MAKER, CHECKER, READ_ONLY, ADMIN], getUserWithRole: (role) => testUsers().withRole(role).one(), getUserWithoutAnyRoles: () => testUsers().withoutAnyRoles().one(), makeRequestAsUser: (user) => as(user).get(oneFacilityUrl), diff --git a/portal-api/api-tests/v1/gef/files.api-test.js b/portal-api/api-tests/v1/gef/files.api-test.js index e9ebf1c406..1658bcc48f 100644 --- a/portal-api/api-tests/v1/gef/files.api-test.js +++ b/portal-api/api-tests/v1/gef/files.api-test.js @@ -8,7 +8,7 @@ const { uploadFile, deleteFile, readFile } = require('../../../src/drivers/files const CONSTANTS = require('../../../src/constants'); const { withClientAuthenticationTests } = require('../../common-tests/client-authentication-tests'); const { withRoleAuthorisationTests } = require('../../common-tests/role-authorisation-tests'); -const { MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN } = require('../../../src/v1/roles/roles'); +const { MAKER, CHECKER, READ_ONLY, ADMIN } = require('../../../src/v1/roles/roles'); const baseUrl = '/v1/gef/files'; const collectionName = 'files'; @@ -177,7 +177,7 @@ describe(baseUrl, () => { }); withRoleAuthorisationTests({ - allowedRoles: [MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN], + allowedRoles: [MAKER, CHECKER, READ_ONLY, ADMIN], getUserWithRole: (role) => testUsers().withBankName(testBankName).withRole(role).one(), getUserWithoutAnyRoles: () => testUsers().withBankName(testBankName).withoutAnyRoles().one(), makeRequestAsUser: (user) => as(user).get(oneFileUrl), @@ -219,7 +219,7 @@ describe(baseUrl, () => { }); withRoleAuthorisationTests({ - allowedRoles: [MAKER, DATA_ADMIN], + allowedRoles: [MAKER], getUserWithRole: (role) => testUsers().withBankName(testBankName).withRole(role).one(), getUserWithoutAnyRoles: () => testUsers().withBankName(testBankName).withoutAnyRoles().one(), makeRequestAsUser: (user) => as(user).remove(oneFileUrl), @@ -281,7 +281,7 @@ describe(baseUrl, () => { }); withRoleAuthorisationTests({ - allowedRoles: [MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN], + allowedRoles: [MAKER, CHECKER, READ_ONLY, ADMIN], getUserWithRole: (role) => testUsers().withBankName(testBankName).withRole(role).one(), getUserWithoutAnyRoles: () => testUsers().withBankName(testBankName).withoutAnyRoles().one(), makeRequestAsUser: (user) => as(user).get(oneFileDownloadUrl), diff --git a/portal-api/api-tests/v1/gef/mandatory-criteria-versioned.api-test.js b/portal-api/api-tests/v1/gef/mandatory-criteria-versioned.api-test.js index 8bf0350ffa..87c9bca855 100644 --- a/portal-api/api-tests/v1/gef/mandatory-criteria-versioned.api-test.js +++ b/portal-api/api-tests/v1/gef/mandatory-criteria-versioned.api-test.js @@ -4,7 +4,7 @@ const app = require('../../../src/createApp'); const testUserCache = require('../../api-test-users'); const { withClientAuthenticationTests } = require('../../common-tests/client-authentication-tests'); const { withRoleAuthorisationTests } = require('../../common-tests/role-authorisation-tests'); -const { MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN } = require('../../../src/v1/roles/roles'); +const { MAKER, CHECKER, READ_ONLY, ADMIN } = require('../../../src/v1/roles/roles'); const { as, get } = require('../../api')(app); const { expectMongoId } = require('../../expectMongoIds'); @@ -21,13 +21,13 @@ const baseUrl = '/v1/gef/mandatory-criteria-versioned'; describe(baseUrl, () => { let aMaker; - let anEditor; + let anAdmin; let testUsers; beforeAll(async () => { testUsers = await testUserCache.initialise(app); aMaker = testUsers().withRole(MAKER).one(); - anEditor = testUsers().withRole(EDITOR).one(); + anAdmin = testUsers().withRole(ADMIN).one(); }); beforeEach(async () => { @@ -41,7 +41,7 @@ describe(baseUrl, () => { }); withRoleAuthorisationTests({ - allowedRoles: [MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN], + allowedRoles: [MAKER, CHECKER, READ_ONLY, ADMIN], getUserWithRole: (role) => testUsers().withRole(role).one(), getUserWithoutAnyRoles: () => testUsers().withoutAnyRoles().one(), makeRequestAsUser: (user) => as(user).get(baseUrl), @@ -53,7 +53,7 @@ describe(baseUrl, () => { const latestMandatoryCriteriaVersionedUrl = `${baseUrl}/latest`; beforeEach(async () => { - await as(anEditor).post(allMandatoryCriteria[0]).to(baseUrl); + await as(anAdmin).post(allMandatoryCriteria[0]).to(baseUrl); }); withClientAuthenticationTests({ @@ -62,7 +62,7 @@ describe(baseUrl, () => { }); withRoleAuthorisationTests({ - allowedRoles: [MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN], + allowedRoles: [MAKER, CHECKER, READ_ONLY, ADMIN], getUserWithRole: (role) => testUsers().withRole(role).one(), getUserWithoutAnyRoles: () => testUsers().withoutAnyRoles().one(), makeRequestAsUser: (user) => as(user).get(latestMandatoryCriteriaVersionedUrl), @@ -70,10 +70,10 @@ describe(baseUrl, () => { }); it('returns the latest mandatory-criteria version', async () => { - await as(anEditor).post(allMandatoryCriteria[1]).to(baseUrl); - await as(anEditor).post(allMandatoryCriteria[2]).to(baseUrl); - await as(anEditor).post(allMandatoryCriteria[3]).to(baseUrl); - await as(anEditor).post(allMandatoryCriteria[4]).to(baseUrl); + await as(anAdmin).post(allMandatoryCriteria[1]).to(baseUrl); + await as(anAdmin).post(allMandatoryCriteria[2]).to(baseUrl); + await as(anAdmin).post(allMandatoryCriteria[3]).to(baseUrl); + await as(anAdmin).post(allMandatoryCriteria[4]).to(baseUrl); const { body } = await as(aMaker).get(latestMandatoryCriteriaVersionedUrl); @@ -95,7 +95,7 @@ describe(baseUrl, () => { let oneMandatoryCriteriaVersionedUrl; beforeEach(async () => { - const { body: { _id: newId } } = await as(anEditor).post(newMandatoryCriteria).to(baseUrl); + const { body: { _id: newId } } = await as(anAdmin).post(newMandatoryCriteria).to(baseUrl); oneMandatoryCriteriaVersionedUrl = `${baseUrl}/${newId}`; }); @@ -105,7 +105,7 @@ describe(baseUrl, () => { }); withRoleAuthorisationTests({ - allowedRoles: [MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN], + allowedRoles: [MAKER, CHECKER, READ_ONLY, ADMIN], getUserWithRole: (role) => testUsers().withRole(role).one(), getUserWithoutAnyRoles: () => testUsers().withoutAnyRoles().one(), makeRequestAsUser: (user) => as(user).get(oneMandatoryCriteriaVersionedUrl), @@ -113,7 +113,7 @@ describe(baseUrl, () => { }); it('returns a mandatory-criteria-versioned', async () => { - const { status, body } = await as(anEditor).get(oneMandatoryCriteriaVersionedUrl); + const { status, body } = await as(anAdmin).get(oneMandatoryCriteriaVersionedUrl); expect(status).toEqual(200); const expected = { ...expectMongoId(newMandatoryCriteria), @@ -135,14 +135,14 @@ describe(baseUrl, () => { expect(status).toEqual(401); }); - it('rejects requests that present a valid Authorization token but do not have "editor" role', async () => { + it('rejects requests that present a valid Authorization token but do not have "admin" role', async () => { const { status } = await as(aMaker).post(newMandatoryCriteria).to(baseUrl); expect(status).toEqual(401); }); - it('accepts requests that present a valid Authorization token with "editor" role', async () => { - const { status } = await as(anEditor).post(newMandatoryCriteria).to(baseUrl); + it('accepts requests that present a valid Authorization token with "admin" role', async () => { + const { status } = await as(anAdmin).post(newMandatoryCriteria).to(baseUrl); expect(status).toEqual(201); }); @@ -154,25 +154,25 @@ describe(baseUrl, () => { expect(status).toEqual(401); }); - it('rejects requests that present a valid Authorization token but do not have "editor" role', async () => { + it('rejects requests that present a valid Authorization token but do not have "admin" role', async () => { const { status } = await as(aMaker).put(updatedMandatoryCriteria).to(`${baseUrl}/1`); expect(status).toEqual(401); }); - it('accepts requests that present a valid Authorization token with "editor" role', async () => { - const item = await as(anEditor).post(newMandatoryCriteria).to(baseUrl); - const { status } = await as(anEditor).put(updatedMandatoryCriteria).to(`${baseUrl}/${item.body._id}`); + it('accepts requests that present a valid Authorization token with "admin" role', async () => { + const item = await as(anAdmin).post(newMandatoryCriteria).to(baseUrl); + const { status } = await as(anAdmin).put(updatedMandatoryCriteria).to(`${baseUrl}/${item.body._id}`); expect(status).toEqual(200); }); it('rejects requests that do not have a valid mongodb id', async () => { - const { status, body } = await as(anEditor).put(updatedMandatoryCriteria).to(`${baseUrl}/abc`); + const { status, body } = await as(anAdmin).put(updatedMandatoryCriteria).to(`${baseUrl}/abc`); expect(status).toEqual(400); expect(body).toStrictEqual({ status: 400, message: 'Invalid Id' }); }); it('successfully updates item', async () => { - const item = await as(anEditor).post(newMandatoryCriteria).to(baseUrl); + const item = await as(anAdmin).post(newMandatoryCriteria).to(baseUrl); const itemUpdate = { ...JSON.parse(item.text), version: 99, @@ -185,7 +185,7 @@ describe(baseUrl, () => { }; delete itemUpdate._id; // immutable key - const { status } = await as(anEditor).put(itemUpdate).to(`${baseUrl}/${item.body._id}`); + const { status } = await as(anAdmin).put(itemUpdate).to(`${baseUrl}/${item.body._id}`); expect(status).toEqual(200); @@ -204,22 +204,22 @@ describe(baseUrl, () => { describe('DELETE /v1/gef/mandatory-criteria-versioned/:id', () => { it('rejects requests that do not present a valid Authorization token', async () => { - const item = await as(anEditor).post(newMandatoryCriteria).to(baseUrl); + const item = await as(anAdmin).post(newMandatoryCriteria).to(baseUrl); const { status } = await as().remove(`${baseUrl}/${item.body._id}`); expect(status).toEqual(401); }); - it('accepts requests that present a valid Authorization token with "editor" role', async () => { - const item = await as(anEditor).post(newMandatoryCriteria).to(baseUrl); - const { status } = await as(anEditor).remove(`${baseUrl}/${item.body._id}`); + it('accepts requests that present a valid Authorization token with "admin" role', async () => { + const item = await as(anAdmin).post(newMandatoryCriteria).to(baseUrl); + const { status } = await as(anAdmin).remove(`${baseUrl}/${item.body._id}`); expect(status).toEqual(200); }); it('deletes the mandatory-criteria', async () => { - const { body: createdItem } = await as(anEditor).post(newMandatoryCriteria).to(baseUrl); - const { body: item } = await as(anEditor).get(`${baseUrl}/${createdItem._id}`); + const { body: createdItem } = await as(anAdmin).post(newMandatoryCriteria).to(baseUrl); + const { body: item } = await as(anAdmin).get(`${baseUrl}/${createdItem._id}`); - const { status, body } = await as(anEditor).remove(`${baseUrl}/${createdItem._id}`); + const { status, body } = await as(anAdmin).remove(`${baseUrl}/${createdItem._id}`); expect(status).toEqual(200); expect(body).toEqual(item); }); diff --git a/portal-api/api-tests/v1/mandatory-criteria/mandatory-criteria.api-test.js b/portal-api/api-tests/v1/mandatory-criteria/mandatory-criteria.api-test.js index 04046922e2..546cddefd8 100644 --- a/portal-api/api-tests/v1/mandatory-criteria/mandatory-criteria.api-test.js +++ b/portal-api/api-tests/v1/mandatory-criteria/mandatory-criteria.api-test.js @@ -9,7 +9,7 @@ const { as, get, post, put, remove } = require('../../api')(app); const { expectMongoId, expectMongoIds } = require('../../expectMongoIds'); const allMandatoryCriteria = require('../../fixtures/mandatoryCriteria'); -const { ADMIN, EDITOR } = require('../../../src/v1/roles/roles'); +const { ADMIN } = require('../../../src/v1/roles/roles'); const newMandatoryCriteria = allMandatoryCriteria[0]; const oldMandatoryCriteria = allMandatoryCriteria[1]; @@ -126,7 +126,7 @@ describe('/v1/mandatory-criteria', () => { }); withRoleAuthorisationTests({ - allowedRoles: [ADMIN, EDITOR], + allowedRoles: [ADMIN], getUserWithRole: (role) => testUsers().withRole(role).one(), getUserWithoutAnyRoles: () => testUsers().withoutAnyRoles().one(), makeRequestAsUser: (user) => as(user).post(newMandatoryCriteria).to(allMandatoryCriteriaUrl), @@ -143,7 +143,7 @@ describe('/v1/mandatory-criteria', () => { }); withRoleAuthorisationTests({ - allowedRoles: [ADMIN, EDITOR], + allowedRoles: [ADMIN], getUserWithRole: (role) => testUsers().withRole(role).one(), getUserWithoutAnyRoles: () => testUsers().withoutAnyRoles().one(), makeRequestAsUser: (user) => as(user).put(updatedMandatoryCriteria).to(mandatoryCriteria1Url), @@ -180,7 +180,7 @@ describe('/v1/mandatory-criteria', () => { }); withRoleAuthorisationTests({ - allowedRoles: [ADMIN, EDITOR], + allowedRoles: [ADMIN], getUserWithRole: (role) => testUsers().withRole(role).one(), getUserWithoutAnyRoles: () => testUsers().withoutAnyRoles().one(), makeRequestAsUser: (user) => as(user).remove(mandatoryCriteria1Url), diff --git a/portal-api/src/v1/gef/routes.js b/portal-api/src/v1/gef/routes.js index 6b33dfd2ce..9691641417 100644 --- a/portal-api/src/v1/gef/routes.js +++ b/portal-api/src/v1/gef/routes.js @@ -1,5 +1,5 @@ const express = require('express'); -const { MAKER, CHECKER, DATA_ADMIN, EDITOR, READ_ONLY, ADMIN } = require('../roles/roles'); +const { MAKER, CHECKER, READ_ONLY, ADMIN } = require('../roles/roles'); const { validateUserHasAtLeastOneAllowedRole } = require('../roles/validate-user-has-at-least-one-allowed-role'); const fileUpload = require('../middleware/file-upload'); @@ -17,70 +17,70 @@ const router = express.Router(); // Application router .route('/application') - .get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, READ_ONLY, DATA_ADMIN, ADMIN] }), application.getAll) - .post(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, DATA_ADMIN] }), application.create); + .get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, READ_ONLY, ADMIN] }), application.getAll) + .post(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER] }), application.create); router.route('/application/clone').post(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER] }), cloneApplication.clone); router .route('/application/:id') - .get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, READ_ONLY, DATA_ADMIN, ADMIN] }), application.getById) - .put(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, DATA_ADMIN] }), application.update) // checker can add a comment - .delete(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, DATA_ADMIN] }), application.delete); + .get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, READ_ONLY, ADMIN] }), application.getById) + .put(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER] }), application.update) // checker can add a comment + .delete(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER] }), application.delete); -router.route('/application/supporting-information/:id').put(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, DATA_ADMIN] }), application.updateSupportingInformation); +router.route('/application/supporting-information/:id').put(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER] }), application.updateSupportingInformation); router .route('/application/status/:id') - .get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, READ_ONLY, DATA_ADMIN, ADMIN] }), application.getStatus) - .put(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, DATA_ADMIN] }), application.changeStatus); + .get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, READ_ONLY, ADMIN] }), application.getStatus) + .put(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER] }), application.changeStatus); // Facilities router .route('/facilities') - .get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, READ_ONLY, DATA_ADMIN, ADMIN] }), facilities.getAllGET) - .post(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, DATA_ADMIN] }), facilities.create) - .delete(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, DATA_ADMIN] }), facilities.deleteByDealId); + .get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, READ_ONLY, ADMIN] }), facilities.getAllGET) + .post(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER] }), facilities.create) + .delete(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER] }), facilities.deleteByDealId); router .route('/facilities/:id') - .get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, READ_ONLY, DATA_ADMIN, ADMIN] }), facilities.getById) - .put(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, DATA_ADMIN] }), facilities.updatePUT) - .delete(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, DATA_ADMIN] }), facilities.delete); + .get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, READ_ONLY, ADMIN] }), facilities.getById) + .put(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER] }), facilities.updatePUT) + .delete(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER] }), facilities.delete); // Eligibility Criteria router .route('/eligibility-criteria') - .get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN] }), eligibilityCriteria.getAll) - .post(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [EDITOR, DATA_ADMIN, ADMIN] }), eligibilityCriteria.create); + .get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, READ_ONLY, ADMIN] }), eligibilityCriteria.getAll) + .post(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [ADMIN] }), eligibilityCriteria.create); -router.route('/eligibility-criteria/latest').get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN] }), eligibilityCriteria.getLatest); +router.route('/eligibility-criteria/latest').get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, READ_ONLY, ADMIN] }), eligibilityCriteria.getLatest); router .route('/eligibility-criteria/:version') - .get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN] }), eligibilityCriteria.getByVersion) - .delete(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [EDITOR, DATA_ADMIN, ADMIN] }), eligibilityCriteria.delete); + .get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, READ_ONLY, ADMIN] }), eligibilityCriteria.getByVersion) + .delete(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [ADMIN] }), eligibilityCriteria.delete); // Mandatory Criteria router .route('/mandatory-criteria-versioned') - .get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN] }), mandatoryCriteriaVersioned.findAll) - .post(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [EDITOR, DATA_ADMIN, ADMIN] }), mandatoryCriteriaVersioned.create); + .get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, READ_ONLY, ADMIN] }), mandatoryCriteriaVersioned.findAll) + .post(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [ADMIN] }), mandatoryCriteriaVersioned.create); router .route('/mandatory-criteria-versioned/latest') - .get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN] }), mandatoryCriteriaVersioned.findLatest); + .get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, READ_ONLY, ADMIN] }), mandatoryCriteriaVersioned.findLatest); router .route('/mandatory-criteria-versioned/:id') - .get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN] }), mandatoryCriteriaVersioned.findOne) - .put(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [EDITOR, DATA_ADMIN, ADMIN] }), mandatoryCriteriaVersioned.update) - .delete(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [EDITOR, DATA_ADMIN, ADMIN] }), mandatoryCriteriaVersioned.delete); + .get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, READ_ONLY, ADMIN] }), mandatoryCriteriaVersioned.findOne) + .put(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [ADMIN] }), mandatoryCriteriaVersioned.update) + .delete(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [ADMIN] }), mandatoryCriteriaVersioned.delete); // File Uploads // TODO: this feels like it should be a service: https://ukef-dtfs.atlassian.net/browse/DTFS2-4842 router.route('/files').post( - validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, DATA_ADMIN] }), + validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER] }), (req, res, next) => { fileUpload(req, res, (error) => { if (!error) { @@ -95,17 +95,17 @@ router.route('/files').post( router .route('/files/:id') - .get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN] }), files.getById) - .delete(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, DATA_ADMIN] }), files.delete); + .get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, READ_ONLY, ADMIN] }), files.getById) + .delete(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER] }), files.delete); -router.route('/files/:id/download').get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, READ_ONLY, EDITOR, DATA_ADMIN, ADMIN] }), files.downloadFile); +router.route('/files/:id/download').get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, READ_ONLY, ADMIN] }), files.downloadFile); router .route('/company/:number') // Companies House - .get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, READ_ONLY, DATA_ADMIN, ADMIN] }), externalApi.getByRegistrationNumber); + .get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, READ_ONLY, ADMIN] }), externalApi.getByRegistrationNumber); router .route('/address/:postcode') // Ordnance Survey - .get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, READ_ONLY, DATA_ADMIN, ADMIN] }), externalApi.getAddressesByPostcode); + .get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, READ_ONLY, ADMIN] }), externalApi.getAddressesByPostcode); module.exports = router; diff --git a/portal-api/src/v1/roles/roles.js b/portal-api/src/v1/roles/roles.js index 563414aa39..cb03060377 100644 --- a/portal-api/src/v1/roles/roles.js +++ b/portal-api/src/v1/roles/roles.js @@ -2,16 +2,10 @@ const MAKER = 'maker'; const CHECKER = 'checker'; const ADMIN = 'admin'; const READ_ONLY = 'read-only'; -const EDITOR = 'editor'; -const DATA_ADMIN = 'data-admin'; -const INTERFACE = 'interface'; module.exports = { MAKER, CHECKER, ADMIN, READ_ONLY, - EDITOR, - DATA_ADMIN, - INTERFACE, }; diff --git a/portal-api/src/v1/routes.js b/portal-api/src/v1/routes.js index 0167bf7be1..de1882d288 100644 --- a/portal-api/src/v1/routes.js +++ b/portal-api/src/v1/routes.js @@ -5,9 +5,6 @@ const { validateUserHasAtLeastOneAllowedRole } = require('./roles/validate-user- const { MAKER, CHECKER, - EDITOR, - DATA_ADMIN, - INTERFACE, READ_ONLY, ADMIN, } = require('./roles/roles'); @@ -69,9 +66,9 @@ authRouter.use(passport.authenticate('jwt', { session: false })); * Allow POST & PUT of MC HTML tags * on non-production environments only */ -authRouter.route('/mandatory-criteria').post(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [EDITOR, ADMIN] }), mandatoryCriteria.create); +authRouter.route('/mandatory-criteria').post(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [ADMIN] }), mandatoryCriteria.create); -authRouter.route('/mandatory-criteria/:version').put(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [EDITOR, ADMIN] }), mandatoryCriteria.update); +authRouter.route('/mandatory-criteria/:version').put(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [ADMIN] }), mandatoryCriteria.update); // Enable XSS authRouter.use(cleanXss); @@ -84,7 +81,7 @@ authRouter.route('/mandatory-criteria/latest').get(mandatoryCriteria.findLatest) authRouter .route('/mandatory-criteria/:version') .get(mandatoryCriteria.findOne) - .delete(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [EDITOR, ADMIN] }), mandatoryCriteria.delete); + .delete(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [ADMIN] }), mandatoryCriteria.delete); authRouter.route('/users').get(users.list).post(users.create); authRouter.route('/users/:_id').get(users.findById).put(users.updateById).delete(users.remove); @@ -98,7 +95,7 @@ authRouter.route('/deals').get(validateUserHasAtLeastOneAllowedRole({ allowedRol authRouter .route('/deals/:id/status') .get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, READ_ONLY, ADMIN] }), dealStatus.findOne) - .put(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, INTERFACE] }), dealStatus.update); + .put(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER] }), dealStatus.update); authRouter .route('/deals/:id/submission-details') @@ -159,13 +156,13 @@ authRouter authRouter .route('/banks') .get(banks.findAll) - .post(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [EDITOR, ADMIN] }), banks.create); + .post(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [ADMIN] }), banks.create); authRouter .route('/banks/:id') .get(banks.findOne) - .put(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [EDITOR, ADMIN] }), banks.update) - .delete(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [EDITOR, ADMIN] }), banks.delete); + .put(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [ADMIN] }), banks.update) + .delete(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [ADMIN] }), banks.delete); authRouter.route('/currencies').get(currencies.findAll); authRouter.route('/currencies/:id').get(currencies.findOne); @@ -173,12 +170,12 @@ authRouter.route('/currencies/:id').get(currencies.findOne); authRouter.route('/countries').get(countries.findAll); authRouter.route('/countries/:code').get(countries.findOne); -authRouter.route('/feedback').get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [DATA_ADMIN, ADMIN] }), feedback.findAll); +authRouter.route('/feedback').get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [ADMIN] }), feedback.findAll); authRouter .route('/feedback/:id') - .get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [DATA_ADMIN, ADMIN] }), feedback.findOne) - .delete(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [DATA_ADMIN, ADMIN] }), feedback.delete); + .get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [ADMIN] }), feedback.findOne) + .delete(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [ADMIN] }), feedback.delete); authRouter.route('/industry-sectors').get(industrySectors.findAll); authRouter.route('/industry-sectors/:code').get(industrySectors.findOne); @@ -186,15 +183,15 @@ authRouter.route('/industry-sectors/:code').get(industrySectors.findOne); authRouter .route('/eligibility-criteria') .get(eligibilityCriteria.findAll) - .post(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [EDITOR, ADMIN] }), eligibilityCriteria.create); + .post(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [ADMIN] }), eligibilityCriteria.create); authRouter.route('/eligibility-criteria/latest').get(eligibilityCriteria.findLatestGET); authRouter .route('/eligibility-criteria/:version') .get(eligibilityCriteria.findOne) - .put(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [EDITOR, ADMIN] }), eligibilityCriteria.update) - .delete(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [EDITOR, ADMIN] }), eligibilityCriteria.delete); + .put(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [ADMIN] }), eligibilityCriteria.update) + .delete(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [ADMIN] }), eligibilityCriteria.delete); // Portal reports authRouter.route('/reports/unissued-facilities').get(validateUserHasAtLeastOneAllowedRole({ allowedRoles: [MAKER, CHECKER, READ_ONLY, ADMIN] }), unissuedFacilitiesReport.findUnissuedFacilitiesReports); diff --git a/utils/data-migration/bss-ewcs/migrate-users.js b/utils/data-migration/bss-ewcs/migrate-users.js index c23b887cf4..d021d9fbf9 100644 --- a/utils/data-migration/bss-ewcs/migrate-users.js +++ b/utils/data-migration/bss-ewcs/migrate-users.js @@ -5,6 +5,7 @@ const generator = require('generate-password'); const api = require('../api'); const { getToken, removeMigrationUser } = require('../temporary-token-handler'); const consoleLogColor = require('./helpers/console-log-colour'); +const { ROLES: { MAKER, CHECKER } } = require('../constant'); const { file, bankId } = args; @@ -17,7 +18,7 @@ const loadUsersFromFile = () => { const generateRoles = (v1Role) => { if (v1Role === 'Maker/Checker') { - return ['maker', 'checker']; + return [MAKER, CHECKER]; } return [v1Role.toLowerCase()]; diff --git a/utils/data-migration/constant/index.js b/utils/data-migration/constant/index.js index b8d93ce27e..941c587fe4 100644 --- a/utils/data-migration/constant/index.js +++ b/utils/data-migration/constant/index.js @@ -3,6 +3,7 @@ const DEAL = require('./deal'); const FACILITY = require('./facility'); const AMENDMENT = require('./amendment'); const WORKFLOW = require('./workflow'); +const ROLES = require('./roles'); module.exports = { DATABASE, @@ -10,4 +11,5 @@ module.exports = { FACILITY, AMENDMENT, WORKFLOW, + ROLES, }; diff --git a/utils/data-migration/constant/roles.js b/utils/data-migration/constant/roles.js new file mode 100644 index 0000000000..77e93312d1 --- /dev/null +++ b/utils/data-migration/constant/roles.js @@ -0,0 +1,8 @@ +const ROLES = { + MAKER: 'maker', + CHECKER: 'checker', + ADMIN: 'admin', + READ_ONLY: 'read-only', +}; + +module.exports = ROLES; diff --git a/utils/data-migration/temporary-token-handler.js b/utils/data-migration/temporary-token-handler.js index 596fd31ab9..301e7246a0 100644 --- a/utils/data-migration/temporary-token-handler.js +++ b/utils/data-migration/temporary-token-handler.js @@ -1,5 +1,6 @@ const axios = require('axios'); require('dotenv').config(); +const { ROLES: { MAKER, ADMIN } } = require('./constant'); const urlRoot = process.env.PORTAL_API_URL; const { PORTAL_API_KEY } = process.env; @@ -12,7 +13,7 @@ const migrationUserFields = { firstname: 'V1 Migration', surname: 'DataLoader', email: 'data-migration', - roles: ['maker', 'editor', 'data-admin'], + roles: [MAKER, ADMIN], bank: { id: '*', }, diff --git a/utils/data-migration/tfm/migrate-tfm-users.js b/utils/data-migration/tfm/migrate-tfm-users.js index 60e5ffedcd..9f5ecf3f4f 100644 --- a/utils/data-migration/tfm/migrate-tfm-users.js +++ b/utils/data-migration/tfm/migrate-tfm-users.js @@ -1,7 +1,8 @@ const api = require('../../mock-data-loader/tfm/api'); const tokenFor = require('../../mock-data-loader/temporary-token-handler'); -const USERS = require('../../mock-data-loader/tfm/mocks/users'); -const TEAMS = require('../../mock-data-loader/tfm/mocks/teams'); +const USERS = require('./users_with_passwords.json'); +const TEAMS = require('./tfm-teams'); +const { ROLES: { ADMIN } } = require('../constant'); const insertTfmUsersAndTeams = async () => { const token = await tokenFor({ @@ -9,7 +10,7 @@ const insertTfmUsersAndTeams = async () => { password: 'AbC!2345', firstname: 'Mock', surname: 'DataLoader', - roles: ['data-admin'], + roles: [ADMIN], email: 're-insert-mocks-tfm@ukexportfinance.gov.uk', }); diff --git a/utils/mock-data-loader/bss/deals/1.js b/utils/mock-data-loader/bss/deals/1.js index 40fade8fb5..d959b8927b 100644 --- a/utils/mock-data-loader/bss/deals/1.js +++ b/utils/mock-data-loader/bss/deals/1.js @@ -1,5 +1,6 @@ const { nowTimestamp } = require('../dates'); const MANDATORY_CRITERIA = require('../mandatoryCriteria'); +const { MAKER } = require('../../portal/roles'); // de-structure and create a new array, so `sort` doesn't impact 'MANDATORY_CRITERIA' let mandatoryCriteria = [...MANDATORY_CRITERIA].sort((a, b) => (a.version > b.version ? 1 : -1)); @@ -23,7 +24,7 @@ module.exports = { maker: { _id: '60f7d72654f99900074c0a6d', username: 'maker1@ukexportfinance.gov.uk', - roles: ['maker'], + roles: [MAKER], bank: { id: '9', name: 'UKEF test bank (Delegated)', @@ -194,7 +195,7 @@ module.exports = { { date: '1626968578071', username: 'maker1@ukexportfinance.gov.uk', - roles: ['maker'], + roles: [MAKER], bank: { id: '9', name: 'UKEF test bank (Delegated)', @@ -205,7 +206,7 @@ module.exports = { { date: '1626971072253', username: 'maker1@ukexportfinance.gov.uk', - roles: ['maker'], + roles: [MAKER], bank: { id: '9', name: 'UKEF test bank (Delegated)', diff --git a/utils/mock-data-loader/bss/deals/10.js b/utils/mock-data-loader/bss/deals/10.js index 2da9cb97b1..03682ad1d1 100644 --- a/utils/mock-data-loader/bss/deals/10.js +++ b/utils/mock-data-loader/bss/deals/10.js @@ -1,5 +1,6 @@ const { nowTimestamp } = require('../dates'); const MANDATORY_CRITERIA = require('../mandatoryCriteria'); +const { MAKER } = require('../../portal/roles'); // de-structure and create a new array, so `sort` doesn't impact 'MANDATORY_CRITERIA' let mandatoryCriteria = [...MANDATORY_CRITERIA].sort((a, b) => (a.version > b.version ? 1 : -1)); @@ -26,7 +27,7 @@ module.exports = { _id: '60f7d72654f99900074c0a6d', username: 'maker1@ukexportfinance.gov.uk', roles: [ - 'maker' + MAKER ], bank: { id: '9', @@ -205,7 +206,7 @@ module.exports = { date: '1626973003543', username: 'maker1@ukexportfinance.gov.uk', roles: [ - 'maker' + MAKER ], bank: { id: '9', diff --git a/utils/mock-data-loader/bss/deals/11.js b/utils/mock-data-loader/bss/deals/11.js index fda9c1877a..af3185350e 100644 --- a/utils/mock-data-loader/bss/deals/11.js +++ b/utils/mock-data-loader/bss/deals/11.js @@ -1,5 +1,6 @@ const { nowTimestamp } = require('../dates'); const MANDATORY_CRITERIA = require('../mandatoryCriteria'); +const { MAKER } = require('../../portal/roles'); // de-structure and create a new array, so `sort` doesn't impact 'MANDATORY_CRITERIA' let mandatoryCriteria = [...MANDATORY_CRITERIA].sort((a, b) => (a.version > b.version ? 1 : -1)); @@ -26,7 +27,7 @@ module.exports = { _id: '60f7d72654f99900074c0a6d', username: 'maker1@ukexportfinance.gov.uk', roles: [ - 'maker' + MAKER ], bank: { id: '9', @@ -203,7 +204,7 @@ module.exports = { date: '1626973061611', username: 'maker1@ukexportfinance.gov.uk', roles: [ - 'maker' + MAKER ], bank: { id: '9', diff --git a/utils/mock-data-loader/bss/deals/2.js b/utils/mock-data-loader/bss/deals/2.js index 9f1b182e95..36743ef3c5 100644 --- a/utils/mock-data-loader/bss/deals/2.js +++ b/utils/mock-data-loader/bss/deals/2.js @@ -1,5 +1,6 @@ const { nowTimestamp } = require('../dates'); const MANDATORY_CRITERIA = require('../mandatoryCriteria'); +const { MAKER } = require('../../portal/roles'); // de-structure and create a new array, so `sort` doesn't impact 'MANDATORY_CRITERIA' let mandatoryCriteria = [...MANDATORY_CRITERIA].sort((a, b) => (a.version > b.version ? 1 : -1)); @@ -23,7 +24,7 @@ module.exports = { maker: { _id: '60f7d72654f99900074c0a6d', username: 'maker1@ukexportfinance.gov.uk', - roles: ['maker'], + roles: [MAKER], bank: { id: '9', name: 'UKEF test bank (Delegated)', @@ -195,7 +196,7 @@ module.exports = { { date: '1626969762958', username: 'maker1@ukexportfinance.gov.uk', - roles: ['maker'], + roles: [MAKER], bank: { id: '9', name: 'UKEF test bank (Delegated)', @@ -206,7 +207,7 @@ module.exports = { { date: '1626969843691', username: 'maker1@ukexportfinance.gov.uk', - roles: ['maker'], + roles: [MAKER], bank: { id: '9', name: 'UKEF test bank (Delegated)', diff --git a/utils/mock-data-loader/bss/deals/3.js b/utils/mock-data-loader/bss/deals/3.js index b00331d341..ca23ee26b6 100644 --- a/utils/mock-data-loader/bss/deals/3.js +++ b/utils/mock-data-loader/bss/deals/3.js @@ -1,5 +1,6 @@ const { nowTimestamp } = require('../dates'); const MANDATORY_CRITERIA = require('../mandatoryCriteria'); +const { MAKER } = require('../../portal/roles'); // de-structure and create a new array, so `sort` doesn't impact 'MANDATORY_CRITERIA' let mandatoryCriteria = [...MANDATORY_CRITERIA].sort((a, b) => (a.version > b.version ? 1 : -1)); @@ -26,7 +27,7 @@ module.exports = { _id: '60f7d72654f99900074c0a6d', username: 'maker1@ukexportfinance.gov.uk', roles: [ - 'maker' + MAKER ], bank: { id: '9', @@ -203,7 +204,7 @@ module.exports = { date: '1626970478083', username: 'maker1@ukexportfinance.gov.uk', roles: [ - 'maker' + MAKER ], bank: { id: '9', diff --git a/utils/mock-data-loader/bss/deals/4.js b/utils/mock-data-loader/bss/deals/4.js index 939dfc7027..a650198ee3 100644 --- a/utils/mock-data-loader/bss/deals/4.js +++ b/utils/mock-data-loader/bss/deals/4.js @@ -1,5 +1,6 @@ const { nowTimestamp } = require('../dates'); const MANDATORY_CRITERIA = require('../mandatoryCriteria'); +const { MAKER } = require('../../portal/roles'); // de-structure and create a new array, so `sort` doesn't impact 'MANDATORY_CRITERIA' let mandatoryCriteria = [...MANDATORY_CRITERIA].sort((a, b) => (a.version > b.version ? 1 : -1)); @@ -23,7 +24,7 @@ module.exports = { maker: { _id: '60f7d72654f99900074c0a6d', username: 'maker1@ukexportfinance.gov.uk', - roles: ['maker'], + roles: [MAKER], bank: { id: '9', name: 'UKEF test bank (Delegated)', @@ -188,7 +189,7 @@ module.exports = { { date: '1626971977437', username: 'maker1@ukexportfinance.gov.uk', - roles: ['maker'], + roles: [MAKER], bank: { id: '9', name: 'UKEF test bank (Delegated)', diff --git a/utils/mock-data-loader/bss/deals/5.js b/utils/mock-data-loader/bss/deals/5.js index 5f31c6ddb6..c0f81e88e9 100644 --- a/utils/mock-data-loader/bss/deals/5.js +++ b/utils/mock-data-loader/bss/deals/5.js @@ -1,5 +1,6 @@ const { nowTimestamp } = require('../dates'); const MANDATORY_CRITERIA = require('../mandatoryCriteria'); +const { MAKER } = require('../../portal/roles'); // de-structure and create a new array, so `sort` doesn't impact 'MANDATORY_CRITERIA' let mandatoryCriteria = [...MANDATORY_CRITERIA].sort((a, b) => (a.version > b.version ? 1 : -1)); @@ -26,7 +27,7 @@ module.exports = { _id: '60f7d72654f99900074c0a6d', username: 'maker1@ukexportfinance.gov.uk', roles: [ - 'maker' + MAKER ], bank: { id: '9', @@ -205,7 +206,7 @@ module.exports = { date: '1626972369233', username: 'maker1@ukexportfinance.gov.uk', roles: [ - 'maker' + MAKER ], bank: { id: '9', diff --git a/utils/mock-data-loader/bss/deals/6.js b/utils/mock-data-loader/bss/deals/6.js index fbf5ea56dd..d10e47ca81 100644 --- a/utils/mock-data-loader/bss/deals/6.js +++ b/utils/mock-data-loader/bss/deals/6.js @@ -1,5 +1,6 @@ const { nowTimestamp } = require('../dates'); const MANDATORY_CRITERIA = require('../mandatoryCriteria'); +const { MAKER } = require('../../portal/roles'); // de-structure and create a new array, so `sort` doesn't impact 'MANDATORY_CRITERIA' let mandatoryCriteria = [...MANDATORY_CRITERIA].sort((a, b) => (a.version > b.version ? 1 : -1)); @@ -26,7 +27,7 @@ module.exports = { _id: '60f7d72654f99900074c0a6d', username: 'maker1@ukexportfinance.gov.uk', roles: [ - 'maker' + MAKER ], bank: { id: '9', @@ -203,7 +204,7 @@ module.exports = { date: '1626972461251', username: 'maker1@ukexportfinance.gov.uk', roles: [ - 'maker' + MAKER ], bank: { id: '9', diff --git a/utils/mock-data-loader/bss/deals/7.js b/utils/mock-data-loader/bss/deals/7.js index a9e2d36f0d..b8a5a8dd29 100644 --- a/utils/mock-data-loader/bss/deals/7.js +++ b/utils/mock-data-loader/bss/deals/7.js @@ -1,5 +1,6 @@ const { nowTimestamp } = require('../dates'); const MANDATORY_CRITERIA = require('../mandatoryCriteria'); +const { MAKER } = require('../../portal/roles'); // de-structure and create a new array, so `sort` doesn't impact 'MANDATORY_CRITERIA' let mandatoryCriteria = [...MANDATORY_CRITERIA].sort((a, b) => (a.version > b.version ? 1 : -1)); @@ -26,7 +27,7 @@ module.exports = { _id: '60f7d72654f99900074c0a6d', username: 'maker1@ukexportfinance.gov.uk', roles: [ - 'maker' + MAKER ], bank: { id: '9', @@ -203,7 +204,7 @@ module.exports = { date: '1626972672857', username: 'maker1@ukexportfinance.gov.uk', roles: [ - 'maker' + MAKER ], bank: { id: '9', diff --git a/utils/mock-data-loader/bss/deals/8.js b/utils/mock-data-loader/bss/deals/8.js index af78c5acf5..14085b986f 100644 --- a/utils/mock-data-loader/bss/deals/8.js +++ b/utils/mock-data-loader/bss/deals/8.js @@ -1,5 +1,6 @@ const { nowTimestamp } = require('../dates'); const MANDATORY_CRITERIA = require('../mandatoryCriteria'); +const { MAKER } = require('../../portal/roles'); // de-structure and create a new array, so `sort` doesn't impact 'MANDATORY_CRITERIA' let mandatoryCriteria = [...MANDATORY_CRITERIA].sort((a, b) => (a.version > b.version ? 1 : -1)); @@ -26,7 +27,7 @@ module.exports = { _id: '60f7d72654f99900074c0a6d', username: 'maker1@ukexportfinance.gov.uk', roles: [ - 'maker' + MAKER ], bank: { id: '9', @@ -203,7 +204,7 @@ module.exports = { date: '1626972850287', username: 'maker1@ukexportfinance.gov.uk', roles: [ - 'maker' + MAKER ], bank: { id: '9', diff --git a/utils/mock-data-loader/bss/deals/9.js b/utils/mock-data-loader/bss/deals/9.js index 9eb4cd465b..d359ca9f2f 100644 --- a/utils/mock-data-loader/bss/deals/9.js +++ b/utils/mock-data-loader/bss/deals/9.js @@ -1,5 +1,6 @@ const { nowTimestamp } = require('../dates'); const MANDATORY_CRITERIA = require('../mandatoryCriteria'); +const { MAKER } = require('../../portal/roles'); // de-structure and create a new array, so `sort` doesn't impact 'MANDATORY_CRITERIA' let mandatoryCriteria = [...MANDATORY_CRITERIA].sort((a, b) => (a.version > b.version ? 1 : -1)); @@ -27,7 +28,7 @@ module.exports = { _id: '60f7d72654f99900074c0a6d', username: 'maker1@ukexportfinance.gov.uk', roles: [ - 'maker' + MAKER ], bank: { id: '9', @@ -204,7 +205,7 @@ module.exports = { date: '1626972928399', username: 'maker1@ukexportfinance.gov.uk', roles: [ - 'maker' + MAKER ], bank: { id: '9', diff --git a/utils/mock-data-loader/gef/application.js b/utils/mock-data-loader/gef/application.js index 689de9e9ed..e019ec9c5e 100644 --- a/utils/mock-data-loader/gef/application.js +++ b/utils/mock-data-loader/gef/application.js @@ -3,8 +3,9 @@ const { EXPORTER_NO_INDUSTRIES, } = require('./exporter'); const USERS = require('../portal/users'); +const { MAKER } = require('../portal/roles'); -const MAKER = USERS.find((user) => user.roles.includes('maker')); +const A_MAKER = USERS.find((user) => user.roles.includes(MAKER)); const APPLICATION = [{ // not started @@ -13,7 +14,7 @@ const APPLICATION = [{ additionalRefName: null, mandatoryVersionId: 33, exporter: EXPORTER_COMPLETED, - maker: MAKER, + maker: A_MAKER, }, { // in progress bank: { id: '9' }, @@ -21,7 +22,7 @@ const APPLICATION = [{ additionalRefName: '', mandatoryVersionId: 33, exporter: EXPORTER_NO_INDUSTRIES, - maker: MAKER, + maker: A_MAKER, }, { // completed bank: { id: '9' }, @@ -29,7 +30,7 @@ const APPLICATION = [{ additionalRefName: 'Some Additional Reference', mandatoryVersionId: 33, exporter: EXPORTER_COMPLETED, - maker: MAKER, + maker: A_MAKER, }, { // in progress - no exporter bank: { id: '9' }, @@ -37,7 +38,7 @@ const APPLICATION = [{ additionalRefName: '', mandatoryVersionId: 33, exporter: {}, - maker: MAKER, + maker: A_MAKER, }]; module.exports = APPLICATION; diff --git a/utils/mock-data-loader/portal/roles.js b/utils/mock-data-loader/portal/roles.js new file mode 100644 index 0000000000..77e93312d1 --- /dev/null +++ b/utils/mock-data-loader/portal/roles.js @@ -0,0 +1,8 @@ +const ROLES = { + MAKER: 'maker', + CHECKER: 'checker', + ADMIN: 'admin', + READ_ONLY: 'read-only', +}; + +module.exports = ROLES; diff --git a/utils/mock-data-loader/portal/users.js b/utils/mock-data-loader/portal/users.js index 16b614bda1..461bfe6f9b 100644 --- a/utils/mock-data-loader/portal/users.js +++ b/utils/mock-data-loader/portal/users.js @@ -1,4 +1,7 @@ const BANKS = require('../banks'); +const { + MAKER, CHECKER, ADMIN, READ_ONLY +} = require('./roles'); const UKEF_TEST_BANK_1 = BANKS.find((bank) => bank.name === 'UKEF test bank (Delegated)'); const UKEF_TEST_BANK_2 = BANKS.find((bank) => bank.name === 'UKEF test bank (Delegated) 2'); @@ -12,7 +15,7 @@ const USERS = [ surname: 'Last', email: 'maker1@ukexportfinance.gov.uk', timezone: 'Europe/London', - roles: ['maker'], + roles: [MAKER], bank: UKEF_TEST_BANK_1, }, { @@ -22,7 +25,7 @@ const USERS = [ surname: 'last', email: 'maker2@ukexportfinance.gov.uk', timezone: 'Europe/London', - roles: ['maker'], + roles: [MAKER], bank: UKEF_TEST_BANK_1, }, { @@ -32,7 +35,7 @@ const USERS = [ surname: 'Last', email: 'maker33@ukexportfinance.gov.uk', timezone: 'Europe/London', - roles: ['maker'], + roles: [MAKER], bank: UKEF_TEST_BANK_1, }, { @@ -42,7 +45,7 @@ const USERS = [ surname: 'Read-only', email: 'readOnly1@ukexportfinance.gov.uk', timezone: 'Europe/London', - roles: ['read-only'], + roles: [READ_ONLY], bank: UKEF_TEST_BANK_1, }, { @@ -52,7 +55,7 @@ const USERS = [ surname: 'Sutton', email: 'maker3@ukexportfinance.gov.uk', timezone: 'Europe/London', - roles: ['maker'], + roles: [MAKER], bank: UKEF_GEF_ONLY_BANK, }, { @@ -62,7 +65,7 @@ const USERS = [ surname: 'Sheridan', email: 'maker4@ukexportfinance.gov.uk', timezone: 'Europe/London', - roles: ['checker'], + roles: [CHECKER], bank: UKEF_GEF_ONLY_BANK, }, { @@ -72,7 +75,7 @@ const USERS = [ surname: 'Checker', email: 'checker1@ukexportfinance.gov.uk', timezone: 'Europe/London', - roles: ['checker'], + roles: [CHECKER], bank: UKEF_TEST_BANK_1, }, { @@ -82,7 +85,7 @@ const USERS = [ surname: 'Scorpius', email: 'checker2@ukexportfinance.gov.uk', timezone: 'Europe/London', - roles: ['maker', 'checker'], + roles: [MAKER, CHECKER], bank: UKEF_TEST_BANK_1, }, { @@ -92,7 +95,7 @@ const USERS = [ surname: 'Scorpius', email: 'checker3@ukexportfinance.gov.uk', timezone: 'Europe/London', - roles: ['maker', 'checker'], + roles: [MAKER, CHECKER], bank: UKEF_TEST_BANK_1, }, { @@ -112,7 +115,7 @@ const USERS = [ surname: 'last', email: 'maker5@ukexportfinance.gov.uk', timezone: 'Europe/London', - roles: ['maker'], + roles: [MAKER], bank: UKEF_TEST_BANK_2, }, { @@ -122,7 +125,7 @@ const USERS = [ surname: 'Last', email: 'maker6@ukexportfinance.gov.uk', timezone: 'Europe/London', - roles: ['maker'], + roles: [MAKER], bank: UKEF_TEST_BANK_2, }, { @@ -132,7 +135,7 @@ const USERS = [ surname: 'Checker', email: 'checker4@ukexportfinance.gov.uk', timezone: 'Europe/London', - roles: ['checker'], + roles: [CHECKER], bank: UKEF_TEST_BANK_2, }, { @@ -162,7 +165,7 @@ const USERS = [ surname: 'No', email: 'test2@ukexportfinance.gov.uk', timezone: 'Europe/London', - roles: ['maker', 'editor', 'admin'], + roles: [ADMIN, MAKER], bank: { id: '*', }, @@ -186,31 +189,7 @@ const USERS = [ surname: 'No', email: 'adminnomaker@ukexportfinance.gov.uk', timezone: 'Europe/London', - roles: ['admin'], - bank: { - id: '*', - }, - }, - { - username: 'UKEF_OPERATIONS', - password: 'AbC!2345', - firstname: 'Elliot', - surname: 'Carver', - email: 'test4@ukexportfinance.gov.uk', - timezone: 'Europe/London', - roles: ['ukef_operations'], - bank: { - id: '*', - }, - }, - { - username: 'EDITOR', - password: 'AbC!2345', - firstname: 'Domingo', - surname: 'Espada', - email: 'test5@ukexportfinance.gov.uk', - timezone: 'Europe/London', - roles: ['editor'], + roles: [ADMIN], bank: { id: '*', }, @@ -222,7 +201,7 @@ const USERS = [ surname: 'Weisen', email: 'test_no_notify@ukexportfinance.gov.uk', timezone: 'Europe/London', - roles: ['maker'], + roles: [MAKER], bank: { id: '*', }, diff --git a/utils/mock-data-loader/refresh-reference-data.js b/utils/mock-data-loader/refresh-reference-data.js deleted file mode 100644 index c03c2bb5fb..0000000000 --- a/utils/mock-data-loader/refresh-reference-data.js +++ /dev/null @@ -1,77 +0,0 @@ -/* eslint-disable no-param-reassign */ -/* eslint-disable import/no-unresolved */ -/* eslint-disable no-return-assign */ -/* eslint-disable import/extensions */ -const api = require('./api'); -const tokenFor = require('./temporary-token-handler'); -const latestCurrencies = require('./mocks/currencies'); -const latestCountries = require('./mocks/countries'); - -const withoutMongoIds = (thingWithMongoId) => { - const existingWithoutMongoId = { ...thingWithMongoId }; - delete (existingWithoutMongoId._id); - return existingWithoutMongoId; -}; - -const matches = (existing, candidate) => JSON.stringify(withoutMongoIds(existing)) === JSON.stringify(candidate); - -const refreshCountries = async (token) => { - const countriesUpdated = []; - - for (const existingCountry of await api.listCountries(token)) { - const matchById = latestCountries.find((country) => country.id === existingCountry.id); - if (!matchById) { - // existing currency has gone.. so we need to delete.. - console.info(`deleting from API as no longer found in External API: ${JSON.stringify(existingCountry)}`); - await api.deleteCountry(existingCountry, token); - } else if (!matches(existingCountry, matchById)) { - console.info(`update: ${JSON.stringify(existingCountry)} -> ${JSON.stringify(matchById)}`); - await api.updateCountry(matchById, token); - } - countriesUpdated.push(withoutMongoIds(existingCountry)); - } - - const newlyAddedCountries = latestCountries.filter((newCountry) => !countriesUpdated.find((entry) => entry.id = newCountry.id)); - for (const newCountry of newlyAddedCountries) { - console.info(`creating: ${JSON.stringify(newCountry)}`); - await api.createCountry(newCountry, token); - } -}; - -const refreshCurrencies = async (token) => { - const currenciesUpdated = []; - - for (const existingCurrency of await api.listCurrencies(token)) { - const matchById = latestCurrencies.find((currency) => currency.id === existingCurrency.id); - if (!matchById) { - // existing currency has gone.. so we need to delete.. - console.info(`deleting from API as no longer found in External API: ${JSON.stringify(existingCurrency)}`); - await api.deleteCurrency(existingCurrency, token); - } else if (!matches(existingCurrency, matchById)) { - console.info(`update: ${JSON.stringify(existingCurrency)} -> ${JSON.stringify(matchById)}`); - await api.updateCurrency(matchById, token); - } - currenciesUpdated.push(existingCurrency); - } - - const newlyAddedCurrencies = latestCurrencies.filter((newCurrency) => !currenciesUpdated.find((entry) => entry.currencyId === newCurrency.currencyId)); - for (const newCurrency of newlyAddedCurrencies) { - console.info(`creating: ${JSON.stringify(newCurrency)}`); - await api.createCurrency(newCurrency, token); - } -}; - -const refreshReferenceData = async () => { - const token = await tokenFor({ - username: 'admin', - password: 'AbC!2345', - email: 'admin-3', - roles: ['maker', 'editor'], - bank: { id: '*' }, - }); - - await refreshCountries(token); - await refreshCurrencies(token); -}; - -refreshReferenceData(); diff --git a/utils/mock-data-loader/user-helper.js b/utils/mock-data-loader/user-helper.js index 9b424cff81..43cc323768 100644 --- a/utils/mock-data-loader/user-helper.js +++ b/utils/mock-data-loader/user-helper.js @@ -1,12 +1,13 @@ const api = require('./api'); const tfmApi = require('./tfm/api'); +const { MAKER, ADMIN } = require('./portal/roles'); const mockDataLoaderUser = { username: 're-insert-mocks', password: 'AbC!2345', firstname: 'Mock', surname: 'DataLoader', - roles: ['editor', 'maker', 'ukef_operations'], + roles: [MAKER, ADMIN], email: 're-insert-mocks-data-loader@ukexportfinance.gov.uk', bank: { id: '*' }, timezone: 'Europe/London', @@ -17,7 +18,7 @@ const mockDataLoaderTFMUser = { password: 'AbC!2345', firstName: 'Mock', lastName: 'DataLoader', - teams: ['data-admin'], + teams: [], email: 're-insert-mocks-data-loader-tfm@ukexportfinance.gov.uk', timezone: 'Europe/London', }; From f27334adb3899175e2503f956af1154c5acc84e2 Mon Sep 17 00:00:00 2001 From: AlexBramhill <47955140+AlexBramhill@users.noreply.github.com> Date: Tue, 19 Sep 2023 13:25:22 +0100 Subject: [PATCH 017/130] feat(DTFS2-6627): gef UI add read only limitation on routes (#2056) --- cspell.json | 3 + gef-ui/README.md | 21 ++++- gef-ui/api-tests/about-exporter.api-test.js | 26 ++++++ gef-ui/api-tests/about-facility.api-test.js | 27 +++++++ .../api-tests/application-abandon.api-test.js | 26 ++++++ .../application-activities.api-test.js | 19 +++++ .../api-tests/application-details.api-test.js | 28 +++++++ .../application-submission.api-test.js | 26 ++++++ gef-ui/api-tests/automatic-cover.api-test.js | 26 ++++++ gef-ui/api-tests/clone-gef-deal.api-test.js | 44 +++++++++++ .../common-tests/role-validation-api-tests.js | 79 +++++++++++++++++++ gef-ui/api-tests/companies-house.api-test.js | 26 ++++++ .../confirm-cover-start-date.api-test.js | 27 +++++++ gef-ui/api-tests/cover-start-date.api-test.js | 17 ++++ gef-ui/api-tests/create-api.js | 10 ++- gef-ui/api-tests/downloadFile.api-test.js | 17 ++++ .../eligible-automatic-cover.api-test.js | 35 ++++++++ ...porters-correspondence-address.api-test.js | 26 ++++++ .../api-tests/exporters-address.api-test.js | 26 ++++++ gef-ui/api-tests/facilities.api-test.js | 45 +++++++++++ .../facility-confirm-deletion.api-test.js | 27 +++++++ .../api-tests/facility-currency.api-test.js | 27 +++++++ .../api-tests/facility-guarantee.api-test.js | 27 +++++++ gef-ui/api-tests/facility-value.api-test.js | 27 +++++++ .../api-tests/mandatory-criteria.api-test.js | 24 ++++++ gef-ui/api-tests/name-application.api-test.js | 44 +++++++++++ .../api-tests/provided-facility.api-test.js | 27 +++++++ gef-ui/api-tests/return-to-maker.api-test.js | 26 ++++++ gef-ui/api-tests/review-decision.api-test.js | 26 ++++++ gef-ui/api-tests/security-details.api-test.js | 26 ++++++ ...porters-correspondence-address.api-test.js | 26 ++++++ gef-ui/api-tests/submit-to-ukef.api-test.js | 26 ++++++ .../supporting-information-upload.api-test.js | 27 +++++++ .../supporting-information.api-test.js | 27 +++++++ .../api-tests/test-helpers/role-selection.js | 18 +++++ .../api-tests/test-helpers/storage/storage.js | 44 +++++++++++ .../api-tests/test-helpers/user-generator.js | 34 ++++++++ .../test-helpers/user-session-generator.js | 25 ++++++ .../api-tests/unissued-facilities.api-test.js | 72 +++++++++++++++++ gef-ui/package-lock.json | 27 ++++++- gef-ui/package.json | 2 + gef-ui/server/constants/index.js | 11 ++- gef-ui/server/constants/roles.js | 14 ++++ .../controllers/about-facility/index.test.js | 8 +- .../application-abandon/index.test.js | 7 +- .../controllers/application-details/index.js | 63 +++++++-------- .../application-submission/index.test.js | 5 +- .../confirm-cover-start-date/index.test.js | 3 +- .../facility-guarantee/index.test.js | 3 +- .../controllers/facility-value/index.test.js | 3 +- gef-ui/server/controllers/mocks/index.js | 15 ++-- .../controllers/return-to-maker/index.test.js | 3 +- .../controllers/review-decision/index.test.js | 5 +- .../controllers/submit-to-ukef/index.test.js | 5 +- .../security-details/index.test.js | 7 +- .../supporting-documents/index.test.js | 11 +-- .../server/middleware/validateBank/index.js | 3 +- .../server/middleware/validateRole/index.js | 11 +-- gef-ui/server/models/application.js | 7 +- .../__tests__/application-activities.test.js | 2 +- .../__tests__/application-details.test.js | 4 +- .../__tests__/supporting-information.test.js | 2 +- .../__tests__/unissued-facilities.test.js | 12 ++- gef-ui/server/routes/about-exporter.js | 5 +- gef-ui/server/routes/about-facility.js | 5 +- gef-ui/server/routes/application-abandon.js | 5 +- .../server/routes/application-activities.js | 8 +- gef-ui/server/routes/application-details.js | 11 ++- .../server/routes/application-submission.js | 5 +- gef-ui/server/routes/automatic-cover.js | 5 +- gef-ui/server/routes/clone-gef-deal.js | 9 ++- gef-ui/server/routes/companies-house.js | 5 +- .../server/routes/confirm-cover-start-date.js | 5 +- gef-ui/server/routes/cover-start-date.js | 3 +- gef-ui/server/routes/downloadFile.js | 3 +- .../server/routes/eligible-automatic-cover.js | 7 +- .../enter-exporters-correspondence-address.js | 5 +- gef-ui/server/routes/exporters-address.js | 5 +- gef-ui/server/routes/facilities.js | 9 ++- .../routes/facility-confirm-deletion.js | 5 +- gef-ui/server/routes/facility-currency.js | 5 +- gef-ui/server/routes/facility-guarantee.js | 5 +- gef-ui/server/routes/facility-value.js | 5 +- gef-ui/server/routes/mandatory-criteria.js | 5 +- gef-ui/server/routes/name-application.js | 9 ++- gef-ui/server/routes/provided-facility.js | 5 +- gef-ui/server/routes/return-to-maker.js | 5 +- gef-ui/server/routes/review-decision.js | 5 +- gef-ui/server/routes/security-details.js | 5 +- ...select-exporters-correspondence-address.js | 5 +- gef-ui/server/routes/submit-to-ukef.js | 5 +- .../routes/supporting-information-upload.js | 5 +- .../server/routes/supporting-information.js | 9 +-- gef-ui/server/routes/unissued-facilities.js | 26 +++--- gef-ui/server/utils/constructPayload.test.js | 5 +- gef-ui/server/utils/deal-helpers.js | 3 +- gef-ui/server/utils/facility-helpers.test.js | 17 ++-- gef-ui/server/utils/fileUtils.test.js | 3 +- gef-ui/server/utils/helpers.js | 3 +- gef-ui/server/utils/helpers.test.js | 5 +- gef-ui/server/utils/mocks/mock_requests.js | 5 +- gef-ui/server/utils/mocks/mock_users.js | 5 +- .../utils/user-authorisation-level.test.js | 19 ++--- portal/README.md | 11 +++ portal/package.json | 1 + .../routes/middleware/validateRole/index.js | 2 +- trade-finance-manager-ui/README.md | 13 ++- 107 files changed, 1458 insertions(+), 200 deletions(-) create mode 100644 gef-ui/api-tests/about-exporter.api-test.js create mode 100644 gef-ui/api-tests/about-facility.api-test.js create mode 100644 gef-ui/api-tests/application-abandon.api-test.js create mode 100644 gef-ui/api-tests/application-activities.api-test.js create mode 100644 gef-ui/api-tests/application-details.api-test.js create mode 100644 gef-ui/api-tests/application-submission.api-test.js create mode 100644 gef-ui/api-tests/automatic-cover.api-test.js create mode 100644 gef-ui/api-tests/clone-gef-deal.api-test.js create mode 100644 gef-ui/api-tests/common-tests/role-validation-api-tests.js create mode 100644 gef-ui/api-tests/companies-house.api-test.js create mode 100644 gef-ui/api-tests/confirm-cover-start-date.api-test.js create mode 100644 gef-ui/api-tests/cover-start-date.api-test.js create mode 100644 gef-ui/api-tests/downloadFile.api-test.js create mode 100644 gef-ui/api-tests/eligible-automatic-cover.api-test.js create mode 100644 gef-ui/api-tests/enter-exporters-correspondence-address.api-test.js create mode 100644 gef-ui/api-tests/exporters-address.api-test.js create mode 100644 gef-ui/api-tests/facilities.api-test.js create mode 100644 gef-ui/api-tests/facility-confirm-deletion.api-test.js create mode 100644 gef-ui/api-tests/facility-currency.api-test.js create mode 100644 gef-ui/api-tests/facility-guarantee.api-test.js create mode 100644 gef-ui/api-tests/facility-value.api-test.js create mode 100644 gef-ui/api-tests/mandatory-criteria.api-test.js create mode 100644 gef-ui/api-tests/name-application.api-test.js create mode 100644 gef-ui/api-tests/provided-facility.api-test.js create mode 100644 gef-ui/api-tests/return-to-maker.api-test.js create mode 100644 gef-ui/api-tests/review-decision.api-test.js create mode 100644 gef-ui/api-tests/security-details.api-test.js create mode 100644 gef-ui/api-tests/select-exporters-correspondence-address.api-test.js create mode 100644 gef-ui/api-tests/submit-to-ukef.api-test.js create mode 100644 gef-ui/api-tests/supporting-information-upload.api-test.js create mode 100644 gef-ui/api-tests/supporting-information.api-test.js create mode 100644 gef-ui/api-tests/test-helpers/role-selection.js create mode 100644 gef-ui/api-tests/test-helpers/storage/storage.js create mode 100644 gef-ui/api-tests/test-helpers/user-generator.js create mode 100644 gef-ui/api-tests/test-helpers/user-session-generator.js create mode 100644 gef-ui/api-tests/unissued-facilities.api-test.js create mode 100644 gef-ui/server/constants/roles.js diff --git a/cspell.json b/cspell.json index 11ac269634..ddb2a33a74 100644 --- a/cspell.json +++ b/cspell.json @@ -53,6 +53,7 @@ "ESTR", "EWCS", "exisitant", + "falsey", "fieldname", "financials", "firstname", @@ -90,6 +91,7 @@ "sanitisation", "Sanitise", "sefntb", + "sess", "snet", "ssword", "startdate", @@ -99,6 +101,7 @@ "typescript", "ukef", "UKEF", + "ukexportfinance", "uksouth", "Unauthorised", "venv", diff --git a/gef-ui/README.md b/gef-ui/README.md index cefa15c1f4..7dc3c39160 100644 --- a/gef-ui/README.md +++ b/gef-ui/README.md @@ -25,20 +25,33 @@ For testing purposes, you can find mock user credentials in the `utils/mock-data ### **Run a UI test suite** -To run the entire UI test suite, use the following command: - +Verbose with coverage: ```shell npm run test ``` -### **Run a single UI test** +Verbose: +```shell +npm run test-dev +``` + +Quick: +```shell +npm run test-quick +``` -To run a specific UI test, specify the path to the test file like this: +### **Run a single UI test** ```shell npm run test /path/to/file.test.js ``` +### **Run API tests** + +```shell +npm run api-test +``` + ### **End to end tests** Detailed information about running end-to-end tests can be found in the `e2e-tests` README.md. diff --git a/gef-ui/api-tests/about-exporter.api-test.js b/gef-ui/api-tests/about-exporter.api-test.js new file mode 100644 index 0000000000..4c9e6b7d4f --- /dev/null +++ b/gef-ui/api-tests/about-exporter.api-test.js @@ -0,0 +1,26 @@ +const { MAKER } = require('../server/constants/roles'); +const { withRoleValidationApiTests } = require('./common-tests/role-validation-api-tests'); +const app = require('../server/createApp'); +const { get, post } = require('./create-api').createApi(app); + +const dealId = '123'; + +describe('about exporter routes', () => { + describe('GET /application-details/:dealId/about-exporter', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/application-details/${dealId}/about-exporter`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); + + describe('POST /application-details/:dealId/about-exporter', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/application-details/${dealId}/about-exporter`), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); +}); diff --git a/gef-ui/api-tests/about-facility.api-test.js b/gef-ui/api-tests/about-facility.api-test.js new file mode 100644 index 0000000000..a15eef3639 --- /dev/null +++ b/gef-ui/api-tests/about-facility.api-test.js @@ -0,0 +1,27 @@ +const { MAKER } = require('../server/constants/roles'); +const { withRoleValidationApiTests } = require('./common-tests/role-validation-api-tests'); +const app = require('../server/createApp'); +const { get, post } = require('./create-api').createApi(app); + +const dealId = '123'; +const facilityId = '111'; + +describe('about facility routes', () => { + describe('GET /application-details/:dealId/facilities/:facilityId/about-facility', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/application-details/${dealId}/facilities/${facilityId}/about-facility`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); + + describe('POST /application-details/:dealId/facilities/:facilityId/about-facility', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/application-details/${dealId}/facilities/${facilityId}/about-facility`), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); +}); diff --git a/gef-ui/api-tests/application-abandon.api-test.js b/gef-ui/api-tests/application-abandon.api-test.js new file mode 100644 index 0000000000..552e5b4567 --- /dev/null +++ b/gef-ui/api-tests/application-abandon.api-test.js @@ -0,0 +1,26 @@ +const { MAKER } = require('../server/constants/roles'); +const { withRoleValidationApiTests } = require('./common-tests/role-validation-api-tests'); +const app = require('../server/createApp'); +const { get, post } = require('./create-api').createApi(app); + +const dealId = '123'; + +describe('application abandon routes', () => { + describe('GET /application-details/:dealId/abandon', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/application-details/${dealId}/abandon`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); + + describe('POST /application-details/:dealId/abandon', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/application-details/${dealId}/abandon`), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); +}); diff --git a/gef-ui/api-tests/application-activities.api-test.js b/gef-ui/api-tests/application-activities.api-test.js new file mode 100644 index 0000000000..e97c8d3bcc --- /dev/null +++ b/gef-ui/api-tests/application-activities.api-test.js @@ -0,0 +1,19 @@ +const { + MAKER, CHECKER, READ_ONLY, ADMIN, +} = require('../server/constants/roles'); +const { withRoleValidationApiTests } = require('./common-tests/role-validation-api-tests'); +const app = require('../server/createApp'); +const { get } = require('./create-api').createApi(app); + +const dealId = '123'; + +describe('application activities routes', () => { + describe('GET /application-details/:dealId/activities', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/application-details/${dealId}/activities`, {}, headers), + whitelistedRoles: [MAKER, CHECKER, READ_ONLY, ADMIN], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); +}); diff --git a/gef-ui/api-tests/application-details.api-test.js b/gef-ui/api-tests/application-details.api-test.js new file mode 100644 index 0000000000..b17c636680 --- /dev/null +++ b/gef-ui/api-tests/application-details.api-test.js @@ -0,0 +1,28 @@ +const { + MAKER, CHECKER, READ_ONLY, ADMIN, +} = require('../server/constants/roles'); +const { withRoleValidationApiTests } = require('./common-tests/role-validation-api-tests'); +const app = require('../server/createApp'); +const { get, post } = require('./create-api').createApi(app); + +const dealId = '123'; + +describe('application details routes', () => { + describe('GET /application-details/:dealId', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/application-details/${dealId}`, {}, headers), + whitelistedRoles: [MAKER, CHECKER, READ_ONLY, ADMIN], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); + + describe('POST /application-details/:dealId', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/application-details/${dealId}`), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); +}); diff --git a/gef-ui/api-tests/application-submission.api-test.js b/gef-ui/api-tests/application-submission.api-test.js new file mode 100644 index 0000000000..8de5261b06 --- /dev/null +++ b/gef-ui/api-tests/application-submission.api-test.js @@ -0,0 +1,26 @@ +const { MAKER } = require('../server/constants/roles'); +const { withRoleValidationApiTests } = require('./common-tests/role-validation-api-tests'); +const app = require('../server/createApp'); +const { get, post } = require('./create-api').createApi(app); + +const dealId = '123'; + +describe('application submission routes', () => { + describe('GET /application-details/:dealId/submit', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/application-details/${dealId}/submit`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); + + describe('POST /application-details/:dealId/submit', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/application-details/${dealId}/submit`), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); +}); diff --git a/gef-ui/api-tests/automatic-cover.api-test.js b/gef-ui/api-tests/automatic-cover.api-test.js new file mode 100644 index 0000000000..88bdbf93d8 --- /dev/null +++ b/gef-ui/api-tests/automatic-cover.api-test.js @@ -0,0 +1,26 @@ +const { MAKER } = require('../server/constants/roles'); +const { withRoleValidationApiTests } = require('./common-tests/role-validation-api-tests'); +const app = require('../server/createApp'); +const { get, post } = require('./create-api').createApi(app); + +const dealId = '123'; + +describe('automatic cover routes', () => { + describe('GET /application-details/:dealId/automatic-cover', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/application-details/${dealId}/automatic-cover`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); + + describe('POST /application-details/:dealId/automatic-cover', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/application-details/${dealId}/automatic-cover`), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); +}); diff --git a/gef-ui/api-tests/clone-gef-deal.api-test.js b/gef-ui/api-tests/clone-gef-deal.api-test.js new file mode 100644 index 0000000000..f6ce9feed5 --- /dev/null +++ b/gef-ui/api-tests/clone-gef-deal.api-test.js @@ -0,0 +1,44 @@ +const { MAKER } = require('../server/constants/roles'); +const { withRoleValidationApiTests } = require('./common-tests/role-validation-api-tests'); +const app = require('../server/createApp'); +const { get, post } = require('./create-api').createApi(app); + +const dealId = '123'; + +describe('clone gef deal routes', () => { + describe('GET /application-details/:dealId/clone', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/application-details/${dealId}/clone`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); + + describe('POST /application-details/:dealId/clone', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/application-details/${dealId}/clone`), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); + + describe('GET /application-details/:dealId/clone/name-application', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/application-details/${dealId}/clone/name-application`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); + + describe('POST /application-details/:dealId/clone/name-application', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/application-details/${dealId}/clone/name-application`), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); +}); diff --git a/gef-ui/api-tests/common-tests/role-validation-api-tests.js b/gef-ui/api-tests/common-tests/role-validation-api-tests.js new file mode 100644 index 0000000000..f58276e8a2 --- /dev/null +++ b/gef-ui/api-tests/common-tests/role-validation-api-tests.js @@ -0,0 +1,79 @@ +jest.mock('../../server/services/api', () => ({ + ...jest.requireActual('../../server/services/api'), + validateToken: () => true, + validateBank: () => ({ isValid: true }), +})); +jest.mock('../../server/middleware/csrf', () => ({ + ...jest.requireActual('../../server/middleware/csrf'), + csrfToken: () => (req, res, next) => next(), +})); + +jest.mock('../../server/utils/csrf-token-checker.js', () => ({ + ...jest.requireActual('../../server/utils/csrf-token-checker.js'), + isCsrfTokenValid: () => true, +})); + +const { ROLES } = require('../../server/constants'); +const storage = require('../test-helpers/storage/storage'); + +const allRoles = Object.values(ROLES); + +const withRoleValidationApiTests = ({ + makeRequestWithHeaders, + whitelistedRoles, + successCode, + successHeaders, + disableHappyPath, // TODO DTFS2-6697: remove and test happy paths. + redirectUrlForInvalidRoles, +}) => { + const nonWhitelistedRoles = allRoles.filter((role) => !whitelistedRoles.includes(role)); + + describe('role validation', () => { + beforeEach(async () => { + await storage.flush(); + }); + + afterAll(async () => { + await storage.flush(); + }); + + if (!disableHappyPath) { + // TODO DTFS2-6697: remove and test happy paths. + if (whitelistedRoles.length) { + describe('whitelisted roles', () => { + it.each(whitelistedRoles)(`returns a ${successCode} response if the user only has the '%s' role`, async (allowedRole) => { + const { sessionCookie } = await storage.saveUserSession([allowedRole]); + + const response = await makeRequestWithHeaders({ Cookie: [`dtfs-session=${encodeURIComponent(sessionCookie)}`] }); + + expect(response.status).toBe(successCode); + + if (successHeaders) { + Object.entries(successHeaders).forEach(([key, value]) => { + expect(response.headers[key]).toBe(value); + }); + } + }); + }); + } + } + + if (nonWhitelistedRoles.length) { + describe('non-whitelisted roles', () => { + it.each(nonWhitelistedRoles)("returns a 302 response if the user only has the '%s' role", async (disallowedRole) => { + const { sessionCookie } = await storage.saveUserSession([disallowedRole]); + + const response = await makeRequestWithHeaders({ Cookie: [`dtfs-session=${encodeURIComponent(sessionCookie)}`] }); + + expect(response.status).toBe(302); + const redirectUrl = redirectUrlForInvalidRoles ?? '/'; + expect(response.headers.location).toBe(redirectUrl); + }); + }); + } + }); +}; + +module.exports = { + withRoleValidationApiTests, +}; diff --git a/gef-ui/api-tests/companies-house.api-test.js b/gef-ui/api-tests/companies-house.api-test.js new file mode 100644 index 0000000000..b6b9aad29c --- /dev/null +++ b/gef-ui/api-tests/companies-house.api-test.js @@ -0,0 +1,26 @@ +const { MAKER } = require('../server/constants/roles'); +const { withRoleValidationApiTests } = require('./common-tests/role-validation-api-tests'); +const app = require('../server/createApp'); +const { get, post } = require('./create-api').createApi(app); + +const dealId = '123'; + +describe('companies house routes', () => { + describe('GET /application-details/:dealId/companies-house', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/application-details/${dealId}/companies-house`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); + + describe('POST /application-details/:dealId/companies-house', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/application-details/${dealId}/companies-house`), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); +}); diff --git a/gef-ui/api-tests/confirm-cover-start-date.api-test.js b/gef-ui/api-tests/confirm-cover-start-date.api-test.js new file mode 100644 index 0000000000..abcb091e38 --- /dev/null +++ b/gef-ui/api-tests/confirm-cover-start-date.api-test.js @@ -0,0 +1,27 @@ +const { MAKER } = require('../server/constants/roles'); +const { withRoleValidationApiTests } = require('./common-tests/role-validation-api-tests'); +const app = require('../server/createApp'); +const { get, post } = require('./create-api').createApi(app); + +const dealId = '123'; +const facilityId = '111'; + +describe('confirm cover start date routes', () => { + describe('GET /application-details/:dealId/:facilityId/confirm-cover-start-date/', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/application-details/${dealId}/${facilityId}/confirm-cover-start-date/`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); + + describe('POST /application-details/:dealId/:facilityId/confirm-cover-start-date/', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/application-details/${dealId}/${facilityId}/confirm-cover-start-date/`), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); +}); diff --git a/gef-ui/api-tests/cover-start-date.api-test.js b/gef-ui/api-tests/cover-start-date.api-test.js new file mode 100644 index 0000000000..dbcd7d83af --- /dev/null +++ b/gef-ui/api-tests/cover-start-date.api-test.js @@ -0,0 +1,17 @@ +const { MAKER } = require('../server/constants/roles'); +const { withRoleValidationApiTests } = require('./common-tests/role-validation-api-tests'); +const app = require('../server/createApp'); +const { get } = require('./create-api').createApi(app); + +const dealId = '123'; + +describe('cover start date routes', () => { + describe('GET /application-details/:dealId/cover-start-date', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/application-details/${dealId}/cover-start-date`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); +}); diff --git a/gef-ui/api-tests/create-api.js b/gef-ui/api-tests/create-api.js index bd83300ca7..99d4387794 100644 --- a/gef-ui/api-tests/create-api.js +++ b/gef-ui/api-tests/create-api.js @@ -4,9 +4,17 @@ const dotenv = require('dotenv'); dotenv.config(); const createApi = (app) => ({ - get: async (url, query = {}) => request(app) + get: async (url, query = {}, headers = {}) => request(app) .get(url) + .set(headers) .query(query), + + post: (data, headers = {}) => ({ + to: async (url) => request(app) + .post(url) + .set(headers) + .send(data), + }), }); module.exports = { diff --git a/gef-ui/api-tests/downloadFile.api-test.js b/gef-ui/api-tests/downloadFile.api-test.js new file mode 100644 index 0000000000..236878d550 --- /dev/null +++ b/gef-ui/api-tests/downloadFile.api-test.js @@ -0,0 +1,17 @@ +const { MAKER, CHECKER } = require('../server/constants/roles'); +const { withRoleValidationApiTests } = require('./common-tests/role-validation-api-tests'); +const app = require('../server/createApp'); +const { get } = require('./create-api').createApi(app); + +const fileId = '321'; + +describe('downloadFile routes', () => { + describe('GET /file/:fileId', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/file/${fileId}`, {}, headers), + whitelistedRoles: [MAKER, CHECKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); +}); diff --git a/gef-ui/api-tests/eligible-automatic-cover.api-test.js b/gef-ui/api-tests/eligible-automatic-cover.api-test.js new file mode 100644 index 0000000000..272e1117d2 --- /dev/null +++ b/gef-ui/api-tests/eligible-automatic-cover.api-test.js @@ -0,0 +1,35 @@ +const { MAKER } = require('../server/constants/roles'); +const { withRoleValidationApiTests } = require('./common-tests/role-validation-api-tests'); +const app = require('../server/createApp'); +const { get } = require('./create-api').createApi(app); + +const dealId = '123'; + +describe('eligible automatic cover routes', () => { + describe('GET /application-details/:dealId/eligible-automatic-cover', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/application-details/${dealId}/eligible-automatic-cover`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); + + describe('GET /application-details/:dealId/ineligible-automatic-cover', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/application-details/${dealId}/ineligible-automatic-cover`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); + + describe('GET /ineligible-gef', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get('/ineligible-gef', {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); +}); diff --git a/gef-ui/api-tests/enter-exporters-correspondence-address.api-test.js b/gef-ui/api-tests/enter-exporters-correspondence-address.api-test.js new file mode 100644 index 0000000000..ac1832ed37 --- /dev/null +++ b/gef-ui/api-tests/enter-exporters-correspondence-address.api-test.js @@ -0,0 +1,26 @@ +const { MAKER } = require('../server/constants/roles'); +const { withRoleValidationApiTests } = require('./common-tests/role-validation-api-tests'); +const app = require('../server/createApp'); +const { get, post } = require('./create-api').createApi(app); + +const dealId = '123'; + +describe('enter exporters correspondence address routes', () => { + describe('GET /application-details/:dealId/enter-exporters-correspondence-address', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/application-details/${dealId}/enter-exporters-correspondence-address`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); + + describe('POST /application-details/:dealId/enter-exporters-correspondence-address', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/application-details/${dealId}/enter-exporters-correspondence-address`), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); +}); diff --git a/gef-ui/api-tests/exporters-address.api-test.js b/gef-ui/api-tests/exporters-address.api-test.js new file mode 100644 index 0000000000..8402aa4180 --- /dev/null +++ b/gef-ui/api-tests/exporters-address.api-test.js @@ -0,0 +1,26 @@ +const { MAKER } = require('../server/constants/roles'); +const { withRoleValidationApiTests } = require('./common-tests/role-validation-api-tests'); +const app = require('../server/createApp'); +const { get, post } = require('./create-api').createApi(app); + +const dealId = '123'; + +describe('exporters address routes', () => { + describe('GET /application-details/:dealId/exporters-address', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/application-details/${dealId}/exporters-address`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); + + describe('POST /application-details/:dealId/exporters-address', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/application-details/${dealId}/exporters-address`), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); +}); diff --git a/gef-ui/api-tests/facilities.api-test.js b/gef-ui/api-tests/facilities.api-test.js new file mode 100644 index 0000000000..bcf835932b --- /dev/null +++ b/gef-ui/api-tests/facilities.api-test.js @@ -0,0 +1,45 @@ +const { MAKER } = require('../server/constants/roles'); +const { withRoleValidationApiTests } = require('./common-tests/role-validation-api-tests'); +const app = require('../server/createApp'); +const { get, post } = require('./create-api').createApi(app); + +const dealId = '123'; +const facilityId = '111'; + +describe('facilities routes', () => { + describe('GET /application-details/:dealId/facilities', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/application-details/${dealId}/facilities`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); + + describe('GET /application-details/:dealId/facilities/:facilityId', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/application-details/${dealId}/facilities/${facilityId}`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); + + describe('POST /application-details/:dealId/facilities', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/application-details/${dealId}/facilities`), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); + + describe('POST /application-details/:dealId/facilities/:facilityId', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/application-details/${dealId}/facilities/${facilityId}`), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); +}); diff --git a/gef-ui/api-tests/facility-confirm-deletion.api-test.js b/gef-ui/api-tests/facility-confirm-deletion.api-test.js new file mode 100644 index 0000000000..2199bab656 --- /dev/null +++ b/gef-ui/api-tests/facility-confirm-deletion.api-test.js @@ -0,0 +1,27 @@ +const { MAKER } = require('../server/constants/roles'); +const { withRoleValidationApiTests } = require('./common-tests/role-validation-api-tests'); +const app = require('../server/createApp'); +const { get, post } = require('./create-api').createApi(app); + +const dealId = '123'; +const facilityId = '111'; + +describe('facility confirm deletion routes', () => { + describe('GET /application-details/:dealId/facilities/:facilityId/confirm-deletion', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/application-details/${dealId}/facilities/${facilityId}/confirm-deletion`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); + + describe('POST /application-details/:dealId/facilities/:facilityId/confirm-deletion', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/application-details/${dealId}/facilities/${facilityId}/confirm-deletion`), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); +}); diff --git a/gef-ui/api-tests/facility-currency.api-test.js b/gef-ui/api-tests/facility-currency.api-test.js new file mode 100644 index 0000000000..2125162953 --- /dev/null +++ b/gef-ui/api-tests/facility-currency.api-test.js @@ -0,0 +1,27 @@ +const { MAKER } = require('../server/constants/roles'); +const { withRoleValidationApiTests } = require('./common-tests/role-validation-api-tests'); +const app = require('../server/createApp'); +const { get, post } = require('./create-api').createApi(app); + +const dealId = '123'; +const facilityId = '111'; + +describe('facility currency routes', () => { + describe('GET /application-details/:dealId/facilities/:facilityId/facility-currency', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/application-details/${dealId}/facilities/${facilityId}/facility-currency`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); + + describe('POST /application-details/:dealId/facilities/:facilityId/facility-currency', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/application-details/${dealId}/facilities/${facilityId}/facility-currency`), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); +}); diff --git a/gef-ui/api-tests/facility-guarantee.api-test.js b/gef-ui/api-tests/facility-guarantee.api-test.js new file mode 100644 index 0000000000..6a3a163ed6 --- /dev/null +++ b/gef-ui/api-tests/facility-guarantee.api-test.js @@ -0,0 +1,27 @@ +const { MAKER } = require('../server/constants/roles'); +const { withRoleValidationApiTests } = require('./common-tests/role-validation-api-tests'); +const app = require('../server/createApp'); +const { get, post } = require('./create-api').createApi(app); + +const dealId = '123'; +const facilityId = '111'; + +describe('facility guarantee routes', () => { + describe('GET /application-details/:dealId/facilities/:facilityId/facility-guarantee', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/application-details/${dealId}/facilities/${facilityId}/facility-guarantee`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); + + describe('POST /application-details/:dealId/facilities/:facilityId/facility-guarantee', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/application-details/${dealId}/facilities/${facilityId}/facility-guarantee`), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); +}); diff --git a/gef-ui/api-tests/facility-value.api-test.js b/gef-ui/api-tests/facility-value.api-test.js new file mode 100644 index 0000000000..9160572d51 --- /dev/null +++ b/gef-ui/api-tests/facility-value.api-test.js @@ -0,0 +1,27 @@ +const { MAKER } = require('../server/constants/roles'); +const { withRoleValidationApiTests } = require('./common-tests/role-validation-api-tests'); +const app = require('../server/createApp'); +const { get, post } = require('./create-api').createApi(app); + +const dealId = '123'; +const facilityId = '111'; + +describe('facility value routes', () => { + describe('GET /application-details/:dealId/facilities/:facilityId/facility-value', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/application-details/${dealId}/facilities/${facilityId}/facility-value`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); + + describe('POST /application-details/:dealId/facilities/:facilityId/facility-value', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/application-details/${dealId}/facilities/${facilityId}/facility-value`), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); +}); diff --git a/gef-ui/api-tests/mandatory-criteria.api-test.js b/gef-ui/api-tests/mandatory-criteria.api-test.js new file mode 100644 index 0000000000..60abfb88dc --- /dev/null +++ b/gef-ui/api-tests/mandatory-criteria.api-test.js @@ -0,0 +1,24 @@ +const { MAKER } = require('../server/constants/roles'); +const { withRoleValidationApiTests } = require('./common-tests/role-validation-api-tests'); +const app = require('../server/createApp'); +const { get, post } = require('./create-api').createApi(app); + +describe('mandatory criteria routes', () => { + describe('GET /mandatory-criteria', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get('/mandatory-criteria', {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); + + describe('POST /mandatory-criteria', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to('/mandatory-criteria'), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); +}); diff --git a/gef-ui/api-tests/name-application.api-test.js b/gef-ui/api-tests/name-application.api-test.js new file mode 100644 index 0000000000..ee6fc5a30d --- /dev/null +++ b/gef-ui/api-tests/name-application.api-test.js @@ -0,0 +1,44 @@ +const { MAKER } = require('../server/constants/roles'); +const { withRoleValidationApiTests } = require('./common-tests/role-validation-api-tests'); +const app = require('../server/createApp'); +const { get, post } = require('./create-api').createApi(app); + +const dealId = '123'; + +describe('name application routes', () => { + describe('GET /name-application', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get('/name-application', {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); + + describe('POST /name-application', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to('/name-application'), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); + + describe('GET /applications/:dealId/name', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/applications/${dealId}/name`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); + + describe('POST /applications/:dealId/name', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/applications/${dealId}/name`), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); +}); diff --git a/gef-ui/api-tests/provided-facility.api-test.js b/gef-ui/api-tests/provided-facility.api-test.js new file mode 100644 index 0000000000..75d20bffd9 --- /dev/null +++ b/gef-ui/api-tests/provided-facility.api-test.js @@ -0,0 +1,27 @@ +const { MAKER } = require('../server/constants/roles'); +const { withRoleValidationApiTests } = require('./common-tests/role-validation-api-tests'); +const app = require('../server/createApp'); +const { get, post } = require('./create-api').createApi(app); + +const dealId = '123'; +const facilityId = '111'; + +describe('provided facility routes', () => { + describe('GET /application-details/:dealId/facilities/:facilityId/provided-facility', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/application-details/${dealId}/facilities/${facilityId}/provided-facility`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); + + describe('POST /application-details/:dealId/facilities/:facilityId/provided-facility', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/application-details/${dealId}/facilities/${facilityId}/provided-facility`), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); +}); diff --git a/gef-ui/api-tests/return-to-maker.api-test.js b/gef-ui/api-tests/return-to-maker.api-test.js new file mode 100644 index 0000000000..36a6e78760 --- /dev/null +++ b/gef-ui/api-tests/return-to-maker.api-test.js @@ -0,0 +1,26 @@ +const { CHECKER } = require('../server/constants/roles'); +const { withRoleValidationApiTests } = require('./common-tests/role-validation-api-tests'); +const app = require('../server/createApp'); +const { get, post } = require('./create-api').createApi(app); + +const dealId = '123'; + +describe('return to maker routes', () => { + describe('GET /application-details/:dealId/return-to-maker', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/application-details/${dealId}/return-to-maker`, {}, headers), + whitelistedRoles: [CHECKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); + + describe('POST /application-details/:dealId/return-to-maker', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/application-details/${dealId}/return-to-maker`), + whitelistedRoles: [CHECKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); +}); diff --git a/gef-ui/api-tests/review-decision.api-test.js b/gef-ui/api-tests/review-decision.api-test.js new file mode 100644 index 0000000000..b294a922b5 --- /dev/null +++ b/gef-ui/api-tests/review-decision.api-test.js @@ -0,0 +1,26 @@ +const { MAKER } = require('../server/constants/roles'); +const { withRoleValidationApiTests } = require('./common-tests/role-validation-api-tests'); +const app = require('../server/createApp'); +const { get, post } = require('./create-api').createApi(app); + +const dealId = '123'; + +describe('review decision routes', () => { + describe('GET /application-details/:dealId/review-decision', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/application-details/${dealId}/review-decision`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); + + describe('POST /application-details/:dealId/review-decision', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/application-details/${dealId}/review-decision`), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); +}); diff --git a/gef-ui/api-tests/security-details.api-test.js b/gef-ui/api-tests/security-details.api-test.js new file mode 100644 index 0000000000..a70638b3eb --- /dev/null +++ b/gef-ui/api-tests/security-details.api-test.js @@ -0,0 +1,26 @@ +const { MAKER } = require('../server/constants/roles'); +const { withRoleValidationApiTests } = require('./common-tests/role-validation-api-tests'); +const app = require('../server/createApp'); +const { get, post } = require('./create-api').createApi(app); + +const dealId = '123'; + +describe('security details routes', () => { + describe('GET /application-details/:dealId/supporting-information/security-details', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/application-details/${dealId}/supporting-information/security-details`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); + + describe('POST /application-details/:dealId/supporting-information/security-details', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/application-details/${dealId}/supporting-information/security-details`), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); +}); diff --git a/gef-ui/api-tests/select-exporters-correspondence-address.api-test.js b/gef-ui/api-tests/select-exporters-correspondence-address.api-test.js new file mode 100644 index 0000000000..e9b23ed493 --- /dev/null +++ b/gef-ui/api-tests/select-exporters-correspondence-address.api-test.js @@ -0,0 +1,26 @@ +const { MAKER } = require('../server/constants/roles'); +const { withRoleValidationApiTests } = require('./common-tests/role-validation-api-tests'); +const app = require('../server/createApp'); +const { get, post } = require('./create-api').createApi(app); + +const dealId = '123'; + +describe('select exporters correspondence address routes', () => { + describe('GET /application-details/:dealId/select-exporters-correspondence-address', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/application-details/${dealId}/select-exporters-correspondence-address`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); + + describe('POST /application-details/:dealId/select-exporters-correspondence-address', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/application-details/${dealId}/select-exporters-correspondence-address`), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); +}); diff --git a/gef-ui/api-tests/submit-to-ukef.api-test.js b/gef-ui/api-tests/submit-to-ukef.api-test.js new file mode 100644 index 0000000000..a0b3973589 --- /dev/null +++ b/gef-ui/api-tests/submit-to-ukef.api-test.js @@ -0,0 +1,26 @@ +const { CHECKER } = require('../server/constants/roles'); +const { withRoleValidationApiTests } = require('./common-tests/role-validation-api-tests'); +const app = require('../server/createApp'); +const { get, post } = require('./create-api').createApi(app); + +const dealId = '123'; + +describe('submit to ukef routes', () => { + describe('GET /application-details/:dealId/submit-to-ukef', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/application-details/${dealId}/submit-to-ukef`, {}, headers), + whitelistedRoles: [CHECKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); + + describe('POST /application-details/:dealId/submit-to-ukef', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/application-details/${dealId}/submit-to-ukef`), + whitelistedRoles: [CHECKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); +}); diff --git a/gef-ui/api-tests/supporting-information-upload.api-test.js b/gef-ui/api-tests/supporting-information-upload.api-test.js new file mode 100644 index 0000000000..0932b9506f --- /dev/null +++ b/gef-ui/api-tests/supporting-information-upload.api-test.js @@ -0,0 +1,27 @@ +const { MAKER } = require('../server/constants/roles'); +const { withRoleValidationApiTests } = require('./common-tests/role-validation-api-tests'); +const app = require('../server/createApp'); +const { post } = require('./create-api').createApi(app); + +const dealId = '123'; +const documentType = 'manual-inclusion-questionnaire'; + +describe('supporting information upload routes', () => { + describe('POST /application-details/:dealId/supporting-information/document/:documentType/upload', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/application-details/${dealId}/supporting-information/document/${documentType}/upload`), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); + + describe('POST /application-details/:dealId/supporting-information/document/:documentType/delete', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/application-details/${dealId}/supporting-information/document/${documentType}/delete`), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); +}); diff --git a/gef-ui/api-tests/supporting-information.api-test.js b/gef-ui/api-tests/supporting-information.api-test.js new file mode 100644 index 0000000000..73c8a5e632 --- /dev/null +++ b/gef-ui/api-tests/supporting-information.api-test.js @@ -0,0 +1,27 @@ +const { MAKER } = require('../server/constants/roles'); +const { withRoleValidationApiTests } = require('./common-tests/role-validation-api-tests'); +const app = require('../server/createApp'); +const { get, post } = require('./create-api').createApi(app); + +const dealId = '123'; +const documentType = 'manual-inclusion-questionnaire'; + +describe('supporting information routes', () => { + describe('GET /application-details/:dealId/supporting-information/document/:documentType', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/application-details/${dealId}/supporting-information/document/${documentType}`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); + + describe('POST /application-details/:dealId/supporting-information/document/:documentType', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/application-details/${dealId}/supporting-information/document/${documentType}`), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); +}); diff --git a/gef-ui/api-tests/test-helpers/role-selection.js b/gef-ui/api-tests/test-helpers/role-selection.js new file mode 100644 index 0000000000..2aa3f57d01 --- /dev/null +++ b/gef-ui/api-tests/test-helpers/role-selection.js @@ -0,0 +1,18 @@ +const ROLES = require('../../server/constants/roles'); + +export const getRolesListExcluding = (rolesToExclude) => { + const roleValues = Object.values(ROLES); + return roleValues.filter((role) => rolesToExclude.includes(role) === false); +}; + +export const COMMON_ROLE_COMBINATIONS = { + NON_MAKER_ROLES: getRolesListExcluding([ROLES.MAKER]), + NON_CHECKER_ROLES: getRolesListExcluding([ROLES.CHECKER]), + NON_MAKER_OR_CHECKER_ROLES: getRolesListExcluding([ROLES.MAKER, ROLES.CHECKER]), + NON_MAKER_OR_CHECKER_OR_ADMIN_ROLES: getRolesListExcluding([ROLES.MAKER, ROLES.CHECKER, ROLES.ADMIN]), +}; + +module.exports = { + getRolesListExcluding, + COMMON_ROLE_COMBINATIONS, +}; diff --git a/gef-ui/api-tests/test-helpers/storage/storage.js b/gef-ui/api-tests/test-helpers/storage/storage.js new file mode 100644 index 0000000000..d15c44a48e --- /dev/null +++ b/gef-ui/api-tests/test-helpers/storage/storage.js @@ -0,0 +1,44 @@ +const redis = require('redis'); +const { promisify } = require('util'); +const { generateUserSession } = require('../user-session-generator'); + +const connect = () => { + let redisOptions = {}; + + if (process.env.REDIS_KEY) { + redisOptions = { + auth_pass: process.env.REDIS_KEY, + tls: { servername: process.env.REDIS_HOSTNAME }, + }; + } + const redisClient = redis.createClient(process.env.REDIS_PORT, process.env.REDIS_HOSTNAME, redisOptions); + return redisClient; +}; + +export const saveData = async (key, value) => { + const redisClient = connect(); + const setAsync = promisify(redisClient.set).bind(redisClient); + await setAsync(key, value); + redisClient.quit(); +}; + +export const saveUserSession = async (roles) => { + const { sessionCookie, sessionKey, data } = generateUserSession(roles); + const dataToSave = JSON.stringify(data).toString(); + + await saveData(sessionKey, dataToSave); + return { sessionCookie, sessionKey, data }; +}; + +export const flush = async () => { + const redisClient = connect(); + const flushAsync = promisify(redisClient.flushall).bind(redisClient); + await flushAsync(); + redisClient.quit(); +}; + +module.exports = { + saveData, + saveUserSession, + flush, +}; diff --git a/gef-ui/api-tests/test-helpers/user-generator.js b/gef-ui/api-tests/test-helpers/user-generator.js new file mode 100644 index 0000000000..1f06738346 --- /dev/null +++ b/gef-ui/api-tests/test-helpers/user-generator.js @@ -0,0 +1,34 @@ +const crypto = require('crypto'); + +const BANK_1 = { + id: '9', + name: 'UKEF test bank (Delegated)', + mga: ['mga_ukef_1.docx', 'mga_ukef_2.docx'], + emails: ['maker1@ukexportfinance.gov.uk', 'checker1@ukexportfinance.gov.uk'], + companiesHouseNo: 'UKEF0001', + partyUrn: '00318345', + hasGefAccessOnly: false, +}; + +export const getUserWithRoles = (roles) => { + const username = `BANK1_${roles.join('_').toUpperCase()}_1`; + const email = `${roles.join('').toLowerCase()}@ukexportfinance.gov.uk`; + const userId = crypto.randomBytes(8).toString('hex'); + const lastLogin = Date.now().toString(); + return { + username, + firstname: 'First Name', + surname: 'Surname', + email, + roles, + bank: BANK_1, + timezone: 'Europe/London', + lastLogin, + 'user-status': 'active', + _id: userId, + }; +}; + +export const getUsersWithRoles = (roles) => roles.forEach((role) => getUserWithRoles(role)); + +module.exports = { getUserWithRoles, getUsersWithRoles }; diff --git a/gef-ui/api-tests/test-helpers/user-session-generator.js b/gef-ui/api-tests/test-helpers/user-session-generator.js new file mode 100644 index 0000000000..182a639800 --- /dev/null +++ b/gef-ui/api-tests/test-helpers/user-session-generator.js @@ -0,0 +1,25 @@ +const crypto = require('crypto'); +const signature = require('cookie-signature'); +const { getUserWithRoles } = require('./user-generator'); + +const generateUserSession = (roles) => { + const sessionId = crypto.randomBytes(8).toString('hex'); + const sessionCookie = `s:${signature.sign(sessionId, process.env.SESSION_SECRET)}`; + const sessionKey = `sess:${sessionId}`; + const user = getUserWithRoles(roles); + + const data = { + cookie: { + originalMaxAge: 604800000, expires: '2023-09-15T15:49:16.345Z', secure: false, httpOnly: true, path: '/', sameSite: 'strict', + }, + userToken: 'mock token', + user, + dashboardFilters: { keyword: null }, + flash: {}, + sortBy: { order: 'updatedAt' }, + EX: 604800, + }; + return { sessionKey, sessionCookie, data }; +}; + +module.exports = { generateUserSession }; diff --git a/gef-ui/api-tests/unissued-facilities.api-test.js b/gef-ui/api-tests/unissued-facilities.api-test.js new file mode 100644 index 0000000000..24511a43e5 --- /dev/null +++ b/gef-ui/api-tests/unissued-facilities.api-test.js @@ -0,0 +1,72 @@ +const { MAKER } = require('../server/constants/roles'); +const { withRoleValidationApiTests } = require('./common-tests/role-validation-api-tests'); +const app = require('../server/createApp'); +const { get, post } = require('./create-api').createApi(app); + +const dealId = '123'; +const facilityId = '111'; + +describe('unissued facilities routes', () => { + describe('GET /application-details/:dealId/unissued-facilities', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/application-details/${dealId}/unissued-facilities`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); + + describe('GET /application-details/:dealId/unissued-facilities/:facilityId/about', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/application-details/${dealId}/unissued-facilities/${facilityId}/about`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); + + describe('POST /application-details/:dealId/unissued-facilities/:facilityId/about', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/application-details/${dealId}/unissued-facilities/${facilityId}/about`), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); + + describe('GET /application-details/:dealId/unissued-facilities/:facilityId/change', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/application-details/${dealId}/unissued-facilities/${facilityId}/change`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); + + describe('POST /application-details/:dealId/unissued-facilities/:facilityId/change', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/application-details/${dealId}/unissued-facilities/${facilityId}/change`), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); + + describe('GET /application-details/:dealId/unissued-facilities/:facilityId/change-to-unissued', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => get(`/application-details/${dealId}/unissued-facilities/${facilityId}/change-to-unissued`, {}, headers), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); + + describe('POST /application-details/:dealId/unissued-facilities/:facilityId/change-to-unissued', () => { + withRoleValidationApiTests({ + makeRequestWithHeaders: (headers) => post({}, headers).to(`/application-details/${dealId}/unissued-facilities/${facilityId}/change-to-unissued`), + whitelistedRoles: [MAKER], + successCode: 200, + disableHappyPath: true, // TODO DTFS2-6697: remove and test happy path. + }); + }); +}); diff --git a/gef-ui/package-lock.json b/gef-ui/package-lock.json index b8ffaaf26b..43bab9e36f 100644 --- a/gef-ui/package-lock.json +++ b/gef-ui/package-lock.json @@ -56,6 +56,7 @@ "@types/jest": "^29.5.4", "babel-jest": "29.5.0", "babel-loader": "9.1.2", + "cookie-signature": "^1.2.1", "css-minimizer-webpack-plugin": "^5.0.1", "eslint": "^8.49.0", "eslint-config-airbnb-base": "^15.0.0", @@ -4500,11 +4501,20 @@ "node": ">= 0.8.0" } }, - "node_modules/cookie-signature": { + "node_modules/cookie-parser/node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, + "node_modules/cookie-signature": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.1.tgz", + "integrity": "sha512-78KWk9T26NhzXtuL26cIJ8/qNHANyJ/ZYrmEXFzUmhZdjpBv+DlWlOANRTGBt48YcyslsLrj0bMLFTmXvLRCOw==", + "dev": true, + "engines": { + "node": ">=6.6.0" + } + }, "node_modules/cookiejar": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", @@ -4919,6 +4929,11 @@ "node": ">= 0.6" } }, + "node_modules/csurf/node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, "node_modules/csurf/node_modules/depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -6078,6 +6093,11 @@ "node": ">= 0.6" } }, + "node_modules/express-session/node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, "node_modules/express-session/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -6118,6 +6138,11 @@ "node": ">= 0.6" } }, + "node_modules/express/node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, "node_modules/express/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", diff --git a/gef-ui/package.json b/gef-ui/package.json index 122a7bfbdf..7ec34ec401 100644 --- a/gef-ui/package.json +++ b/gef-ui/package.json @@ -26,6 +26,7 @@ "lint:fix": "eslint ./server ./scripts --fix", "start": "node server/index.js", "test": "jest --coverage --verbose --config=jest.config.js", + "test-dev": "jest --verbose --config=jest.config.js", "test-file": "jest --config=jest.config.js --verbose --testMatch", "test-quick": "jest --config=jest.config.js", "test-watch": "jest --watchAll --coverage --verbose --config=jest.config.js --detectOpenHandles" @@ -86,6 +87,7 @@ "@types/jest": "^29.5.4", "babel-jest": "29.5.0", "babel-loader": "9.1.2", + "cookie-signature": "^1.2.1", "css-minimizer-webpack-plugin": "^5.0.1", "eslint": "^8.49.0", "eslint-config-airbnb-base": "^15.0.0", diff --git a/gef-ui/server/constants/index.js b/gef-ui/server/constants/index.js index 62c0e1595b..0b67dab2ae 100644 --- a/gef-ui/server/constants/index.js +++ b/gef-ui/server/constants/index.js @@ -1,3 +1,5 @@ +const ROLES = require('./roles'); + const DEAL_SUBMISSION_TYPE = { AIN: 'Automatic Inclusion Notice', MIA: 'Manual Inclusion Application', @@ -13,8 +15,8 @@ const DEAL_STATUS = { COMPLETED: 'Completed', // statuses specific to the entire deal - READY_FOR_APPROVAL: 'Ready for Checker\'s approval', - CHANGES_REQUIRED: 'Further Maker\'s input required', + READY_FOR_APPROVAL: "Ready for Checker's approval", + CHANGES_REQUIRED: "Further Maker's input required", ABANDONED: 'Abandoned', SUBMITTED_TO_UKEF: 'Submitted', UKEF_ACKNOWLEDGED: 'Acknowledged', @@ -74,11 +76,12 @@ const DATE_FORMAT = { COVER: 'MMMM d, yyyy', }; -const COMPANIES_HOUSE_NUMBER_REGEX = /^(([A-Z]{2}|[A-Z]\d{1}|\d{2})(\d{5,6}|\d{4,5}[A-Z]))$/; +const COMPANIES_HOUSE_NUMBER_REGEX = /^(([A-Z]{2}|[A-Z]\d{1}|\d{2})(\d{5,6}|\d{4,5}[A-Z]))$/; // cspell:disable-line -const UK_POSTCODE_REGEX = /^[A-Za-z]{1,2}[0-9Rr][0-9A-Za-z]?\s?[0-9][ABD-HJLNP-UW-Zabd-hjlnp-uw-z]{2}$/; +const UK_POSTCODE_REGEX = /^[A-Za-z]{1,2}[0-9Rr][0-9A-Za-z]?\s?[0-9][ABD-HJLNP-UW-Zabd-hjlnp-uw-z]{2}$/; // cspell:disable-line module.exports = { + ROLES, DEAL_SUBMISSION_TYPE, DEAL_STATUS, DEAL_TYPE, diff --git a/gef-ui/server/constants/roles.js b/gef-ui/server/constants/roles.js new file mode 100644 index 0000000000..a9c4138ee8 --- /dev/null +++ b/gef-ui/server/constants/roles.js @@ -0,0 +1,14 @@ +const ROLES = { + MAKER: 'maker', + CHECKER: 'checker', + ADMIN: 'admin', + UKEF_OPERATIONS: 'ukef_operations', + UKEF_ADMIN: 'ukef_admin', + READ_ONLY: 'read-only', + EDITOR: 'editor', + DATA_ADMIN: 'data-admin', + INTERFACE: 'interface', + EFM: 'efm', +}; + +module.exports = ROLES; diff --git a/gef-ui/server/controllers/about-facility/index.test.js b/gef-ui/server/controllers/about-facility/index.test.js index eae1b6abde..6b00f698d7 100644 --- a/gef-ui/server/controllers/about-facility/index.test.js +++ b/gef-ui/server/controllers/about-facility/index.test.js @@ -316,7 +316,7 @@ describe('controllers/about-facility', () => { })); }); - it('doesnt show error message if coverStartDate is less than 3 months away', async () => { + it('does not show error message if coverStartDate is less than 3 months away', async () => { mockRequest.body.facilityType = CONSTANTS.FACILITY_TYPE.CASH; mockRequest.body.hasBeenIssued = 'true'; mockRequest.body.shouldCoverStartOnSubmission = 'false'; @@ -616,7 +616,7 @@ describe('controllers/about-facility', () => { })); }); - it('shows error message if no monthsOfcover has been provided', async () => { + it('shows error message if no monthsOfCover has been provided', async () => { mockRequest.body.facilityType = CONSTANTS.FACILITY_TYPE.CASH; mockRequest.body.hasBeenIssued = 'false'; mockRequest.body.monthsOfCover = ''; @@ -630,7 +630,7 @@ describe('controllers/about-facility', () => { })); }); - it('shows error message if monthsOfcover is not a number', async () => { + it('shows error message if monthsOfCover is not a number', async () => { mockRequest.body.facilityType = CONSTANTS.FACILITY_TYPE.CASH; mockRequest.body.hasBeenIssued = 'false'; mockRequest.body.monthsOfCover = '1ab'; @@ -644,7 +644,7 @@ describe('controllers/about-facility', () => { })); }); - it('shows error message if monthsOfcover is greater than 999 months', async () => { + it('shows error message if monthsOfCover is greater than 999 months', async () => { mockRequest.body.facilityType = CONSTANTS.FACILITY_TYPE.CASH; mockRequest.body.hasBeenIssued = 'false'; mockRequest.body.monthsOfCover = '1000'; diff --git a/gef-ui/server/controllers/application-abandon/index.test.js b/gef-ui/server/controllers/application-abandon/index.test.js index c2a7de95f9..4cc8c042e4 100644 --- a/gef-ui/server/controllers/application-abandon/index.test.js +++ b/gef-ui/server/controllers/application-abandon/index.test.js @@ -4,6 +4,7 @@ import { } from './index'; import api from '../../services/api'; import CONSTANTS from '../../constants'; +import { MAKER } from '../../constants/roles'; jest.mock('../../services/api'); @@ -22,7 +23,7 @@ const MockRequest = () => { req.session = { user: { bank: { id: 'BANKID' }, - roles: ['MAKER'], + roles: [MAKER], }, }; return req; @@ -48,7 +49,7 @@ const MockEligibilityCriteriaResponse = () => ({ { id: 12, text: 'Some eligibility criteria', - errMsg: '12. Select some eligibilty', + errMsg: '12. Select some eligibility', }, ], }); @@ -90,7 +91,7 @@ describe('controllers/application-abandon', () => { })); }); - it('redirects to the application details page if application is not abondonable', async () => { + it('redirects to the application details page if application is not abandonable', async () => { mockApplicationResponse.status = CONSTANTS.DEAL_STATUS.SUBMITTED_TO_UKEF; api.getApplication.mockResolvedValueOnce(mockApplicationResponse); diff --git a/gef-ui/server/controllers/application-details/index.js b/gef-ui/server/controllers/application-details/index.js index 3069c96dfe..e6e7220e29 100644 --- a/gef-ui/server/controllers/application-details/index.js +++ b/gef-ui/server/controllers/application-details/index.js @@ -18,22 +18,14 @@ const { coverDatesConfirmed, hasChangedToIssued, } = require('../../utils/facility-helpers'); -const { - isUkefReviewAvailable, - isUkefReviewPositive, - makerCanReSubmit, -} = require('../../utils/deal-helpers'); -const { - exporterItems, facilityItems, -} = require('../../utils/display-items'); +const { isUkefReviewAvailable, isUkefReviewPositive, makerCanReSubmit } = require('../../utils/deal-helpers'); +const { exporterItems, facilityItems } = require('../../utils/display-items'); const getUserAuthorisationLevelsToApplication = require('../../utils/user-authorisation-level'); const { - FACILITY_TYPE, - AUTHORISATION_LEVEL, - DEAL_STATUS, - DEAL_SUBMISSION_TYPE, + FACILITY_TYPE, AUTHORISATION_LEVEL, DEAL_STATUS, DEAL_SUBMISSION_TYPE, } = require('../../constants'); const Application = require('../../models/application'); +const { ADMIN } = require('../../constants/roles'); let userSession; @@ -102,16 +94,17 @@ function buildBody(app, previewMode, user) { }, facilities: { status: app.facilitiesStatus, - data: app.facilities.items.map((item) => ({ - heading: _startCase(FACILITY_TYPE[item.details.type.toUpperCase()].toLowerCase()), - rows: mapSummaryList(item, facilityItems(`${facilityUrl}/${item.details._id}`, item.details), mapSummaryParams, previewMode), - createdAt: item.details.createdAt, - facilityId: item.details._id, - // facilityName added for aria-label for accessibility - facilityName: item.details.name, - // ukefFacilityId required for html facility summary table id - ukefFacilityId: item.details.ukefFacilityId, - })) + data: app.facilities.items + .map((item) => ({ + heading: _startCase(FACILITY_TYPE[item.details.type.toUpperCase()].toLowerCase()), + rows: mapSummaryList(item, facilityItems(`${facilityUrl}/${item.details._id}`, item.details), mapSummaryParams, previewMode), + createdAt: item.details.createdAt, + facilityId: item.details._id, + // facilityName added for aria-label for accessibility + facilityName: item.details.name, + // ukefFacilityId required for html facility summary table id + ukefFacilityId: item.details.ukefFacilityId, + })) .sort((a, b) => b.createdAt - a.createdAt), // latest facility appears at top }, supportingInfo: { @@ -131,14 +124,20 @@ function buildBody(app, previewMode, user) { isUkefReviewPositive: ukefReviewPositive, ukefDecisionAccepted: hasUkefDecisionAccepted, coverDatesConfirmed: coverDates, - renderReviewDecisionLink: (ukefReviewAvailable && ukefReviewPositive && !coverDates && !hasUkefDecisionAccepted && !app.userRoles.includes('admin')), + renderReviewDecisionLink: ukefReviewAvailable && ukefReviewPositive && !coverDates && !hasUkefDecisionAccepted && !app.userRoles.includes(ADMIN), previewMode, hasChangedFacilities, userRoles: app.userRoles, - isAdmin: app.userRoles.includes('admin'), + isAdmin: app.userRoles.includes(ADMIN), displayComments: displayTaskComments(app), displayChangeSupportingInfo: displayChangeSupportingInfo(app, previewMode), - canUpdateUnissuedFacilities: canUpdateUnissuedFacilitiesCheck(app, unissuedFacilitiesPresent, facilitiesChangedToIssued, hasUkefDecisionAccepted) && !app.userRoles.includes('admin'), + canUpdateUnissuedFacilities: + canUpdateUnissuedFacilitiesCheck( + app, + unissuedFacilitiesPresent, + facilitiesChangedToIssued, + hasUkefDecisionAccepted, + ) && !app.userRoles.includes(ADMIN), MIAReturnToMaker: isMIAWithoutChangedToIssuedFacilities(app), returnToMakerNoFacilitiesChanged: returnToMakerNoFacilitiesChanged(app, hasChangedFacilities), }; @@ -149,9 +148,7 @@ function buildBody(app, previewMode, user) { function buildActions(app) { return { submit: app.canSubmit, - abandon: [ - DEAL_STATUS.DRAFT, - DEAL_STATUS.CHANGES_REQUIRED].includes(app.status), + abandon: [DEAL_STATUS.DRAFT, DEAL_STATUS.CHANGES_REQUIRED].includes(app.status), }; } @@ -186,9 +183,7 @@ const stateToPartial = (status, url) => { 'unissued-facilities': 'unissued-facilities', }; - return url in partials - ? partials[url] - : template[status]; + return url in partials ? partials[url] : template[status]; }; const applicationDetails = async (req, res, next) => { @@ -196,11 +191,7 @@ const applicationDetails = async (req, res, next) => { params: { dealId, facilityId }, session: { user, userToken }, } = req; - const facilitiesPartials = [ - 'cover-start-date', - 'confirm-cover-start-date', - 'unissued-facilities', - ]; + const facilitiesPartials = ['cover-start-date', 'confirm-cover-start-date', 'unissued-facilities']; userSession = user; let facility; diff --git a/gef-ui/server/controllers/application-submission/index.test.js b/gef-ui/server/controllers/application-submission/index.test.js index 606b612668..ae9dbb10c1 100644 --- a/gef-ui/server/controllers/application-submission/index.test.js +++ b/gef-ui/server/controllers/application-submission/index.test.js @@ -5,6 +5,7 @@ import { import api from '../../services/api'; import { DEAL_STATUS } from '../../constants'; import MOCKS from '../mocks/index'; +import { MAKER } from '../../constants/roles'; jest.mock('../../services/api'); @@ -77,7 +78,7 @@ describe('controllers/application-submission', () => { const expected = { ...{ comments: [{ - roles: ['maker'], + roles: [MAKER], userName: 'maker', firstname: 'Bob', surname: 'Smith', @@ -94,7 +95,7 @@ describe('controllers/application-submission', () => { expect(api.updateApplication).toHaveBeenCalledWith(mockApplicationResponse._id, expected); }); - it('doesnt add a comment to the application when the user doesnt enter one', async () => { + it('does not add a comment to the application when the user does not enter one', async () => { api.updateApplication = jest.fn(); mockRequest.body.comment = ''; diff --git a/gef-ui/server/controllers/confirm-cover-start-date/index.test.js b/gef-ui/server/controllers/confirm-cover-start-date/index.test.js index 92ed660888..6c4fd30781 100644 --- a/gef-ui/server/controllers/confirm-cover-start-date/index.test.js +++ b/gef-ui/server/controllers/confirm-cover-start-date/index.test.js @@ -2,6 +2,7 @@ import { processCoverStartDate } from './index'; import api from '../../services/api'; import CONSTANTS from '../../constants'; import MOCKS from '../mocks'; +import { MAKER } from '../../constants/roles'; jest.mock('../../services/api'); @@ -31,7 +32,7 @@ const MockRequest = () => { req.session = { user: { bank: { id: 'BANKID' }, - roles: ['MAKER'], + roles: [MAKER], _id: '12345', }, userToken: 'TEST', diff --git a/gef-ui/server/controllers/facility-guarantee/index.test.js b/gef-ui/server/controllers/facility-guarantee/index.test.js index 47fec594af..f2fa631482 100644 --- a/gef-ui/server/controllers/facility-guarantee/index.test.js +++ b/gef-ui/server/controllers/facility-guarantee/index.test.js @@ -1,6 +1,7 @@ import { facilityGuarantee, updateFacilityGuarantee } from './index'; import api from '../../services/api'; import CONSTANTS from '../../constants'; +import { MAKER } from '../../constants/roles'; jest.mock('../../services/api'); @@ -19,7 +20,7 @@ const MockRequest = () => { req.session = { user: { bank: { id: 'BANK_ID' }, - roles: ['MAKER'], + roles: [MAKER], _id: '12345', }, userToken: 'secret-token', diff --git a/gef-ui/server/controllers/facility-value/index.test.js b/gef-ui/server/controllers/facility-value/index.test.js index 252e712e9b..1bed7ead0e 100644 --- a/gef-ui/server/controllers/facility-value/index.test.js +++ b/gef-ui/server/controllers/facility-value/index.test.js @@ -1,6 +1,7 @@ import { facilityValue, updateFacilityValue } from './index'; import api from '../../services/api'; import CONSTANTS from '../../constants'; +import { MAKER } from '../../constants/roles'; jest.mock('../../services/api'); @@ -19,7 +20,7 @@ const MockRequest = (saveAndReturn = false) => { req.session = { user: { bank: { id: 'BANK_ID' }, - roles: ['MAKER'], + roles: [MAKER], _id: '12345', }, userToken: 'secret-token', diff --git a/gef-ui/server/controllers/mocks/index.js b/gef-ui/server/controllers/mocks/index.js index 4e3d63c337..9954d4f3c5 100644 --- a/gef-ui/server/controllers/mocks/index.js +++ b/gef-ui/server/controllers/mocks/index.js @@ -2,6 +2,7 @@ const Chance = require('chance'); const { sub, getUnixTime } = require('date-fns'); const CONSTANTS = require('../../constants'); +const { MAKER, CHECKER } = require('../../constants/roles'); const chance = new Chance(); @@ -17,7 +18,7 @@ const MockRequest = () => ({ user: { username: 'maker', bank: { id: 'BANKID' }, - roles: ['MAKER'], + roles: [MAKER], _id: 1235, }, userToken: 'TEST', @@ -30,7 +31,7 @@ const MockRequestChecker = () => ({ session: { user: { bank: { id: 'BANKID' }, - roles: ['CHECKER'], + roles: [CHECKER], _id: 1235, }, userToken: 'TEST', @@ -44,7 +45,7 @@ const MockRequestUrl = (url) => ({ session: { user: { bank: { id: 'BANKID' }, - roles: ['MAKER'], + roles: [MAKER], _id: 1235, }, userToken: 'TEST', @@ -58,7 +59,7 @@ const MockRequestUrlChecker = (url) => ({ session: { user: { bank: { id: 'BANKID' }, - roles: ['CHECKER'], + roles: [CHECKER], _id: 1235, }, userToken: 'TEST', @@ -256,7 +257,7 @@ const MockSubmissionRequest = () => ({ surname: 'Smith', email: 'test@test.com', bank: { id: 'BANKID' }, - roles: ['maker'], + roles: [MAKER], _id: 1235, }, }, @@ -280,7 +281,7 @@ const MockRequestUnissued = () => { req.session = { user: { bank: { id: 'BANKID' }, - roles: ['MAKER'], + roles: [MAKER], _id: '12345', firstname: 'Test', surname: 'Test', @@ -305,7 +306,7 @@ const MockRequestIssuedToUnissued = () => { req.session = { user: { bank: { id: 'BANKID' }, - roles: ['MAKER'], + roles: [MAKER], _id: '12345', firstname: 'Test', surname: 'Test', diff --git a/gef-ui/server/controllers/return-to-maker/index.test.js b/gef-ui/server/controllers/return-to-maker/index.test.js index d4190d78c7..ccb7b5d5d2 100644 --- a/gef-ui/server/controllers/return-to-maker/index.test.js +++ b/gef-ui/server/controllers/return-to-maker/index.test.js @@ -7,6 +7,7 @@ import { getApplication, updateApplication, setApplicationStatus, getUserDetails, } from '../../services/api'; import { DEAL_STATUS } from '../../constants'; +import { CHECKER } from '../../constants/roles'; jest.mock('../../services/api', () => ({ __esModule: true, @@ -58,7 +59,7 @@ describe('controllers/return-to-maker', () => { }, query: {}, session: { - user: { roles: ['CHECKER'] }, + user: { roles: [CHECKER] }, }, }; }); diff --git a/gef-ui/server/controllers/review-decision/index.test.js b/gef-ui/server/controllers/review-decision/index.test.js index 03c89f2aaa..13714da602 100644 --- a/gef-ui/server/controllers/review-decision/index.test.js +++ b/gef-ui/server/controllers/review-decision/index.test.js @@ -1,6 +1,7 @@ import { acceptUkefDecision } from './index'; import api from '../../services/api'; import CONSTANTS from '../../constants'; +import { MAKER } from '../../constants/roles'; jest.mock('../../services/api'); @@ -21,7 +22,7 @@ const MockRequest = () => { req.session = { user: { bank: { id: 'BANKID' }, - roles: ['MAKER'], + roles: [MAKER], _id: '12345', }, userToken: 'TEST', @@ -57,7 +58,7 @@ const MockApplicationResponse = () => { res.exporter = {}; res.bankInternalRefName = 'My test'; res.comments = [{ - role: 'maker', + role: MAKER, userName: 'Test User', createdAt: '1625482095783', comment: 'The client needs this asap.', diff --git a/gef-ui/server/controllers/submit-to-ukef/index.test.js b/gef-ui/server/controllers/submit-to-ukef/index.test.js index a0295d5c95..716a063e3b 100644 --- a/gef-ui/server/controllers/submit-to-ukef/index.test.js +++ b/gef-ui/server/controllers/submit-to-ukef/index.test.js @@ -1,6 +1,7 @@ import { submitToUkef, createSubmissionToUkef } from './index'; import api from '../../services/api'; import CONSTANTS from '../../constants'; +import { MAKER } from '../../constants/roles'; const { isNotice } = require('../../utils/deal-helpers'); @@ -25,7 +26,7 @@ const MockRequest = () => { req.session = { user: { bank: { id: '9' }, - roles: ['MAKER'], + roles: [MAKER], }, userToken: 'TEST', }; @@ -45,7 +46,7 @@ const MockApplicationResponse = () => { res.exporter = {}; res.bankInternalRefName = 'My test'; res.comments = [{ - role: 'maker', + role: MAKER, userName: 'Test User', createdAt: '1625482095783', comment: 'The client needs this asap.', diff --git a/gef-ui/server/controllers/supporting-information/security-details/index.test.js b/gef-ui/server/controllers/supporting-information/security-details/index.test.js index baeef35059..494a9f199e 100644 --- a/gef-ui/server/controllers/supporting-information/security-details/index.test.js +++ b/gef-ui/server/controllers/supporting-information/security-details/index.test.js @@ -3,6 +3,7 @@ import { postSecurityDetails, MAX_INPUT_LENGTH, } from '.'; +import { MAKER } from '../../../constants/roles'; import Application from '../../../models/application'; import { updateApplication } from '../../../services/api'; @@ -33,7 +34,7 @@ describe('controllers/supporting-information/security-details', () => { dealId: 'mock-id', }, session: { - user: { roles: ['MAKER'] }, + user: { roles: [MAKER] }, }, }; }); @@ -97,7 +98,7 @@ describe('controllers/supporting-information/security-details', () => { dealId: 'mock-id', }, session: { - user: { roles: ['MAKER'] }, + user: { roles: [MAKER] }, }, body: { exporterSecurity: 'mock exporter security', @@ -149,7 +150,7 @@ describe('controllers/supporting-information/security-details', () => { })); }); - it('renders the page showing error if input has invalid contentg', async () => { + it('renders the page showing error if input has invalid content', async () => { const invalidString = 'This @ is < invalid *'; mockRequest.body = { diff --git a/gef-ui/server/controllers/supporting-information/supporting-documents/index.test.js b/gef-ui/server/controllers/supporting-information/supporting-documents/index.test.js index 26ec007914..2aef8e3eec 100644 --- a/gef-ui/server/controllers/supporting-information/supporting-documents/index.test.js +++ b/gef-ui/server/controllers/supporting-information/supporting-documents/index.test.js @@ -5,6 +5,7 @@ import Application from '../../../models/application'; import validateFile from '../../../utils/validateFile'; import { uploadAndSaveToDeal, removeFileFromDeal } from '../../../utils/fileUtils'; import MOCKS from '../../mocks/index'; +import { MAKER } from '../../../constants/roles'; jest.mock('../../../models/application'); jest.mock('../../../utils/validateFile', () => jest.fn(() => [true, null])); @@ -40,7 +41,7 @@ describe('controllers/supporting-documents', () => { documentType: 'manual-inclusion-questionnaire', }, session: { - user: { roles: ['MAKER'] }, + user: { roles: [MAKER] }, }, }; }); @@ -73,7 +74,7 @@ describe('controllers/supporting-documents', () => { title: 'Add manual inclusion questionnaire', user: { roles: [ - 'MAKER', + MAKER, ], }, dealId: 'mock-id', @@ -95,7 +96,7 @@ describe('controllers/supporting-documents', () => { documentType: 'manual-inclusion-questionnaire', }, session: { - user: { roles: ['MAKER'] }, + user: { roles: [MAKER] }, }, }; }); @@ -309,7 +310,7 @@ describe('controllers/supporting-documents', () => { documentType: 'manual-inclusion-questionnaire', }, session: { - user: { roles: ['MAKER'] }, + user: { roles: [MAKER] }, }, file: { filename: 'mock-file.pdf', @@ -405,7 +406,7 @@ describe('controllers/supporting-documents', () => { documentType: 'manual-inclusion-questionnaire', }, session: { - user: { roles: ['MAKER'] }, + user: { roles: [MAKER] }, }, body: { delete: 'mock-file.pdf', diff --git a/gef-ui/server/middleware/validateBank/index.js b/gef-ui/server/middleware/validateBank/index.js index 9bf3d43897..74f1fe5df5 100644 --- a/gef-ui/server/middleware/validateBank/index.js +++ b/gef-ui/server/middleware/validateBank/index.js @@ -1,6 +1,7 @@ +const { ADMIN, UKEF_ADMIN, UKEF_OPERATIONS } = require('../../constants/roles'); const api = require('../../services/api'); -const ukefAdminRoles = ['ukef_operations', 'admin', 'ukef_admin']; +const ukefAdminRoles = [ADMIN, UKEF_ADMIN, UKEF_OPERATIONS]; const validateBank = async (req, res, next) => { try { diff --git a/gef-ui/server/middleware/validateRole/index.js b/gef-ui/server/middleware/validateRole/index.js index 47c44db7cb..5c10616d88 100644 --- a/gef-ui/server/middleware/validateRole/index.js +++ b/gef-ui/server/middleware/validateRole/index.js @@ -1,5 +1,3 @@ -const ukefAdminRoles = ['ukef_operations', 'admin', 'ukef_admin']; - /** * * @param {array} requiredRoles (i.e. ['maker']) @@ -11,13 +9,16 @@ const userRoleIsValid = (requiredRoles, user) => { if (!requiredRoles || requiredRoles.length === 0) { return true; } - const userHasOneOfTheRequiredRoles = ukefAdminRoles.some((adminRole) => user.roles.includes(adminRole)) - || requiredRoles.some((role) => user.roles.includes(role)); + if (!user) { + return false; + } + + const userHasOneOfTheRequiredRoles = requiredRoles.some((role) => user.roles.includes(role)); return userHasOneOfTheRequiredRoles; }; /** * - * @param {object} opts (i.e. { role: ['maker'] }) + * @param {object} opts (i.e. { role: [MAKER] }) * */ const validateRole = (opts) => { diff --git a/gef-ui/server/models/application.js b/gef-ui/server/models/application.js index 658989c64d..054153d807 100644 --- a/gef-ui/server/models/application.js +++ b/gef-ui/server/models/application.js @@ -6,6 +6,7 @@ const { const { status } = require('../utils/deal-helpers'); const { facilitiesChangedToIssuedAsArray } = require('../utils/facility-helpers'); const { DEAL_STATUS, DEAL_SUBMISSION_TYPE } = require('../constants'); +const { MAKER, CHECKER, ADMIN } = require('../constants/roles'); const termToSupportDocuments = { coverStart: ['manualInclusion', 'yearToDateManagement', 'auditedFinancialStatements', 'financialForecasts', 'financialInformationCommentary', 'corporateStructure', 'debtorAndCreditorReports'], @@ -86,14 +87,14 @@ const canSubmitApplication = (application, user) => || application.supportingInfoStatus.code === DEAL_STATUS.COMPLETED ) && [DEAL_STATUS.DRAFT, DEAL_STATUS.CHANGES_REQUIRED].includes(application.status) - && user.roles.includes('maker'); + && user.roles.includes(MAKER); class Application { static async findById(id, user, userToken) { try { const application = await getApplication(id); - if (application.bank.id !== user.bank.id && !user.roles.includes('admin')) { + if (application.bank.id !== user.bank.id && !user.roles.includes(ADMIN)) { return null; } @@ -120,7 +121,7 @@ class Application { application.checkerCanSubmit = [DEAL_STATUS.READY_FOR_APPROVAL].includes(application.status) && !application.editedBy.includes(user._id) - && user.roles.includes('checker'); + && user.roles.includes(CHECKER); if (application.checkerId) { application.checker = await getUserDetails(application.checkerId, userToken); diff --git a/gef-ui/server/routes/__tests__/application-activities.test.js b/gef-ui/server/routes/__tests__/application-activities.test.js index 274efa3cba..d50310c6c7 100644 --- a/gef-ui/server/routes/__tests__/application-activities.test.js +++ b/gef-ui/server/routes/__tests__/application-activities.test.js @@ -22,6 +22,6 @@ describe('Routes', () => { }); it('Sets up all routes', () => { - expect(getSpy).toHaveBeenCalledWith('/application-details/:dealId/activities', [validateToken, validateBank], expect.any(Function)); + expect(getSpy).toHaveBeenCalledWith('/application-details/:dealId/activities', [validateToken, validateBank, expect.any(Function)], expect.any(Function)); }); }); diff --git a/gef-ui/server/routes/__tests__/application-details.test.js b/gef-ui/server/routes/__tests__/application-details.test.js index 79c90fe6c4..54abdff5f7 100644 --- a/gef-ui/server/routes/__tests__/application-details.test.js +++ b/gef-ui/server/routes/__tests__/application-details.test.js @@ -22,7 +22,7 @@ describe('Routes', () => { }); it('Sets up all routes', () => { - expect(getSpy).toHaveBeenCalledWith('/application-details/:dealId', [validateToken, validateBank], expect.any(Function)); - expect(postSpy).toHaveBeenCalledWith('/application-details/:dealId', [validateToken, validateBank], expect.any(Function)); + expect(getSpy).toHaveBeenCalledWith('/application-details/:dealId', [validateToken, validateBank, expect.any(Function)], expect.any(Function)); + expect(postSpy).toHaveBeenCalledWith('/application-details/:dealId', [validateToken, validateBank, expect.any(Function)], expect.any(Function)); }); }); diff --git a/gef-ui/server/routes/__tests__/supporting-information.test.js b/gef-ui/server/routes/__tests__/supporting-information.test.js index 4cfdb7d5a6..01d1c169ba 100644 --- a/gef-ui/server/routes/__tests__/supporting-information.test.js +++ b/gef-ui/server/routes/__tests__/supporting-information.test.js @@ -36,7 +36,7 @@ describe('Routes', () => { ); expect(postSpy).toHaveBeenCalledWith( '/application-details/:dealId/supporting-information/document/:documentType', - [validateToken, validateBank, multer().array('documents', 2)], + [validateToken, validateBank, expect.any(Function), multer().array('documents', 2)], expect.any(Function), ); }); diff --git a/gef-ui/server/routes/__tests__/unissued-facilities.test.js b/gef-ui/server/routes/__tests__/unissued-facilities.test.js index e6003ecd6e..31b05ed0c3 100644 --- a/gef-ui/server/routes/__tests__/unissued-facilities.test.js +++ b/gef-ui/server/routes/__tests__/unissued-facilities.test.js @@ -47,7 +47,15 @@ describe('Routes', () => { [validateToken, validateBank, expect.any(Function)], expect.any(Function), ); - expect(postSpy).toHaveBeenCalledWith('/application-details/:dealId/unissued-facilities/:facilityId/change-to-unissued', validateToken, expect.any(Function)); - expect(postSpy).toHaveBeenCalledWith('/application-details/:dealId/unissued-facilities/:facilityId/change-to-unissued', validateToken, expect.any(Function)); + expect(postSpy).toHaveBeenCalledWith( + '/application-details/:dealId/unissued-facilities/:facilityId/change-to-unissued', + [validateToken, validateBank, expect.any(Function)], + expect.any(Function), + ); + expect(postSpy).toHaveBeenCalledWith( + '/application-details/:dealId/unissued-facilities/:facilityId/change-to-unissued', + [validateToken, validateBank, expect.any(Function)], + expect.any(Function), + ); }); }); diff --git a/gef-ui/server/routes/about-exporter.js b/gef-ui/server/routes/about-exporter.js index 7630629e61..d3d598127d 100644 --- a/gef-ui/server/routes/about-exporter.js +++ b/gef-ui/server/routes/about-exporter.js @@ -1,10 +1,11 @@ const express = require('express'); const { aboutExporter, validateAboutExporter } = require('../controllers/about-exporter'); const { validateRole, validateToken, validateBank } = require('../middleware'); +const { MAKER } = require('../constants/roles'); const router = express.Router(); -router.get('/application-details/:dealId/about-exporter', [validateToken, validateBank, validateRole({ role: ['maker'] })], (req, res) => aboutExporter(req, res)); -router.post('/application-details/:dealId/about-exporter', [validateToken, validateBank, validateRole({ role: ['maker'] })], (req, res) => validateAboutExporter(req, res)); +router.get('/application-details/:dealId/about-exporter', [validateToken, validateBank, validateRole({ role: [MAKER] })], (req, res) => aboutExporter(req, res)); +router.post('/application-details/:dealId/about-exporter', [validateToken, validateBank, validateRole({ role: [MAKER] })], (req, res) => validateAboutExporter(req, res)); module.exports = router; diff --git a/gef-ui/server/routes/about-facility.js b/gef-ui/server/routes/about-facility.js index 1fb52ef58f..ca00d2c715 100644 --- a/gef-ui/server/routes/about-facility.js +++ b/gef-ui/server/routes/about-facility.js @@ -1,10 +1,11 @@ const express = require('express'); const { aboutFacility, validateAboutFacility } = require('../controllers/about-facility'); const { validateRole, validateToken, validateBank } = require('../middleware'); +const { MAKER } = require('../constants/roles'); const router = express.Router(); -router.get('/application-details/:dealId/facilities/:facilityId/about-facility', [validateToken, validateBank, validateRole({ role: ['maker'] })], (req, res) => aboutFacility(req, res)); -router.post('/application-details/:dealId/facilities/:facilityId/about-facility', [validateToken, validateBank, validateRole({ role: ['maker'] })], (req, res) => validateAboutFacility(req, res)); +router.get('/application-details/:dealId/facilities/:facilityId/about-facility', [validateToken, validateBank, validateRole({ role: [MAKER] })], (req, res) => aboutFacility(req, res)); +router.post('/application-details/:dealId/facilities/:facilityId/about-facility', [validateToken, validateBank, validateRole({ role: [MAKER] })], (req, res) => validateAboutFacility(req, res)); module.exports = router; diff --git a/gef-ui/server/routes/application-abandon.js b/gef-ui/server/routes/application-abandon.js index 496e02dace..a03384a914 100644 --- a/gef-ui/server/routes/application-abandon.js +++ b/gef-ui/server/routes/application-abandon.js @@ -1,10 +1,11 @@ const express = require('express'); const { confirmAbandonApplication, abandonApplication } = require('../controllers/application-abandon'); const { validateRole, validateToken, validateBank } = require('../middleware'); +const { MAKER } = require('../constants/roles'); const router = express.Router(); -router.get('/application-details/:dealId/abandon', [validateToken, validateBank, validateRole({ role: ['maker'] })], confirmAbandonApplication); -router.post('/application-details/:dealId/abandon', [validateToken, validateBank, validateRole({ role: ['maker'] })], abandonApplication); +router.get('/application-details/:dealId/abandon', [validateToken, validateBank, validateRole({ role: [MAKER] })], confirmAbandonApplication); +router.post('/application-details/:dealId/abandon', [validateToken, validateBank, validateRole({ role: [MAKER] })], abandonApplication); module.exports = router; diff --git a/gef-ui/server/routes/application-activities.js b/gef-ui/server/routes/application-activities.js index 68a6ae0e0e..eb401029c1 100644 --- a/gef-ui/server/routes/application-activities.js +++ b/gef-ui/server/routes/application-activities.js @@ -1,9 +1,13 @@ const express = require('express'); const { getPortalActivities } = require('../controllers/activities-controller'); -const { validateToken, validateBank } = require('../middleware'); +const { validateRole, validateToken, validateBank } = require('../middleware'); +const { + MAKER, CHECKER, READ_ONLY, ADMIN, +} = require('../constants/roles'); const router = express.Router(); -router.get('/application-details/:dealId/activities', [validateToken, validateBank], (req, res) => getPortalActivities(req, res)); +router.get('/application-details/:dealId/activities', [validateToken, validateBank, validateRole({ role: [MAKER, CHECKER, READ_ONLY, ADMIN] })], (req, res) => + getPortalActivities(req, res)); module.exports = router; diff --git a/gef-ui/server/routes/application-details.js b/gef-ui/server/routes/application-details.js index 6a49cda2ff..27e7832e09 100644 --- a/gef-ui/server/routes/application-details.js +++ b/gef-ui/server/routes/application-details.js @@ -1,10 +1,15 @@ const express = require('express'); const { applicationDetails, postApplicationDetails } = require('../controllers/application-details'); -const { validateToken, validateBank } = require('../middleware'); +const { validateToken, validateBank, validateRole } = require('../middleware'); +const { + MAKER, CHECKER, READ_ONLY, ADMIN, +} = require('../constants/roles'); const router = express.Router(); -router.get('/application-details/:dealId', [validateToken, validateBank], (req, res) => applicationDetails(req, res)); -router.post('/application-details/:dealId', [validateToken, validateBank], (req, res) => postApplicationDetails(req, res)); +router.get('/application-details/:dealId', [validateToken, validateBank, validateRole({ role: [MAKER, CHECKER, READ_ONLY, ADMIN] })], (req, res) => + applicationDetails(req, res)); +router.post('/application-details/:dealId', [validateToken, validateBank, validateRole({ role: [MAKER] })], (req, res) => + postApplicationDetails(req, res)); module.exports = router; diff --git a/gef-ui/server/routes/application-submission.js b/gef-ui/server/routes/application-submission.js index 40abae33bc..4b1137fe56 100644 --- a/gef-ui/server/routes/application-submission.js +++ b/gef-ui/server/routes/application-submission.js @@ -1,10 +1,11 @@ const express = require('express'); const { getApplicationSubmission, postApplicationSubmission } = require('../controllers/application-submission'); const { validateRole, validateToken, validateBank } = require('../middleware'); +const { MAKER } = require('../constants/roles'); const router = express.Router(); -router.get('/application-details/:dealId/submit', [validateToken, validateBank, validateRole({ role: ['maker'] })], getApplicationSubmission); -router.post('/application-details/:dealId/submit', [validateToken, validateBank, validateRole({ role: ['maker'] })], postApplicationSubmission); +router.get('/application-details/:dealId/submit', [validateToken, validateBank, validateRole({ role: [MAKER] })], getApplicationSubmission); +router.post('/application-details/:dealId/submit', [validateToken, validateBank, validateRole({ role: [MAKER] })], postApplicationSubmission); module.exports = router; diff --git a/gef-ui/server/routes/automatic-cover.js b/gef-ui/server/routes/automatic-cover.js index 25697ee5bc..fc763ab5e6 100644 --- a/gef-ui/server/routes/automatic-cover.js +++ b/gef-ui/server/routes/automatic-cover.js @@ -2,10 +2,11 @@ const express = require('express'); const { automaticCover, validateAutomaticCover } = require('../controllers/automatic-cover'); const { validateRole, validateToken, validateBank } = require('../middleware'); +const { MAKER } = require('../constants/roles'); const router = express.Router(); -router.get('/application-details/:dealId/automatic-cover', [validateToken, validateBank, validateRole({ role: ['maker'] })], (req, res) => automaticCover(req, res)); -router.post('/application-details/:dealId/automatic-cover', [validateToken, validateBank, validateRole({ role: ['maker'] })], (req, res) => validateAutomaticCover(req, res)); +router.get('/application-details/:dealId/automatic-cover', [validateToken, validateBank, validateRole({ role: [MAKER] })], (req, res) => automaticCover(req, res)); +router.post('/application-details/:dealId/automatic-cover', [validateToken, validateBank, validateRole({ role: [MAKER] })], (req, res) => validateAutomaticCover(req, res)); module.exports = router; diff --git a/gef-ui/server/routes/clone-gef-deal.js b/gef-ui/server/routes/clone-gef-deal.js index 9a3d6bbff5..a31f669007 100644 --- a/gef-ui/server/routes/clone-gef-deal.js +++ b/gef-ui/server/routes/clone-gef-deal.js @@ -2,12 +2,13 @@ const express = require('express'); const { validateRole, validateToken, validateBank } = require('../middleware'); const { getMandatoryCriteria } = require('../controllers/mandatory-criteria'); const { cloneDealValidateMandatoryCriteria, cloneDealNameApplication, cloneDealCreateApplication } = require('../controllers/clone-gef-deal'); +const { MAKER } = require('../constants/roles'); const router = express.Router(); -router.get('/application-details/:dealId/clone', [validateToken, validateBank, validateRole({ role: ['maker'] })], getMandatoryCriteria); -router.post('/application-details/:dealId/clone', [validateToken, validateBank, validateRole({ role: ['maker'] })], cloneDealValidateMandatoryCriteria); -router.get('/application-details/:dealId/clone/name-application', [validateToken, validateBank, validateRole({ role: ['maker'] })], cloneDealNameApplication); -router.post('/application-details/:dealId/clone/name-application', [validateToken, validateBank, validateRole({ role: ['maker'] })], cloneDealCreateApplication); +router.get('/application-details/:dealId/clone', [validateToken, validateBank, validateRole({ role: [MAKER] })], getMandatoryCriteria); +router.post('/application-details/:dealId/clone', [validateToken, validateBank, validateRole({ role: [MAKER] })], cloneDealValidateMandatoryCriteria); +router.get('/application-details/:dealId/clone/name-application', [validateToken, validateBank, validateRole({ role: [MAKER] })], cloneDealNameApplication); +router.post('/application-details/:dealId/clone/name-application', [validateToken, validateBank, validateRole({ role: [MAKER] })], cloneDealCreateApplication); module.exports = router; diff --git a/gef-ui/server/routes/companies-house.js b/gef-ui/server/routes/companies-house.js index 8286681b94..2b55532a2f 100644 --- a/gef-ui/server/routes/companies-house.js +++ b/gef-ui/server/routes/companies-house.js @@ -4,10 +4,11 @@ const { validateCompaniesHouse, } = require('../controllers/companies-house'); const { validateRole, validateToken, validateBank } = require('../middleware'); +const { MAKER } = require('../constants/roles'); const router = express.Router(); -router.get('/application-details/:dealId/companies-house', [validateToken, validateBank, validateRole({ role: ['maker'] })], (req, res) => companiesHouse(req, res)); -router.post('/application-details/:dealId/companies-house', [validateToken, validateBank, validateRole({ role: ['maker'] })], (req, res) => validateCompaniesHouse(req, res)); +router.get('/application-details/:dealId/companies-house', [validateToken, validateBank, validateRole({ role: [MAKER] })], (req, res) => companiesHouse(req, res)); +router.post('/application-details/:dealId/companies-house', [validateToken, validateBank, validateRole({ role: [MAKER] })], (req, res) => validateCompaniesHouse(req, res)); module.exports = router; diff --git a/gef-ui/server/routes/confirm-cover-start-date.js b/gef-ui/server/routes/confirm-cover-start-date.js index 235ae0bd69..ab1ca77fc3 100644 --- a/gef-ui/server/routes/confirm-cover-start-date.js +++ b/gef-ui/server/routes/confirm-cover-start-date.js @@ -2,17 +2,18 @@ const express = require('express'); const { processCoverStartDate } = require('../controllers/confirm-cover-start-date'); const { applicationDetails } = require('../controllers/application-details'); const { validateRole, validateToken, validateBank } = require('../middleware'); +const { MAKER } = require('../constants/roles'); const router = express.Router(); router.get( '/application-details/:dealId/:facilityId/confirm-cover-start-date/', - [validateToken, validateBank, validateRole({ role: ['maker'] })], + [validateToken, validateBank, validateRole({ role: [MAKER] })], (req, res) => applicationDetails(req, res), ); router.post( '/application-details/:dealId/:facilityId/confirm-cover-start-date/', - [validateToken, validateBank, validateRole({ role: ['maker'] })], + [validateToken, validateBank, validateRole({ role: [MAKER] })], (req, res) => processCoverStartDate(req, res), ); diff --git a/gef-ui/server/routes/cover-start-date.js b/gef-ui/server/routes/cover-start-date.js index 0308d1fc2b..6dba3b9e57 100644 --- a/gef-ui/server/routes/cover-start-date.js +++ b/gef-ui/server/routes/cover-start-date.js @@ -1,12 +1,13 @@ const express = require('express'); const { applicationDetails } = require('../controllers/application-details'); const { validateRole, validateToken, validateBank } = require('../middleware'); +const { MAKER } = require('../constants/roles'); const router = express.Router(); router.get( '/application-details/:dealId/cover-start-date', - [validateToken, validateBank, validateRole({ role: ['maker'] })], + [validateToken, validateBank, validateRole({ role: [MAKER] })], (req, res) => applicationDetails(req, res), ); diff --git a/gef-ui/server/routes/downloadFile.js b/gef-ui/server/routes/downloadFile.js index 3d906caea9..678c05d2d1 100644 --- a/gef-ui/server/routes/downloadFile.js +++ b/gef-ui/server/routes/downloadFile.js @@ -1,12 +1,13 @@ const express = require('express'); const { validateRole, validateToken } = require('../middleware'); const downloadFile = require('../controllers/downloadFile'); +const { MAKER, CHECKER } = require('../constants/roles'); const router = express.Router(); router.get( '/file/:fileId', - [validateToken, validateRole({ role: ['maker', 'checker'] })], + [validateToken, validateRole({ role: [MAKER, CHECKER] })], (req, res) => downloadFile(req, res), ); diff --git a/gef-ui/server/routes/eligible-automatic-cover.js b/gef-ui/server/routes/eligible-automatic-cover.js index 6798db6e6e..cc814ff7e4 100644 --- a/gef-ui/server/routes/eligible-automatic-cover.js +++ b/gef-ui/server/routes/eligible-automatic-cover.js @@ -3,24 +3,25 @@ const eligibleAutomaticCover = require('../controllers/eligible-automatic-cover' const ineligibleGef = require('../controllers/ineligible-gef'); const ineligibleAutomaticCover = require('../controllers/ineligible-automatic-cover'); const { validateRole, validateToken, validateBank } = require('../middleware'); +const { MAKER } = require('../constants/roles'); const router = express.Router(); router.get( '/application-details/:dealId/eligible-automatic-cover', - [validateToken, validateBank, validateRole({ role: ['maker'] })], + [validateToken, validateBank, validateRole({ role: [MAKER] })], (req, res) => eligibleAutomaticCover(req, res), ); router.get( '/application-details/:dealId/ineligible-automatic-cover', - [validateToken, validateBank, validateRole({ role: ['maker'] })], + [validateToken, validateBank, validateRole({ role: [MAKER] })], (req, res) => ineligibleAutomaticCover(req, res), ); router.get( '/ineligible-gef', - [validateToken, validateRole({ role: ['maker'] })], + [validateToken, validateRole({ role: [MAKER] })], (req, res) => ineligibleGef(req, res), ); diff --git a/gef-ui/server/routes/enter-exporters-correspondence-address.js b/gef-ui/server/routes/enter-exporters-correspondence-address.js index ef038f1528..07bdb76f1d 100644 --- a/gef-ui/server/routes/enter-exporters-correspondence-address.js +++ b/gef-ui/server/routes/enter-exporters-correspondence-address.js @@ -4,14 +4,15 @@ const { validateEnterExportersCorrespondenceAddress, } = require('../controllers/enter-exporters-correspondence-address'); const { validateRole, validateToken, validateBank } = require('../middleware'); +const { MAKER } = require('../constants/roles'); const router = express.Router(); router.get( '/application-details/:dealId/enter-exporters-correspondence-address', - [validateToken, validateBank, validateRole({ role: ['maker'] })], + [validateToken, validateBank, validateRole({ role: [MAKER] })], (req, res) => enterExportersCorrespondenceAddress(req, res), ); -router.post('/application-details/:dealId/enter-exporters-correspondence-address', [validateToken, validateBank, validateRole({ role: ['maker'] })], (req, res) => validateEnterExportersCorrespondenceAddress(req, res)); +router.post('/application-details/:dealId/enter-exporters-correspondence-address', [validateToken, validateBank, validateRole({ role: [MAKER] })], (req, res) => validateEnterExportersCorrespondenceAddress(req, res)); module.exports = router; diff --git a/gef-ui/server/routes/exporters-address.js b/gef-ui/server/routes/exporters-address.js index 6b5ba80b68..db0c158ab5 100644 --- a/gef-ui/server/routes/exporters-address.js +++ b/gef-ui/server/routes/exporters-address.js @@ -4,17 +4,18 @@ const { validateExportersAddress, } = require('../controllers/exporters-address'); const { validateRole, validateToken, validateBank } = require('../middleware'); +const { MAKER } = require('../constants/roles'); const router = express.Router(); router.get( '/application-details/:dealId/exporters-address', - [validateToken, validateBank, validateRole({ role: ['maker'] })], + [validateToken, validateBank, validateRole({ role: [MAKER] })], (req, res) => exportersAddress(req, res), ); router.post( '/application-details/:dealId/exporters-address', - [validateToken, validateBank, validateRole({ role: ['maker'] })], + [validateToken, validateBank, validateRole({ role: [MAKER] })], (req, res) => validateExportersAddress(req, res), ); diff --git a/gef-ui/server/routes/facilities.js b/gef-ui/server/routes/facilities.js index 454e67a163..4b068533dd 100644 --- a/gef-ui/server/routes/facilities.js +++ b/gef-ui/server/routes/facilities.js @@ -1,12 +1,13 @@ const express = require('express'); const { facilities, createFacility } = require('../controllers/facilities'); const { validateRole, validateToken, validateBank } = require('../middleware'); +const { MAKER } = require('../constants/roles'); const router = express.Router(); -router.get('/application-details/:dealId/facilities', [validateToken, validateBank, validateRole({ role: ['maker'] })], (req, res) => facilities(req, res)); -router.get('/application-details/:dealId/facilities/:facilityId', [validateToken, validateBank, validateRole({ role: ['maker'] })], (req, res) => facilities(req, res)); -router.post('/application-details/:dealId/facilities', [validateToken, validateBank, validateRole({ role: ['maker'] })], (req, res) => createFacility(req, res)); -router.post('/application-details/:dealId/facilities/:facilityId', [validateToken, validateBank, validateRole({ role: ['maker'] })], (req, res) => createFacility(req, res)); +router.get('/application-details/:dealId/facilities', [validateToken, validateBank, validateRole({ role: [MAKER] })], (req, res) => facilities(req, res)); +router.get('/application-details/:dealId/facilities/:facilityId', [validateToken, validateBank, validateRole({ role: [MAKER] })], (req, res) => facilities(req, res)); +router.post('/application-details/:dealId/facilities', [validateToken, validateBank, validateRole({ role: [MAKER] })], (req, res) => createFacility(req, res)); +router.post('/application-details/:dealId/facilities/:facilityId', [validateToken, validateBank, validateRole({ role: [MAKER] })], (req, res) => createFacility(req, res)); module.exports = router; diff --git a/gef-ui/server/routes/facility-confirm-deletion.js b/gef-ui/server/routes/facility-confirm-deletion.js index f83ffa86e9..e51f2a695e 100644 --- a/gef-ui/server/routes/facility-confirm-deletion.js +++ b/gef-ui/server/routes/facility-confirm-deletion.js @@ -1,17 +1,18 @@ const express = require('express'); const { facilityConfirmDeletion, deleteFacility } = require('../controllers/facility-confirm-deletion'); const { validateRole, validateToken, validateBank } = require('../middleware'); +const { MAKER } = require('../constants/roles'); const router = express.Router(); router.get( '/application-details/:dealId/facilities/:facilityId/confirm-deletion', - [validateToken, validateBank, validateRole({ role: ['maker'] })], + [validateToken, validateBank, validateRole({ role: [MAKER] })], (req, res) => facilityConfirmDeletion(req, res), ); router.post( '/application-details/:dealId/facilities/:facilityId/confirm-deletion', - [validateToken, validateBank, validateRole({ role: ['maker'] })], + [validateToken, validateBank, validateRole({ role: [MAKER] })], (req, res) => deleteFacility(req, res), ); diff --git a/gef-ui/server/routes/facility-currency.js b/gef-ui/server/routes/facility-currency.js index 951e03c97e..02f3476fa4 100644 --- a/gef-ui/server/routes/facility-currency.js +++ b/gef-ui/server/routes/facility-currency.js @@ -1,17 +1,18 @@ const express = require('express'); const { facilityCurrency, updateFacilityCurrency } = require('../controllers/facility-currency'); const { validateRole, validateToken, validateBank } = require('../middleware'); +const { MAKER } = require('../constants/roles'); const router = express.Router(); router.get( '/application-details/:dealId/facilities/:facilityId/facility-currency', - [validateToken, validateBank, validateRole({ role: ['maker'] })], + [validateToken, validateBank, validateRole({ role: [MAKER] })], (req, res) => facilityCurrency(req, res), ); router.post( '/application-details/:dealId/facilities/:facilityId/facility-currency', - [validateToken, validateBank, validateRole({ role: ['maker'] })], + [validateToken, validateBank, validateRole({ role: [MAKER] })], (req, res) => updateFacilityCurrency(req, res), ); diff --git a/gef-ui/server/routes/facility-guarantee.js b/gef-ui/server/routes/facility-guarantee.js index deb19ff845..984bdf3e63 100644 --- a/gef-ui/server/routes/facility-guarantee.js +++ b/gef-ui/server/routes/facility-guarantee.js @@ -1,17 +1,18 @@ const express = require('express'); const { facilityGuarantee, updateFacilityGuarantee } = require('../controllers/facility-guarantee'); const { validateRole, validateToken, validateBank } = require('../middleware'); +const { MAKER } = require('../constants/roles'); const router = express.Router(); router.get( '/application-details/:dealId/facilities/:facilityId/facility-guarantee', - [validateToken, validateBank, validateRole({ role: ['maker'] })], + [validateToken, validateBank, validateRole({ role: [MAKER] })], (req, res) => facilityGuarantee(req, res), ); router.post( '/application-details/:dealId/facilities/:facilityId/facility-guarantee', - [validateToken, validateBank, validateRole({ role: ['maker'] })], + [validateToken, validateBank, validateRole({ role: [MAKER] })], (req, res) => updateFacilityGuarantee(req, res), ); diff --git a/gef-ui/server/routes/facility-value.js b/gef-ui/server/routes/facility-value.js index f1954474af..91e17701b0 100644 --- a/gef-ui/server/routes/facility-value.js +++ b/gef-ui/server/routes/facility-value.js @@ -1,17 +1,18 @@ const express = require('express'); const { facilityValue, updateFacilityValue } = require('../controllers/facility-value'); const { validateRole, validateToken, validateBank } = require('../middleware'); +const { MAKER } = require('../constants/roles'); const router = express.Router(); router.get( '/application-details/:dealId/facilities/:facilityId/facility-value', - [validateToken, validateBank, validateRole({ role: ['maker'] })], + [validateToken, validateBank, validateRole({ role: [MAKER] })], (req, res) => facilityValue(req, res), ); router.post( '/application-details/:dealId/facilities/:facilityId/facility-value', - [validateToken, validateBank, validateRole({ role: ['maker'] })], + [validateToken, validateBank, validateRole({ role: [MAKER] })], (req, res) => updateFacilityValue(req, res), ); diff --git a/gef-ui/server/routes/mandatory-criteria.js b/gef-ui/server/routes/mandatory-criteria.js index 8ea457ff26..180eb0c3d5 100644 --- a/gef-ui/server/routes/mandatory-criteria.js +++ b/gef-ui/server/routes/mandatory-criteria.js @@ -1,17 +1,18 @@ const express = require('express'); const { getMandatoryCriteria, validateMandatoryCriteria } = require('../controllers/mandatory-criteria'); const { validateRole, validateToken } = require('../middleware'); +const { MAKER } = require('../constants/roles'); const router = express.Router(); router.get( '/mandatory-criteria', - [validateToken, validateRole({ role: ['maker'] })], + [validateToken, validateRole({ role: [MAKER] })], (req, res) => getMandatoryCriteria(req, res), ); router.post( '/mandatory-criteria', - [validateToken, validateRole({ role: ['maker'] })], + [validateToken, validateRole({ role: [MAKER] })], (req, res) => validateMandatoryCriteria(req, res), ); diff --git a/gef-ui/server/routes/name-application.js b/gef-ui/server/routes/name-application.js index 447f8b2e7a..7477c38d03 100644 --- a/gef-ui/server/routes/name-application.js +++ b/gef-ui/server/routes/name-application.js @@ -1,12 +1,13 @@ const express = require('express'); const { nameApplication, createApplication, updateApplicationReferences } = require('../controllers/name-application'); const { validateRole, validateToken, validateBank } = require('../middleware'); +const { MAKER } = require('../constants/roles'); const router = express.Router(); -router.get('/name-application', [validateToken, validateRole({ role: ['maker'] })], (req, res) => nameApplication(req, res)); -router.post('/name-application', [validateToken, validateRole({ role: ['maker'] })], (req, res) => createApplication(req, res)); -router.get('/applications/:dealId/name', [validateToken, validateBank, validateRole({ role: ['maker'] })], nameApplication); -router.post('/applications/:dealId/name', [validateToken, validateBank, validateRole({ role: ['maker'] })], updateApplicationReferences); +router.get('/name-application', [validateToken, validateRole({ role: [MAKER] })], (req, res) => nameApplication(req, res)); +router.post('/name-application', [validateToken, validateRole({ role: [MAKER] })], (req, res) => createApplication(req, res)); +router.get('/applications/:dealId/name', [validateToken, validateBank, validateRole({ role: [MAKER] })], nameApplication); +router.post('/applications/:dealId/name', [validateToken, validateBank, validateRole({ role: [MAKER] })], updateApplicationReferences); module.exports = router; diff --git a/gef-ui/server/routes/provided-facility.js b/gef-ui/server/routes/provided-facility.js index a79ab2da82..4eea0401d4 100644 --- a/gef-ui/server/routes/provided-facility.js +++ b/gef-ui/server/routes/provided-facility.js @@ -4,17 +4,18 @@ const { validateProvidedFacility, } = require('../controllers/provided-facility'); const { validateRole, validateToken, validateBank } = require('../middleware'); +const { MAKER } = require('../constants/roles'); const router = express.Router(); router.get( '/application-details/:dealId/facilities/:facilityId/provided-facility', - [validateToken, validateBank, validateRole({ role: ['maker'] })], + [validateToken, validateBank, validateRole({ role: [MAKER] })], (req, res) => providedFacility(req, res), ); router.post( '/application-details/:dealId/facilities/:facilityId/provided-facility', - [validateToken, validateBank, validateRole({ role: ['maker'] })], + [validateToken, validateBank, validateRole({ role: [MAKER] })], (req, res) => validateProvidedFacility(req, res), ); diff --git a/gef-ui/server/routes/return-to-maker.js b/gef-ui/server/routes/return-to-maker.js index 972645bc60..6ba2d61db0 100644 --- a/gef-ui/server/routes/return-to-maker.js +++ b/gef-ui/server/routes/return-to-maker.js @@ -1,17 +1,18 @@ const express = require('express'); const { getReturnToMaker, postReturnToMaker } = require('../controllers/return-to-maker'); const { validateRole, validateToken, validateBank } = require('../middleware'); +const { CHECKER } = require('../constants/roles'); const router = express.Router(); router.get( '/application-details/:dealId/return-to-maker', - [validateToken, validateBank, validateRole({ role: ['checker'] })], + [validateToken, validateBank, validateRole({ role: [CHECKER] })], getReturnToMaker, ); router.post( '/application-details/:dealId/return-to-maker', - [validateToken, validateBank, validateRole({ role: ['checker'] })], + [validateToken, validateBank, validateRole({ role: [CHECKER] })], postReturnToMaker, ); diff --git a/gef-ui/server/routes/review-decision.js b/gef-ui/server/routes/review-decision.js index 927d6f121c..e5f288ce74 100644 --- a/gef-ui/server/routes/review-decision.js +++ b/gef-ui/server/routes/review-decision.js @@ -2,17 +2,18 @@ const express = require('express'); const { acceptUkefDecision } = require('../controllers/review-decision'); const { applicationDetails } = require('../controllers/application-details'); const { validateRole, validateToken, validateBank } = require('../middleware'); +const { MAKER } = require('../constants/roles'); const router = express.Router(); router.get( '/application-details/:dealId/review-decision', - [validateToken, validateBank, validateRole({ role: ['maker'] })], + [validateToken, validateBank, validateRole({ role: [MAKER] })], (req, res) => applicationDetails(req, res), ); router.post( '/application-details/:dealId/review-decision', - [validateToken, validateBank, validateRole({ role: ['maker'] })], + [validateToken, validateBank, validateRole({ role: [MAKER] })], (req, res) => acceptUkefDecision(req, res), ); diff --git a/gef-ui/server/routes/security-details.js b/gef-ui/server/routes/security-details.js index 7ab9504b33..925d4d3595 100644 --- a/gef-ui/server/routes/security-details.js +++ b/gef-ui/server/routes/security-details.js @@ -1,17 +1,18 @@ const express = require('express'); const { getSecurityDetails, postSecurityDetails } = require('../controllers/supporting-information/security-details'); const { validateRole, validateToken, validateBank } = require('../middleware'); +const { MAKER } = require('../constants/roles'); const router = express.Router(); router.get( '/application-details/:dealId/supporting-information/security-details', - [validateToken, validateBank, validateRole({ role: ['maker'] })], + [validateToken, validateBank, validateRole({ role: [MAKER] })], (req, res) => getSecurityDetails(req, res), ); router.post( '/application-details/:dealId/supporting-information/security-details', - [validateToken, validateBank, validateRole({ role: ['maker'] })], + [validateToken, validateBank, validateRole({ role: [MAKER] })], (req, res) => postSecurityDetails(req, res), ); diff --git a/gef-ui/server/routes/select-exporters-correspondence-address.js b/gef-ui/server/routes/select-exporters-correspondence-address.js index f651cd7dbe..044efbbb1e 100644 --- a/gef-ui/server/routes/select-exporters-correspondence-address.js +++ b/gef-ui/server/routes/select-exporters-correspondence-address.js @@ -1,17 +1,18 @@ const express = require('express'); const { selectExportersCorrespondenceAddress, validateSelectExportersCorrespondenceAddress } = require('../controllers/select-exporters-correspondence-address'); const { validateRole, validateToken, validateBank } = require('../middleware'); +const { MAKER } = require('../constants/roles'); const router = express.Router(); router.get( '/application-details/:dealId/select-exporters-correspondence-address', - [validateToken, validateBank, validateRole({ role: ['maker'] })], + [validateToken, validateBank, validateRole({ role: [MAKER] })], (req, res) => selectExportersCorrespondenceAddress(req, res), ); router.post( '/application-details/:dealId/select-exporters-correspondence-address', - [validateToken, validateBank, validateRole({ role: ['maker'] })], + [validateToken, validateBank, validateRole({ role: [MAKER] })], (req, res) => validateSelectExportersCorrespondenceAddress(req, res), ); diff --git a/gef-ui/server/routes/submit-to-ukef.js b/gef-ui/server/routes/submit-to-ukef.js index 1365d80e87..6ee0228271 100644 --- a/gef-ui/server/routes/submit-to-ukef.js +++ b/gef-ui/server/routes/submit-to-ukef.js @@ -1,10 +1,11 @@ const express = require('express'); const { submitToUkef, createSubmissionToUkef } = require('../controllers/submit-to-ukef'); const { validateBank, validateRole, validateToken } = require('../middleware'); +const { CHECKER } = require('../constants/roles'); const router = express.Router(); -router.get('/application-details/:dealId/submit-to-ukef', [validateToken, validateBank, validateRole({ role: ['checker'] })], (req, res) => submitToUkef(req, res)); -router.post('/application-details/:dealId/submit-to-ukef', [validateToken, validateBank, validateRole({ role: ['checker'] })], (req, res) => createSubmissionToUkef(req, res)); +router.get('/application-details/:dealId/submit-to-ukef', [validateToken, validateBank, validateRole({ role: [CHECKER] })], (req, res) => submitToUkef(req, res)); +router.post('/application-details/:dealId/submit-to-ukef', [validateToken, validateBank, validateRole({ role: [CHECKER] })], (req, res) => createSubmissionToUkef(req, res)); module.exports = router; diff --git a/gef-ui/server/routes/supporting-information-upload.js b/gef-ui/server/routes/supporting-information-upload.js index b2ca2eb55d..99567e9e16 100644 --- a/gef-ui/server/routes/supporting-information-upload.js +++ b/gef-ui/server/routes/supporting-information-upload.js @@ -5,6 +5,7 @@ const { uploadSupportingDocument, deleteSupportingDocument } = require('../contr const { validateRole, validateToken, validateBank } = require('../middleware'); const { FILE_UPLOAD } = require('../constants/file-upload'); const { isCsrfTokenValid } = require('../utils/csrf-token-checker'); +const { MAKER } = require('../constants/roles'); // The following routes cannot use the same csrf checks as the rest of the routes // as the Ministry of Justice multi-file-upload component does not allow passing tokens to the request body. @@ -32,7 +33,7 @@ const uploadSingle = multer({ limits: { fileSize: FILE_UPLOAD.MAX_FILE_SIZE }, f router.post( '/application-details/:dealId/supporting-information/document/:documentType/upload', - [validateUploadCsrfToken, validateToken, validateBank, validateRole({ role: ['maker'] })], + [validateUploadCsrfToken, validateToken, validateBank, validateRole({ role: [MAKER] })], (req, res, next) => { uploadSingle(req, res, (error) => { if (!error) { @@ -51,7 +52,7 @@ router.post( ); router.post( '/application-details/:dealId/supporting-information/document/:documentType/delete', - [validateUploadCsrfToken, validateToken, validateBank, validateRole({ role: ['maker'] })], + [validateUploadCsrfToken, validateToken, validateBank, validateRole({ role: [MAKER] })], deleteSupportingDocument, ); diff --git a/gef-ui/server/routes/supporting-information.js b/gef-ui/server/routes/supporting-information.js index cc97ea02ab..dab12b772d 100644 --- a/gef-ui/server/routes/supporting-information.js +++ b/gef-ui/server/routes/supporting-information.js @@ -1,10 +1,9 @@ const express = require('express'); const multer = require('multer'); -const { - getSupportingDocuments, postSupportingDocuments, -} = require('../controllers/supporting-information/supporting-documents'); +const { getSupportingDocuments, postSupportingDocuments } = require('../controllers/supporting-information/supporting-documents'); const { validateRole, validateToken, validateBank } = require('../middleware'); const { FILE_UPLOAD } = require('../constants/file-upload'); +const { MAKER } = require('../constants/roles'); const router = express.Router(); @@ -12,12 +11,12 @@ const uploadMultiple = multer({ limits: { fileSize: FILE_UPLOAD.MAX_FILE_SIZE } router.get( '/application-details/:dealId/supporting-information/document/:documentType', - [validateToken, validateBank, validateRole({ role: ['maker'] })], + [validateToken, validateBank, validateRole({ role: [MAKER] })], getSupportingDocuments, ); router.post( '/application-details/:dealId/supporting-information/document/:documentType', - [validateToken, validateBank, uploadMultiple], + [validateToken, validateBank, validateRole({ role: [MAKER] }), uploadMultiple], postSupportingDocuments, ); diff --git a/gef-ui/server/routes/unissued-facilities.js b/gef-ui/server/routes/unissued-facilities.js index 4485a73f27..2584e70dd9 100644 --- a/gef-ui/server/routes/unissued-facilities.js +++ b/gef-ui/server/routes/unissued-facilities.js @@ -9,31 +9,39 @@ const { postChangeIssuedToUnissuedFacility, } = require('../controllers/unissued-facilities'); const { validateRole, validateToken, validateBank } = require('../middleware'); +const { MAKER } = require('../constants/roles'); const router = express.Router(); // unissued facility list -router.get('/application-details/:dealId/unissued-facilities', [validateToken, validateBank, validateRole({ role: ['maker'] })], (req, res) => applicationDetails(req, res)); +router.get('/application-details/:dealId/unissued-facilities', [validateToken, validateBank, validateRole({ role: [MAKER] })], (req, res) => + applicationDetails(req, res)); // get change unissued facility from facility list -router.get('/application-details/:dealId/unissued-facilities/:facilityId/about', [validateToken, validateBank, validateRole({ role: ['maker'] })], (req, res) => +router.get('/application-details/:dealId/unissued-facilities/:facilityId/about', [validateToken, validateBank, validateRole({ role: [MAKER] })], (req, res) => changeUnissuedFacility(req, res)); // post change unissued facility to issued from facility list -router.post('/application-details/:dealId/unissued-facilities/:facilityId/about', [validateToken, validateBank, validateRole({ role: ['maker'] })], (req, res) => +router.post('/application-details/:dealId/unissued-facilities/:facilityId/about', [validateToken, validateBank, validateRole({ role: [MAKER] })], (req, res) => postChangeUnissuedFacility(req, res)); // get change unissued facility from application preview -router.get('/application-details/:dealId/unissued-facilities/:facilityId/change', [validateToken, validateBank, validateRole({ role: ['maker'] })], (req, res) => +router.get('/application-details/:dealId/unissued-facilities/:facilityId/change', [validateToken, validateBank, validateRole({ role: [MAKER] })], (req, res) => changeUnissuedFacilityPreview(req, res)); // post change unissued facilities to issued from application preview -router.post('/application-details/:dealId/unissued-facilities/:facilityId/change', [validateToken, validateBank, validateRole({ role: ['maker'] })], (req, res) => +router.post('/application-details/:dealId/unissued-facilities/:facilityId/change', [validateToken, validateBank, validateRole({ role: [MAKER] })], (req, res) => postChangeUnissuedFacilityPreview(req, res)); // get change issued facility to unissued from application preview -router.get('/application-details/:dealId/unissued-facilities/:facilityId/change-to-unissued', validateToken, (req, res) => - changeIssuedToUnissuedFacility(req, res)); +router.get( + '/application-details/:dealId/unissued-facilities/:facilityId/change-to-unissued', + [validateToken, validateBank, validateRole({ role: [MAKER] })], + (req, res) => changeIssuedToUnissuedFacility(req, res), +); // post change issued facility to unissued from application preview -router.post('/application-details/:dealId/unissued-facilities/:facilityId/change-to-unissued', validateToken, (req, res) => - postChangeIssuedToUnissuedFacility(req, res)); +router.post( + '/application-details/:dealId/unissued-facilities/:facilityId/change-to-unissued', + [validateToken, validateBank, validateRole({ role: [MAKER] })], + (req, res) => postChangeIssuedToUnissuedFacility(req, res), +); module.exports = router; diff --git a/gef-ui/server/utils/constructPayload.test.js b/gef-ui/server/utils/constructPayload.test.js index 4501e93d14..8f0c8bc0ef 100644 --- a/gef-ui/server/utils/constructPayload.test.js +++ b/gef-ui/server/utils/constructPayload.test.js @@ -1,6 +1,9 @@ /** * Unit test cases for `constructPayload` method */ +import { + CHECKER, EFM, MAKER, UKEF_OPERATIONS, +} from '../constants/roles'; import constructPayload from './constructPayload'; const mockBody = { @@ -11,7 +14,7 @@ const mockBody = { }; const mockExtraBody = { - roles: ['maker/checker', 'checker', 'maker', 'ukef_operations', 'EFM'], + roles: ['maker/checker', CHECKER, MAKER, UKEF_OPERATIONS, EFM], _csrf: '3YyRfYmT', currentPassword: 'AbC!2345', password: 'AbC!23456', diff --git a/gef-ui/server/utils/deal-helpers.js b/gef-ui/server/utils/deal-helpers.js index 8003223dfb..5adb32a0a0 100644 --- a/gef-ui/server/utils/deal-helpers.js +++ b/gef-ui/server/utils/deal-helpers.js @@ -1,4 +1,5 @@ const CONSTANTS = require('../constants'); +const { MAKER } = require('../constants/roles'); const { hasChangedToIssued, coverDatesConfirmed, @@ -66,7 +67,7 @@ const makerCanReSubmit = (maker, application) => { const ukefDecisionAccepted = application.submissionType === CONSTANTS.DEAL_SUBMISSION_TYPE.AIN ? true : application.ukefDecisionAccepted; - const makerAuthorised = (maker.roles.includes('maker') && maker.bank.id === application.bank.id); + const makerAuthorised = (maker.roles.includes(MAKER) && maker.bank.id === application.bank.id); return Boolean(ukefDecisionAccepted) && coverDateConfirmed && facilitiesChangedToIssued && acceptableStatus.includes(application.status) && makerAuthorised; }; diff --git a/gef-ui/server/utils/facility-helpers.test.js b/gef-ui/server/utils/facility-helpers.test.js index 9c25b8b54c..230082171b 100644 --- a/gef-ui/server/utils/facility-helpers.test.js +++ b/gef-ui/server/utils/facility-helpers.test.js @@ -36,6 +36,7 @@ import { import { MOCK_REQUEST, MOCK_REQUEST_CHECKER, } from './mocks/mock_requests'; +import { MAKER } from '../constants/roles'; const CONSTANTS = require('../constants'); @@ -46,7 +47,7 @@ const acceptableStatus = [ CONSTANTS.DEAL_STATUS.UKEF_APPROVED_WITH_CONDITIONS, ]; const acceptableRole = [ - 'maker', + MAKER, ]; const mockParam = { acceptableStatus, @@ -382,7 +383,7 @@ describe('summaryIssuedUnchanged()', () => { expect(result).toEqual(false); }); - it('should return false when CHECKER, maker, and facilty not issued and has no canResubmitIssuedFacilities facilities', () => { + it('should return false when CHECKER, maker, and facility not issued and has no canResubmitIssuedFacilities facilities', () => { const changed = facilitiesChangedToIssuedAsArray(MOCK_AIN_APPLICATION); mockParam.app = MOCK_AIN_APPLICATION_CHECKER; mockParam.data = MOCK_ISSUED_FACILITY; @@ -392,7 +393,7 @@ describe('summaryIssuedUnchanged()', () => { expect(result).toEqual(false); }); - it('should return false when UKEF_ACKNOWLEDGED, maker, and facilty not issued and has no canResubmitIssuedFacilities facilities', () => { + it('should return false when UKEF_ACKNOWLEDGED, maker, and facility not issued and has no canResubmitIssuedFacilities facilities', () => { const changed = facilitiesChangedToIssuedAsArray(MOCK_AIN_APPLICATION_ISSUED_ONLY); mockParam.app = MOCK_AIN_APPLICATION; mockParam.data = MOCK_ISSUED_FACILITY_UNCHANGED; @@ -402,7 +403,7 @@ describe('summaryIssuedUnchanged()', () => { expect(result).toEqual(false); }); - it('should return false when CHANGED_REQUIRED, maker, and facilty not issued and has no canResubmitIssuedFacilities facilities', () => { + it('should return false when CHANGED_REQUIRED, maker, and facility not issued and has no canResubmitIssuedFacilities facilities', () => { const changed = facilitiesChangedToIssuedAsArray(MOCK_AIN_APPLICATION_ISSUED_ONLY); mockParam.app = MOCK_AIN_APPLICATION_RETURN_MAKER; mockParam.data = MOCK_ISSUED_FACILITY_UNCHANGED; @@ -412,7 +413,7 @@ describe('summaryIssuedUnchanged()', () => { expect(result).toEqual(false); }); - it('should return false when UKEF_ACKNOWLEDGED, maker, and facilty issued and has canResubmitIssuedFacilities facilities', () => { + it('should return false when UKEF_ACKNOWLEDGED, maker, and facility issued and has canResubmitIssuedFacilities facilities', () => { const changed = facilitiesChangedToIssuedAsArray(MOCK_AIN_APPLICATION); mockParam.app = MOCK_AIN_APPLICATION; mockParam.data = MOCK_ISSUED_FACILITY; @@ -422,7 +423,7 @@ describe('summaryIssuedUnchanged()', () => { expect(result).toEqual(false); }); - it('should return false when CHANGED_REQUIRED, maker, and facilty issued and has canResubmitIssuedFacilities facilities', () => { + it('should return false when CHANGED_REQUIRED, maker, and facility issued and has canResubmitIssuedFacilities facilities', () => { const changed = facilitiesChangedToIssuedAsArray(MOCK_AIN_APPLICATION); mockParam.app = MOCK_AIN_APPLICATION_RETURN_MAKER; mockParam.data = MOCK_ISSUED_FACILITY; @@ -432,7 +433,7 @@ describe('summaryIssuedUnchanged()', () => { expect(result).toEqual(false); }); - it('should return false when UKEF_ACKNOWLEDGED, checker, and facilty not issued and has canResubmitIssuedFacilities facilities', () => { + it('should return false when UKEF_ACKNOWLEDGED, checker, and facility not issued and has canResubmitIssuedFacilities facilities', () => { const changed = facilitiesChangedToIssuedAsArray(MOCK_AIN_APPLICATION); mockParam.app = MOCK_AIN_APPLICATION; mockParam.data = MOCK_UNISSUED_FACILITY; @@ -443,7 +444,7 @@ describe('summaryIssuedUnchanged()', () => { expect(result).toEqual(false); }); - it('should return false when CHANGED_REQUIRED, checker, and facilty not issued and has canResubmitIssuedFacilities facilities', () => { + it('should return false when CHANGED_REQUIRED, checker, and facility not issued and has canResubmitIssuedFacilities facilities', () => { const changed = facilitiesChangedToIssuedAsArray(MOCK_AIN_APPLICATION); mockParam.app = MOCK_AIN_APPLICATION_RETURN_MAKER; mockParam.data = MOCK_UNISSUED_FACILITY; diff --git a/gef-ui/server/utils/fileUtils.test.js b/gef-ui/server/utils/fileUtils.test.js index 04e37e54a7..f0d40c19b6 100644 --- a/gef-ui/server/utils/fileUtils.test.js +++ b/gef-ui/server/utils/fileUtils.test.js @@ -3,6 +3,7 @@ import { uploadFile, deleteFile, updateApplication, updateSupportingInformation, } from '../services/api'; import Application from '../models/application'; +import { MAKER } from '../constants/roles'; jest.mock('../services/api', () => ({ uploadFile: jest.fn(), @@ -20,7 +21,7 @@ const mockFile = { filename: 'mock-file.pdf', }; -const mockUser = { roles: ['MAKER'], _id: '12345' }; +const mockUser = { roles: [MAKER], _id: '12345' }; const mockDealId = 'mock-id'; let mockDeal = { diff --git a/gef-ui/server/utils/helpers.js b/gef-ui/server/utils/helpers.js index d917fbaa46..033d7fc020 100644 --- a/gef-ui/server/utils/helpers.js +++ b/gef-ui/server/utils/helpers.js @@ -14,6 +14,7 @@ const { } = require('./facility-helpers'); const { isUkefReviewAvailable } = require('./deal-helpers'); +const { MAKER } = require('../constants/roles'); const userToken = (req) => { const token = req.session.userToken; @@ -268,7 +269,7 @@ const summaryItemsConditions = (summaryItemsObj) => { CONSTANTS.DEAL_STATUS.UKEF_APPROVED_WITH_CONDITIONS, ]; const acceptableRole = [ - 'maker', + MAKER, ]; const { id, href, shouldCoverStartOnSubmission } = item; const value = typeof details[item.id] === 'number' || typeof details[item.id] === 'boolean' ? details[item.id].toString() : details[item.id]; diff --git a/gef-ui/server/utils/helpers.test.js b/gef-ui/server/utils/helpers.test.js index 09a3db1db5..fd42eda26b 100644 --- a/gef-ui/server/utils/helpers.test.js +++ b/gef-ui/server/utils/helpers.test.js @@ -48,6 +48,7 @@ import { } from './mocks/mock_applications'; import { MOCK_REQUEST } from './mocks/mock_requests'; +import { CHECKER } from '../constants/roles'; const CONSTANTS = require('../constants'); @@ -509,7 +510,7 @@ describe('mapSummaryList()', () => { mockedData.details.reverse = 'abcd'; const { text } = mapSummaryList(mockedData, mockedDisplayItems, mapSummaryParams)[0].value; - expect(text).toEqual('dcba'); + expect(text).toEqual('dcba'); // cspell:disable-line }); it('coverStartDate should display as date when !startOnSubmission', () => { @@ -1379,7 +1380,7 @@ describe('summaryItemsConditions()', () => { }); it('Should return FALSE as the user does not have `maker` role', () => { - MOCK_REQUEST.roles = ['checker']; + MOCK_REQUEST.roles = [CHECKER]; expect(makerCanReSubmit(MOCK_REQUEST, MOCK_BASIC_DEAL)).toEqual(false); }); diff --git a/gef-ui/server/utils/mocks/mock_requests.js b/gef-ui/server/utils/mocks/mock_requests.js index 7b46dd0618..54abd67683 100644 --- a/gef-ui/server/utils/mocks/mock_requests.js +++ b/gef-ui/server/utils/mocks/mock_requests.js @@ -1,4 +1,5 @@ const Chance = require('chance'); +const { MAKER, CHECKER } = require('../../constants/roles'); const chance = new Chance(); @@ -7,7 +8,7 @@ const MOCK_REQUEST = { firstname: chance.first(), surname: chance.last(), email: chance.email(), - roles: ['maker'], + roles: [MAKER], bank: { id: '9', name: 'UKEF test bank (Delegated)', @@ -30,7 +31,7 @@ const MOCK_REQUEST_CHECKER = { firstname: chance.first(), surname: chance.last(), email: chance.email(), - roles: ['checker'], + roles: [CHECKER], bank: { id: '9', name: 'UKEF test bank (Delegated)', diff --git a/gef-ui/server/utils/mocks/mock_users.js b/gef-ui/server/utils/mocks/mock_users.js index 19dccd2144..5efe2dca09 100644 --- a/gef-ui/server/utils/mocks/mock_users.js +++ b/gef-ui/server/utils/mocks/mock_users.js @@ -1,4 +1,5 @@ const Chance = require('chance'); +const { MAKER, CHECKER } = require('../../constants/roles'); const chance = new Chance(); @@ -6,7 +7,7 @@ const MOCK_MAKER = { _id: '61cdde40055cf301acf98064', username: 'BANK1_MAKER1', roles: [ - 'maker', + MAKER, ], bank: { id: '9', @@ -34,7 +35,7 @@ const MOCK_CHECKER = { _id: '61cdde40055cf301acf98065', username: 'BANK1_CHECKER1', roles: [ - 'checker', + CHECKER, ], bank: { id: '9', diff --git a/gef-ui/server/utils/user-authorisation-level.test.js b/gef-ui/server/utils/user-authorisation-level.test.js index c7506ea2a0..8d8a8a69d2 100644 --- a/gef-ui/server/utils/user-authorisation-level.test.js +++ b/gef-ui/server/utils/user-authorisation-level.test.js @@ -1,30 +1,31 @@ import getUserAuthorisationLevelsToApplication from './user-authorisation-level'; import CONSTANTS from '../constants'; +import { CHECKER, MAKER } from '../constants/roles'; const makerUser = { username: 'MAKER', - firstname: 'Ma', - surname: 'Ker', + firstname: 'Ma', // cspell:disable-line + surname: 'Ker', // cspell:disable-line email: 'maker@ukexportfinance.gov.uk', - roles: ['maker'], + roles: [MAKER], 'user-status': 'active', _id: '11111', }; const checkerUser = { username: 'CHECKER', - firstname: 'Chec', - surname: 'Ker', + firstname: 'Chec', // cspell:disable-line + surname: 'Ker', // cspell:disable-line email: 'checker@ukexportfinance.gov.uk', - roles: ['checker'], + roles: [CHECKER], 'user-status': 'active', _id: '11112', }; const combinedUser = { username: 'COMBINED', - firstname: 'Com', - surname: 'Bined', + firstname: 'Com', // cspell:disable-line + surname: 'Bined', // cspell:disable-line email: 'combined@ukexportfinance.gov.uk', - roles: ['maker', 'checker'], + roles: [MAKER, CHECKER], 'user-status': 'active', _id: '11113', }; diff --git a/portal/README.md b/portal/README.md index 47949edeee..42c33f6551 100644 --- a/portal/README.md +++ b/portal/README.md @@ -21,10 +21,21 @@ You can find mock login credentials in the `utils/mock-data-loader/portal/users. ### **Run a UI test suite** +Verbose with coverage: ```shell npm run test ``` +Verbose: +```shell +npm run test-dev +``` + +Quick: +```shell +npm run test-quick +``` + ### **Run a single UI test** ```shell diff --git a/portal/package.json b/portal/package.json index 286c73066d..456c517be2 100644 --- a/portal/package.json +++ b/portal/package.json @@ -27,6 +27,7 @@ "start": "node server/index.js", "test": "jest --coverage --verbose --config=jest.config.js", "test-dev": "jest --verbose --config=jest.config.js", + "test-file": "jest --config=jest.config.js --verbose --testMatch", "test-quick": "jest --config=jest.config.js", "test-watch": "jest --watchAll --coverage --verbose --config=jest.config.js --detectOpenHandles" }, diff --git a/portal/server/routes/middleware/validateRole/index.js b/portal/server/routes/middleware/validateRole/index.js index f9931bfd4d..14bf1e417b 100644 --- a/portal/server/routes/middleware/validateRole/index.js +++ b/portal/server/routes/middleware/validateRole/index.js @@ -18,7 +18,7 @@ const userRoleIsValid = (requiredRoles, user) => { }; /** * - * @param {object} opts (i.e. { role: ['maker'] }) + * @param {object} opts (i.e. { role: [MAKER] }) * */ const validateRole = (opts, getRedirectUrl = () => '/') => { diff --git a/trade-finance-manager-ui/README.md b/trade-finance-manager-ui/README.md index 3ac589bbce..55fd380a10 100644 --- a/trade-finance-manager-ui/README.md +++ b/trade-finance-manager-ui/README.md @@ -27,11 +27,22 @@ Login credentials can be found in the mock users data, specifically in the file: ### Run a UI Test Suite :heavy_check_mark: +Verbose with coverage: ```shell npm run test ``` -### Run a Single UI Test :heavy_check_mark: +Verbose: +```shell +npm run test-dev +``` + +Quick: +```shell +npm run test-quick +``` + +### **Run a single UI test** ```shell npm run test /path/to/file.test.js From 1db44fa33617476fa740e69fcc11080daf515b70 Mon Sep 17 00:00:00 2001 From: lmarrai-sw <44811960+lmarrai-sw@users.noreply.github.com> Date: Tue, 19 Sep 2023 17:04:58 +0100 Subject: [PATCH 018/130] feat(DTFS2-6628): add read only limitation on UI elements in gef-ui (#2057) Co-authored-by: oscar-richardson-softwire Co-authored-by: AlexBramhill <47955140+AlexBramhill@users.noreply.github.com> --- ...ationReferenceAndActions.component-test.js | 50 ++++++++++++ .../includes/footer.component-test.js | 52 ++++++++++++ .../primary-navigation.component-test.js | 80 +++++++++++++++++++ .../application-activity.component-test.js | 6 +- gef-ui/package.json | 4 +- .../canUpdateUnissuedFacilitiesCheck.js | 18 +++++ .../canUpdateUnissuedFacilitiesCheck.test.js | 78 ++++++++++++++++++ .../controllers/application-details/index.js | 13 +-- .../application-details/index.test.js | 52 +++++++++++- gef-ui/server/utils/helpers.js | 13 --- gef-ui/server/utils/helpers.test.js | 44 ---------- .../server/utils/user-authorisation-level.js | 3 +- .../utils/user-authorisation-level.test.js | 18 ++++- .../applicationReferenceAndActions.njk | 10 ++- .../application-details/automatic-cover.njk | 2 +- gef-ui/templates/includes/footer.njk | 5 +- .../templates/includes/primary-navigation.njk | 61 +++++++------- .../partials/accessibility-statement.njk | 65 --------------- .../test-helpers/common-deal-status-lists.js | 7 ++ gef-ui/test-helpers/common-role-lists.js | 15 ++++ portal/package.json | 4 +- utils/data-migration/tfm/migrate-tfm-users.js | 4 +- 22 files changed, 425 insertions(+), 179 deletions(-) create mode 100644 gef-ui/component-tests/includes/application-details/applicationReferenceAndActions.component-test.js create mode 100644 gef-ui/component-tests/includes/footer.component-test.js create mode 100644 gef-ui/component-tests/includes/primary-navigation.component-test.js rename gef-ui/{templates => component-tests}/partials/application-activity.component-test.js (83%) create mode 100644 gef-ui/server/controllers/application-details/canUpdateUnissuedFacilitiesCheck.js create mode 100644 gef-ui/server/controllers/application-details/canUpdateUnissuedFacilitiesCheck.test.js delete mode 100644 gef-ui/templates/partials/accessibility-statement.njk create mode 100644 gef-ui/test-helpers/common-deal-status-lists.js create mode 100644 gef-ui/test-helpers/common-role-lists.js diff --git a/gef-ui/component-tests/includes/application-details/applicationReferenceAndActions.component-test.js b/gef-ui/component-tests/includes/application-details/applicationReferenceAndActions.component-test.js new file mode 100644 index 0000000000..a08c4f80d5 --- /dev/null +++ b/gef-ui/component-tests/includes/application-details/applicationReferenceAndActions.component-test.js @@ -0,0 +1,50 @@ +const pageRenderer = require('../../pageRenderer'); +const { NON_MAKER_ROLES } = require('../../../test-helpers/common-role-lists'); +const { MAKER } = require('../../../server/constants/roles'); + +const page = 'includes/application-details/applicationReferenceAndActions.njk'; +const render = pageRenderer(page); + +describe(page, () => { + let wrapper; + const dealId = '61e54dd5b578247e14575882'; + const status = 'Ready for Checker\'s approval'; + + describe('the \'Clone\' button', () => { + const cloneButtonSelector = '[data-cy="clone-gef-deal-link"]'; + + it('should not render when the page is rendered without the userRoles param', () => { + wrapper = render({ + dealId, + status, + }); + wrapper.expectLink(cloneButtonSelector).notToExist(); + }); + + it('should not render when the page is rendered without the status param', () => { + wrapper = render({ + dealId, + userRoles: [MAKER], + }); + wrapper.expectLink(cloneButtonSelector).notToExist(); + }); + + it.each(NON_MAKER_ROLES)('should not render when the page is rendered with the %s role only', (role) => { + wrapper = render({ + dealId, + status, + userRoles: [role], + }); + wrapper.expectLink(cloneButtonSelector).notToExist(); + }); + + it('should render when the page is rendered with the maker role only', () => { + wrapper = render({ + dealId, + status, + userRoles: [MAKER], + }); + wrapper.expectLink(cloneButtonSelector).toLinkTo(`${dealId}/clone`, 'Clone'); + }); + }); +}); diff --git a/gef-ui/component-tests/includes/footer.component-test.js b/gef-ui/component-tests/includes/footer.component-test.js new file mode 100644 index 0000000000..3e6c998535 --- /dev/null +++ b/gef-ui/component-tests/includes/footer.component-test.js @@ -0,0 +1,52 @@ +const pageRenderer = require('../pageRenderer'); +const { NON_MAKER_OR_CHECKER_ROLES } = require('../../test-helpers/common-role-lists'); +const { MAKER, CHECKER } = require('../../server/constants/roles'); + +const page = 'includes/footer.njk'; +const render = pageRenderer(page); + +describe(page, () => { + let wrapper; + + describe(`when viewed with the role '${MAKER}'`, () => { + beforeEach(() => { + wrapper = render({ + user: { + roles: [MAKER], + }, + }); + }); + + it('should render the feedback link', () => { + wrapper.expectElement('[data-cy="feedback-link"]').toExist(); + }); + }); + + describe(`when viewed with the role '${CHECKER}'`, () => { + beforeEach(() => { + wrapper = render({ + user: { + roles: [CHECKER], + }, + }); + }); + + it('should render the feedback link', () => { + wrapper.expectElement('[data-cy="feedback-link"]').toExist(); + }); + }); + + describe.each(NON_MAKER_OR_CHECKER_ROLES)('when viewed with the role \'%s\'', (nonMakerOrCheckerRole) => { + beforeEach(() => { + wrapper = render({ + user: { + roles: [nonMakerOrCheckerRole], + }, + }); + }); + + it('should NOT render the feedback link', () => { + wrapper.expectElement('[data-cy="feedback-link"]').notToExist(); + }); + }); +}); diff --git a/gef-ui/component-tests/includes/primary-navigation.component-test.js b/gef-ui/component-tests/includes/primary-navigation.component-test.js new file mode 100644 index 0000000000..eb5d470cdb --- /dev/null +++ b/gef-ui/component-tests/includes/primary-navigation.component-test.js @@ -0,0 +1,80 @@ +const { ADMIN, MAKER, CHECKER } = require('../../server/constants/roles'); +const { NON_MAKER_OR_CHECKER_OR_ADMIN_ROLES } = require('../../test-helpers/common-role-lists'); +const pageRenderer = require('../pageRenderer'); + +const page = 'includes/primary-navigation.njk'; +const render = pageRenderer(page); + +const rolesToDisplayAllNavigationItems = [ADMIN]; +const rolesToDisplayHomeAndReportsNavigationItems = [MAKER, CHECKER]; +const rolesToDisplayHomeNavigationItem = NON_MAKER_OR_CHECKER_OR_ADMIN_ROLES; + +describe(page, () => { + let wrapper; + + describe.each(rolesToDisplayAllNavigationItems)('viewed by a %s', (role) => { + const user = { roles: [role] }; + + beforeAll(() => { + wrapper = render({ user }); + }); + + itRendersAHomeLink(); + itRendersAReportsLink(); + itRendersAUsersLink(); + }); + + describe.each(rolesToDisplayHomeAndReportsNavigationItems)('viewed by a %s', (role) => { + const user = { roles: [role] }; + + beforeAll(() => { + wrapper = render({ user }); + }); + + itRendersAHomeLink(); + itRendersAReportsLink(); + itDoesNotRenderAUsersLink(); + }); + + describe.each(rolesToDisplayHomeNavigationItem)('viewed by a %s', (role) => { + const user = { roles: [role] }; + + beforeAll(() => { + wrapper = render({ user }); + }); + + itRendersAHomeLink(); + itDoesNotRenderAReportsLink(); + itDoesNotRenderAUsersLink(); + }); + + function itRendersAHomeLink() { + it('renders a home link', () => { + wrapper.expectLink('[data-cy="dashboard"]').toLinkTo('/dashboard', 'Dashboard'); + }); + } + + function itRendersAReportsLink() { + it('renders a reports link', () => { + wrapper.expectLink('[data-cy="reports"]').toLinkTo('/reports', 'Reports'); + }); + } + + function itDoesNotRenderAReportsLink() { + it('does not render a reports link', () => { + wrapper.expectLink('[data-cy="reports"]').notToExist(); + }); + } + + function itRendersAUsersLink() { + it('renders a users link', () => { + wrapper.expectLink('[data-cy="users"]').toLinkTo('/admin/users', 'Users'); + }); + } + + function itDoesNotRenderAUsersLink() { + it('does not render a users link', () => { + wrapper.expectLink('[data-cy="users"]').notToExist(); + }); + } +}); diff --git a/gef-ui/templates/partials/application-activity.component-test.js b/gef-ui/component-tests/partials/application-activity.component-test.js similarity index 83% rename from gef-ui/templates/partials/application-activity.component-test.js rename to gef-ui/component-tests/partials/application-activity.component-test.js index a19732f926..9ca38fc5c6 100644 --- a/gef-ui/templates/partials/application-activity.component-test.js +++ b/gef-ui/component-tests/partials/application-activity.component-test.js @@ -1,12 +1,14 @@ -const pageRenderer = require('../../component-tests/pageRenderer'); +const { READ_ONLY } = require('../../server/constants/roles'); +const pageRenderer = require('../pageRenderer'); -const page = ('../templates/partials/application-activity.njk'); +const page = 'partials/application-activity.njk'; const render = pageRenderer(page); describe(page, () => { let wrapper; const params = { + userRoles: [READ_ONLY], portalActivities: [ { label: 'Automatic inclusion notice submitted to UKEF', diff --git a/gef-ui/package.json b/gef-ui/package.json index 7ec34ec401..41a3387719 100644 --- a/gef-ui/package.json +++ b/gef-ui/package.json @@ -22,8 +22,8 @@ "api-test": "jest --coverage --verbose --forceExit --config=api-test.jest.config.js", "build": "rimraf ./public/js && rimraf ./public/css && webpack --mode production --config webpack.prod.config.js", "dev": "webpack --config webpack.config.dev.js --watch", - "lint": "eslint ./server ./scripts", - "lint:fix": "eslint ./server ./scripts --fix", + "lint": "eslint ./server ./scripts ./component-tests ./test-helpers ./api-tests", + "lint:fix": "eslint ./server ./scripts ./component-tests ./test-helpers ./api-tests --fix", "start": "node server/index.js", "test": "jest --coverage --verbose --config=jest.config.js", "test-dev": "jest --verbose --config=jest.config.js", diff --git a/gef-ui/server/controllers/application-details/canUpdateUnissuedFacilitiesCheck.js b/gef-ui/server/controllers/application-details/canUpdateUnissuedFacilitiesCheck.js new file mode 100644 index 0000000000..af07fd165f --- /dev/null +++ b/gef-ui/server/controllers/application-details/canUpdateUnissuedFacilitiesCheck.js @@ -0,0 +1,18 @@ +const CONSTANTS = require('../../constants/index'); +const { MAKER } = require('../../constants/roles'); + +const canUpdateUnissuedFacilitiesCheck = (application, unissuedFacilities, facilitiesChanged, ukefDecision) => { + if (!application.userRoles.includes(MAKER)) { + return false; + } + + if (!unissuedFacilities || facilitiesChanged.length) { + return false; + } + + return ukefDecision || (application.submissionType === CONSTANTS.DEAL_SUBMISSION_TYPE.AIN); +}; + +module.exports = { + canUpdateUnissuedFacilitiesCheck, +}; diff --git a/gef-ui/server/controllers/application-details/canUpdateUnissuedFacilitiesCheck.test.js b/gef-ui/server/controllers/application-details/canUpdateUnissuedFacilitiesCheck.test.js new file mode 100644 index 0000000000..38fb2c6d15 --- /dev/null +++ b/gef-ui/server/controllers/application-details/canUpdateUnissuedFacilitiesCheck.test.js @@ -0,0 +1,78 @@ +import { MAKER } from '../../constants/roles'; +import { + MOCK_AIN_APPLICATION_UNISSUED_ONLY, + MOCK_MIA_APPLICATION_UNISSUED_ONLY, +} from '../../utils/mocks/mock_applications'; +import { canUpdateUnissuedFacilitiesCheck } from './canUpdateUnissuedFacilitiesCheck'; +import { NON_MAKER_ROLES } from '../../../test-helpers/common-role-lists'; + +describe('canUpdateUnissuedFacilitiesCheck', () => { + describe('for users without the maker role', () => { + it.each(NON_MAKER_ROLES)('returns false for users with the %s role (for AIN with unissuedFacilities and no facilitiesChanged to issued)', (role) => { + const userRoles = [role]; + const application = { ...MOCK_AIN_APPLICATION_UNISSUED_ONLY, userRoles }; + + const result = canUpdateUnissuedFacilitiesCheck(application, true, [], null); + + expect(result).toBe(false); + }); + }); + + describe('for users with the maker role', () => { + const userRoles = [MAKER]; + + describe('for AIN', () => { + const application = { + ...MOCK_AIN_APPLICATION_UNISSUED_ONLY, + userRoles, + }; + + it('returns true if unissuedFacilities and no facilitiesChanged to issued', () => { + const result = canUpdateUnissuedFacilitiesCheck(application, true, [], null); + expect(result).toBe(true); + }); + + it('returns false if unissuedFacilities and facilitiesChanged to issued', () => { + const result = canUpdateUnissuedFacilitiesCheck(application, true, ['mock1'], null); + expect(result).toBe(false); + }); + + it('returns false if no unissuedFacilities and no facilitiesChanged to issued', () => { + const result = canUpdateUnissuedFacilitiesCheck(application, false, [], null); + expect(result).toBe(false); + }); + + it('returns false if no unissuedFacilities and facilitiesChanged to issued', () => { + const result = canUpdateUnissuedFacilitiesCheck(application, false, ['mock1'], null); + expect(result).toBe(false); + }); + }); + + describe('for MIA', () => { + const application = { + ...MOCK_MIA_APPLICATION_UNISSUED_ONLY, + userRoles, + }; + + it('returns true if unissuedFacilities and no facilitiesChanged to issued and ukefDecisionAccepted is true', () => { + const result = canUpdateUnissuedFacilitiesCheck(application, true, [], true); + expect(result).toBe(true); + }); + + it('returns false if no unissuedFacilities and no facilitiesChanged to issued and ukefDecisionAccepted is true', () => { + const result = canUpdateUnissuedFacilitiesCheck(application, false, [], true); + expect(result).toBe(false); + }); + + it('returns false if unissuedFacilities and facilitiesChanged to issued and ukefDecisionAccepted is true', () => { + const result = canUpdateUnissuedFacilitiesCheck(application, true, ['mock1'], true); + expect(result).toBe(false); + }); + + it('returns false if unissuedFacilities and no facilitiesChanged to issued and ukefDecisionAccepted is false', () => { + const result = canUpdateUnissuedFacilitiesCheck(application, true, [], false); + expect(result).toBe(false); + }); + }); + }); +}); diff --git a/gef-ui/server/controllers/application-details/index.js b/gef-ui/server/controllers/application-details/index.js index e6e7220e29..233e90be89 100644 --- a/gef-ui/server/controllers/application-details/index.js +++ b/gef-ui/server/controllers/application-details/index.js @@ -1,11 +1,13 @@ /* eslint-disable no-underscore-dangle */ const _startCase = require('lodash/startCase'); const api = require('../../services/api'); +const { + canUpdateUnissuedFacilitiesCheck, +} = require('./canUpdateUnissuedFacilitiesCheck'); const { mapSummaryList, displayTaskComments, displayChangeSupportingInfo, - canUpdateUnissuedFacilitiesCheck, isMIAWithoutChangedToIssuedFacilities, returnToMakerNoFacilitiesChanged, } = require('../../utils/helpers'); @@ -25,7 +27,7 @@ const { FACILITY_TYPE, AUTHORISATION_LEVEL, DEAL_STATUS, DEAL_SUBMISSION_TYPE, } = require('../../constants'); const Application = require('../../models/application'); -const { ADMIN } = require('../../constants/roles'); +const { MAKER } = require('../../constants/roles'); let userSession; @@ -124,11 +126,10 @@ function buildBody(app, previewMode, user) { isUkefReviewPositive: ukefReviewPositive, ukefDecisionAccepted: hasUkefDecisionAccepted, coverDatesConfirmed: coverDates, - renderReviewDecisionLink: ukefReviewAvailable && ukefReviewPositive && !coverDates && !hasUkefDecisionAccepted && !app.userRoles.includes(ADMIN), + renderReviewDecisionLink: ukefReviewAvailable && ukefReviewPositive && !coverDates && !hasUkefDecisionAccepted && app.userRoles.includes(MAKER), previewMode, hasChangedFacilities, userRoles: app.userRoles, - isAdmin: app.userRoles.includes(ADMIN), displayComments: displayTaskComments(app), displayChangeSupportingInfo: displayChangeSupportingInfo(app, previewMode), canUpdateUnissuedFacilities: @@ -137,7 +138,7 @@ function buildBody(app, previewMode, user) { unissuedFacilitiesPresent, facilitiesChangedToIssued, hasUkefDecisionAccepted, - ) && !app.userRoles.includes(ADMIN), + ), MIAReturnToMaker: isMIAWithoutChangedToIssuedFacilities(app), returnToMakerNoFacilitiesChanged: returnToMakerNoFacilitiesChanged(app, hasChangedFacilities), }; @@ -148,7 +149,7 @@ function buildBody(app, previewMode, user) { function buildActions(app) { return { submit: app.canSubmit, - abandon: [DEAL_STATUS.DRAFT, DEAL_STATUS.CHANGES_REQUIRED].includes(app.status), + abandon: app.userRoles?.includes(MAKER) && [DEAL_STATUS.DRAFT, DEAL_STATUS.CHANGES_REQUIRED].includes(app.status), }; } diff --git a/gef-ui/server/controllers/application-details/index.test.js b/gef-ui/server/controllers/application-details/index.test.js index 390ae6c3e7..008ea88179 100644 --- a/gef-ui/server/controllers/application-details/index.test.js +++ b/gef-ui/server/controllers/application-details/index.test.js @@ -3,9 +3,11 @@ import { postApplicationDetails, } from '.'; import api from '../../services/api'; +import { NON_MAKER_ROLES } from '../../../test-helpers/common-role-lists'; import MOCKS from '../mocks'; import CONSTANTS from '../../constants'; +import { ALL_DEAL_STATUSES } from '../../../test-helpers/common-deal-status-lists'; jest.mock('../../services/api'); @@ -146,7 +148,6 @@ describe('controllers/application-details', () => { // user in session user: mockRequest.session.user, userRoles: mockRequest.session.user.roles, - isAdmin: expect.any(Boolean), }); }); @@ -355,7 +356,7 @@ describe('controllers/application-details', () => { mockApplicationResponse.status = CONSTANTS.DEAL_STATUS.UKEF_APPROVED_WITHOUT_CONDITIONS; api.getApplication.mockResolvedValueOnce(mockApplicationResponse); - await applicationDetails(MOCKS.MockRequestUrl('/gef/appliction/123/review-decision'), mockResponse); + await applicationDetails(MOCKS.MockRequestUrl('/gef/application/123/review-decision'), mockResponse); expect(mockResponse.render) .toHaveBeenCalledWith('partials/review-decision.njk', expect.objectContaining({ @@ -378,6 +379,53 @@ describe('controllers/application-details', () => { }); }); + describe('params', () => { + describe('abandon', () => { + const statusesThatAllowDealToBeAbandoned = [CONSTANTS.DEAL_STATUS.DRAFT, CONSTANTS.DEAL_STATUS.CHANGES_REQUIRED]; + const statusesThatDoNotAllowDealToBeAbandoned = ALL_DEAL_STATUSES.filter((status) => !statusesThatAllowDealToBeAbandoned.includes(status)); + + it.each(NON_MAKER_ROLES)('is false if the user has the %s role (and not the maker role)', async (role) => { + const [aStatusThatAllowsDealToBeAbandoned] = statusesThatAllowDealToBeAbandoned; + mockApplicationResponse.status = aStatusThatAllowsDealToBeAbandoned; + api.getApplication.mockResolvedValueOnce(mockApplicationResponse); + mockRequest.session.user.roles = [role]; + + await applicationDetails(mockRequest, mockResponse); + + expect(mockResponse.render) + .toHaveBeenCalledWith(expect.any(String), expect.objectContaining({ + abandon: false, + })); + }); + + it.each(statusesThatAllowDealToBeAbandoned)('is true if the user has the maker role and the deal is in %s status', async (status) => { + mockApplicationResponse.status = status; + api.getApplication.mockResolvedValueOnce(mockApplicationResponse); + mockRequest.session.user.roles = [CONSTANTS.ROLES.MAKER]; + + await applicationDetails(mockRequest, mockResponse); + + expect(mockResponse.render) + .toHaveBeenCalledWith(expect.any(String), expect.objectContaining({ + abandon: true, + })); + }); + + it.each(statusesThatDoNotAllowDealToBeAbandoned)('is false if the user has the maker role and the deal is in %s status', async (status) => { + mockApplicationResponse.status = status; + api.getApplication.mockResolvedValueOnce(mockApplicationResponse); + mockRequest.session.user.roles = [CONSTANTS.ROLES.MAKER]; + + await applicationDetails(mockRequest, mockResponse); + + expect(mockResponse.render) + .toHaveBeenCalledWith(expect.any(String), expect.objectContaining({ + abandon: false, + })); + }); + }); + }); + it('redirects user to `problem with service` page if there is an issue with the API', async () => { const mockNext = jest.fn(); api.getApplication.mockRejectedValue(); diff --git a/gef-ui/server/utils/helpers.js b/gef-ui/server/utils/helpers.js index 033d7fc020..04a177de3a 100644 --- a/gef-ui/server/utils/helpers.js +++ b/gef-ui/server/utils/helpers.js @@ -535,18 +535,6 @@ const displayChangeSupportingInfo = (application, preview) => { return true; }; -const canUpdateUnissuedFacilitiesCheck = (application, unissuedFacilities, facilitiesChanged, UkefDecision) => { - if (application.submissionType === CONSTANTS.DEAL_SUBMISSION_TYPE.AIN) { - if (unissuedFacilities && !facilitiesChanged.length) { - return true; - } - } else if (unissuedFacilities && !facilitiesChanged.length && UkefDecision) { - return true; - } - - return false; -}; - module.exports = { apiErrorHandler, isEmpty, @@ -566,7 +554,6 @@ module.exports = { futureDateInRange, getCurrentTimePlusMinutes, displayChangeSupportingInfo, - canUpdateUnissuedFacilitiesCheck, isMIAWithoutChangedToIssuedFacilities, returnToMakerNoFacilitiesChanged, }; diff --git a/gef-ui/server/utils/helpers.test.js b/gef-ui/server/utils/helpers.test.js index fd42eda26b..eb3f2e54ea 100644 --- a/gef-ui/server/utils/helpers.test.js +++ b/gef-ui/server/utils/helpers.test.js @@ -17,7 +17,6 @@ import { sameDate, futureDateInRange, displayChangeSupportingInfo, - canUpdateUnissuedFacilitiesCheck, returnToMakerNoFacilitiesChanged, getCurrentTimePlusMinutes, } from './helpers'; @@ -44,7 +43,6 @@ import { MOCK_AIN_APPLICATION_FALSE_COMMENTS, MOCK_AIN_APPLICATION_SUPPORTING_INFO, MOCK_AIN_APPLICATION_UNISSUED_ONLY, - MOCK_MIA_APPLICATION_UNISSUED_ONLY, } from './mocks/mock_applications'; import { MOCK_REQUEST } from './mocks/mock_requests'; @@ -1522,48 +1520,6 @@ describe('displayChangeSupportingInfo()', () => { }); }); -describe('canUpdateUnissuedFacilitiesCheck()', () => { - it('if AIN, returns true if unissuedFacilities and no facilitiesChanged to issued', () => { - const result = canUpdateUnissuedFacilitiesCheck(MOCK_AIN_APPLICATION_UNISSUED_ONLY, true, [], null); - expect(result).toEqual(true); - }); - - it('if AIN, returns false if unissuedFacilities and facilitiesChanged to issued', () => { - const result = canUpdateUnissuedFacilitiesCheck(MOCK_AIN_APPLICATION_UNISSUED_ONLY, true, ['mock1'], null); - expect(result).toEqual(false); - }); - - it('if AIN, returns false if no unissuedFacilities and no facilitiesChanged to issued', () => { - const result = canUpdateUnissuedFacilitiesCheck(MOCK_AIN_APPLICATION_UNISSUED_ONLY, false, [], null); - expect(result).toEqual(false); - }); - - it('if AIN, returns false if no unissuedFacilities and facilitiesChanged to issued', () => { - const result = canUpdateUnissuedFacilitiesCheck(MOCK_AIN_APPLICATION_UNISSUED_ONLY, false, ['mock1'], null); - expect(result).toEqual(false); - }); - - it('if MIA, returns true if unissuedFacilities and no facilitiesChanged to issued and ukefDecisionAccepted is true', () => { - const result = canUpdateUnissuedFacilitiesCheck(MOCK_MIA_APPLICATION_UNISSUED_ONLY, true, [], true); - expect(result).toEqual(true); - }); - - it('if MIA, returns false if no unissuedFacilities and no facilitiesChanged to issued and ukefDecisionAccepted is true', () => { - const result = canUpdateUnissuedFacilitiesCheck(MOCK_MIA_APPLICATION_UNISSUED_ONLY, false, [], true); - expect(result).toEqual(false); - }); - - it('if MIA, returns false if unissuedFacilities and facilitiesChanged to issued and ukefDecisionAccepted is true', () => { - const result = canUpdateUnissuedFacilitiesCheck(MOCK_MIA_APPLICATION_UNISSUED_ONLY, true, ['mock1'], true); - expect(result).toEqual(false); - }); - - it('if MIA, returns false if unissuedFacilities and no facilitiesChanged to issued and ukefDecisionAccepted is false', () => { - const result = canUpdateUnissuedFacilitiesCheck(MOCK_MIA_APPLICATION_UNISSUED_ONLY, true, [], false); - expect(result).toEqual(false); - }); -}); - describe('displayChangeSupportingInfo()', () => { it('Should return false if preview mode', () => { const result = displayChangeSupportingInfo(MOCK_AIN_APPLICATION_SUPPORTING_INFO(CONSTANTS.DEAL_STATUS.READY_FOR_APPROVAL, 0), true); diff --git a/gef-ui/server/utils/user-authorisation-level.js b/gef-ui/server/utils/user-authorisation-level.js index cf2800142f..f055dada21 100644 --- a/gef-ui/server/utils/user-authorisation-level.js +++ b/gef-ui/server/utils/user-authorisation-level.js @@ -50,7 +50,8 @@ const getUserAuthorisationLevelsToApplication = (user, application) => { try { let levels = []; roles.forEach((role) => { - levels = levels.concat(authorisationMap[role.toUpperCase()][application?.status]); + const levelsByStatus = authorisationMap[role.toUpperCase()] ?? []; + levels = levels.concat(levelsByStatus[application?.status]); }); const unique = new Set(levels); return [...unique]; diff --git a/gef-ui/server/utils/user-authorisation-level.test.js b/gef-ui/server/utils/user-authorisation-level.test.js index 8d8a8a69d2..32f09f6a41 100644 --- a/gef-ui/server/utils/user-authorisation-level.test.js +++ b/gef-ui/server/utils/user-authorisation-level.test.js @@ -1,6 +1,6 @@ import getUserAuthorisationLevelsToApplication from './user-authorisation-level'; import CONSTANTS from '../constants'; -import { CHECKER, MAKER } from '../constants/roles'; +import { CHECKER, MAKER, READ_ONLY } from '../constants/roles'; const makerUser = { username: 'MAKER', @@ -11,6 +11,7 @@ const makerUser = { 'user-status': 'active', _id: '11111', }; + const checkerUser = { username: 'CHECKER', firstname: 'Chec', // cspell:disable-line @@ -20,6 +21,7 @@ const checkerUser = { 'user-status': 'active', _id: '11112', }; + const combinedUser = { username: 'COMBINED', firstname: 'Com', // cspell:disable-line @@ -30,6 +32,16 @@ const combinedUser = { _id: '11113', }; +const userWithoutMakerOrCheckerRole = { + username: 'USER_WITHOUT_MAKER_OR_CHECKER', + firstname: 'user without', + surname: 'maker or checker', + email: 'user-without-maker-or-checker@ukexportfinance.gov.uk', + roles: [READ_ONLY], + 'user-status': 'active', + _id: '11114', +}; + const draftApplication = { _id: '123456789', maker: { name: 'mock-user' }, @@ -54,6 +66,10 @@ const bankCheckApplication = { }; describe('user-authorisation-levels', () => { + it('returns an empty array if the user does not have the maker or checker role', () => { + expect(getUserAuthorisationLevelsToApplication(userWithoutMakerOrCheckerRole, draftApplication)).toEqual([]); + }); + it('returns the expected authorisation levels for DRAFT', () => { expect(getUserAuthorisationLevelsToApplication(makerUser, draftApplication)).toEqual(['EDIT']); expect(getUserAuthorisationLevelsToApplication(checkerUser, draftApplication)).toEqual([]); diff --git a/gef-ui/templates/includes/application-details/applicationReferenceAndActions.njk b/gef-ui/templates/includes/application-details/applicationReferenceAndActions.njk index 22766f5e3b..ac78f388e0 100644 --- a/gef-ui/templates/includes/application-details/applicationReferenceAndActions.njk +++ b/gef-ui/templates/includes/application-details/applicationReferenceAndActions.njk @@ -1,9 +1,11 @@ {% from "govuk/components/button/macro.njk" import govukButton %} +{% set isMaker = userRoles and userRoles.includes('maker') %} +
    - {% if status and userRoles.includes('maker') %} + {% if status and isMaker %} {{ govukButton({ text: "Clone", attributes: { @@ -14,7 +16,7 @@ href: dealId + "/clone" }) }} {% endif %} - {%if abandon and not hasChangedFacilities and not MIAReturnToMaker and not returnToMakerNoFacilitiesChanged and not isAdmin %} + {% if abandon and not hasChangedFacilities and not MIAReturnToMaker and not returnToMakerNoFacilitiesChanged %} {{ govukButton({ text: "Abandon", attributes: { @@ -31,7 +33,7 @@

    Bank's reference

    - {%if abandon and not hasChangedFacilities and not MIAReturnToMaker and not returnToMakerNoFacilitiesChanged and not isAdmin %} + {% if abandon and not hasChangedFacilities and not MIAReturnToMaker and not returnToMakerNoFacilitiesChanged %}

    {{ bankInternalRefName }}

    @@ -43,7 +45,7 @@
    - {%if abandon and not hasChangedFacilities and not MIAReturnToMaker and not returnToMakerNoFacilitiesChanged and not isAdmin %} + {% if abandon and not hasChangedFacilities and not MIAReturnToMaker and not returnToMakerNoFacilitiesChanged %}

    Additional reference

    diff --git a/gef-ui/templates/includes/application-details/automatic-cover.njk b/gef-ui/templates/includes/application-details/automatic-cover.njk index cdce2f07c7..f7c62b2f2c 100644 --- a/gef-ui/templates/includes/application-details/automatic-cover.njk +++ b/gef-ui/templates/includes/application-details/automatic-cover.njk @@ -21,7 +21,7 @@

    -{% if not isAdmin and eligibility.status.code === 'Not started' or eligibility.status.code === 'In progress' %} +{% if not previewMode and (eligibility.status.code === 'Not started' or eligibility.status.code === 'In progress') %} Check if you're eligible for automatic cover diff --git a/gef-ui/templates/includes/footer.njk b/gef-ui/templates/includes/footer.njk index 6236efa428..99b1eb1509 100644 --- a/gef-ui/templates/includes/footer.njk +++ b/gef-ui/templates/includes/footer.njk @@ -1,3 +1,6 @@ +{% set isChecker = user and user.roles and user.roles.includes("checker") %} +{% set isMaker = user and user.roles and user.roles.includes("maker") %} +