diff --git a/.env b/.env index 0bdfbe73..b86458d7 100644 --- a/.env +++ b/.env @@ -20,6 +20,9 @@ JWT_SECRET=Lendas contam que o Rui foi membro do IEEE. # Frontend Password Recovery Base Route PASSWORD_RECOVERY_LINK=https://localhost:3000/recover +# Frontend Application Confirmation Base Route +APPLICATION_CONFIRMATION_LINK=https://localhost:3000/apply/ + # Specifies the port in which the app will be exposed PORT=8087 @@ -45,12 +48,12 @@ ACCESS_CONTROL_ALLOW_ORIGINS= MAIL_FROM= # Password for email above -MAIL_FROM_PASSWORD= +MAIL_FROM_PASSWORD= # Cloudinary API URL to save images CLOUDINARY_URL= -# Hostname of the application (where the webserver will be served) - without the trailing '/' +# Hostname of the application (where the webserver will be served) - without the trailing '/' WEBSERVER_HOST=https://localhost:8087 # Path to save file uploads, the path must be relative to the root of the project - Defaults to static diff --git a/.eslintrc b/.eslintrc index 8ff0b7eb..5aa42c22 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,4 +1,4 @@ -{ +{ "extends": [ "eslint:recommended" ], @@ -99,6 +99,6 @@ "no-var": "error", "prefer-const": ["error", { "destructuring": "all" }], "prefer-template": "error", - "template-curly-spacing": "error", + "template-curly-spacing": "error" } } diff --git a/documentation/docs-index.js b/documentation/docs-index.js index cce0cb47..1134eed7 100644 --- a/documentation/docs-index.js +++ b/documentation/docs-index.js @@ -28,13 +28,15 @@ module.exports = { "companies/disable", "companies/enable", "companies/delete", - "companies/concurrent-offers" + "companies/concurrent-offers", + "companies/get-application" ], Applications: [ "applications/create", "applications/search", "applications/approve", - "applications/reject" + "applications/reject", + "applications/validate" ], Auth: [ "auth/login", diff --git a/documentation/docs/applications/approve.md b/documentation/docs/applications/approve.md index f771615d..160f2510 100644 --- a/documentation/docs/applications/approve.md +++ b/documentation/docs/applications/approve.md @@ -13,6 +13,7 @@ import Highlight from "../../src/highlight.js" ## Details This endpoint is used to approve a company Application, specified by applicationId. +It changes all the companies offers to not pending. **URL** : `/applications/company/:applicationId/approve` @@ -169,3 +170,39 @@ values={[ + +### Example 5 - Application is not verified + +**Code** : 409 CONFLICT + + + + + +```bash +/applications/company/631a18cf8e61e0acea76e5e1/approve +``` + + + + + +```json +{ + "error_code": 1, + "errors": [ + { + "msg": "application-must-be-verified" + } + ] +} +``` + + + diff --git a/documentation/docs/applications/create.md b/documentation/docs/applications/create.md index 3524f1ae..953d12d8 100644 --- a/documentation/docs/applications/create.md +++ b/documentation/docs/applications/create.md @@ -13,8 +13,8 @@ import Highlight from "../../src/highlight.js" ## Details This endpoint is used to create company applications. -In order of a Company to use its account, the application must be accepted by an Admin and then the Company should -finish its registration. +In order for a Company to use its account, the company must verify its application by clicking in a link sent +by email after its creation. After that the Company should finish its registration. **URL** : `/apply/company` @@ -36,7 +36,11 @@ see [register](../auth/register). Email used for the company application and subsequent account. Must be in a valid email format. -Can't already be in use for accounts or other applications. +Can't already be in use on any account. + +:::info +After creating an application, if another application is created with the same email after 10 minutes, the existing one will be replaced. Creating the new application before the 10 minute mark will result in an error. +::: ### password @@ -181,7 +185,7 @@ values={[ "password": "password123", "companyName": "Company", "motivation": "We wish to revolutionize the industry with young engineers." -} +}ara quem usa o timetable-bruteforcer ``` @@ -249,7 +253,48 @@ values={[ -### Example 5 - Invalid Password +### Example 5 - Application with the same email created recently + +**Code** : 403 FORBIDDEN + + + + + +```json +{ + "email": "company@company.com", + "password": "password123", + "companyName": "Company", + "motivation": "We wish to revolutionize the industry with young engineers." +} +``` + + + + + +```json +{ + "error_code": 1, + "errors": [ + { + "msg": "company-application-recently-created", + } + ] +} +``` + + + + +### Example 6 - Invalid Password **Code** : 422 UNPROCESSABLE ENTITY diff --git a/documentation/docs/applications/reject.md b/documentation/docs/applications/reject.md index c9e3b9a7..1ef7a3a9 100644 --- a/documentation/docs/applications/reject.md +++ b/documentation/docs/applications/reject.md @@ -197,3 +197,42 @@ values={[ + +### Example 5 - Application is not verified + +**Code** : 409 CONFLICT + + + + + +```json +{ + "rejectReason": "The motivation of the company is not convincing" +} +``` + + + + + +```json +{ + "error_code": 1, + "errors": [ + { + "msg": "application-must-be-verified" + } + ] +} +``` + + + + diff --git a/documentation/docs/applications/search.md b/documentation/docs/applications/search.md index dc8227d4..574f52f2 100644 --- a/documentation/docs/applications/search.md +++ b/documentation/docs/applications/search.md @@ -66,7 +66,7 @@ Filters the applications by the name of the respective companies. Array of strings which filters the application by their state. :::caution -Must be a valid state (currently `["PENDING", "APPROVED", "REJECTED"]`). +Must be a valid state (currently `["UNVERIFIED", "PENDING", "APPROVED", "REJECTED"]`). ::: ### submissionDateFrom @@ -153,6 +153,7 @@ values={[ "companyName": "Company name", "motivation": "We wish to revolutionize the industry with young engineers.", "submittedAt": "2022-09-08T16:31:11.784Z", + "isVerified": true, "__v": 0, "state": "PENDING" }, @@ -162,6 +163,7 @@ values={[ "companyName": "Example Company", "motivation": "We are a brand new tech company in Porto, Portugal", "submittedAt": "2022-09-07T13:15:15.971Z", + "isVerified": true, "__v": 0, "approvedAt": "2022-09-07T13:17:30.908Z", "state": "APPROVED" @@ -172,13 +174,24 @@ values={[ "companyName": "Bad Company", "motivation": "We want to exploit workers.", "submittedAt": "2022-09-07T13:15:15.971Z", + "isVerified": true, "__v": 0, "rejectedAt": "2022-09-07T13:17:30.908Z", "rejectReason": "Motivation doesn't seem right", "state": "REJECTED" + }, + { + "_id": "63189963541e53a45a423dce", + "email": "notVerified@company.com", + "companyName": "Unverified", + "motivation": "We are a new company in Lisbon", + "submittedAt": "2022-09-07T13:15:15.971Z", + "isVerified": false, + "__v": 0, + "state": "UNVERIFIED" } ], - "docCount": 3 + "docCount": 4 } ``` diff --git a/documentation/docs/applications/validate.md b/documentation/docs/applications/validate.md new file mode 100644 index 00000000..526798a2 --- /dev/null +++ b/documentation/docs/applications/validate.md @@ -0,0 +1,161 @@ +--- +id: validate +title: Validate Application +sidebar_label: Validate Application +slug: /applications/validate +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +import Highlight from "../../src/highlight.js" + +## Details + +This endpoint is used to validate an application using a previous created token. +The token is generated with the [ create ](./create) endpoint and is sent to the user by email. + + +**URL** : `/apply/company/:token/validate` + +**Method** : POST + +## Request examples + +### Example 1 - Valid Request + +**Code** : 200 OK + + + + + +```bash +/apply/company/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6Im5pQGFlZmV1cC5wdCIsImlhdCI6MTY2MzAxMzg0OSwiZXhwIjoxNjYzMDE0NDQ5fQ.k5Z_nBpqt_Hs8JBhLH0ZXTl2-BG-utdIAUdhKXEFuFc/validate +``` + + + + + +```json +{} +``` + + + + +### Example 2 - Invalid Token + +**Code** : 404 NOT_FOUND + + + + + +```bash +/apply/company/invalid/validate + +``` + + + + + +```json +{ + "error_code": 3, + "errors": [ + { + "msg": "invalid-token" + } + ] +} +``` + + + + +### Example 3 - Expired Token + +**Code** : 410 GONE + + + + + +```bash +/apply/company/expired/validate +``` + + + + + +```json +{ + "error_code": 3, + "errors": [ + { + "msg": "expired-token" + } + ] +} +``` + + + + +### Example 4 - Application Already Validated + +**Code** : 409 CONFLICT + + + + + +```bash +/apply/company/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6Im5pQGFlZmV1cC5wdCIsImlhdCI6MTY2MzAxMzg0OSwiZXhwIjoxNjYzMDE0NDQ5fQ.k5Z_nBpqt_Hs8JBhLH0ZXTl2-BG-utdIAUdhKXEFuFc/validate +``` + + + + + +```json +{ + "error_code": 3, + "errors": [ + { + "msg": "application-already-validated" + } + ] +} +``` + + + diff --git a/documentation/docs/auth/confirm.md b/documentation/docs/auth/confirm.md index b758f236..254c32a5 100644 --- a/documentation/docs/auth/confirm.md +++ b/documentation/docs/auth/confirm.md @@ -52,7 +52,7 @@ values={[ ### Example 2 - Invalid Token -**Code** : 403 FORBIDDEN +**Code** : 404 NOT_FOUND + +### Example 3 - Expired Token + +**Code** : 410 GONE + + + + + +```bash +/auth/recover/expired/confirm +``` + + + + + +```json +{ + "error_code": 3, + "errors": [ + { + "msg": "expired-token" + } + ] +} +``` + + + + diff --git a/documentation/docs/auth/finish-recovery.md b/documentation/docs/auth/finish-recovery.md index bf876184..f3286f39 100644 --- a/documentation/docs/auth/finish-recovery.md +++ b/documentation/docs/auth/finish-recovery.md @@ -66,7 +66,7 @@ values={[ ### Example 2 - Invalid Token -**Code** : 403 FORBIDDEN +**Code** : 404 NOT_FOUND -### Example 3 - Password Without Numbers + +**Code** : 410 GONE + + + + + +```bash +/auth/recover/expired/confirm +``` + + + + + +```json +{ + "error_code": 3, + "errors": [ + { + "msg": "expired-token" + } + ] +} +``` + + + + +### Example 4 - Password Without Numbers **Code** : 422 UNPROCESSABLE ENTITY diff --git a/documentation/docs/companies/get-application.md b/documentation/docs/companies/get-application.md new file mode 100644 index 00000000..165c4082 --- /dev/null +++ b/documentation/docs/companies/get-application.md @@ -0,0 +1,190 @@ +--- +id: get-application +title: Get Company Application by Company Id +sidebar_label: Get Application by Company Id +slug: /companies/get-application +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +import Highlight from "../../src/highlight.js" + +## Details + +This endpoint returns an application of a Company based on the Company ID provided. + +**URL** : `/company/:companyId/application` + +**Method** : GET + +:::caution Authentication +Auth is required to get the application. Only Admins or owners of the company will have permission. Otherwise, if in god mode, [god_token](#god_token) must be provided. +::: + +## Parameters + +### god_token + +Body Parameter + +Optional +String + +If set, will use this for validating the usage of god mode (in case no session details are available, i.e., no logged-in +user). + +## Request examples + +### Example 1 - Valid Request + +**Code** : 200 OK + + + + + +```bash +/company/649a1ac0282d8ea3c574e25f/application +``` + + + + + +```json +{ + "_id": "649a1ab4282d8ea3c574e259", + "email": "company@example.com", + "companyName": "Company", + "motivation": "We wish to revolutionize the industry with young engineers.", + "submittedAt": "2023-06-26T23:09:40.450Z", + "isVerified": true, + "__v": 0, + "approvedAt": "2023-06-26T23:11:37.488Z", + "state": "APPROVED" +} +``` + + + + +### Example 2 - Insufficient permission + +**Code** : 401 UNAUTHORIZED + + + + + +```bash +/company/649a1ac0282d8ea3c574e25f/application +``` + + + + + +```json +{ + "error_code": 3, + "errors": [ + { + "msg": "insufficient-permissions" + } + ] +} +``` + + + + +### Example 3 - Invalid ID + +**Code** : 422 UNPROCESSABLE ENTITY + + + + + +```bash +/company/invalid/application +``` + + + + + +```json +{ + "error_code": 1, + "errors": [ + { + "value": "invalid", + "msg": "must-be-a-valid-id", + "param": "companyId", + "location": "params" + } + ] +} +``` + + + + +### Example 4 - Non-Existing Company + +**Code** : 422 UNPROCESSABLE ENTITY + + + + + +```bash +/company/649a1ac0282d8ea3c574e26f/application +``` + + + + + +```json +{ + "error_code": 1, + "errors": [ + { + "value": "649a1ac0282d8ea3c574e26f", + "msg": "no-company-found-with-id:649a1ac0282d8ea3c574e26f", + "param": "companyId", + "location": "params" + } + ] +} +``` + + + diff --git a/documentation/docs/offers/create.md b/documentation/docs/offers/create.md index a5c6bb25..231daa04 100644 --- a/documentation/docs/offers/create.md +++ b/documentation/docs/offers/create.md @@ -13,6 +13,7 @@ import Highlight from "../../src/highlight.js" ## Details This endpoint is used to create offers. Both Admins and Companies can use it. +Companies which are yet to be approved will have its offer pending. :::info If the logged-in user is a Company, that account will be the Offer owner. Otherwise, the creation will be done in diff --git a/documentation/docs/offers/search.md b/documentation/docs/offers/search.md index f9e67689..aeb078b7 100644 --- a/documentation/docs/offers/search.md +++ b/documentation/docs/offers/search.md @@ -14,6 +14,7 @@ import Highlight from "../../src/highlight.js" This endpoint returns offers based on search criteria. It allows for _Full-Text Search_ as well as results filtering. Perfect for a search component! +Only returns offers that are not pending. **URL** : `/offers` @@ -271,6 +272,7 @@ values={[ "React Native" ], "isHidden": false, + "isPending": false, "isArchived": false, "requirements": [ "Recent graduate/master's degree in Computer Science, Engineering or similar areas" diff --git a/package-lock.json b/package-lock.json index 5d461e75..c5e6d437 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,7 +1,7 @@ { "name": "nijobs-be", "version": "1.0.0", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -15,6 +15,7 @@ "bcrypt": "^5.1.0", "cloudinary": "^1.32.0", "dotenv-flow": "^3.2.0", + "expect": "^29.5.0", "express": "^4.18.2", "express-rate-limit": "^6.7.0", "express-session": "^1.17.3", @@ -161,49 +162,49 @@ "optional": true }, "node_modules/@aws-sdk/client-cognito-identity": { - "version": "3.461.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.461.0.tgz", - "integrity": "sha512-rttO5tsvNqZghQwUgPk67LSo+0Yy4ItmsI3sgl81WDUP2A9Q4rwB8L99gLWroUz1uJtBujQ/HoYu6GN4kRa3MQ==", + "version": "3.438.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.438.0.tgz", + "integrity": "sha512-ZaMx8S2Uex5UXk1R5Qje2aE8lhXz1bw5Pk0Kjjz/8mo+CBiQDgtHu5SrS9ccLfBrFIcz6HtDWsJazEQaBaLplQ==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.461.0", - "@aws-sdk/core": "3.451.0", - "@aws-sdk/credential-provider-node": "3.460.0", - "@aws-sdk/middleware-host-header": "3.460.0", - "@aws-sdk/middleware-logger": "3.460.0", - "@aws-sdk/middleware-recursion-detection": "3.460.0", - "@aws-sdk/middleware-signing": "3.461.0", - "@aws-sdk/middleware-user-agent": "3.460.0", - "@aws-sdk/region-config-resolver": "3.451.0", - "@aws-sdk/types": "3.460.0", - "@aws-sdk/util-endpoints": "3.460.0", - "@aws-sdk/util-user-agent-browser": "3.460.0", - "@aws-sdk/util-user-agent-node": "3.460.0", - "@smithy/config-resolver": "^2.0.18", - "@smithy/fetch-http-handler": "^2.2.6", - "@smithy/hash-node": "^2.0.15", - "@smithy/invalid-dependency": "^2.0.13", - "@smithy/middleware-content-length": "^2.0.15", - "@smithy/middleware-endpoint": "^2.2.0", - "@smithy/middleware-retry": "^2.0.20", - "@smithy/middleware-serde": "^2.0.13", - "@smithy/middleware-stack": "^2.0.7", - "@smithy/node-config-provider": "^2.1.5", - "@smithy/node-http-handler": "^2.1.9", - "@smithy/protocol-http": "^3.0.9", - "@smithy/smithy-client": "^2.1.15", - "@smithy/types": "^2.5.0", - "@smithy/url-parser": "^2.0.13", - "@smithy/util-base64": "^2.0.1", + "@aws-sdk/client-sts": "3.438.0", + "@aws-sdk/core": "3.436.0", + "@aws-sdk/credential-provider-node": "3.438.0", + "@aws-sdk/middleware-host-header": "3.433.0", + "@aws-sdk/middleware-logger": "3.433.0", + "@aws-sdk/middleware-recursion-detection": "3.433.0", + "@aws-sdk/middleware-signing": "3.433.0", + "@aws-sdk/middleware-user-agent": "3.438.0", + "@aws-sdk/region-config-resolver": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@aws-sdk/util-endpoints": "3.438.0", + "@aws-sdk/util-user-agent-browser": "3.433.0", + "@aws-sdk/util-user-agent-node": "3.437.0", + "@smithy/config-resolver": "^2.0.16", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/hash-node": "^2.0.12", + "@smithy/invalid-dependency": "^2.0.12", + "@smithy/middleware-content-length": "^2.0.14", + "@smithy/middleware-endpoint": "^2.1.3", + "@smithy/middleware-retry": "^2.0.18", + "@smithy/middleware-serde": "^2.0.12", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/protocol-http": "^3.0.8", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", + "@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.19", - "@smithy/util-defaults-mode-node": "^2.0.25", - "@smithy/util-endpoints": "^1.0.4", - "@smithy/util-retry": "^2.0.6", - "@smithy/util-utf8": "^2.0.2", + "@smithy/util-defaults-mode-browser": "^2.0.16", + "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-endpoints": "^1.0.2", + "@smithy/util-retry": "^2.0.5", + "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" }, "engines": { @@ -211,46 +212,46 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.460.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.460.0.tgz", - "integrity": "sha512-p5D9C8LKJs5yoBn5cCs2Wqzrp5YP5BYcP774bhGMFEu/LCIUyWzudwN3+/AObSiq8R8SSvBY2zQD4h+k3NjgTQ==", + "version": "3.438.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.438.0.tgz", + "integrity": "sha512-L/xKq+K78PShLku8x5gM6lZDUp7LhFJ2ksKH7Vll+exSZq+QUaxuzjp4gqdzh6B0oIshv2jssQlUa0ScOmVRMg==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/core": "3.451.0", - "@aws-sdk/middleware-host-header": "3.460.0", - "@aws-sdk/middleware-logger": "3.460.0", - "@aws-sdk/middleware-recursion-detection": "3.460.0", - "@aws-sdk/middleware-user-agent": "3.460.0", - "@aws-sdk/region-config-resolver": "3.451.0", - "@aws-sdk/types": "3.460.0", - "@aws-sdk/util-endpoints": "3.460.0", - "@aws-sdk/util-user-agent-browser": "3.460.0", - "@aws-sdk/util-user-agent-node": "3.460.0", - "@smithy/config-resolver": "^2.0.18", - "@smithy/fetch-http-handler": "^2.2.6", - "@smithy/hash-node": "^2.0.15", - "@smithy/invalid-dependency": "^2.0.13", - "@smithy/middleware-content-length": "^2.0.15", - "@smithy/middleware-endpoint": "^2.2.0", - "@smithy/middleware-retry": "^2.0.20", - "@smithy/middleware-serde": "^2.0.13", - "@smithy/middleware-stack": "^2.0.7", - "@smithy/node-config-provider": "^2.1.5", - "@smithy/node-http-handler": "^2.1.9", - "@smithy/protocol-http": "^3.0.9", - "@smithy/smithy-client": "^2.1.15", - "@smithy/types": "^2.5.0", - "@smithy/url-parser": "^2.0.13", - "@smithy/util-base64": "^2.0.1", + "@aws-sdk/core": "3.436.0", + "@aws-sdk/middleware-host-header": "3.433.0", + "@aws-sdk/middleware-logger": "3.433.0", + "@aws-sdk/middleware-recursion-detection": "3.433.0", + "@aws-sdk/middleware-user-agent": "3.438.0", + "@aws-sdk/region-config-resolver": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@aws-sdk/util-endpoints": "3.438.0", + "@aws-sdk/util-user-agent-browser": "3.433.0", + "@aws-sdk/util-user-agent-node": "3.437.0", + "@smithy/config-resolver": "^2.0.16", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/hash-node": "^2.0.12", + "@smithy/invalid-dependency": "^2.0.12", + "@smithy/middleware-content-length": "^2.0.14", + "@smithy/middleware-endpoint": "^2.1.3", + "@smithy/middleware-retry": "^2.0.18", + "@smithy/middleware-serde": "^2.0.12", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/protocol-http": "^3.0.8", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", + "@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.19", - "@smithy/util-defaults-mode-node": "^2.0.25", - "@smithy/util-endpoints": "^1.0.4", - "@smithy/util-retry": "^2.0.6", - "@smithy/util-utf8": "^2.0.2", + "@smithy/util-defaults-mode-browser": "^2.0.16", + "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-endpoints": "^1.0.2", + "@smithy/util-retry": "^2.0.5", + "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" }, "engines": { @@ -258,49 +259,49 @@ } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.461.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.461.0.tgz", - "integrity": "sha512-1u+t31m23vuc9zkiUk51L4QbwuRQEuBeMArHK/thmq4V+A0VmjoAr/x2D0eQ0deOuBqG5YC62oaqUfIhj03SIw==", + "version": "3.438.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.438.0.tgz", + "integrity": "sha512-UBxLZKVVvbR4LHwSNSqaKx22YBSOGkavrh4SyDP8o8XOlXeRxTCllfSfjL9K5Mktp+ZwQ2NiubNcwmvUcGKbbg==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/core": "3.451.0", - "@aws-sdk/credential-provider-node": "3.460.0", - "@aws-sdk/middleware-host-header": "3.460.0", - "@aws-sdk/middleware-logger": "3.460.0", - "@aws-sdk/middleware-recursion-detection": "3.460.0", - "@aws-sdk/middleware-sdk-sts": "3.461.0", - "@aws-sdk/middleware-signing": "3.461.0", - "@aws-sdk/middleware-user-agent": "3.460.0", - "@aws-sdk/region-config-resolver": "3.451.0", - "@aws-sdk/types": "3.460.0", - "@aws-sdk/util-endpoints": "3.460.0", - "@aws-sdk/util-user-agent-browser": "3.460.0", - "@aws-sdk/util-user-agent-node": "3.460.0", - "@smithy/config-resolver": "^2.0.18", - "@smithy/fetch-http-handler": "^2.2.6", - "@smithy/hash-node": "^2.0.15", - "@smithy/invalid-dependency": "^2.0.13", - "@smithy/middleware-content-length": "^2.0.15", - "@smithy/middleware-endpoint": "^2.2.0", - "@smithy/middleware-retry": "^2.0.20", - "@smithy/middleware-serde": "^2.0.13", - "@smithy/middleware-stack": "^2.0.7", - "@smithy/node-config-provider": "^2.1.5", - "@smithy/node-http-handler": "^2.1.9", - "@smithy/protocol-http": "^3.0.9", - "@smithy/smithy-client": "^2.1.15", - "@smithy/types": "^2.5.0", - "@smithy/url-parser": "^2.0.13", - "@smithy/util-base64": "^2.0.1", + "@aws-sdk/core": "3.436.0", + "@aws-sdk/credential-provider-node": "3.438.0", + "@aws-sdk/middleware-host-header": "3.433.0", + "@aws-sdk/middleware-logger": "3.433.0", + "@aws-sdk/middleware-recursion-detection": "3.433.0", + "@aws-sdk/middleware-sdk-sts": "3.433.0", + "@aws-sdk/middleware-signing": "3.433.0", + "@aws-sdk/middleware-user-agent": "3.438.0", + "@aws-sdk/region-config-resolver": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@aws-sdk/util-endpoints": "3.438.0", + "@aws-sdk/util-user-agent-browser": "3.433.0", + "@aws-sdk/util-user-agent-node": "3.437.0", + "@smithy/config-resolver": "^2.0.16", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/hash-node": "^2.0.12", + "@smithy/invalid-dependency": "^2.0.12", + "@smithy/middleware-content-length": "^2.0.14", + "@smithy/middleware-endpoint": "^2.1.3", + "@smithy/middleware-retry": "^2.0.18", + "@smithy/middleware-serde": "^2.0.12", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/protocol-http": "^3.0.8", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", + "@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.19", - "@smithy/util-defaults-mode-node": "^2.0.25", - "@smithy/util-endpoints": "^1.0.4", - "@smithy/util-retry": "^2.0.6", - "@smithy/util-utf8": "^2.0.2", + "@smithy/util-defaults-mode-browser": "^2.0.16", + "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-endpoints": "^1.0.2", + "@smithy/util-retry": "^2.0.5", + "@smithy/util-utf8": "^2.0.0", "fast-xml-parser": "4.2.5", "tslib": "^2.5.0" }, @@ -309,28 +310,27 @@ } }, "node_modules/@aws-sdk/core": { - "version": "3.451.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.451.0.tgz", - "integrity": "sha512-SamWW2zHEf1ZKe3j1w0Piauryl8BQIlej0TBS18A4ACzhjhWXhCs13bO1S88LvPR5mBFXok3XOT6zPOnKDFktw==", + "version": "3.436.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.436.0.tgz", + "integrity": "sha512-vX5/LjXvCejC2XUY6TSg1oozjqK6BvkE75t0ys9dgqyr5PlZyZksMoeAFHUlj0sCjhT3ziWCujP1oiSpPWY9hg==", "optional": true, "dependencies": { - "@smithy/smithy-client": "^2.1.15", - "tslib": "^2.5.0" + "@smithy/smithy-client": "^2.1.12" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/credential-provider-cognito-identity": { - "version": "3.461.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.461.0.tgz", - "integrity": "sha512-D3bayvoEMxxheSpLug0VpAmGiVsDdYU4GsT8ls6389NjgQsAhPrmHd5wAxf1AtZYxghO9cT2rsZK60u0VQ1Q1w==", + "version": "3.438.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.438.0.tgz", + "integrity": "sha512-/HgSPPvzIQ25SMII0vYlarJbijOAsXZCjayKWZ7+hilzju22hMB0ZTPM1E3QopWoZ6os76K59aAACfjhVAfIUg==", "optional": true, "dependencies": { - "@aws-sdk/client-cognito-identity": "3.461.0", - "@aws-sdk/types": "3.460.0", + "@aws-sdk/client-cognito-identity": "3.438.0", + "@aws-sdk/types": "3.433.0", "@smithy/property-provider": "^2.0.0", - "@smithy/types": "^2.5.0", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -338,14 +338,14 @@ } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.460.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.460.0.tgz", - "integrity": "sha512-WWdaRJFuYRc2Ue9NKDy2NIf8pQRNx/QRVmrsk6EkIID8uWlQIOePk3SWTVV0TZIyPrbfSEaSnJRZoShphJ6PAg==", + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.433.0.tgz", + "integrity": "sha512-Vl7Qz5qYyxBurMn6hfSiNJeUHSqfVUlMt0C1Bds3tCkl3IzecRWwyBOlxtxO3VCrgVeW3HqswLzCvhAFzPH6nQ==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.460.0", + "@aws-sdk/types": "3.433.0", "@smithy/property-provider": "^2.0.0", - "@smithy/types": "^2.5.0", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -353,19 +353,19 @@ } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.460.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.460.0.tgz", - "integrity": "sha512-tLnuLDsGcBRemj8jxt1MkerjwsQlYdwnlfQXvrYOO8qMrbFP2sEjAx165GeCbsjmY/y0w1UFQEV+xRpFg5dxUw==", + "version": "3.435.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.435.0.tgz", + "integrity": "sha512-i07YSy3+IrXwAzp3goCMo2OYzAwqRGIWPNMUX5ziFgA1eMlRWNC2slnbqJzax6xHrU8HdpNESAfflnQvUVBqYQ==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.460.0", - "@smithy/fetch-http-handler": "^2.2.6", - "@smithy/node-http-handler": "^2.1.9", + "@aws-sdk/types": "3.433.0", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/node-http-handler": "^2.1.8", "@smithy/property-provider": "^2.0.0", - "@smithy/protocol-http": "^3.0.9", - "@smithy/smithy-client": "^2.1.15", - "@smithy/types": "^2.5.0", - "@smithy/util-stream": "^2.0.20", + "@smithy/protocol-http": "^3.0.8", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "@smithy/util-stream": "^2.0.17", "tslib": "^2.5.0" }, "engines": { @@ -373,20 +373,20 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.460.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.460.0.tgz", - "integrity": "sha512-1IEUmyaWzt2M3mONO8QyZtPy0f9ccaEjCo48ZQLgptWxUI+Ohga9gPK0mqu1kTJOjv4JJGACYHzLwEnnpltGlA==", + "version": "3.438.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.438.0.tgz", + "integrity": "sha512-WYPQR3pXoHJjn9/RMWipUhsUNFy6zhOiII6u8LJ5w84aNqIjV4+BdRYztRNGJD98jdtekhbkX0YKoSuZqP+unQ==", "optional": true, "dependencies": { - "@aws-sdk/credential-provider-env": "3.460.0", - "@aws-sdk/credential-provider-process": "3.460.0", - "@aws-sdk/credential-provider-sso": "3.460.0", - "@aws-sdk/credential-provider-web-identity": "3.460.0", - "@aws-sdk/types": "3.460.0", + "@aws-sdk/credential-provider-env": "3.433.0", + "@aws-sdk/credential-provider-process": "3.433.0", + "@aws-sdk/credential-provider-sso": "3.438.0", + "@aws-sdk/credential-provider-web-identity": "3.433.0", + "@aws-sdk/types": "3.433.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.5.0", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -394,21 +394,21 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.460.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.460.0.tgz", - "integrity": "sha512-PbPo92WIgNlF6V4eWKehYGYjTqf0gU9vr09LeQUc3bTm1DJhJw1j+HU/3PfQ8LwTkBQePO7MbJ5A2n6ckMwfMg==", + "version": "3.438.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.438.0.tgz", + "integrity": "sha512-uaw3D2R0svyrC32qyZ2aOv/l0AT9eClh+eQsZJTQD3Kz9q+2VdeOBThQ8fsMfRtm26nUbZo6A/CRwxkm6okI+w==", "optional": true, "dependencies": { - "@aws-sdk/credential-provider-env": "3.460.0", - "@aws-sdk/credential-provider-ini": "3.460.0", - "@aws-sdk/credential-provider-process": "3.460.0", - "@aws-sdk/credential-provider-sso": "3.460.0", - "@aws-sdk/credential-provider-web-identity": "3.460.0", - "@aws-sdk/types": "3.460.0", + "@aws-sdk/credential-provider-env": "3.433.0", + "@aws-sdk/credential-provider-ini": "3.438.0", + "@aws-sdk/credential-provider-process": "3.433.0", + "@aws-sdk/credential-provider-sso": "3.438.0", + "@aws-sdk/credential-provider-web-identity": "3.433.0", + "@aws-sdk/types": "3.433.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.5.0", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -416,15 +416,15 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.460.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.460.0.tgz", - "integrity": "sha512-ng+0FMc4EaxLAwdttCwf2nzNf4AgcqAHZ8pKXUf8qF/KVkoyTt3UZKW7P2FJI01zxwP+V4yAwVt95PBUKGn4YQ==", + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.433.0.tgz", + "integrity": "sha512-W7FcGlQjio9Y/PepcZGRyl5Bpwb0uWU7qIUCh+u4+q2mW4D5ZngXg8V/opL9/I/p4tUH9VXZLyLGwyBSkdhL+A==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.460.0", + "@aws-sdk/types": "3.433.0", "@smithy/property-provider": "^2.0.0", "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/types": "^2.5.0", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -432,17 +432,17 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.460.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.460.0.tgz", - "integrity": "sha512-KnrQieOw17+aHEzE3SwfxjeSQ5ZTe2HeAzxkaZF++GxhNul/PkVnLzjGpIuB9bn71T9a2oNfG3peDUA+m2l2kw==", + "version": "3.438.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.438.0.tgz", + "integrity": "sha512-Xykli/64xR18cBV5P0XFxcH120omtfAjC/cFy/9nFU/+dPvbk0uu1yEOZYteWHyGGkPN4PkHmbh60GiUCLQkWQ==", "optional": true, "dependencies": { - "@aws-sdk/client-sso": "3.460.0", - "@aws-sdk/token-providers": "3.460.0", - "@aws-sdk/types": "3.460.0", + "@aws-sdk/client-sso": "3.438.0", + "@aws-sdk/token-providers": "3.438.0", + "@aws-sdk/types": "3.433.0", "@smithy/property-provider": "^2.0.0", "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/types": "^2.5.0", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -450,14 +450,14 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.460.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.460.0.tgz", - "integrity": "sha512-7OeaZgC3HmJZGE0I0ZiKInUMF2LyA0IZiW85AYFnAZzAIfv1cXk/1UnDAoFIQhOZfnUBXivStagz892s480ryw==", + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.433.0.tgz", + "integrity": "sha512-RlwjP1I5wO+aPpwyCp23Mk8nmRbRL33hqRASy73c4JA2z2YiRua+ryt6MalIxehhwQU6xvXUKulJnPG9VaMFZg==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.460.0", + "@aws-sdk/types": "3.433.0", "@smithy/property-provider": "^2.0.0", - "@smithy/types": "^2.5.0", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -465,26 +465,26 @@ } }, "node_modules/@aws-sdk/credential-providers": { - "version": "3.461.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.461.0.tgz", - "integrity": "sha512-sJjGjJxs0KajPK+WbdIRSuidWqm1xobX/Uv0x7TTQCCj1Fsuyq03pNP1aLRbJnLazKx+qyJef7rEFwQeFEAiNA==", - "optional": true, - "dependencies": { - "@aws-sdk/client-cognito-identity": "3.461.0", - "@aws-sdk/client-sso": "3.460.0", - "@aws-sdk/client-sts": "3.461.0", - "@aws-sdk/credential-provider-cognito-identity": "3.461.0", - "@aws-sdk/credential-provider-env": "3.460.0", - "@aws-sdk/credential-provider-http": "3.460.0", - "@aws-sdk/credential-provider-ini": "3.460.0", - "@aws-sdk/credential-provider-node": "3.460.0", - "@aws-sdk/credential-provider-process": "3.460.0", - "@aws-sdk/credential-provider-sso": "3.460.0", - "@aws-sdk/credential-provider-web-identity": "3.460.0", - "@aws-sdk/types": "3.460.0", + "version": "3.438.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.438.0.tgz", + "integrity": "sha512-EBtcczPtUyXsN/yNGvZxGU/Ildl8kJeq7Vt7MsFLtOmYXDWoMsSIEVuSYbBdzBal1z03fmd/Mmjr0DhYiSAqMg==", + "optional": true, + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.438.0", + "@aws-sdk/client-sso": "3.438.0", + "@aws-sdk/client-sts": "3.438.0", + "@aws-sdk/credential-provider-cognito-identity": "3.438.0", + "@aws-sdk/credential-provider-env": "3.433.0", + "@aws-sdk/credential-provider-http": "3.435.0", + "@aws-sdk/credential-provider-ini": "3.438.0", + "@aws-sdk/credential-provider-node": "3.438.0", + "@aws-sdk/credential-provider-process": "3.433.0", + "@aws-sdk/credential-provider-sso": "3.438.0", + "@aws-sdk/credential-provider-web-identity": "3.433.0", + "@aws-sdk/types": "3.433.0", "@smithy/credential-provider-imds": "^2.0.0", "@smithy/property-provider": "^2.0.0", - "@smithy/types": "^2.5.0", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -492,14 +492,14 @@ } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.460.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.460.0.tgz", - "integrity": "sha512-qBeDyuJkEuHe87Xk6unvFO9Zg5j6zM8bQOOZITocTLfu9JN0u5V4GQ/yopvpv+nQHmC/MGr0G7p+kIXMrg/Q2A==", + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.433.0.tgz", + "integrity": "sha512-mBTq3UWv1UzeHG+OfUQ2MB/5GEkt5LTKFaUqzL7ESwzW8XtpBgXnjZvIwu3Vcd3sEetMwijwaGiJhY0ae/YyaA==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.460.0", - "@smithy/protocol-http": "^3.0.9", - "@smithy/types": "^2.5.0", + "@aws-sdk/types": "3.433.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -507,13 +507,13 @@ } }, "node_modules/@aws-sdk/middleware-logger": { - "version": "3.460.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.460.0.tgz", - "integrity": "sha512-w2AJ6HOJ+Ggx9+VDKuWBHk5S0ZxYEo2EY2IFh0qtCQ1RDix/ur1QEzOOL5vNjHlZKPv/dseIwhgsTCac8UHXbQ==", + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.433.0.tgz", + "integrity": "sha512-We346Fb5xGonTGVZC9Nvqtnqy74VJzYuTLLiuuftA5sbNzftBDy/22QCfvYSTOAl3bvif+dkDUzQY2ihc5PwOQ==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.460.0", - "@smithy/types": "^2.5.0", + "@aws-sdk/types": "3.433.0", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -521,14 +521,14 @@ } }, "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.460.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.460.0.tgz", - "integrity": "sha512-wmzm1/2NzpcCVCAsGqqiTBK+xNyLmQwTOq63rcW6eeq6gYOO0cyTZROOkVRrrsKWPBigrSFFHvDrEvonOMtKAg==", + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.433.0.tgz", + "integrity": "sha512-HEvYC9PQlWY/ccUYtLvAlwwf1iCif2TSAmLNr3YTBRVa98x6jKL0hlCrHWYklFeqOGSKy6XhE+NGJMUII0/HaQ==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.460.0", - "@smithy/protocol-http": "^3.0.9", - "@smithy/types": "^2.5.0", + "@aws-sdk/types": "3.433.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -536,14 +536,14 @@ } }, "node_modules/@aws-sdk/middleware-sdk-sts": { - "version": "3.461.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.461.0.tgz", - "integrity": "sha512-sgNxkwKdJ/NZm7SJZBnbYPkbspmzn3lDyRSJH7PTCvyzDBzY2PB6yS/dfnGkitR+PYwromuOYMha37W4su2SOw==", + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.433.0.tgz", + "integrity": "sha512-ORYbJnBejUyonFl5FwIqhvI3Cq6sAp9j+JpkKZtFNma9tFPdrhmYgfCeNH32H/wGTQV/tUoQ3luh0gA4cuk6DA==", "optional": true, "dependencies": { - "@aws-sdk/middleware-signing": "3.461.0", - "@aws-sdk/types": "3.460.0", - "@smithy/types": "^2.5.0", + "@aws-sdk/middleware-signing": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -551,17 +551,17 @@ } }, "node_modules/@aws-sdk/middleware-signing": { - "version": "3.461.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.461.0.tgz", - "integrity": "sha512-aM/7VupHlsgeRG1UZSAQMWJX+2Jam4GG8ZGVAbLfBr9yh9cBwnUUndpUpYI9rU7atA8n+vISr162EbR7WTiFhQ==", + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.433.0.tgz", + "integrity": "sha512-jxPvt59NZo/epMNLNTu47ikmP8v0q217I6bQFGJG7JVFnfl36zDktMwGw+0xZR80qiK47/2BWrNpta61Zd2FxQ==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.460.0", + "@aws-sdk/types": "3.433.0", "@smithy/property-provider": "^2.0.0", - "@smithy/protocol-http": "^3.0.9", + "@smithy/protocol-http": "^3.0.8", "@smithy/signature-v4": "^2.0.0", - "@smithy/types": "^2.5.0", - "@smithy/util-middleware": "^2.0.6", + "@smithy/types": "^2.4.0", + "@smithy/util-middleware": "^2.0.5", "tslib": "^2.5.0" }, "engines": { @@ -569,15 +569,15 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.460.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.460.0.tgz", - "integrity": "sha512-0gBSOCr+RtwRUCSRLn9H3RVnj9ercvk/QKTHIr33CgfEdyZtIGpHWUSs6uqiQydPTRzjCm5SfUa6ESGhRVMM6A==", + "version": "3.438.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.438.0.tgz", + "integrity": "sha512-a+xHT1wOxT6EA6YyLmrfaroKWOkwwyiktUfXKM0FsUutGzNi4fKhb5NZ2al58NsXzHgHFrasSDp+Lqbd/X2cEw==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.460.0", - "@aws-sdk/util-endpoints": "3.460.0", - "@smithy/protocol-http": "^3.0.9", - "@smithy/types": "^2.5.0", + "@aws-sdk/types": "3.433.0", + "@aws-sdk/util-endpoints": "3.438.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -585,15 +585,15 @@ } }, "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.451.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.451.0.tgz", - "integrity": "sha512-3iMf4OwzrFb4tAAmoROXaiORUk2FvSejnHIw/XHvf/jjR4EqGGF95NZP/n/MeFZMizJWVssrwS412GmoEyoqhg==", + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.433.0.tgz", + "integrity": "sha512-xpjRjCZW+CDFdcMmmhIYg81ST5UAnJh61IHziQEk0FXONrg4kjyYPZAOjEdzXQ+HxJQuGQLKPhRdzxmQnbX7pg==", "optional": true, "dependencies": { - "@smithy/node-config-provider": "^2.1.5", - "@smithy/types": "^2.5.0", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/types": "^2.4.0", "@smithy/util-config-provider": "^2.0.0", - "@smithy/util-middleware": "^2.0.6", + "@smithy/util-middleware": "^2.0.5", "tslib": "^2.5.0" }, "engines": { @@ -601,47 +601,47 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.460.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.460.0.tgz", - "integrity": "sha512-EvSIPMI1gXk3gEkdtbZCW+p3Bjmt2gOR1m7ibQD7qLj4l0dKXhp4URgTqB1ExH3S4qUq0M/XSGKbGLZpvunHNg==", + "version": "3.438.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.438.0.tgz", + "integrity": "sha512-G2fUfTtU6/1ayYRMu0Pd9Ln4qYSvwJOWCqJMdkDgvXSwdgcOSOLsnAIk1AHGJDAvgLikdCzuyOsdJiexr9Vnww==", "optional": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/middleware-host-header": "3.460.0", - "@aws-sdk/middleware-logger": "3.460.0", - "@aws-sdk/middleware-recursion-detection": "3.460.0", - "@aws-sdk/middleware-user-agent": "3.460.0", - "@aws-sdk/region-config-resolver": "3.451.0", - "@aws-sdk/types": "3.460.0", - "@aws-sdk/util-endpoints": "3.460.0", - "@aws-sdk/util-user-agent-browser": "3.460.0", - "@aws-sdk/util-user-agent-node": "3.460.0", - "@smithy/config-resolver": "^2.0.18", - "@smithy/fetch-http-handler": "^2.2.6", - "@smithy/hash-node": "^2.0.15", - "@smithy/invalid-dependency": "^2.0.13", - "@smithy/middleware-content-length": "^2.0.15", - "@smithy/middleware-endpoint": "^2.2.0", - "@smithy/middleware-retry": "^2.0.20", - "@smithy/middleware-serde": "^2.0.13", - "@smithy/middleware-stack": "^2.0.7", - "@smithy/node-config-provider": "^2.1.5", - "@smithy/node-http-handler": "^2.1.9", + "@aws-sdk/middleware-host-header": "3.433.0", + "@aws-sdk/middleware-logger": "3.433.0", + "@aws-sdk/middleware-recursion-detection": "3.433.0", + "@aws-sdk/middleware-user-agent": "3.438.0", + "@aws-sdk/region-config-resolver": "3.433.0", + "@aws-sdk/types": "3.433.0", + "@aws-sdk/util-endpoints": "3.438.0", + "@aws-sdk/util-user-agent-browser": "3.433.0", + "@aws-sdk/util-user-agent-node": "3.437.0", + "@smithy/config-resolver": "^2.0.16", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/hash-node": "^2.0.12", + "@smithy/invalid-dependency": "^2.0.12", + "@smithy/middleware-content-length": "^2.0.14", + "@smithy/middleware-endpoint": "^2.1.3", + "@smithy/middleware-retry": "^2.0.18", + "@smithy/middleware-serde": "^2.0.12", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/node-http-handler": "^2.1.8", "@smithy/property-provider": "^2.0.0", - "@smithy/protocol-http": "^3.0.9", + "@smithy/protocol-http": "^3.0.8", "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/smithy-client": "^2.1.15", - "@smithy/types": "^2.5.0", - "@smithy/url-parser": "^2.0.13", - "@smithy/util-base64": "^2.0.1", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", + "@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.19", - "@smithy/util-defaults-mode-node": "^2.0.25", - "@smithy/util-endpoints": "^1.0.4", - "@smithy/util-retry": "^2.0.6", - "@smithy/util-utf8": "^2.0.2", + "@smithy/util-defaults-mode-browser": "^2.0.16", + "@smithy/util-defaults-mode-node": "^2.0.21", + "@smithy/util-endpoints": "^1.0.2", + "@smithy/util-retry": "^2.0.5", + "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" }, "engines": { @@ -649,12 +649,12 @@ } }, "node_modules/@aws-sdk/types": { - "version": "3.460.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.460.0.tgz", - "integrity": "sha512-MyZSWS/FV8Bnux5eD9en7KLgVxevlVrGNEP3X2D7fpnUlLhl0a7k8+OpSI2ozEQB8hIU2DLc/XXTKRerHSefxQ==", + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.433.0.tgz", + "integrity": "sha512-0jEE2mSrNDd8VGFjTc1otYrwYPIkzZJEIK90ZxisKvQ/EURGBhNzWn7ejWB9XCMFT6XumYLBR0V9qq5UPisWtA==", "optional": true, "dependencies": { - "@smithy/types": "^2.5.0", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -662,13 +662,13 @@ } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.460.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.460.0.tgz", - "integrity": "sha512-myH6kM5WP4IWULHDHMYf2Q+BCYVGlzqJgiBmO10kQEtJSeAGZZ49eoFFYgKW8ZAYB5VnJ+XhXVB1TRA+vR4l5A==", + "version": "3.438.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.438.0.tgz", + "integrity": "sha512-6VyPTq1kN3GWxwFt5DdZfOsr6cJZPLjWh0troY/0uUv3hK74C9o3Y0Xf/z8UAUvQFkVqZse12O0/BgPVMImvfA==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.460.0", - "@smithy/util-endpoints": "^1.0.4", + "@aws-sdk/types": "3.433.0", + "@smithy/util-endpoints": "^1.0.2", "tslib": "^2.5.0" }, "engines": { @@ -688,26 +688,26 @@ } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.460.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.460.0.tgz", - "integrity": "sha512-FRCzW+TyjKnvxsargPVrjayBfp/rvObYHZyZ2OSqrVw8lkkPCb4e/WZOeIiXZuhdhhoah7wMuo6zGwtFF3bYKg==", + "version": "3.433.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.433.0.tgz", + "integrity": "sha512-2Cf/Lwvxbt5RXvWFXrFr49vXv0IddiUwrZoAiwhDYxvsh+BMnh+NUFot+ZQaTrk/8IPZVDeLPWZRdVy00iaVXQ==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.460.0", - "@smithy/types": "^2.5.0", + "@aws-sdk/types": "3.433.0", + "@smithy/types": "^2.4.0", "bowser": "^2.11.0", "tslib": "^2.5.0" } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.460.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.460.0.tgz", - "integrity": "sha512-+kSoR9ABGpJ5Xc7v0VwpgTQbgyI4zuezC8K4pmKAGZsSsVWg4yxptoy2bDqoFL7qfRlWviMVTkQRMvR4D44WxA==", + "version": "3.437.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.437.0.tgz", + "integrity": "sha512-JVEcvWaniamtYVPem4UthtCNoTBCfFTwYj7Y3CrWZ2Qic4TqrwLkAfaBGtI2TGrhIClVr77uzLI6exqMTN7orA==", "optional": true, "dependencies": { - "@aws-sdk/types": "3.460.0", - "@smithy/node-config-provider": "^2.1.5", - "@smithy/types": "^2.5.0", + "@aws-sdk/types": "3.433.0", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -732,11 +732,11 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dependencies": { - "@babel/highlight": "^7.23.4", + "@babel/highlight": "^7.22.13", "chalk": "^2.4.2" }, "engines": { @@ -791,27 +791,20 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/debug": { - "version": "4.3.1", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.5.tgz", - "integrity": "sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dependencies": { - "@babel/types": "^7.23.5", + "@babel/types": "^7.23.0", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -871,6 +864,14 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/helper-create-class-features-plugin": { "version": "7.20.5", "dev": true, @@ -922,20 +923,13 @@ "@babel/core": "^7.4.0-0" } }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/debug": { - "version": "4.3.4", + "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "bin": { + "semver": "bin/semver.js" } }, "node_modules/@babel/helper-environment-visitor": { @@ -1100,9 +1094,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "engines": { "node": ">=6.9.0" } @@ -1149,9 +1143,9 @@ } }, "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", @@ -1175,9 +1169,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.5.tgz", - "integrity": "sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "bin": { "parser": "bin/babel-parser.js" }, @@ -2236,6 +2230,15 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/preset-modules": { "version": "0.1.5", "dev": true, @@ -2276,18 +2279,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.5.tgz", - "integrity": "sha512-czx7Xy5a6sapWWRx61m1Ke1Ra4vczu1mCTtJam5zRTBOonfdJ+S/B6HYmGYu3fJtr8GGET3si6IhgWVBhJ/m8w==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.5", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.5", - "@babel/types": "^7.23.5", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -2295,27 +2298,12 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/node_modules/debug": { - "version": "4.3.1", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/@babel/types": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.5.tgz", - "integrity": "sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dependencies": { - "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-string-parser": "^7.22.5", "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, @@ -2355,22 +2343,6 @@ "dev": true, "license": "Python-2.0" }, - "node_modules/@eslint/eslintrc/node_modules/debug": { - "version": "4.3.4", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/@eslint/eslintrc/node_modules/globals": { "version": "13.19.0", "dev": true, @@ -2409,22 +2381,6 @@ "node": ">=10.10.0" } }, - "node_modules/@humanwhocodes/config-array/node_modules/debug": { - "version": "4.3.4", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "dev": true, @@ -2554,11 +2510,11 @@ } }, "node_modules/@jest/expect-utils": { - "version": "29.3.1", - "dev": true, - "license": "MIT", + "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.2.0" + "jest-get-type": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -2637,11 +2593,11 @@ } }, "node_modules/@jest/schemas": { - "version": "29.0.0", - "dev": true, - "license": "MIT", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dependencies": { - "@sinclair/typebox": "^0.24.1" + "@sinclair/typebox": "^0.27.8" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -2719,11 +2675,11 @@ "license": "MIT" }, "node_modules/@jest/types": { - "version": "29.3.1", - "dev": true, - "license": "MIT", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dependencies": { - "@jest/schemas": "^29.0.0", + "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", @@ -2789,20 +2745,6 @@ "node-pre-gyp": "bin/node-pre-gyp" } }, - "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@mongodb-js/saslprep": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.1.tgz", @@ -2845,9 +2787,9 @@ } }, "node_modules/@sinclair/typebox": { - "version": "0.24.51", - "dev": true, - "license": "MIT" + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" }, "node_modules/@sinonjs/commons": { "version": "1.8.6", @@ -2866,12 +2808,12 @@ } }, "node_modules/@smithy/abort-controller": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.14.tgz", - "integrity": "sha512-zXtteuYLWbSXnzI3O6xq3FYvigYZFW8mdytGibfarLL2lxHto9L3ILtGVnVGmFZa7SDh62l39EnU5hesLN87Fw==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.12.tgz", + "integrity": "sha512-YIJyefe1mi3GxKdZxEBEuzYOeQ9xpYfqnFmWzojCssRAuR7ycxwpoRQgp965vuW426xUAQhCV5rCaWElQ7XsaA==", "optional": true, "dependencies": { - "@smithy/types": "^2.6.0", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -2879,15 +2821,15 @@ } }, "node_modules/@smithy/config-resolver": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.19.tgz", - "integrity": "sha512-JsghnQ5zjWmjEVY8TFOulLdEOCj09SjRLugrHlkPZTIBBm7PQitCFVLThbsKPZQOP7N3ME1DU1nKUc1UaVnBog==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.16.tgz", + "integrity": "sha512-1k+FWHQDt2pfpXhJsOmNMmlAZ3NUQ98X5tYsjQhVGq+0X6cOBMhfh6Igd0IX3Ut6lEO6DQAdPMI/blNr3JZfMQ==", "optional": true, "dependencies": { - "@smithy/node-config-provider": "^2.1.6", - "@smithy/types": "^2.6.0", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/types": "^2.4.0", "@smithy/util-config-provider": "^2.0.0", - "@smithy/util-middleware": "^2.0.7", + "@smithy/util-middleware": "^2.0.5", "tslib": "^2.5.0" }, "engines": { @@ -2895,15 +2837,15 @@ } }, "node_modules/@smithy/credential-provider-imds": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.1.2.tgz", - "integrity": "sha512-Y62jBWdoLPSYjr9fFvJf+KwTa1EunjVr6NryTEWCnwIY93OJxwV4t0qxjwdPl/XMsUkq79ppNJSEQN6Ohnhxjw==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.0.18.tgz", + "integrity": "sha512-QnPBi6D2zj6AHJdUTo5zXmk8vwHJ2bNevhcVned1y+TZz/OI5cizz5DsYNkqFUIDn8tBuEyKNgbmKVNhBbuY3g==", "optional": true, "dependencies": { - "@smithy/node-config-provider": "^2.1.6", - "@smithy/property-provider": "^2.0.15", - "@smithy/types": "^2.6.0", - "@smithy/url-parser": "^2.0.14", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/property-provider": "^2.0.13", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", "tslib": "^2.5.0" }, "engines": { @@ -2911,39 +2853,39 @@ } }, "node_modules/@smithy/eventstream-codec": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.14.tgz", - "integrity": "sha512-g/OU/MeWGfHDygoXgMWfG/Xb0QqDnAGcM9t2FRrVAhleXYRddGOEnfanR5cmHgB9ue52MJsyorqFjckzXsylaA==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.12.tgz", + "integrity": "sha512-ZZQLzHBJkbiAAdj2C5K+lBlYp/XJ+eH2uy+jgJgYIFW/o5AM59Hlj7zyI44/ZTDIQWmBxb3EFv/c5t44V8/g8A==", "optional": true, "dependencies": { "@aws-crypto/crc32": "3.0.0", - "@smithy/types": "^2.6.0", + "@smithy/types": "^2.4.0", "@smithy/util-hex-encoding": "^2.0.0", "tslib": "^2.5.0" } }, "node_modules/@smithy/fetch-http-handler": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.2.7.tgz", - "integrity": "sha512-iSDBjxuH9TgrtMYAr7j5evjvkvgwLY3y+9D547uep+JNkZ1ZT+BaeU20j6I/bO/i26ilCWFImrlXTPsfQtZdIQ==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.2.4.tgz", + "integrity": "sha512-gIPRFEGi+c6V52eauGKrjDzPWF2Cu7Z1r5F8A3j2wcwz25sPG/t8kjsbEhli/tS/2zJp/ybCZXe4j4ro3yv/HA==", "optional": true, "dependencies": { - "@smithy/protocol-http": "^3.0.10", - "@smithy/querystring-builder": "^2.0.14", - "@smithy/types": "^2.6.0", - "@smithy/util-base64": "^2.0.1", + "@smithy/protocol-http": "^3.0.8", + "@smithy/querystring-builder": "^2.0.12", + "@smithy/types": "^2.4.0", + "@smithy/util-base64": "^2.0.0", "tslib": "^2.5.0" } }, "node_modules/@smithy/hash-node": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.16.tgz", - "integrity": "sha512-Wbi9A0PacMYUOwjAulQP90Wl3mQ6NDwnyrZQzFjDz+UzjXOSyQMgBrTkUBz+pVoYVlX3DUu24gWMZBcit+wOGg==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.12.tgz", + "integrity": "sha512-fDZnTr5j9t5qcbeJ037aMZXxMka13Znqwrgy3PAqYj6Dm3XHXHftTH3q+NWgayUxl1992GFtQt1RuEzRMy3NnQ==", "optional": true, "dependencies": { - "@smithy/types": "^2.6.0", + "@smithy/types": "^2.4.0", "@smithy/util-buffer-from": "^2.0.0", - "@smithy/util-utf8": "^2.0.2", + "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" }, "engines": { @@ -2951,12 +2893,12 @@ } }, "node_modules/@smithy/invalid-dependency": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.14.tgz", - "integrity": "sha512-d8ohpwZo9RzTpGlAfsWtfm1SHBSU7+N4iuZ6MzR10xDTujJJWtmXYHK1uzcr7rggbpUTaWyHpPFgnf91q0EFqQ==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.12.tgz", + "integrity": "sha512-p5Y+iMHV3SoEpy3VSR7mifbreHQwVSvHSAz/m4GdoXfOzKzaYC8hYv10Ks7Deblkf7lhas8U+lAp9ThbBM+ZXA==", "optional": true, "dependencies": { - "@smithy/types": "^2.6.0", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" } }, @@ -2973,13 +2915,13 @@ } }, "node_modules/@smithy/middleware-content-length": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.16.tgz", - "integrity": "sha512-9ddDia3pp1d3XzLXKcm7QebGxLq9iwKf+J1LapvlSOhpF8EM9SjMeSrMOOFgG+2TfW5K3+qz4IAJYYm7INYCng==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.14.tgz", + "integrity": "sha512-poUNgKTw9XwPXfX9nEHpVgrMNVpaSMZbshqvPxFVoalF4wp6kRzYKOfdesSVectlQ51VtigoLfbXcdyPwvxgTg==", "optional": true, "dependencies": { - "@smithy/protocol-http": "^3.0.10", - "@smithy/types": "^2.6.0", + "@smithy/protocol-http": "^3.0.8", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -2987,17 +2929,17 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.2.1.tgz", - "integrity": "sha512-dVDS7HNJl/wb0lpByXor6whqDbb1YlLoaoWYoelyYzLHioXOE7y/0iDwJWtDcN36/tVCw9EPBFZ3aans84jLpg==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.1.3.tgz", + "integrity": "sha512-ZrQ0/YX6hNVTxqMEHtEaDbDv6pNeEji/a5Vk3HuFC5R3ZY8lfoATyxmOGxBVYnF3NUvZLNC7umEv1WzWGWvCGQ==", "optional": true, "dependencies": { - "@smithy/middleware-serde": "^2.0.14", - "@smithy/node-config-provider": "^2.1.6", - "@smithy/shared-ini-file-loader": "^2.2.5", - "@smithy/types": "^2.6.0", - "@smithy/url-parser": "^2.0.14", - "@smithy/util-middleware": "^2.0.7", + "@smithy/middleware-serde": "^2.0.12", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/shared-ini-file-loader": "^2.2.2", + "@smithy/types": "^2.4.0", + "@smithy/url-parser": "^2.0.12", + "@smithy/util-middleware": "^2.0.5", "tslib": "^2.5.0" }, "engines": { @@ -3005,17 +2947,17 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "2.0.21", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.21.tgz", - "integrity": "sha512-EZS1EXv1k6IJX6hyu/0yNQuPcPaXwG8SWljQHYueyRbOxmqYgoWMWPtfZj0xRRQ4YtLawQSpBgAeiJltq8/MPw==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.18.tgz", + "integrity": "sha512-VyrHQRldGSb3v9oFOB5yPxmLT7U2sQic2ytylOnYlnsmVOLlFIaI6sW22c+w2675yq+XZ6HOuzV7x2OBYCWRNA==", "optional": true, "dependencies": { - "@smithy/node-config-provider": "^2.1.6", - "@smithy/protocol-http": "^3.0.10", - "@smithy/service-error-classification": "^2.0.7", - "@smithy/types": "^2.6.0", - "@smithy/util-middleware": "^2.0.7", - "@smithy/util-retry": "^2.0.7", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/protocol-http": "^3.0.8", + "@smithy/service-error-classification": "^2.0.5", + "@smithy/types": "^2.4.0", + "@smithy/util-middleware": "^2.0.5", + "@smithy/util-retry": "^2.0.5", "tslib": "^2.5.0", "uuid": "^8.3.2" }, @@ -3024,12 +2966,12 @@ } }, "node_modules/@smithy/middleware-serde": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.14.tgz", - "integrity": "sha512-hFi3FqoYWDntCYA2IGY6gJ6FKjq2gye+1tfxF2HnIJB5uW8y2DhpRNBSUMoqP+qvYzRqZ6ntv4kgbG+o3pX57g==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.12.tgz", + "integrity": "sha512-IBeco157lIScecq2Z+n0gq56i4MTnfKxS7rbfrAORveDJgnbBAaEQgYqMqp/cYqKrpvEXcyTjwKHrBjCCIZh2A==", "optional": true, "dependencies": { - "@smithy/types": "^2.6.0", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -3037,12 +2979,12 @@ } }, "node_modules/@smithy/middleware-stack": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.8.tgz", - "integrity": "sha512-7/N59j0zWqVEKExJcA14MrLDZ/IeN+d6nbkN8ucs+eURyaDUXWYlZrQmMOd/TyptcQv0+RDlgag/zSTTV62y/Q==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.6.tgz", + "integrity": "sha512-YSvNZeOKWLJ0M/ycxwDIe2Ztkp6Qixmcml1ggsSv2fdHKGkBPhGrX5tMzPGMI1yyx55UEYBi2OB4s+RriXX48A==", "optional": true, "dependencies": { - "@smithy/types": "^2.6.0", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -3050,14 +2992,14 @@ } }, "node_modules/@smithy/node-config-provider": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.1.6.tgz", - "integrity": "sha512-HLqTs6O78m3M3z1cPLFxddxhEPv5MkVatfPuxoVO3A+cHZanNd/H5I6btcdHy6N2CB1MJ/lihJC92h30SESsBA==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.1.3.tgz", + "integrity": "sha512-J6lXvRHGVnSX3n1PYi+e1L5HN73DkkJpUviV3Ebf+8wSaIjAf+eVNbzyvh/S5EQz7nf4KVfwbD5vdoZMAthAEQ==", "optional": true, "dependencies": { - "@smithy/property-provider": "^2.0.15", - "@smithy/shared-ini-file-loader": "^2.2.5", - "@smithy/types": "^2.6.0", + "@smithy/property-provider": "^2.0.13", + "@smithy/shared-ini-file-loader": "^2.2.2", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -3065,15 +3007,15 @@ } }, "node_modules/@smithy/node-http-handler": { - "version": "2.1.10", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.1.10.tgz", - "integrity": "sha512-lkALAwtN6odygIM4nB8aHDahINM6WXXjNrZmWQAh0RSossySRT2qa31cFv0ZBuAYVWeprskRk13AFvvLmf1WLw==", + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.1.8.tgz", + "integrity": "sha512-KZylM7Wff/So5SmCiwg2kQNXJ+RXgz34wkxS7WNwIUXuZrZZpY/jKJCK+ZaGyuESDu3TxcaY+zeYGJmnFKbQsA==", "optional": true, "dependencies": { - "@smithy/abort-controller": "^2.0.14", - "@smithy/protocol-http": "^3.0.10", - "@smithy/querystring-builder": "^2.0.14", - "@smithy/types": "^2.6.0", + "@smithy/abort-controller": "^2.0.12", + "@smithy/protocol-http": "^3.0.8", + "@smithy/querystring-builder": "^2.0.12", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -3081,12 +3023,12 @@ } }, "node_modules/@smithy/property-provider": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.15.tgz", - "integrity": "sha512-YbRFBn8oiiC3o1Kn3a4KjGa6k47rCM9++5W9cWqYn9WnkyH+hBWgfJAckuxpyA2Hq6Ys4eFrWzXq6fqHEw7iew==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.13.tgz", + "integrity": "sha512-VJqUf2CbsQX6uUiC5dUPuoEATuFjkbkW3lJHbRnpk9EDC9X+iKqhfTK+WP+lve5EQ9TcCI1Q6R7hrg41FyC54w==", "optional": true, "dependencies": { - "@smithy/types": "^2.6.0", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -3094,12 +3036,12 @@ } }, "node_modules/@smithy/protocol-http": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.10.tgz", - "integrity": "sha512-6+tjNk7rXW7YTeGo9qwxXj/2BFpJTe37kTj3EnZCoX/nH+NP/WLA7O83fz8XhkGqsaAhLUPo/bB12vvd47nsmg==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.8.tgz", + "integrity": "sha512-SHJvYeWq8q0FK8xHk+xjV9dzDUDjFMT+G1pZbV+XB6OVoac/FSVshlMNPeUJ8AmSkcDKHRu5vASnRqZHgD3qhw==", "optional": true, "dependencies": { - "@smithy/types": "^2.6.0", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -3107,12 +3049,12 @@ } }, "node_modules/@smithy/querystring-builder": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.14.tgz", - "integrity": "sha512-lQ4pm9vTv9nIhl5jt6uVMPludr6syE2FyJmHsIJJuOD7QPIJnrf9HhUGf1iHh9KJ4CUv21tpOU3X6s0rB6uJ0g==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.12.tgz", + "integrity": "sha512-cDbF07IuCjiN8CdGvPzfJjXIrmDSelScRfyJYrYBNBbKl2+k7QD/KqiHhtRyEKgID5mmEVrV6KE6L/iPJ98sFw==", "optional": true, "dependencies": { - "@smithy/types": "^2.6.0", + "@smithy/types": "^2.4.0", "@smithy/util-uri-escape": "^2.0.0", "tslib": "^2.5.0" }, @@ -3121,12 +3063,12 @@ } }, "node_modules/@smithy/querystring-parser": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.14.tgz", - "integrity": "sha512-+cbtXWI9tNtQjlgQg3CA+pvL3zKTAxPnG3Pj6MP89CR3vi3QMmD0SOWoq84tqZDnJCxlsusbgIXk1ngMReXo+A==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.12.tgz", + "integrity": "sha512-fytyTcXaMzPBuNtPlhj5v6dbl4bJAnwKZFyyItAGt4Tgm9HFPZNo7a9r1SKPr/qdxUEBzvL9Rh+B9SkTX3kFxg==", "optional": true, "dependencies": { - "@smithy/types": "^2.6.0", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -3134,24 +3076,24 @@ } }, "node_modules/@smithy/service-error-classification": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.7.tgz", - "integrity": "sha512-LLxgW12qGz8doYto15kZ4x1rHjtXl0BnCG6T6Wb8z2DI4PT9cJfOSvzbuLzy7+5I24PAepKgFeWHRd9GYy3Z9w==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.5.tgz", + "integrity": "sha512-M0SeJnEgD2ywJyV99Fb1yKFzmxDe9JfpJiYTVSRMyRLc467BPU0qsuuDPzMCdB1mU8M8u1rVOdkqdoyFN8UFTw==", "optional": true, "dependencies": { - "@smithy/types": "^2.6.0" + "@smithy/types": "^2.4.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/shared-ini-file-loader": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.2.5.tgz", - "integrity": "sha512-LHA68Iu7SmNwfAVe8egmjDCy648/7iJR/fK1UnVw+iAOUJoEYhX2DLgVd5pWllqdDiRbQQzgaHLcRokM+UFR1w==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.2.2.tgz", + "integrity": "sha512-noyQUPn7b1M8uB0GEXc/Zyxq+5K2b7aaqWnLp+hgJ7+xu/FCvtyWy5eWLDjQEsHnAet2IZhS5QF8872OR69uNg==", "optional": true, "dependencies": { - "@smithy/types": "^2.6.0", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -3159,18 +3101,18 @@ } }, "node_modules/@smithy/signature-v4": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.16.tgz", - "integrity": "sha512-ilLY85xS2kZZzTb83diQKYLIYALvart0KnBaKnIRnMBHAGEio5aHSlANQoxVn0VsonwmQ3CnWhnCT0sERD8uTg==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.12.tgz", + "integrity": "sha512-6Kc2lCZEVmb1nNYngyNbWpq0d82OZwITH11SW/Q0U6PX5fH7B2cIcFe7o6eGEFPkTZTP8itTzmYiGcECL0D0Lw==", "optional": true, "dependencies": { - "@smithy/eventstream-codec": "^2.0.14", + "@smithy/eventstream-codec": "^2.0.12", "@smithy/is-array-buffer": "^2.0.0", - "@smithy/types": "^2.6.0", + "@smithy/types": "^2.4.0", "@smithy/util-hex-encoding": "^2.0.0", - "@smithy/util-middleware": "^2.0.7", + "@smithy/util-middleware": "^2.0.5", "@smithy/util-uri-escape": "^2.0.0", - "@smithy/util-utf8": "^2.0.2", + "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" }, "engines": { @@ -3178,14 +3120,14 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "2.1.16", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.16.tgz", - "integrity": "sha512-Lw67+yQSpLl4YkDLUzI2KgS8TXclXmbzSeOJUmRFS4ueT56B4pw3RZRF/SRzvgyxM/HxgkUan8oSHXCujPDafQ==", + "version": "2.1.12", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.12.tgz", + "integrity": "sha512-XXqhridfkKnpj+lt8vM6HRlZbqUAqBjVC74JIi13F/AYQd/zTj9SOyGfxnbp4mjY9q28LityxIuV8CTinr9r5w==", "optional": true, "dependencies": { - "@smithy/middleware-stack": "^2.0.8", - "@smithy/types": "^2.6.0", - "@smithy/util-stream": "^2.0.21", + "@smithy/middleware-stack": "^2.0.6", + "@smithy/types": "^2.4.0", + "@smithy/util-stream": "^2.0.17", "tslib": "^2.5.0" }, "engines": { @@ -3193,9 +3135,9 @@ } }, "node_modules/@smithy/types": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.6.0.tgz", - "integrity": "sha512-PgqxJq2IcdMF9iAasxcqZqqoOXBHufEfmbEUdN1pmJrJltT42b0Sc8UiYSWWzKkciIp9/mZDpzYi4qYG1qqg6g==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.4.0.tgz", + "integrity": "sha512-iH1Xz68FWlmBJ9vvYeHifVMWJf82ONx+OybPW8ZGf5wnEv2S0UXcU4zwlwJkRXuLKpcSLHrraHbn2ucdVXLb4g==", "optional": true, "dependencies": { "tslib": "^2.5.0" @@ -3205,20 +3147,20 @@ } }, "node_modules/@smithy/url-parser": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.14.tgz", - "integrity": "sha512-kbu17Y1AFXi5lNlySdDj7ZzmvupyWKCX/0jNZ8ffquRyGdbDZb+eBh0QnWqsSmnZa/ctyWaTf7n4l/pXLExrnw==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.12.tgz", + "integrity": "sha512-qgkW2mZqRvlNUcBkxYB/gYacRaAdck77Dk3/g2iw0S9F0EYthIS3loGfly8AwoWpIvHKhkTsCXXQfzksgZ4zIA==", "optional": true, "dependencies": { - "@smithy/querystring-parser": "^2.0.14", - "@smithy/types": "^2.6.0", + "@smithy/querystring-parser": "^2.0.12", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" } }, "node_modules/@smithy/util-base64": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.0.1.tgz", - "integrity": "sha512-DlI6XFYDMsIVN+GH9JtcRp3j02JEVuWIn/QOZisVzpIAprdsxGveFed0bjbMRCqmIFe8uetn5rxzNrBtIGrPIQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.0.0.tgz", + "integrity": "sha512-Zb1E4xx+m5Lud8bbeYi5FkcMJMnn+1WUnJF3qD7rAdXpaL7UjkFQLdmW5fHadoKbdHpwH9vSR8EyTJFHJs++tA==", "optional": true, "dependencies": { "@smithy/util-buffer-from": "^2.0.0", @@ -3275,14 +3217,14 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.20.tgz", - "integrity": "sha512-QJtnbTIl0/BbEASkx1MUFf6EaoWqWW1/IM90N++8NNscePvPf77GheYfpoPis6CBQawUWq8QepTP2QUSAdrVkw==", + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.16.tgz", + "integrity": "sha512-Uv5Cu8nVkuvLn0puX+R9zWbSNpLIR3AxUlPoLJ7hC5lvir8B2WVqVEkJLwtixKAncVLasnTVjPDCidtAUTGEQw==", "optional": true, "dependencies": { - "@smithy/property-provider": "^2.0.15", - "@smithy/smithy-client": "^2.1.16", - "@smithy/types": "^2.6.0", + "@smithy/property-provider": "^2.0.13", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", "bowser": "^2.11.0", "tslib": "^2.5.0" }, @@ -3291,17 +3233,17 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "2.0.26", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.26.tgz", - "integrity": "sha512-lGFPOFCHv1ql019oegYqa54BZH7HREw6EBqjDLbAr0wquMX0BDi2sg8TJ6Eq+JGLijkZbJB73m4+aK8OFAapMg==", + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.21.tgz", + "integrity": "sha512-cUEsttVZ79B7Al2rWK2FW03HBpD9LyuqFtm+1qFty5u9sHSdesr215gS2Ln53fTopNiPgeXpdoM3IgjvIO0rJw==", "optional": true, "dependencies": { - "@smithy/config-resolver": "^2.0.19", - "@smithy/credential-provider-imds": "^2.1.2", - "@smithy/node-config-provider": "^2.1.6", - "@smithy/property-provider": "^2.0.15", - "@smithy/smithy-client": "^2.1.16", - "@smithy/types": "^2.6.0", + "@smithy/config-resolver": "^2.0.16", + "@smithy/credential-provider-imds": "^2.0.18", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/property-provider": "^2.0.13", + "@smithy/smithy-client": "^2.1.12", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -3309,13 +3251,13 @@ } }, "node_modules/@smithy/util-endpoints": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.0.5.tgz", - "integrity": "sha512-K7qNuCOD5K/90MjHvHm9kJldrfm40UxWYQxNEShMFxV/lCCCRIg8R4uu1PFAxRvPxNpIdcrh1uK6I1ISjDXZJw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.0.2.tgz", + "integrity": "sha512-QEdq+sP68IJHAMVB2ugKVVZEWeKQtZLuf+akHzc8eTVElsZ2ZdVLWC6Cp+uKjJ/t4yOj1qu6ZzyxJQEQ8jdEjg==", "optional": true, "dependencies": { - "@smithy/node-config-provider": "^2.1.6", - "@smithy/types": "^2.6.0", + "@smithy/node-config-provider": "^2.1.3", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -3335,12 +3277,12 @@ } }, "node_modules/@smithy/util-middleware": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.7.tgz", - "integrity": "sha512-tRINOTlf1G9B0ECarFQAtTgMhpnrMPSa+5j4ZEwEawCLfTFTavk6757sxhE4RY5RMlD/I3x+DCS8ZUiR8ho9Pw==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.5.tgz", + "integrity": "sha512-1lyT3TcaMJQe+OFfVI+TlomDkPuVzb27NZYdYtmSTltVmLaUjdCyt4KE+OH1CnhZKsz4/cdCL420Lg9UH5Z2Mw==", "optional": true, "dependencies": { - "@smithy/types": "^2.6.0", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -3348,13 +3290,13 @@ } }, "node_modules/@smithy/util-retry": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.7.tgz", - "integrity": "sha512-fIe5yARaF0+xVT1XKcrdnHKTJ1Vc4+3e3tLDjCuIcE9b6fkBzzGFY7AFiX4M+vj6yM98DrwkuZeHf7/hmtVp0Q==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.5.tgz", + "integrity": "sha512-x3t1+MQAJ6QONk3GTbJNcugCFDVJ+Bkro5YqQQK1EyVesajNDqxFtCx9WdOFNGm/Cbm7tUdwVEmfKQOJoU2Vtw==", "optional": true, "dependencies": { - "@smithy/service-error-classification": "^2.0.7", - "@smithy/types": "^2.6.0", + "@smithy/service-error-classification": "^2.0.5", + "@smithy/types": "^2.4.0", "tslib": "^2.5.0" }, "engines": { @@ -3362,18 +3304,18 @@ } }, "node_modules/@smithy/util-stream": { - "version": "2.0.21", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.21.tgz", - "integrity": "sha512-0BUE16d7n1x7pi1YluXJdB33jOTyBChT0j/BlOkFa9uxfg6YqXieHxjHNuCdJRARa7AZEj32LLLEPJ1fSa4inA==", + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.17.tgz", + "integrity": "sha512-fP/ZQ27rRvHsqItds8yB7jerwMpZFTL3QqbQbidUiG0+mttMoKdP0ZqnvM8UK5q0/dfc3/pN7g4XKPXOU7oRWw==", "optional": true, "dependencies": { - "@smithy/fetch-http-handler": "^2.2.7", - "@smithy/node-http-handler": "^2.1.10", - "@smithy/types": "^2.6.0", - "@smithy/util-base64": "^2.0.1", + "@smithy/fetch-http-handler": "^2.2.4", + "@smithy/node-http-handler": "^2.1.8", + "@smithy/types": "^2.4.0", + "@smithy/util-base64": "^2.0.0", "@smithy/util-buffer-from": "^2.0.0", "@smithy/util-hex-encoding": "^2.0.0", - "@smithy/util-utf8": "^2.0.2", + "@smithy/util-utf8": "^2.0.0", "tslib": "^2.5.0" }, "engines": { @@ -3393,9 +3335,9 @@ } }, "node_modules/@smithy/util-utf8": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.0.2.tgz", - "integrity": "sha512-qOiVORSPm6Ce4/Yu6hbSgNHABLP2VMv8QOC3tTDNHHlWY19pPyc++fBTbZPtx6egPXi4HQxKDnMxVxpbtX2GoA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.0.0.tgz", + "integrity": "sha512-rctU1VkziY84n5OXe3bPNpKR001ZCME2JCaBBFgtiM2hfKbHFudc/BkMuPab8hRbLd0j3vbnBTTZ1igBf0wgiQ==", "optional": true, "dependencies": { "@smithy/util-buffer-from": "^2.0.0", @@ -3452,12 +3394,10 @@ }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.4", - "dev": true, "license": "MIT" }, "node_modules/@types/istanbul-lib-report": { "version": "3.0.0", - "dev": true, "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "*" @@ -3465,7 +3405,6 @@ }, "node_modules/@types/istanbul-reports": { "version": "3.0.1", - "dev": true, "license": "MIT", "dependencies": { "@types/istanbul-lib-report": "*" @@ -3492,13 +3431,12 @@ }, "node_modules/@types/stack-utils": { "version": "2.0.1", - "dev": true, "license": "MIT" }, "node_modules/@types/webidl-conversions": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", - "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==" + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.2.tgz", + "integrity": "sha512-uNv6b/uGRLlCVmelat2rA8bcVd3k/42mV2EmjhPh6JLkd35T5bgwR/t6xy7a9MWhd9sixIeBUzhBenvk3NO+DQ==" }, "node_modules/@types/whatwg-url": { "version": "8.2.2", @@ -3511,7 +3449,6 @@ }, "node_modules/@types/yargs": { "version": "17.0.17", - "dev": true, "license": "MIT", "dependencies": { "@types/yargs-parser": "*" @@ -3519,7 +3456,6 @@ }, "node_modules/@types/yargs-parser": { "version": "21.0.0", - "dev": true, "license": "MIT" }, "node_modules/abbrev": { @@ -3538,9 +3474,10 @@ } }, "node_modules/acorn": { - "version": "8.8.1", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", "dev": true, - "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -3566,21 +3503,6 @@ "node": ">= 6.0.0" } }, - "node_modules/agent-base/node_modules/debug": { - "version": "4.3.4", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/ajv": { "version": "6.12.6", "dev": true, @@ -3775,6 +3697,15 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/babel-plugin-polyfill-corejs3": { "version": "0.6.0", "dev": true, @@ -3978,7 +3909,6 @@ }, "node_modules/braces": { "version": "3.0.2", - "dev": true, "license": "MIT", "dependencies": { "fill-range": "^7.0.1" @@ -4118,7 +4048,6 @@ }, "node_modules/chalk": { "version": "4.1.0", - "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -4133,7 +4062,6 @@ }, "node_modules/chalk/node_modules/ansi-styles": { "version": "4.3.0", - "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -4147,7 +4075,6 @@ }, "node_modules/chalk/node_modules/color-convert": { "version": "2.0.1", - "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -4158,12 +4085,10 @@ }, "node_modules/chalk/node_modules/color-name": { "version": "1.1.4", - "dev": true, "license": "MIT" }, "node_modules/chalk/node_modules/has-flag": { "version": "4.0.0", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -4171,7 +4096,6 @@ }, "node_modules/chalk/node_modules/supports-color": { "version": "7.2.0", - "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -4223,7 +4147,6 @@ }, "node_modules/ci-info": { "version": "3.7.0", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -4302,9 +4225,9 @@ } }, "node_modules/cloudinary": { - "version": "1.41.0", - "resolved": "https://registry.npmjs.org/cloudinary/-/cloudinary-1.41.0.tgz", - "integrity": "sha512-qFf2McjvILJITePf4VF1PrY/8c2zy+/q5FVV6V3VWrP/gpIZsusPqXL4QZ6ZKXibPRukzMYqsQEhaSQgJHKKow==", + "version": "1.38.0", + "resolved": "https://registry.npmjs.org/cloudinary/-/cloudinary-1.38.0.tgz", + "integrity": "sha512-s5Sh/uButN0M7lxTYvrvPcImaieI1aYh1qmgyhO0wbPUMfb0BSb+mBa5SETFJpzQGCAqP46yxapkPeEFyGZX9A==", "dependencies": { "cloudinary-core": "^2.13.0", "core-js": "^3.30.1", @@ -4463,9 +4386,9 @@ "dev": true }, "node_modules/core-js": { - "version": "3.33.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.33.3.tgz", - "integrity": "sha512-lo0kOocUlLKmm6kv/FswQL8zbkH7mVsLJ/FULClOhv8WRVmKLVcs6XPNQAzstfeJTCHMyButEwG+z1kHxHoDZw==", + "version": "3.31.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.31.1.tgz", + "integrity": "sha512-2sKLtfq1eFST7l7v62zaqXacPc7uG8ZAya8ogijLhTtaKNcpzpB4TMoTw2Si+8GYKRwFPMMtUT0263QFWFfqyQ==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -4526,11 +4449,19 @@ } }, "node_modules/debug": { - "version": "3.2.7", - "dev": true, - "license": "MIT", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { - "ms": "^2.1.1" + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, "node_modules/dedent": { @@ -4610,9 +4541,9 @@ } }, "node_modules/diff-sequences": { - "version": "29.3.1", - "dev": true, - "license": "MIT", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -4871,22 +4802,6 @@ "dev": true, "license": "Python-2.0" }, - "node_modules/eslint/node_modules/debug": { - "version": "4.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/eslint/node_modules/escape-string-regexp": { "version": "4.0.0", "dev": true, @@ -5107,15 +5022,15 @@ } }, "node_modules/expect": { - "version": "29.3.1", - "dev": true, - "license": "MIT", + "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.3.1", - "jest-get-type": "^29.2.0", - "jest-matcher-utils": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-util": "^29.3.1" + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^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" @@ -5375,7 +5290,6 @@ }, "node_modules/fill-range": { "version": "7.0.1", - "dev": true, "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" @@ -5755,21 +5669,6 @@ "node": ">= 6" } }, - "node_modules/https-proxy-agent/node_modules/debug": { - "version": "4.3.4", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/human-signals": { "version": "2.1.0", "dev": true, @@ -5882,9 +5781,9 @@ "license": "ISC" }, "node_modules/ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.1.tgz", + "integrity": "sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==" }, "node_modules/ipaddr.js": { "version": "1.9.1", @@ -5956,7 +5855,6 @@ }, "node_modules/is-number": { "version": "7.0.0", - "dev": true, "license": "MIT", "engines": { "node": ">=0.12.0" @@ -6013,8 +5911,17 @@ "node": ">=8" } }, - "node_modules/istanbul-lib-report": { - "version": "3.0.0", + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -6058,22 +5965,6 @@ "node": ">=10" } }, - "node_modules/istanbul-lib-source-maps/node_modules/debug": { - "version": "4.3.4", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/istanbul-reports": { "version": "3.1.5", "dev": true, @@ -6230,14 +6121,14 @@ } }, "node_modules/jest-diff": { - "version": "29.3.1", - "dev": true, - "license": "MIT", + "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.3.1", - "jest-get-type": "^29.2.0", - "pretty-format": "^29.3.1" + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -6286,9 +6177,9 @@ } }, "node_modules/jest-get-type": { - "version": "29.2.0", - "dev": true, - "license": "MIT", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -6330,31 +6221,31 @@ } }, "node_modules/jest-matcher-utils": { - "version": "29.3.1", - "dev": true, - "license": "MIT", + "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.3.1", - "jest-get-type": "^29.2.0", - "pretty-format": "^29.3.1" + "jest-diff": "^29.7.0", + "jest-get-type": "^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.3.1", - "dev": true, - "license": "MIT", + "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.3.1", + "@jest/types": "^29.6.3", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -6527,27 +6418,12 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/jest-util": { - "version": "29.3.1", - "dev": true, - "license": "MIT", + "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.3.1", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -6716,20 +6592,6 @@ "npm": ">=6" } }, - "node_modules/jsonwebtoken/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/jwa": { "version": "1.4.1", "license": "MIT", @@ -6855,6 +6717,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/makeerror": { "version": "1.0.12", "dev": true, @@ -6893,7 +6763,6 @@ }, "node_modules/micromatch": { "version": "4.0.5", - "dev": true, "license": "MIT", "dependencies": { "braces": "^3.0.2", @@ -7071,9 +6940,9 @@ } }, "node_modules/mongoose": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.12.3.tgz", - "integrity": "sha512-MNJymaaXali7w7rHBxVUoQ3HzHHMk/7I/+yeeoSa4rUzdjZwIWQznBNvVgc0A8ghuJwsuIkb5LyLV6gSjGjWyQ==", + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.12.2.tgz", + "integrity": "sha512-3XXhSAB4PcJBd0sfqyi+LdVb3brVoIFh5kB/gpnrKcD54tmWdEI4Y8xjiiBx773U9IV3Mv4GxFVCy9/lvXMMyg==", "dependencies": { "bson": "^4.7.2", "kareem": "2.5.1", @@ -7175,21 +7044,6 @@ "node": ">=12.0.0" } }, - "node_modules/mquery/node_modules/debug": { - "version": "4.3.4", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/ms": { "version": "2.1.2", "license": "MIT" @@ -7258,8 +7112,9 @@ "license": "MIT" }, "node_modules/nodemailer": { - "version": "6.8.0", - "license": "MIT", + "version": "6.9.12", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.12.tgz", + "integrity": "sha512-pnLo7g37Br3jXbF0bl5DekBJihm2q+3bB3l2o/B060sWmb5l+VqeScAQCBqaQ+5ezRZFzW5SciZNGdRDEbq89w==", "engines": { "node": ">=6.0.0" } @@ -7272,13 +7127,13 @@ } }, "node_modules/nodemon": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz", - "integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.0.tgz", + "integrity": "sha512-xqlktYlDMCepBJd43ZQhjWwMw2obW/JRvkrLxq5RCNcuDDX1DbcPT+qT1IlIIdf+DhnWs90JpTMe+Y5KxOchvA==", "dev": true, "dependencies": { "chokidar": "^3.5.2", - "debug": "^3.2.7", + "debug": "^4", "ignore-by-default": "^1.0.1", "minimatch": "^3.1.2", "pstree.remy": "^1.1.8", @@ -7299,21 +7154,6 @@ "url": "https://opencollective.com/nodemon" } }, - "node_modules/nodemon/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/nopt": { "version": "5.0.0", "license": "ISC", @@ -7619,7 +7459,6 @@ }, "node_modules/picomatch": { "version": "2.3.1", - "dev": true, "license": "MIT", "engines": { "node": ">=8.6" @@ -7656,11 +7495,11 @@ } }, "node_modules/pretty-format": { - "version": "29.3.1", - "dev": true, - "license": "MIT", + "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.0.0", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -7670,7 +7509,6 @@ }, "node_modules/pretty-format/node_modules/ansi-styles": { "version": "5.2.0", - "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -7796,7 +7634,6 @@ }, "node_modules/react-is": { "version": "18.2.0", - "dev": true, "license": "MIT" }, "node_modules/readable-stream": { @@ -8017,11 +7854,17 @@ } }, "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, "bin": { "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/send": { @@ -8143,21 +7986,6 @@ "node": ">=10" } }, - "node_modules/simple-update-notifier/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/sisteransi": { "version": "1.0.5", "dev": true, @@ -8165,7 +7993,6 @@ }, "node_modules/slash": { "version": "3.0.0", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -8224,7 +8051,6 @@ }, "node_modules/stack-utils": { "version": "2.0.6", - "dev": true, "license": "MIT", "dependencies": { "escape-string-regexp": "^2.0.0" @@ -8235,7 +8061,6 @@ }, "node_modules/stack-utils/node_modules/escape-string-regexp": { "version": "2.0.0", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -8348,22 +8173,6 @@ "node": ">=6.4.0 <13 || >=14" } }, - "node_modules/superagent/node_modules/debug": { - "version": "4.3.4", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/superagent/node_modules/mime": { "version": "2.6.0", "dev": true, @@ -8375,21 +8184,6 @@ "node": ">=4.0.0" } }, - "node_modules/superagent/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/supertest": { "version": "6.3.3", "dev": true, @@ -8480,7 +8274,6 @@ }, "node_modules/to-regex-range": { "version": "5.0.1", - "dev": true, "license": "MIT", "dependencies": { "is-number": "^7.0.0" @@ -8523,9 +8316,9 @@ "license": "MIT" }, "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==", "devOptional": true }, "node_modules/twostep": { @@ -8775,9 +8568,9 @@ } }, "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", + "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -8904,5872 +8697,5 @@ "url": "https://github.com/sponsors/sindresorhus" } } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.2.0", - "requires": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@aws-crypto/crc32": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", - "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", - "optional": true, - "requires": { - "@aws-crypto/util": "^3.0.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^1.11.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "optional": true - } - } - }, - "@aws-crypto/ie11-detection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", - "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", - "optional": true, - "requires": { - "tslib": "^1.11.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "optional": true - } - } - }, - "@aws-crypto/sha256-browser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", - "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", - "optional": true, - "requires": { - "@aws-crypto/ie11-detection": "^3.0.0", - "@aws-crypto/sha256-js": "^3.0.0", - "@aws-crypto/supports-web-crypto": "^3.0.0", - "@aws-crypto/util": "^3.0.0", - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "optional": true - } - } - }, - "@aws-crypto/sha256-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", - "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", - "optional": true, - "requires": { - "@aws-crypto/util": "^3.0.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^1.11.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "optional": true - } - } - }, - "@aws-crypto/supports-web-crypto": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", - "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", - "optional": true, - "requires": { - "tslib": "^1.11.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "optional": true - } - } - }, - "@aws-crypto/util": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", - "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", - "optional": true, - "requires": { - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "optional": true - } - } - }, - "@aws-sdk/client-cognito-identity": { - "version": "3.461.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.461.0.tgz", - "integrity": "sha512-rttO5tsvNqZghQwUgPk67LSo+0Yy4ItmsI3sgl81WDUP2A9Q4rwB8L99gLWroUz1uJtBujQ/HoYu6GN4kRa3MQ==", - "optional": true, - "requires": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.461.0", - "@aws-sdk/core": "3.451.0", - "@aws-sdk/credential-provider-node": "3.460.0", - "@aws-sdk/middleware-host-header": "3.460.0", - "@aws-sdk/middleware-logger": "3.460.0", - "@aws-sdk/middleware-recursion-detection": "3.460.0", - "@aws-sdk/middleware-signing": "3.461.0", - "@aws-sdk/middleware-user-agent": "3.460.0", - "@aws-sdk/region-config-resolver": "3.451.0", - "@aws-sdk/types": "3.460.0", - "@aws-sdk/util-endpoints": "3.460.0", - "@aws-sdk/util-user-agent-browser": "3.460.0", - "@aws-sdk/util-user-agent-node": "3.460.0", - "@smithy/config-resolver": "^2.0.18", - "@smithy/fetch-http-handler": "^2.2.6", - "@smithy/hash-node": "^2.0.15", - "@smithy/invalid-dependency": "^2.0.13", - "@smithy/middleware-content-length": "^2.0.15", - "@smithy/middleware-endpoint": "^2.2.0", - "@smithy/middleware-retry": "^2.0.20", - "@smithy/middleware-serde": "^2.0.13", - "@smithy/middleware-stack": "^2.0.7", - "@smithy/node-config-provider": "^2.1.5", - "@smithy/node-http-handler": "^2.1.9", - "@smithy/protocol-http": "^3.0.9", - "@smithy/smithy-client": "^2.1.15", - "@smithy/types": "^2.5.0", - "@smithy/url-parser": "^2.0.13", - "@smithy/util-base64": "^2.0.1", - "@smithy/util-body-length-browser": "^2.0.0", - "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.19", - "@smithy/util-defaults-mode-node": "^2.0.25", - "@smithy/util-endpoints": "^1.0.4", - "@smithy/util-retry": "^2.0.6", - "@smithy/util-utf8": "^2.0.2", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/client-sso": { - "version": "3.460.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.460.0.tgz", - "integrity": "sha512-p5D9C8LKJs5yoBn5cCs2Wqzrp5YP5BYcP774bhGMFEu/LCIUyWzudwN3+/AObSiq8R8SSvBY2zQD4h+k3NjgTQ==", - "optional": true, - "requires": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/core": "3.451.0", - "@aws-sdk/middleware-host-header": "3.460.0", - "@aws-sdk/middleware-logger": "3.460.0", - "@aws-sdk/middleware-recursion-detection": "3.460.0", - "@aws-sdk/middleware-user-agent": "3.460.0", - "@aws-sdk/region-config-resolver": "3.451.0", - "@aws-sdk/types": "3.460.0", - "@aws-sdk/util-endpoints": "3.460.0", - "@aws-sdk/util-user-agent-browser": "3.460.0", - "@aws-sdk/util-user-agent-node": "3.460.0", - "@smithy/config-resolver": "^2.0.18", - "@smithy/fetch-http-handler": "^2.2.6", - "@smithy/hash-node": "^2.0.15", - "@smithy/invalid-dependency": "^2.0.13", - "@smithy/middleware-content-length": "^2.0.15", - "@smithy/middleware-endpoint": "^2.2.0", - "@smithy/middleware-retry": "^2.0.20", - "@smithy/middleware-serde": "^2.0.13", - "@smithy/middleware-stack": "^2.0.7", - "@smithy/node-config-provider": "^2.1.5", - "@smithy/node-http-handler": "^2.1.9", - "@smithy/protocol-http": "^3.0.9", - "@smithy/smithy-client": "^2.1.15", - "@smithy/types": "^2.5.0", - "@smithy/url-parser": "^2.0.13", - "@smithy/util-base64": "^2.0.1", - "@smithy/util-body-length-browser": "^2.0.0", - "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.19", - "@smithy/util-defaults-mode-node": "^2.0.25", - "@smithy/util-endpoints": "^1.0.4", - "@smithy/util-retry": "^2.0.6", - "@smithy/util-utf8": "^2.0.2", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/client-sts": { - "version": "3.461.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.461.0.tgz", - "integrity": "sha512-1u+t31m23vuc9zkiUk51L4QbwuRQEuBeMArHK/thmq4V+A0VmjoAr/x2D0eQ0deOuBqG5YC62oaqUfIhj03SIw==", - "optional": true, - "requires": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/core": "3.451.0", - "@aws-sdk/credential-provider-node": "3.460.0", - "@aws-sdk/middleware-host-header": "3.460.0", - "@aws-sdk/middleware-logger": "3.460.0", - "@aws-sdk/middleware-recursion-detection": "3.460.0", - "@aws-sdk/middleware-sdk-sts": "3.461.0", - "@aws-sdk/middleware-signing": "3.461.0", - "@aws-sdk/middleware-user-agent": "3.460.0", - "@aws-sdk/region-config-resolver": "3.451.0", - "@aws-sdk/types": "3.460.0", - "@aws-sdk/util-endpoints": "3.460.0", - "@aws-sdk/util-user-agent-browser": "3.460.0", - "@aws-sdk/util-user-agent-node": "3.460.0", - "@smithy/config-resolver": "^2.0.18", - "@smithy/fetch-http-handler": "^2.2.6", - "@smithy/hash-node": "^2.0.15", - "@smithy/invalid-dependency": "^2.0.13", - "@smithy/middleware-content-length": "^2.0.15", - "@smithy/middleware-endpoint": "^2.2.0", - "@smithy/middleware-retry": "^2.0.20", - "@smithy/middleware-serde": "^2.0.13", - "@smithy/middleware-stack": "^2.0.7", - "@smithy/node-config-provider": "^2.1.5", - "@smithy/node-http-handler": "^2.1.9", - "@smithy/protocol-http": "^3.0.9", - "@smithy/smithy-client": "^2.1.15", - "@smithy/types": "^2.5.0", - "@smithy/url-parser": "^2.0.13", - "@smithy/util-base64": "^2.0.1", - "@smithy/util-body-length-browser": "^2.0.0", - "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.19", - "@smithy/util-defaults-mode-node": "^2.0.25", - "@smithy/util-endpoints": "^1.0.4", - "@smithy/util-retry": "^2.0.6", - "@smithy/util-utf8": "^2.0.2", - "fast-xml-parser": "4.2.5", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/core": { - "version": "3.451.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.451.0.tgz", - "integrity": "sha512-SamWW2zHEf1ZKe3j1w0Piauryl8BQIlej0TBS18A4ACzhjhWXhCs13bO1S88LvPR5mBFXok3XOT6zPOnKDFktw==", - "optional": true, - "requires": { - "@smithy/smithy-client": "^2.1.15", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/credential-provider-cognito-identity": { - "version": "3.461.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.461.0.tgz", - "integrity": "sha512-D3bayvoEMxxheSpLug0VpAmGiVsDdYU4GsT8ls6389NjgQsAhPrmHd5wAxf1AtZYxghO9cT2rsZK60u0VQ1Q1w==", - "optional": true, - "requires": { - "@aws-sdk/client-cognito-identity": "3.461.0", - "@aws-sdk/types": "3.460.0", - "@smithy/property-provider": "^2.0.0", - "@smithy/types": "^2.5.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/credential-provider-env": { - "version": "3.460.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.460.0.tgz", - "integrity": "sha512-WWdaRJFuYRc2Ue9NKDy2NIf8pQRNx/QRVmrsk6EkIID8uWlQIOePk3SWTVV0TZIyPrbfSEaSnJRZoShphJ6PAg==", - "optional": true, - "requires": { - "@aws-sdk/types": "3.460.0", - "@smithy/property-provider": "^2.0.0", - "@smithy/types": "^2.5.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/credential-provider-http": { - "version": "3.460.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.460.0.tgz", - "integrity": "sha512-tLnuLDsGcBRemj8jxt1MkerjwsQlYdwnlfQXvrYOO8qMrbFP2sEjAx165GeCbsjmY/y0w1UFQEV+xRpFg5dxUw==", - "optional": true, - "requires": { - "@aws-sdk/types": "3.460.0", - "@smithy/fetch-http-handler": "^2.2.6", - "@smithy/node-http-handler": "^2.1.9", - "@smithy/property-provider": "^2.0.0", - "@smithy/protocol-http": "^3.0.9", - "@smithy/smithy-client": "^2.1.15", - "@smithy/types": "^2.5.0", - "@smithy/util-stream": "^2.0.20", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/credential-provider-ini": { - "version": "3.460.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.460.0.tgz", - "integrity": "sha512-1IEUmyaWzt2M3mONO8QyZtPy0f9ccaEjCo48ZQLgptWxUI+Ohga9gPK0mqu1kTJOjv4JJGACYHzLwEnnpltGlA==", - "optional": true, - "requires": { - "@aws-sdk/credential-provider-env": "3.460.0", - "@aws-sdk/credential-provider-process": "3.460.0", - "@aws-sdk/credential-provider-sso": "3.460.0", - "@aws-sdk/credential-provider-web-identity": "3.460.0", - "@aws-sdk/types": "3.460.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.5.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/credential-provider-node": { - "version": "3.460.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.460.0.tgz", - "integrity": "sha512-PbPo92WIgNlF6V4eWKehYGYjTqf0gU9vr09LeQUc3bTm1DJhJw1j+HU/3PfQ8LwTkBQePO7MbJ5A2n6ckMwfMg==", - "optional": true, - "requires": { - "@aws-sdk/credential-provider-env": "3.460.0", - "@aws-sdk/credential-provider-ini": "3.460.0", - "@aws-sdk/credential-provider-process": "3.460.0", - "@aws-sdk/credential-provider-sso": "3.460.0", - "@aws-sdk/credential-provider-web-identity": "3.460.0", - "@aws-sdk/types": "3.460.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.5.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/credential-provider-process": { - "version": "3.460.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.460.0.tgz", - "integrity": "sha512-ng+0FMc4EaxLAwdttCwf2nzNf4AgcqAHZ8pKXUf8qF/KVkoyTt3UZKW7P2FJI01zxwP+V4yAwVt95PBUKGn4YQ==", - "optional": true, - "requires": { - "@aws-sdk/types": "3.460.0", - "@smithy/property-provider": "^2.0.0", - "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/types": "^2.5.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/credential-provider-sso": { - "version": "3.460.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.460.0.tgz", - "integrity": "sha512-KnrQieOw17+aHEzE3SwfxjeSQ5ZTe2HeAzxkaZF++GxhNul/PkVnLzjGpIuB9bn71T9a2oNfG3peDUA+m2l2kw==", - "optional": true, - "requires": { - "@aws-sdk/client-sso": "3.460.0", - "@aws-sdk/token-providers": "3.460.0", - "@aws-sdk/types": "3.460.0", - "@smithy/property-provider": "^2.0.0", - "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/types": "^2.5.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/credential-provider-web-identity": { - "version": "3.460.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.460.0.tgz", - "integrity": "sha512-7OeaZgC3HmJZGE0I0ZiKInUMF2LyA0IZiW85AYFnAZzAIfv1cXk/1UnDAoFIQhOZfnUBXivStagz892s480ryw==", - "optional": true, - "requires": { - "@aws-sdk/types": "3.460.0", - "@smithy/property-provider": "^2.0.0", - "@smithy/types": "^2.5.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/credential-providers": { - "version": "3.461.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.461.0.tgz", - "integrity": "sha512-sJjGjJxs0KajPK+WbdIRSuidWqm1xobX/Uv0x7TTQCCj1Fsuyq03pNP1aLRbJnLazKx+qyJef7rEFwQeFEAiNA==", - "optional": true, - "requires": { - "@aws-sdk/client-cognito-identity": "3.461.0", - "@aws-sdk/client-sso": "3.460.0", - "@aws-sdk/client-sts": "3.461.0", - "@aws-sdk/credential-provider-cognito-identity": "3.461.0", - "@aws-sdk/credential-provider-env": "3.460.0", - "@aws-sdk/credential-provider-http": "3.460.0", - "@aws-sdk/credential-provider-ini": "3.460.0", - "@aws-sdk/credential-provider-node": "3.460.0", - "@aws-sdk/credential-provider-process": "3.460.0", - "@aws-sdk/credential-provider-sso": "3.460.0", - "@aws-sdk/credential-provider-web-identity": "3.460.0", - "@aws-sdk/types": "3.460.0", - "@smithy/credential-provider-imds": "^2.0.0", - "@smithy/property-provider": "^2.0.0", - "@smithy/types": "^2.5.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/middleware-host-header": { - "version": "3.460.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.460.0.tgz", - "integrity": "sha512-qBeDyuJkEuHe87Xk6unvFO9Zg5j6zM8bQOOZITocTLfu9JN0u5V4GQ/yopvpv+nQHmC/MGr0G7p+kIXMrg/Q2A==", - "optional": true, - "requires": { - "@aws-sdk/types": "3.460.0", - "@smithy/protocol-http": "^3.0.9", - "@smithy/types": "^2.5.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/middleware-logger": { - "version": "3.460.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.460.0.tgz", - "integrity": "sha512-w2AJ6HOJ+Ggx9+VDKuWBHk5S0ZxYEo2EY2IFh0qtCQ1RDix/ur1QEzOOL5vNjHlZKPv/dseIwhgsTCac8UHXbQ==", - "optional": true, - "requires": { - "@aws-sdk/types": "3.460.0", - "@smithy/types": "^2.5.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/middleware-recursion-detection": { - "version": "3.460.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.460.0.tgz", - "integrity": "sha512-wmzm1/2NzpcCVCAsGqqiTBK+xNyLmQwTOq63rcW6eeq6gYOO0cyTZROOkVRrrsKWPBigrSFFHvDrEvonOMtKAg==", - "optional": true, - "requires": { - "@aws-sdk/types": "3.460.0", - "@smithy/protocol-http": "^3.0.9", - "@smithy/types": "^2.5.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/middleware-sdk-sts": { - "version": "3.461.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.461.0.tgz", - "integrity": "sha512-sgNxkwKdJ/NZm7SJZBnbYPkbspmzn3lDyRSJH7PTCvyzDBzY2PB6yS/dfnGkitR+PYwromuOYMha37W4su2SOw==", - "optional": true, - "requires": { - "@aws-sdk/middleware-signing": "3.461.0", - "@aws-sdk/types": "3.460.0", - "@smithy/types": "^2.5.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/middleware-signing": { - "version": "3.461.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.461.0.tgz", - "integrity": "sha512-aM/7VupHlsgeRG1UZSAQMWJX+2Jam4GG8ZGVAbLfBr9yh9cBwnUUndpUpYI9rU7atA8n+vISr162EbR7WTiFhQ==", - "optional": true, - "requires": { - "@aws-sdk/types": "3.460.0", - "@smithy/property-provider": "^2.0.0", - "@smithy/protocol-http": "^3.0.9", - "@smithy/signature-v4": "^2.0.0", - "@smithy/types": "^2.5.0", - "@smithy/util-middleware": "^2.0.6", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/middleware-user-agent": { - "version": "3.460.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.460.0.tgz", - "integrity": "sha512-0gBSOCr+RtwRUCSRLn9H3RVnj9ercvk/QKTHIr33CgfEdyZtIGpHWUSs6uqiQydPTRzjCm5SfUa6ESGhRVMM6A==", - "optional": true, - "requires": { - "@aws-sdk/types": "3.460.0", - "@aws-sdk/util-endpoints": "3.460.0", - "@smithy/protocol-http": "^3.0.9", - "@smithy/types": "^2.5.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/region-config-resolver": { - "version": "3.451.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.451.0.tgz", - "integrity": "sha512-3iMf4OwzrFb4tAAmoROXaiORUk2FvSejnHIw/XHvf/jjR4EqGGF95NZP/n/MeFZMizJWVssrwS412GmoEyoqhg==", - "optional": true, - "requires": { - "@smithy/node-config-provider": "^2.1.5", - "@smithy/types": "^2.5.0", - "@smithy/util-config-provider": "^2.0.0", - "@smithy/util-middleware": "^2.0.6", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/token-providers": { - "version": "3.460.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.460.0.tgz", - "integrity": "sha512-EvSIPMI1gXk3gEkdtbZCW+p3Bjmt2gOR1m7ibQD7qLj4l0dKXhp4URgTqB1ExH3S4qUq0M/XSGKbGLZpvunHNg==", - "optional": true, - "requires": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/middleware-host-header": "3.460.0", - "@aws-sdk/middleware-logger": "3.460.0", - "@aws-sdk/middleware-recursion-detection": "3.460.0", - "@aws-sdk/middleware-user-agent": "3.460.0", - "@aws-sdk/region-config-resolver": "3.451.0", - "@aws-sdk/types": "3.460.0", - "@aws-sdk/util-endpoints": "3.460.0", - "@aws-sdk/util-user-agent-browser": "3.460.0", - "@aws-sdk/util-user-agent-node": "3.460.0", - "@smithy/config-resolver": "^2.0.18", - "@smithy/fetch-http-handler": "^2.2.6", - "@smithy/hash-node": "^2.0.15", - "@smithy/invalid-dependency": "^2.0.13", - "@smithy/middleware-content-length": "^2.0.15", - "@smithy/middleware-endpoint": "^2.2.0", - "@smithy/middleware-retry": "^2.0.20", - "@smithy/middleware-serde": "^2.0.13", - "@smithy/middleware-stack": "^2.0.7", - "@smithy/node-config-provider": "^2.1.5", - "@smithy/node-http-handler": "^2.1.9", - "@smithy/property-provider": "^2.0.0", - "@smithy/protocol-http": "^3.0.9", - "@smithy/shared-ini-file-loader": "^2.0.6", - "@smithy/smithy-client": "^2.1.15", - "@smithy/types": "^2.5.0", - "@smithy/url-parser": "^2.0.13", - "@smithy/util-base64": "^2.0.1", - "@smithy/util-body-length-browser": "^2.0.0", - "@smithy/util-body-length-node": "^2.1.0", - "@smithy/util-defaults-mode-browser": "^2.0.19", - "@smithy/util-defaults-mode-node": "^2.0.25", - "@smithy/util-endpoints": "^1.0.4", - "@smithy/util-retry": "^2.0.6", - "@smithy/util-utf8": "^2.0.2", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/types": { - "version": "3.460.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.460.0.tgz", - "integrity": "sha512-MyZSWS/FV8Bnux5eD9en7KLgVxevlVrGNEP3X2D7fpnUlLhl0a7k8+OpSI2ozEQB8hIU2DLc/XXTKRerHSefxQ==", - "optional": true, - "requires": { - "@smithy/types": "^2.5.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/util-endpoints": { - "version": "3.460.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.460.0.tgz", - "integrity": "sha512-myH6kM5WP4IWULHDHMYf2Q+BCYVGlzqJgiBmO10kQEtJSeAGZZ49eoFFYgKW8ZAYB5VnJ+XhXVB1TRA+vR4l5A==", - "optional": true, - "requires": { - "@aws-sdk/types": "3.460.0", - "@smithy/util-endpoints": "^1.0.4", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/util-locate-window": { - "version": "3.310.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.310.0.tgz", - "integrity": "sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==", - "optional": true, - "requires": { - "tslib": "^2.5.0" - } - }, - "@aws-sdk/util-user-agent-browser": { - "version": "3.460.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.460.0.tgz", - "integrity": "sha512-FRCzW+TyjKnvxsargPVrjayBfp/rvObYHZyZ2OSqrVw8lkkPCb4e/WZOeIiXZuhdhhoah7wMuo6zGwtFF3bYKg==", - "optional": true, - "requires": { - "@aws-sdk/types": "3.460.0", - "@smithy/types": "^2.5.0", - "bowser": "^2.11.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/util-user-agent-node": { - "version": "3.460.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.460.0.tgz", - "integrity": "sha512-+kSoR9ABGpJ5Xc7v0VwpgTQbgyI4zuezC8K4pmKAGZsSsVWg4yxptoy2bDqoFL7qfRlWviMVTkQRMvR4D44WxA==", - "optional": true, - "requires": { - "@aws-sdk/types": "3.460.0", - "@smithy/node-config-provider": "^2.1.5", - "@smithy/types": "^2.5.0", - "tslib": "^2.5.0" - } - }, - "@aws-sdk/util-utf8-browser": { - "version": "3.259.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", - "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", - "optional": true, - "requires": { - "tslib": "^2.3.1" - } - }, - "@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", - "requires": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - } - } - }, - "@babel/compat-data": { - "version": "7.20.5" - }, - "@babel/core": { - "version": "7.20.5", - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-module-transforms": "^7.20.2", - "@babel/helpers": "^7.20.5", - "@babel/parser": "^7.20.5", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "requires": { - "ms": "2.1.2" - } - } - } - }, - "@babel/generator": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.5.tgz", - "integrity": "sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA==", - "requires": { - "@babel/types": "^7.23.5", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.9", - "dev": true, - "requires": { - "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.9" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.20.0", - "requires": { - "@babel/compat-data": "^7.20.0", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "semver": "^6.3.0" - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.20.5", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-member-expression-to-functions": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.19.1", - "@babel/helper-split-export-declaration": "^7.18.6" - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.20.5", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.2.1" - } - }, - "@babel/helper-define-polyfill-provider": { - "version": "0.3.3", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "dev": true, - "requires": { - "ms": "2.1.2" - } - } - } - }, - "@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==" - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.18.6", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "requires": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.18.9", - "dev": true, - "requires": { - "@babel/types": "^7.18.9" - } - }, - "@babel/helper-module-imports": { - "version": "7.18.6", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-transforms": { - "version": "7.20.2", - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.1", - "@babel/types": "^7.20.2" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.20.2" - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" - } - }, - "@babel/helper-replace-supers": { - "version": "7.19.1", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/traverse": "^7.19.1", - "@babel/types": "^7.19.0" - } - }, - "@babel/helper-simple-access": { - "version": "7.20.2", - "requires": { - "@babel/types": "^7.20.2" - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.20.0", - "requires": { - "@babel/types": "^7.20.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==" - }, - "@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==" - }, - "@babel/helper-validator-option": { - "version": "7.18.6" - }, - "@babel/helper-wrap-function": { - "version": "7.20.5", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.19.0", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" - } - }, - "@babel/helpers": { - "version": "7.20.6", - "requires": { - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" - } - }, - "@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "requires": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - } - } - }, - "@babel/parser": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.5.tgz", - "integrity": "sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==" - }, - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.18.9", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", - "@babel/plugin-proposal-optional-chaining": "^7.18.9" - } - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.1", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-proposal-class-static-block": { - "version": "7.18.6", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - } - }, - "@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - } - }, - "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.18.9", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.2", - "dev": true, - "requires": { - "@babel/compat-data": "^7.20.1", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.1" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.18.9", - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-proposal-private-property-in-object": { - "version": "7.20.5", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-import-assertions": { - "version": "7.20.0", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.19.0" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.18.6", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.20.0", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.19.0" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.18.6", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.18.6", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-remap-async-to-generator": "^7.18.6" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.20.5", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.20.2", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.19.1", - "@babel/helper-split-export-declaration": "^7.18.6", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.18.9", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.20.2", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.18.8", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.18.9", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.18.9", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.19.6", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.19.6", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-simple-access": "^7.19.4" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.19.6", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-validator-identifier": "^7.19.1" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.20.5", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.18.6", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.18.6", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.20.5", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.20.5", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "regenerator-transform": "^0.15.1" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.19.0", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.18.10", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/preset-env": { - "version": "7.20.2", - "dev": true, - "requires": { - "@babel/compat-data": "^7.20.1", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.20.1", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.18.6", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.20.2", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.18.6", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.20.0", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.18.6", - "@babel/plugin-transform-async-to-generator": "^7.18.6", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.20.2", - "@babel/plugin-transform-classes": "^7.20.2", - "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.20.2", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.18.8", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.19.6", - "@babel/plugin-transform-modules-commonjs": "^7.19.6", - "@babel/plugin-transform-modules-systemjs": "^7.19.6", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.20.1", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.18.6", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.19.0", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.10", - "@babel/plugin-transform-unicode-regex": "^7.18.6", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.20.2", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "core-js-compat": "^3.25.1", - "semver": "^6.3.0" - } - }, - "@babel/preset-modules": { - "version": "0.1.5", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/runtime": { - "version": "7.20.6", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.11" - } - }, - "@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - } - }, - "@babel/traverse": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.5.tgz", - "integrity": "sha512-czx7Xy5a6sapWWRx61m1Ke1Ra4vczu1mCTtJam5zRTBOonfdJ+S/B6HYmGYu3fJtr8GGET3si6IhgWVBhJ/m8w==", - "requires": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.5", - "@babel/types": "^7.23.5", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "requires": { - "ms": "2.1.2" - } - } - } - }, - "@babel/types": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.5.tgz", - "integrity": "sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w==", - "requires": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "dev": true - }, - "@eslint/eslintrc": { - "version": "1.3.3", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.15.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "argparse": { - "version": "2.0.1", - "dev": true - }, - "debug": { - "version": "4.3.4", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "globals": { - "version": "13.19.0", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "js-yaml": { - "version": "4.1.0", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - } - } - }, - "@humanwhocodes/config-array": { - "version": "0.11.7", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "dev": true, - "requires": { - "ms": "2.1.2" - } - } - } - }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "dev": true - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "dev": true - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "dev": true - }, - "@jest/console": { - "version": "29.3.1", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.3.1", - "jest-util": "^29.3.1", - "slash": "^3.0.0" - } - }, - "@jest/core": { - "version": "29.3.1", - "dev": true, - "requires": { - "@jest/console": "^29.3.1", - "@jest/reporters": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.2.0", - "jest-config": "^29.3.1", - "jest-haste-map": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-regex-util": "^29.2.0", - "jest-resolve": "^29.3.1", - "jest-resolve-dependencies": "^29.3.1", - "jest-runner": "^29.3.1", - "jest-runtime": "^29.3.1", - "jest-snapshot": "^29.3.1", - "jest-util": "^29.3.1", - "jest-validate": "^29.3.1", - "jest-watcher": "^29.3.1", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "@jest/environment": { - "version": "29.3.1", - "dev": true, - "requires": { - "@jest/fake-timers": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-mock": "^29.3.1" - } - }, - "@jest/expect": { - "version": "29.3.1", - "dev": true, - "requires": { - "expect": "^29.3.1", - "jest-snapshot": "^29.3.1" - } - }, - "@jest/expect-utils": { - "version": "29.3.1", - "dev": true, - "requires": { - "jest-get-type": "^29.2.0" - } - }, - "@jest/fake-timers": { - "version": "29.3.1", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@sinonjs/fake-timers": "^9.1.2", - "@types/node": "*", - "jest-message-util": "^29.3.1", - "jest-mock": "^29.3.1", - "jest-util": "^29.3.1" - } - }, - "@jest/globals": { - "version": "29.3.1", - "dev": true, - "requires": { - "@jest/environment": "^29.3.1", - "@jest/expect": "^29.3.1", - "@jest/types": "^29.3.1", - "jest-mock": "^29.3.1" - } - }, - "@jest/reporters": { - "version": "29.3.1", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", - "@jridgewell/trace-mapping": "^0.3.15", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.3.1", - "jest-util": "^29.3.1", - "jest-worker": "^29.3.1", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - } - }, - "@jest/schemas": { - "version": "29.0.0", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "@jest/source-map": { - "version": "29.2.0", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.15", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - } - }, - "@jest/test-result": { - "version": "29.3.1", - "dev": true, - "requires": { - "@jest/console": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/test-sequencer": { - "version": "29.3.1", - "dev": true, - "requires": { - "@jest/test-result": "^29.3.1", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.3.1", - "slash": "^3.0.0" - } - }, - "@jest/transform": { - "version": "29.3.1", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.3.1", - "@jridgewell/trace-mapping": "^0.3.15", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.3.1", - "jest-regex-util": "^29.2.0", - "jest-util": "^29.3.1", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" - }, - "dependencies": { - "convert-source-map": { - "version": "2.0.0", - "dev": true - } - } - }, - "@jest/types": { - "version": "29.3.1", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - } - }, - "@jridgewell/gen-mapping": { - "version": "0.1.1", - "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0" - }, - "@jridgewell/set-array": { - "version": "1.1.2" - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14" - }, - "@jridgewell/trace-mapping": { - "version": "0.3.17", - "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "@mapbox/node-pre-gyp": { - "version": "1.0.10", - "requires": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "dependencies": { - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "@mongodb-js/saslprep": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.1.tgz", - "integrity": "sha512-t7c5K033joZZMspnHg/gWPE4kandgc2OxE74aYOtGKfgB9VPuVJPix0H6fhmm2erj5PBJ21mqcx34lpIGtUCsQ==", - "optional": true, - "requires": { - "sparse-bitfield": "^3.0.3" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@sinclair/typebox": { - "version": "0.24.51", - "dev": true - }, - "@sinonjs/commons": { - "version": "1.8.6", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "9.1.2", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, - "@smithy/abort-controller": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.14.tgz", - "integrity": "sha512-zXtteuYLWbSXnzI3O6xq3FYvigYZFW8mdytGibfarLL2lxHto9L3ILtGVnVGmFZa7SDh62l39EnU5hesLN87Fw==", - "optional": true, - "requires": { - "@smithy/types": "^2.6.0", - "tslib": "^2.5.0" - } - }, - "@smithy/config-resolver": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.19.tgz", - "integrity": "sha512-JsghnQ5zjWmjEVY8TFOulLdEOCj09SjRLugrHlkPZTIBBm7PQitCFVLThbsKPZQOP7N3ME1DU1nKUc1UaVnBog==", - "optional": true, - "requires": { - "@smithy/node-config-provider": "^2.1.6", - "@smithy/types": "^2.6.0", - "@smithy/util-config-provider": "^2.0.0", - "@smithy/util-middleware": "^2.0.7", - "tslib": "^2.5.0" - } - }, - "@smithy/credential-provider-imds": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.1.2.tgz", - "integrity": "sha512-Y62jBWdoLPSYjr9fFvJf+KwTa1EunjVr6NryTEWCnwIY93OJxwV4t0qxjwdPl/XMsUkq79ppNJSEQN6Ohnhxjw==", - "optional": true, - "requires": { - "@smithy/node-config-provider": "^2.1.6", - "@smithy/property-provider": "^2.0.15", - "@smithy/types": "^2.6.0", - "@smithy/url-parser": "^2.0.14", - "tslib": "^2.5.0" - } - }, - "@smithy/eventstream-codec": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.14.tgz", - "integrity": "sha512-g/OU/MeWGfHDygoXgMWfG/Xb0QqDnAGcM9t2FRrVAhleXYRddGOEnfanR5cmHgB9ue52MJsyorqFjckzXsylaA==", - "optional": true, - "requires": { - "@aws-crypto/crc32": "3.0.0", - "@smithy/types": "^2.6.0", - "@smithy/util-hex-encoding": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@smithy/fetch-http-handler": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.2.7.tgz", - "integrity": "sha512-iSDBjxuH9TgrtMYAr7j5evjvkvgwLY3y+9D547uep+JNkZ1ZT+BaeU20j6I/bO/i26ilCWFImrlXTPsfQtZdIQ==", - "optional": true, - "requires": { - "@smithy/protocol-http": "^3.0.10", - "@smithy/querystring-builder": "^2.0.14", - "@smithy/types": "^2.6.0", - "@smithy/util-base64": "^2.0.1", - "tslib": "^2.5.0" - } - }, - "@smithy/hash-node": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.16.tgz", - "integrity": "sha512-Wbi9A0PacMYUOwjAulQP90Wl3mQ6NDwnyrZQzFjDz+UzjXOSyQMgBrTkUBz+pVoYVlX3DUu24gWMZBcit+wOGg==", - "optional": true, - "requires": { - "@smithy/types": "^2.6.0", - "@smithy/util-buffer-from": "^2.0.0", - "@smithy/util-utf8": "^2.0.2", - "tslib": "^2.5.0" - } - }, - "@smithy/invalid-dependency": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.14.tgz", - "integrity": "sha512-d8ohpwZo9RzTpGlAfsWtfm1SHBSU7+N4iuZ6MzR10xDTujJJWtmXYHK1uzcr7rggbpUTaWyHpPFgnf91q0EFqQ==", - "optional": true, - "requires": { - "@smithy/types": "^2.6.0", - "tslib": "^2.5.0" - } - }, - "@smithy/is-array-buffer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.0.0.tgz", - "integrity": "sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==", - "optional": true, - "requires": { - "tslib": "^2.5.0" - } - }, - "@smithy/middleware-content-length": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.16.tgz", - "integrity": "sha512-9ddDia3pp1d3XzLXKcm7QebGxLq9iwKf+J1LapvlSOhpF8EM9SjMeSrMOOFgG+2TfW5K3+qz4IAJYYm7INYCng==", - "optional": true, - "requires": { - "@smithy/protocol-http": "^3.0.10", - "@smithy/types": "^2.6.0", - "tslib": "^2.5.0" - } - }, - "@smithy/middleware-endpoint": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.2.1.tgz", - "integrity": "sha512-dVDS7HNJl/wb0lpByXor6whqDbb1YlLoaoWYoelyYzLHioXOE7y/0iDwJWtDcN36/tVCw9EPBFZ3aans84jLpg==", - "optional": true, - "requires": { - "@smithy/middleware-serde": "^2.0.14", - "@smithy/node-config-provider": "^2.1.6", - "@smithy/shared-ini-file-loader": "^2.2.5", - "@smithy/types": "^2.6.0", - "@smithy/url-parser": "^2.0.14", - "@smithy/util-middleware": "^2.0.7", - "tslib": "^2.5.0" - } - }, - "@smithy/middleware-retry": { - "version": "2.0.21", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.21.tgz", - "integrity": "sha512-EZS1EXv1k6IJX6hyu/0yNQuPcPaXwG8SWljQHYueyRbOxmqYgoWMWPtfZj0xRRQ4YtLawQSpBgAeiJltq8/MPw==", - "optional": true, - "requires": { - "@smithy/node-config-provider": "^2.1.6", - "@smithy/protocol-http": "^3.0.10", - "@smithy/service-error-classification": "^2.0.7", - "@smithy/types": "^2.6.0", - "@smithy/util-middleware": "^2.0.7", - "@smithy/util-retry": "^2.0.7", - "tslib": "^2.5.0", - "uuid": "^8.3.2" - } - }, - "@smithy/middleware-serde": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.14.tgz", - "integrity": "sha512-hFi3FqoYWDntCYA2IGY6gJ6FKjq2gye+1tfxF2HnIJB5uW8y2DhpRNBSUMoqP+qvYzRqZ6ntv4kgbG+o3pX57g==", - "optional": true, - "requires": { - "@smithy/types": "^2.6.0", - "tslib": "^2.5.0" - } - }, - "@smithy/middleware-stack": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.8.tgz", - "integrity": "sha512-7/N59j0zWqVEKExJcA14MrLDZ/IeN+d6nbkN8ucs+eURyaDUXWYlZrQmMOd/TyptcQv0+RDlgag/zSTTV62y/Q==", - "optional": true, - "requires": { - "@smithy/types": "^2.6.0", - "tslib": "^2.5.0" - } - }, - "@smithy/node-config-provider": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.1.6.tgz", - "integrity": "sha512-HLqTs6O78m3M3z1cPLFxddxhEPv5MkVatfPuxoVO3A+cHZanNd/H5I6btcdHy6N2CB1MJ/lihJC92h30SESsBA==", - "optional": true, - "requires": { - "@smithy/property-provider": "^2.0.15", - "@smithy/shared-ini-file-loader": "^2.2.5", - "@smithy/types": "^2.6.0", - "tslib": "^2.5.0" - } - }, - "@smithy/node-http-handler": { - "version": "2.1.10", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.1.10.tgz", - "integrity": "sha512-lkALAwtN6odygIM4nB8aHDahINM6WXXjNrZmWQAh0RSossySRT2qa31cFv0ZBuAYVWeprskRk13AFvvLmf1WLw==", - "optional": true, - "requires": { - "@smithy/abort-controller": "^2.0.14", - "@smithy/protocol-http": "^3.0.10", - "@smithy/querystring-builder": "^2.0.14", - "@smithy/types": "^2.6.0", - "tslib": "^2.5.0" - } - }, - "@smithy/property-provider": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.15.tgz", - "integrity": "sha512-YbRFBn8oiiC3o1Kn3a4KjGa6k47rCM9++5W9cWqYn9WnkyH+hBWgfJAckuxpyA2Hq6Ys4eFrWzXq6fqHEw7iew==", - "optional": true, - "requires": { - "@smithy/types": "^2.6.0", - "tslib": "^2.5.0" - } - }, - "@smithy/protocol-http": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.10.tgz", - "integrity": "sha512-6+tjNk7rXW7YTeGo9qwxXj/2BFpJTe37kTj3EnZCoX/nH+NP/WLA7O83fz8XhkGqsaAhLUPo/bB12vvd47nsmg==", - "optional": true, - "requires": { - "@smithy/types": "^2.6.0", - "tslib": "^2.5.0" - } - }, - "@smithy/querystring-builder": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.14.tgz", - "integrity": "sha512-lQ4pm9vTv9nIhl5jt6uVMPludr6syE2FyJmHsIJJuOD7QPIJnrf9HhUGf1iHh9KJ4CUv21tpOU3X6s0rB6uJ0g==", - "optional": true, - "requires": { - "@smithy/types": "^2.6.0", - "@smithy/util-uri-escape": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@smithy/querystring-parser": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.14.tgz", - "integrity": "sha512-+cbtXWI9tNtQjlgQg3CA+pvL3zKTAxPnG3Pj6MP89CR3vi3QMmD0SOWoq84tqZDnJCxlsusbgIXk1ngMReXo+A==", - "optional": true, - "requires": { - "@smithy/types": "^2.6.0", - "tslib": "^2.5.0" - } - }, - "@smithy/service-error-classification": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.7.tgz", - "integrity": "sha512-LLxgW12qGz8doYto15kZ4x1rHjtXl0BnCG6T6Wb8z2DI4PT9cJfOSvzbuLzy7+5I24PAepKgFeWHRd9GYy3Z9w==", - "optional": true, - "requires": { - "@smithy/types": "^2.6.0" - } - }, - "@smithy/shared-ini-file-loader": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.2.5.tgz", - "integrity": "sha512-LHA68Iu7SmNwfAVe8egmjDCy648/7iJR/fK1UnVw+iAOUJoEYhX2DLgVd5pWllqdDiRbQQzgaHLcRokM+UFR1w==", - "optional": true, - "requires": { - "@smithy/types": "^2.6.0", - "tslib": "^2.5.0" - } - }, - "@smithy/signature-v4": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.16.tgz", - "integrity": "sha512-ilLY85xS2kZZzTb83diQKYLIYALvart0KnBaKnIRnMBHAGEio5aHSlANQoxVn0VsonwmQ3CnWhnCT0sERD8uTg==", - "optional": true, - "requires": { - "@smithy/eventstream-codec": "^2.0.14", - "@smithy/is-array-buffer": "^2.0.0", - "@smithy/types": "^2.6.0", - "@smithy/util-hex-encoding": "^2.0.0", - "@smithy/util-middleware": "^2.0.7", - "@smithy/util-uri-escape": "^2.0.0", - "@smithy/util-utf8": "^2.0.2", - "tslib": "^2.5.0" - } - }, - "@smithy/smithy-client": { - "version": "2.1.16", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.16.tgz", - "integrity": "sha512-Lw67+yQSpLl4YkDLUzI2KgS8TXclXmbzSeOJUmRFS4ueT56B4pw3RZRF/SRzvgyxM/HxgkUan8oSHXCujPDafQ==", - "optional": true, - "requires": { - "@smithy/middleware-stack": "^2.0.8", - "@smithy/types": "^2.6.0", - "@smithy/util-stream": "^2.0.21", - "tslib": "^2.5.0" - } - }, - "@smithy/types": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.6.0.tgz", - "integrity": "sha512-PgqxJq2IcdMF9iAasxcqZqqoOXBHufEfmbEUdN1pmJrJltT42b0Sc8UiYSWWzKkciIp9/mZDpzYi4qYG1qqg6g==", - "optional": true, - "requires": { - "tslib": "^2.5.0" - } - }, - "@smithy/url-parser": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.14.tgz", - "integrity": "sha512-kbu17Y1AFXi5lNlySdDj7ZzmvupyWKCX/0jNZ8ffquRyGdbDZb+eBh0QnWqsSmnZa/ctyWaTf7n4l/pXLExrnw==", - "optional": true, - "requires": { - "@smithy/querystring-parser": "^2.0.14", - "@smithy/types": "^2.6.0", - "tslib": "^2.5.0" - } - }, - "@smithy/util-base64": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.0.1.tgz", - "integrity": "sha512-DlI6XFYDMsIVN+GH9JtcRp3j02JEVuWIn/QOZisVzpIAprdsxGveFed0bjbMRCqmIFe8uetn5rxzNrBtIGrPIQ==", - "optional": true, - "requires": { - "@smithy/util-buffer-from": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@smithy/util-body-length-browser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.0.0.tgz", - "integrity": "sha512-JdDuS4ircJt+FDnaQj88TzZY3+njZ6O+D3uakS32f2VNnDo3vyEuNdBOh/oFd8Df1zSZOuH1HEChk2AOYDezZg==", - "optional": true, - "requires": { - "tslib": "^2.5.0" - } - }, - "@smithy/util-body-length-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.1.0.tgz", - "integrity": "sha512-/li0/kj/y3fQ3vyzn36NTLGmUwAICb7Jbe/CsWCktW363gh1MOcpEcSO3mJ344Gv2dqz8YJCLQpb6hju/0qOWw==", - "optional": true, - "requires": { - "tslib": "^2.5.0" - } - }, - "@smithy/util-buffer-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.0.0.tgz", - "integrity": "sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==", - "optional": true, - "requires": { - "@smithy/is-array-buffer": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@smithy/util-config-provider": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.0.0.tgz", - "integrity": "sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg==", - "optional": true, - "requires": { - "tslib": "^2.5.0" - } - }, - "@smithy/util-defaults-mode-browser": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.20.tgz", - "integrity": "sha512-QJtnbTIl0/BbEASkx1MUFf6EaoWqWW1/IM90N++8NNscePvPf77GheYfpoPis6CBQawUWq8QepTP2QUSAdrVkw==", - "optional": true, - "requires": { - "@smithy/property-provider": "^2.0.15", - "@smithy/smithy-client": "^2.1.16", - "@smithy/types": "^2.6.0", - "bowser": "^2.11.0", - "tslib": "^2.5.0" - } - }, - "@smithy/util-defaults-mode-node": { - "version": "2.0.26", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.26.tgz", - "integrity": "sha512-lGFPOFCHv1ql019oegYqa54BZH7HREw6EBqjDLbAr0wquMX0BDi2sg8TJ6Eq+JGLijkZbJB73m4+aK8OFAapMg==", - "optional": true, - "requires": { - "@smithy/config-resolver": "^2.0.19", - "@smithy/credential-provider-imds": "^2.1.2", - "@smithy/node-config-provider": "^2.1.6", - "@smithy/property-provider": "^2.0.15", - "@smithy/smithy-client": "^2.1.16", - "@smithy/types": "^2.6.0", - "tslib": "^2.5.0" - } - }, - "@smithy/util-endpoints": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.0.5.tgz", - "integrity": "sha512-K7qNuCOD5K/90MjHvHm9kJldrfm40UxWYQxNEShMFxV/lCCCRIg8R4uu1PFAxRvPxNpIdcrh1uK6I1ISjDXZJw==", - "optional": true, - "requires": { - "@smithy/node-config-provider": "^2.1.6", - "@smithy/types": "^2.6.0", - "tslib": "^2.5.0" - } - }, - "@smithy/util-hex-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz", - "integrity": "sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==", - "optional": true, - "requires": { - "tslib": "^2.5.0" - } - }, - "@smithy/util-middleware": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.7.tgz", - "integrity": "sha512-tRINOTlf1G9B0ECarFQAtTgMhpnrMPSa+5j4ZEwEawCLfTFTavk6757sxhE4RY5RMlD/I3x+DCS8ZUiR8ho9Pw==", - "optional": true, - "requires": { - "@smithy/types": "^2.6.0", - "tslib": "^2.5.0" - } - }, - "@smithy/util-retry": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.7.tgz", - "integrity": "sha512-fIe5yARaF0+xVT1XKcrdnHKTJ1Vc4+3e3tLDjCuIcE9b6fkBzzGFY7AFiX4M+vj6yM98DrwkuZeHf7/hmtVp0Q==", - "optional": true, - "requires": { - "@smithy/service-error-classification": "^2.0.7", - "@smithy/types": "^2.6.0", - "tslib": "^2.5.0" - } - }, - "@smithy/util-stream": { - "version": "2.0.21", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.21.tgz", - "integrity": "sha512-0BUE16d7n1x7pi1YluXJdB33jOTyBChT0j/BlOkFa9uxfg6YqXieHxjHNuCdJRARa7AZEj32LLLEPJ1fSa4inA==", - "optional": true, - "requires": { - "@smithy/fetch-http-handler": "^2.2.7", - "@smithy/node-http-handler": "^2.1.10", - "@smithy/types": "^2.6.0", - "@smithy/util-base64": "^2.0.1", - "@smithy/util-buffer-from": "^2.0.0", - "@smithy/util-hex-encoding": "^2.0.0", - "@smithy/util-utf8": "^2.0.2", - "tslib": "^2.5.0" - } - }, - "@smithy/util-uri-escape": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.0.0.tgz", - "integrity": "sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==", - "optional": true, - "requires": { - "tslib": "^2.5.0" - } - }, - "@smithy/util-utf8": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.0.2.tgz", - "integrity": "sha512-qOiVORSPm6Ce4/Yu6hbSgNHABLP2VMv8QOC3tTDNHHlWY19pPyc++fBTbZPtx6egPXi4HQxKDnMxVxpbtX2GoA==", - "optional": true, - "requires": { - "@smithy/util-buffer-from": "^2.0.0", - "tslib": "^2.5.0" - } - }, - "@types/babel__core": { - "version": "7.1.16", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.3", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.4.1", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.11.0", - "dev": true, - "requires": { - "@babel/types": "^7.3.0" - } - }, - "@types/graceful-fs": { - "version": "4.1.5", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.4", - "dev": true - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "3.0.1", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/jest": { - "version": "29.4.0", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.4.0.tgz", - "integrity": "sha512-VaywcGQ9tPorCX/Jkkni7RWGFfI11whqzs8dvxF41P17Z+z872thvEvlIbznjPJ02kl1HMX3LmLOonsj2n7HeQ==", - "dev": true, - "requires": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "@types/node": { - "version": "14.14.12" - }, - "@types/prettier": { - "version": "2.7.1", - "dev": true - }, - "@types/stack-utils": { - "version": "2.0.1", - "dev": true - }, - "@types/webidl-conversions": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", - "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==" - }, - "@types/whatwg-url": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", - "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", - "requires": { - "@types/node": "*", - "@types/webidl-conversions": "*" - } - }, - "@types/yargs": { - "version": "17.0.17", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "21.0.0", - "dev": true - }, - "abbrev": { - "version": "1.1.1" - }, - "accepts": { - "version": "1.3.8", - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, - "acorn": { - "version": "8.8.1", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "dev": true, - "requires": {} - }, - "agent-base": { - "version": "6.0.2", - "requires": { - "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "requires": { - "ms": "2.1.2" - } - } - } - }, - "ajv": { - "version": "6.12.6", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-escapes": { - "version": "4.3.2", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - }, - "dependencies": { - "type-fest": { - "version": "0.21.3", - "dev": true - } - } - }, - "ansi-regex": { - "version": "5.0.1" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "3.1.3", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "append-field": { - "version": "1.0.0" - }, - "aproba": { - "version": "2.0.0" - }, - "are-we-there-yet": { - "version": "2.0.0", - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "argparse": { - "version": "1.0.10", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "array-flatten": { - "version": "1.1.1" - }, - "asap": { - "version": "2.0.6", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "dev": true - }, - "babel": { - "version": "6.23.0" - }, - "babel-jest": { - "version": "29.3.1", - "dev": true, - "requires": { - "@jest/transform": "^29.3.1", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.2.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - } - }, - "babel-plugin-istanbul": { - "version": "6.1.1", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - } - }, - "babel-plugin-jest-hoist": { - "version": "29.2.0", - "dev": true, - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-plugin-polyfill-corejs2": { - "version": "0.3.3", - "dev": true, - "requires": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", - "semver": "^6.1.1" - } - }, - "babel-plugin-polyfill-corejs3": { - "version": "0.6.0", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.3", - "core-js-compat": "^3.25.1" - } - }, - "babel-plugin-polyfill-regenerator": { - "version": "0.4.1", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.3" - } - }, - "babel-plugin-transform-import-meta": { - "version": "2.2.0", - "dev": true, - "requires": { - "@babel/template": "^7.4.4", - "tslib": "^2.4.0" - } - }, - "babel-preset-current-node-syntax": { - "version": "1.0.1", - "dev": true, - "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - } - }, - "babel-preset-jest": { - "version": "29.2.0", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^29.2.0", - "babel-preset-current-node-syntax": "^1.0.0" - } - }, - "balanced-match": { - "version": "1.0.0" - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, - "base64url": { - "version": "3.0.1" - }, - "basic-auth": { - "version": "2.0.1", - "requires": { - "safe-buffer": "5.1.2" - } - }, - "bcrypt": { - "version": "5.1.0", - "requires": { - "@mapbox/node-pre-gyp": "^1.0.10", - "node-addon-api": "^5.0.0" - } - }, - "binary-extensions": { - "version": "2.2.0", - "dev": true - }, - "bl": { - "version": "2.2.1", - "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "body-parser": { - "version": "1.20.1", - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0" - }, - "on-finished": { - "version": "2.4.1", - "requires": { - "ee-first": "1.1.1" - } - } - } - }, - "boolbase": { - "version": "1.0.0" - }, - "bowser": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", - "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browserslist": { - "version": "4.21.4", - "requires": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" - } - }, - "bser": { - "version": "2.1.1", - "dev": true, - "requires": { - "node-int64": "^0.4.0" - } - }, - "bson": { - "version": "1.1.5" - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "buffer-equal-constant-time": { - "version": "1.0.1" - }, - "buffer-from": { - "version": "1.1.1" - }, - "busboy": { - "version": "1.6.0", - "requires": { - "streamsearch": "^1.1.0" - } - }, - "bytes": { - "version": "3.1.2" - }, - "call-bind": { - "version": "1.0.2", - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001439" - }, - "chalk": { - "version": "4.1.0", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "char-regex": { - "version": "1.0.2", - "dev": true - }, - "chokidar": { - "version": "3.5.3", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "chownr": { - "version": "2.0.0" - }, - "ci-info": { - "version": "3.7.0", - "dev": true - }, - "cjs-module-lexer": { - "version": "1.2.2", - "dev": true - }, - "cli-table3": { - "version": "0.5.1", - "dev": true, - "requires": { - "colors": "^1.1.2", - "object-assign": "^4.1.0", - "string-width": "^2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.1", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "cliui": { - "version": "8.0.1", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - } - }, - "cloudinary": { - "version": "1.41.0", - "resolved": "https://registry.npmjs.org/cloudinary/-/cloudinary-1.41.0.tgz", - "integrity": "sha512-qFf2McjvILJITePf4VF1PrY/8c2zy+/q5FVV6V3VWrP/gpIZsusPqXL4QZ6ZKXibPRukzMYqsQEhaSQgJHKKow==", - "requires": { - "cloudinary-core": "^2.13.0", - "core-js": "^3.30.1", - "lodash": "^4.17.21", - "q": "^1.5.1" - } - }, - "cloudinary-core": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/cloudinary-core/-/cloudinary-core-2.13.0.tgz", - "integrity": "sha512-Nt0Q5I2FtenmJghtC4YZ3MZZbGg1wLm84SsxcuVwZ83OyJqG9CNIGp86CiI6iDv3QobaqBUpOT7vg+HqY5HxEA==", - "requires": {} - }, - "co": { - "version": "4.6.0", - "dev": true - }, - "collect-v8-coverage": { - "version": "1.0.1", - "dev": true - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "color-support": { - "version": "1.1.3" - }, - "colors": { - "version": "1.4.0", - "dev": true, - "optional": true - }, - "combined-stream": { - "version": "1.0.8", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "component-emitter": { - "version": "1.3.0", - "dev": true - }, - "concat-map": { - "version": "0.0.1" - }, - "concat-stream": { - "version": "1.6.2", - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "console-control-strings": { - "version": "1.1.0" - }, - "content-disposition": { - "version": "0.5.4", - "requires": { - "safe-buffer": "5.2.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1" - } - } - }, - "content-type": { - "version": "1.0.4" - }, - "convert-source-map": { - "version": "1.7.0", - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cookie": { - "version": "0.4.2" - }, - "cookie-signature": { - "version": "1.0.6" - }, - "cookiejar": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", - "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", - "dev": true - }, - "core-js": { - "version": "3.33.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.33.3.tgz", - "integrity": "sha512-lo0kOocUlLKmm6kv/FswQL8zbkH7mVsLJ/FULClOhv8WRVmKLVcs6XPNQAzstfeJTCHMyButEwG+z1kHxHoDZw==" - }, - "core-js-compat": { - "version": "3.26.1", - "dev": true, - "requires": { - "browserslist": "^4.21.4" - } - }, - "core-util-is": { - "version": "1.0.2" - }, - "cross-spawn": { - "version": "7.0.3", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "css-select": { - "version": "5.1.0", - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - } - }, - "css-what": { - "version": "6.1.0" - }, - "debug": { - "version": "3.2.7", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "dedent": { - "version": "0.7.0", - "dev": true - }, - "deep-is": { - "version": "0.1.3", - "dev": true - }, - "deepmerge": { - "version": "4.2.2", - "dev": true - }, - "delayed-stream": { - "version": "1.0.0", - "dev": true - }, - "delegates": { - "version": "1.0.0" - }, - "denque": { - "version": "1.4.1" - }, - "depd": { - "version": "2.0.0" - }, - "destroy": { - "version": "1.2.0" - }, - "detect-libc": { - "version": "2.0.1" - }, - "detect-newline": { - "version": "3.1.0", - "dev": true - }, - "dezalgo": { - "version": "1.0.4", - "dev": true, - "requires": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "diff-sequences": { - "version": "29.3.1", - "dev": true - }, - "doctrine": { - "version": "3.0.0", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dom-serializer": { - "version": "2.0.0", - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - } - }, - "domelementtype": { - "version": "2.3.0" - }, - "domhandler": { - "version": "5.0.3", - "requires": { - "domelementtype": "^2.3.0" - } - }, - "domutils": { - "version": "3.0.1", - "requires": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.1" - } - }, - "dotenv": { - "version": "8.2.0" - }, - "dotenv-flow": { - "version": "3.2.0", - "requires": { - "dotenv": "^8.0.0" - } - }, - "ecdsa-sig-formatter": { - "version": "1.0.11", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "ee-first": { - "version": "1.1.1" - }, - "electron-to-chromium": { - "version": "1.4.284" - }, - "emittery": { - "version": "0.13.1", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0" - }, - "encodeurl": { - "version": "1.0.2" - }, - "entities": { - "version": "4.4.0" - }, - "error-ex": { - "version": "1.3.2", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "escalade": { - "version": "3.1.1" - }, - "escape-html": { - "version": "1.0.3" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" - }, - "eslint": { - "version": "8.29.0", - "dev": true, - "requires": { - "@eslint/eslintrc": "^1.3.3", - "@humanwhocodes/config-array": "^0.11.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.15.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, - "dependencies": { - "argparse": { - "version": "2.0.1", - "dev": true - }, - "debug": { - "version": "4.3.2", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "escape-string-regexp": { - "version": "4.0.0", - "dev": true - }, - "find-up": { - "version": "5.0.0", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "glob-parent": { - "version": "6.0.2", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - }, - "dependencies": { - "is-glob": { - "version": "4.0.3", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - } - } - }, - "globals": { - "version": "13.19.0", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "js-yaml": { - "version": "4.1.0", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "locate-path": { - "version": "6.0.0", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "optionator": { - "version": "0.9.1", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "p-locate": { - "version": "5.0.0", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - } - } - }, - "eslint-scope": { - "version": "7.1.1", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "eslint-utils": { - "version": "3.0.0", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "3.3.0", - "dev": true - }, - "espree": { - "version": "9.4.1", - "dev": true, - "requires": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - } - }, - "esprima": { - "version": "4.0.1", - "dev": true - }, - "esquery": { - "version": "1.4.0", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - } - }, - "esrecurse": { - "version": "4.3.0", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.2.0", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "dev": true - }, - "etag": { - "version": "1.8.1" - }, - "execa": { - "version": "5.1.1", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "exit": { - "version": "0.1.2", - "dev": true - }, - "expect": { - "version": "29.3.1", - "dev": true, - "requires": { - "@jest/expect-utils": "^29.3.1", - "jest-get-type": "^29.2.0", - "jest-matcher-utils": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-util": "^29.3.1" - } - }, - "express": { - "version": "4.18.2", - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "cookie": { - "version": "0.5.0" - }, - "debug": { - "version": "2.6.9", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0" - }, - "on-finished": { - "version": "2.4.1", - "requires": { - "ee-first": "1.1.1" - } - }, - "safe-buffer": { - "version": "5.2.1" - } - } - }, - "express-handlebars": { - "version": "6.0.2", - "requires": { - "glob": "^7.2.0", - "graceful-fs": "^4.2.8", - "handlebars": "^4.7.7" - }, - "dependencies": { - "glob": { - "version": "7.2.0", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, - "express-rate-limit": { - "version": "6.7.0", - "requires": {} - }, - "express-session": { - "version": "1.17.3", - "requires": { - "cookie": "0.4.2", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~2.0.0", - "on-headers": "~1.0.2", - "parseurl": "~1.3.3", - "safe-buffer": "5.2.1", - "uid-safe": "~2.1.5" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0" - }, - "safe-buffer": { - "version": "5.2.1" - } - } - }, - "express-validator": { - "version": "6.14.2", - "requires": { - "lodash": "^4.17.21", - "validator": "^13.7.0" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "dev": true - }, - "fast-safe-stringify": { - "version": "2.1.1", - "dev": true - }, - "fast-xml-parser": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", - "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==", - "optional": true, - "requires": { - "strnum": "^1.0.5" - } - }, - "fastq": { - "version": "1.14.0", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fb-watchman": { - "version": "2.0.2", - "dev": true, - "requires": { - "bser": "2.1.1" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "finalhandler": { - "version": "1.2.0", - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0" - }, - "on-finished": { - "version": "2.4.1", - "requires": { - "ee-first": "1.1.1" - } - } - } - }, - "find-up": { - "version": "4.1.0", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "flat-cache": { - "version": "3.0.4", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.2", - "dev": true - }, - "form-data": { - "version": "4.0.0", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "formidable": { - "version": "2.1.1", - "dev": true, - "requires": { - "dezalgo": "^1.0.4", - "hexoid": "^1.0.0", - "once": "^1.4.0", - "qs": "^6.11.0" - } - }, - "forwarded": { - "version": "0.2.0" - }, - "fresh": { - "version": "0.5.2" - }, - "fs-minipass": { - "version": "2.1.0", - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "fs.realpath": { - "version": "1.0.0" - }, - "function-bind": { - "version": "1.1.1" - }, - "gauge": { - "version": "3.0.2", - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - } - }, - "gensync": { - "version": "1.0.0-beta.2" - }, - "get-caller-file": { - "version": "2.0.5", - "dev": true - }, - "get-intrinsic": { - "version": "1.1.1", - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } - }, - "get-package-type": { - "version": "0.1.0", - "dev": true - }, - "get-stdin": { - "version": "8.0.0", - "dev": true - }, - "get-stream": { - "version": "6.0.1", - "dev": true - }, - "glob": { - "version": "7.1.6", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "11.12.0" - }, - "graceful-fs": { - "version": "4.2.10" - }, - "grapheme-splitter": { - "version": "1.0.4", - "dev": true - }, - "handlebars": { - "version": "4.7.7", - "requires": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4", - "wordwrap": "^1.0.0" - } - }, - "has": { - "version": "1.0.3", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "3.0.0" - }, - "has-symbols": { - "version": "1.0.2" - }, - "has-unicode": { - "version": "2.0.1" - }, - "helmet": { - "version": "6.0.1" - }, - "hexoid": { - "version": "1.0.0", - "dev": true - }, - "html-escaper": { - "version": "2.0.2", - "dev": true - }, - "htmlparser2": { - "version": "8.0.1", - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "entities": "^4.3.0" - } - }, - "http-errors": { - "version": "2.0.0", - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "http-status-codes": { - "version": "2.2.0" - }, - "https-proxy-agent": { - "version": "5.0.1", - "requires": { - "agent-base": "6", - "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "requires": { - "ms": "2.1.2" - } - } - } - }, - "human-signals": { - "version": "2.1.0", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, - "ignore": { - "version": "5.2.1", - "dev": true - }, - "ignore-by-default": { - "version": "1.0.1", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "dev": true - } - } - }, - "import-local": { - "version": "3.1.0", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4" - }, - "ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" - }, - "ipaddr.js": { - "version": "1.9.1" - }, - "is-arrayish": { - "version": "0.2.1", - "dev": true - }, - "is-binary-path": { - "version": "2.1.0", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-core-module": { - "version": "2.11.0", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-extglob": { - "version": "2.1.1", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0" - }, - "is-generator-fn": { - "version": "2.1.0", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "dev": true - }, - "is-path-inside": { - "version": "3.0.3", - "dev": true - }, - "is-stream": { - "version": "2.0.1", - "dev": true - }, - "isarray": { - "version": "1.0.0" - }, - "isexe": { - "version": "2.0.0", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "5.2.1", - "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.1", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "dev": true, - "requires": { - "ms": "2.1.2" - } - } - } - }, - "istanbul-reports": { - "version": "3.1.5", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jest": { - "version": "29.3.1", - "dev": true, - "requires": { - "@jest/core": "^29.3.1", - "@jest/types": "^29.3.1", - "import-local": "^3.0.2", - "jest-cli": "^29.3.1" - } - }, - "jest-changed-files": { - "version": "29.2.0", - "dev": true, - "requires": { - "execa": "^5.0.0", - "p-limit": "^3.1.0" - } - }, - "jest-circus": { - "version": "29.3.1", - "dev": true, - "requires": { - "@jest/environment": "^29.3.1", - "@jest/expect": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.3.1", - "jest-matcher-utils": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-runtime": "^29.3.1", - "jest-snapshot": "^29.3.1", - "jest-util": "^29.3.1", - "p-limit": "^3.1.0", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-cli": { - "version": "29.3.1", - "dev": true, - "requires": { - "@jest/core": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/types": "^29.3.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "import-local": "^3.0.2", - "jest-config": "^29.3.1", - "jest-util": "^29.3.1", - "jest-validate": "^29.3.1", - "prompts": "^2.0.1", - "yargs": "^17.3.1" - } - }, - "jest-config": { - "version": "29.3.1", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.3.1", - "@jest/types": "^29.3.1", - "babel-jest": "^29.3.1", - "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.3.1", - "jest-environment-node": "^29.3.1", - "jest-get-type": "^29.2.0", - "jest-regex-util": "^29.2.0", - "jest-resolve": "^29.3.1", - "jest-runner": "^29.3.1", - "jest-util": "^29.3.1", - "jest-validate": "^29.3.1", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - } - }, - "jest-diff": { - "version": "29.3.1", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^29.3.1", - "jest-get-type": "^29.2.0", - "pretty-format": "^29.3.1" - } - }, - "jest-docblock": { - "version": "29.2.0", - "dev": true, - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-each": { - "version": "29.3.1", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "chalk": "^4.0.0", - "jest-get-type": "^29.2.0", - "jest-util": "^29.3.1", - "pretty-format": "^29.3.1" - } - }, - "jest-environment-node": { - "version": "29.3.1", - "dev": true, - "requires": { - "@jest/environment": "^29.3.1", - "@jest/fake-timers": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-mock": "^29.3.1", - "jest-util": "^29.3.1" - } - }, - "jest-get-type": { - "version": "29.2.0", - "dev": true - }, - "jest-haste-map": { - "version": "29.3.1", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.2.0", - "jest-util": "^29.3.1", - "jest-worker": "^29.3.1", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - } - }, - "jest-leak-detector": { - "version": "29.3.1", - "dev": true, - "requires": { - "jest-get-type": "^29.2.0", - "pretty-format": "^29.3.1" - } - }, - "jest-matcher-utils": { - "version": "29.3.1", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^29.3.1", - "jest-get-type": "^29.2.0", - "pretty-format": "^29.3.1" - } - }, - "jest-message-util": { - "version": "29.3.1", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.3.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.3.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - } - }, - "jest-mock": { - "version": "29.3.1", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "jest-util": "^29.3.1" - } - }, - "jest-pnp-resolver": { - "version": "1.2.3", - "dev": true, - "requires": {} - }, - "jest-regex-util": { - "version": "29.2.0", - "dev": true - }, - "jest-resolve": { - "version": "29.3.1", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.3.1", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.3.1", - "jest-validate": "^29.3.1", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", - "slash": "^3.0.0" - } - }, - "jest-resolve-dependencies": { - "version": "29.3.1", - "dev": true, - "requires": { - "jest-regex-util": "^29.2.0", - "jest-snapshot": "^29.3.1" - } - }, - "jest-runner": { - "version": "29.3.1", - "dev": true, - "requires": { - "@jest/console": "^29.3.1", - "@jest/environment": "^29.3.1", - "@jest/test-result": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.2.0", - "jest-environment-node": "^29.3.1", - "jest-haste-map": "^29.3.1", - "jest-leak-detector": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-resolve": "^29.3.1", - "jest-runtime": "^29.3.1", - "jest-util": "^29.3.1", - "jest-watcher": "^29.3.1", - "jest-worker": "^29.3.1", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - } - }, - "jest-runtime": { - "version": "29.3.1", - "dev": true, - "requires": { - "@jest/environment": "^29.3.1", - "@jest/fake-timers": "^29.3.1", - "@jest/globals": "^29.3.1", - "@jest/source-map": "^29.2.0", - "@jest/test-result": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-mock": "^29.3.1", - "jest-regex-util": "^29.2.0", - "jest-resolve": "^29.3.1", - "jest-snapshot": "^29.3.1", - "jest-util": "^29.3.1", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - } - }, - "jest-snapshot": { - "version": "29.3.1", - "dev": true, - "requires": { - "@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/traverse": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.3.1", - "@jest/transform": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.3.1", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.3.1", - "jest-get-type": "^29.2.0", - "jest-haste-map": "^29.3.1", - "jest-matcher-utils": "^29.3.1", - "jest-message-util": "^29.3.1", - "jest-util": "^29.3.1", - "natural-compare": "^1.4.0", - "pretty-format": "^29.3.1", - "semver": "^7.3.5" - }, - "dependencies": { - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "jest-util": { - "version": "29.3.1", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, - "jest-validate": { - "version": "29.3.1", - "dev": true, - "requires": { - "@jest/types": "^29.3.1", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.2.0", - "leven": "^3.1.0", - "pretty-format": "^29.3.1" - }, - "dependencies": { - "camelcase": { - "version": "6.3.0", - "dev": true - } - } - }, - "jest-watcher": { - "version": "29.3.1", - "dev": true, - "requires": { - "@jest/test-result": "^29.3.1", - "@jest/types": "^29.3.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.3.1", - "string-length": "^4.0.1" - } - }, - "jest-worker": { - "version": "29.3.1", - "dev": true, - "requires": { - "@types/node": "*", - "jest-util": "^29.3.1", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "dev": true - }, - "supports-color": { - "version": "8.1.1", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "js-sdsl": { - "version": "4.2.0", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "js-yaml": { - "version": "3.14.0", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsesc": { - "version": "2.5.2" - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "dev": true - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" - }, - "jsonwebtoken": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", - "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", - "requires": { - "jws": "^3.2.2", - "lodash": "^4.17.21", - "ms": "^2.1.1", - "semver": "^7.3.8" - }, - "dependencies": { - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "jwa": { - "version": "1.4.1", - "requires": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "jws": { - "version": "3.2.2", - "requires": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, - "kareem": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.1.tgz", - "integrity": "sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==" - }, - "kleur": { - "version": "3.0.3", - "dev": true - }, - "leven": { - "version": "3.1.0", - "dev": true - }, - "levn": { - "version": "0.4.1", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lines-and-columns": { - "version": "1.2.4", - "dev": true - }, - "linkedom": { - "version": "0.14.21", - "requires": { - "css-select": "^5.1.0", - "cssom": "^0.5.0", - "html-escaper": "^3.0.3", - "htmlparser2": "^8.0.1", - "uhyphen": "^0.1.0" - }, - "dependencies": { - "cssom": { - "version": "0.5.0" - }, - "html-escaper": { - "version": "3.0.3" - } - } - }, - "locate-path": { - "version": "5.0.0", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.21" - }, - "lodash.debounce": { - "version": "4.0.8", - "dev": true - }, - "lodash.merge": { - "version": "4.6.2", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "requires": { - "yallist": "^4.0.0" - } - }, - "make-dir": { - "version": "3.1.0", - "requires": { - "semver": "^6.0.0" - } - }, - "makeerror": { - "version": "1.0.12", - "dev": true, - "requires": { - "tmpl": "1.0.5" - } - }, - "media-typer": { - "version": "0.3.0" - }, - "memory-pager": { - "version": "1.5.0", - "optional": true - }, - "merge-descriptors": { - "version": "1.0.1" - }, - "merge-stream": { - "version": "2.0.0", - "dev": true - }, - "methods": { - "version": "1.1.2" - }, - "micromatch": { - "version": "4.0.5", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime": { - "version": "1.6.0" - }, - "mime-db": { - "version": "1.52.0" - }, - "mime-types": { - "version": "2.1.35", - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.6" - }, - "minipass": { - "version": "4.0.0", - "requires": { - "yallist": "^4.0.0" - } - }, - "minizlib": { - "version": "2.1.2", - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "mkdirp": { - "version": "0.5.6", - "requires": { - "minimist": "^1.2.6" - } - }, - "mongodb": { - "version": "3.6.11", - "requires": { - "bl": "^2.2.1", - "bson": "^1.1.4", - "denque": "^1.4.1", - "optional-require": "^1.0.3", - "safe-buffer": "^5.1.2", - "saslprep": "^1.0.0" - } - }, - "mongodb-connection-string-url": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz", - "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==", - "requires": { - "@types/whatwg-url": "^8.2.1", - "whatwg-url": "^11.0.0" - }, - "dependencies": { - "tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", - "requires": { - "punycode": "^2.1.1" - } - }, - "webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==" - }, - "whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", - "requires": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - } - } - } - }, - "mongoose": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.12.3.tgz", - "integrity": "sha512-MNJymaaXali7w7rHBxVUoQ3HzHHMk/7I/+yeeoSa4rUzdjZwIWQznBNvVgc0A8ghuJwsuIkb5LyLV6gSjGjWyQ==", - "requires": { - "bson": "^4.7.2", - "kareem": "2.5.1", - "mongodb": "4.17.1", - "mpath": "0.9.0", - "mquery": "4.0.3", - "ms": "2.1.3", - "sift": "16.0.1" - }, - "dependencies": { - "bson": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.2.tgz", - "integrity": "sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ==", - "requires": { - "buffer": "^5.6.0" - } - }, - "mongodb": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.17.1.tgz", - "integrity": "sha512-MBuyYiPUPRTqfH2dV0ya4dcr2E5N52ocBuZ8Sgg/M030nGF78v855B3Z27mZJnp8PxjnUquEnAtjOsphgMZOlQ==", - "requires": { - "@aws-sdk/credential-providers": "^3.186.0", - "@mongodb-js/saslprep": "^1.1.0", - "bson": "^4.7.2", - "mongodb-connection-string-url": "^2.6.0", - "socks": "^2.7.1" - } - }, - "ms": { - "version": "2.1.3" - } - } - }, - "mongoose-unique-array": { - "version": "0.4.2", - "requires": {} - }, - "morgan": { - "version": "1.10.0", - "requires": { - "basic-auth": "~2.0.1", - "debug": "2.6.9", - "depd": "~2.0.0", - "on-finished": "~2.3.0", - "on-headers": "~1.0.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0" - } - } - }, - "mpath": { - "version": "0.9.0" - }, - "mquery": { - "version": "4.0.3", - "requires": { - "debug": "4.x" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "requires": { - "ms": "2.1.2" - } - } - } - }, - "ms": { - "version": "2.1.2" - }, - "multer": { - "version": "1.4.5-lts.1", - "requires": { - "append-field": "^1.0.0", - "busboy": "^1.0.0", - "concat-stream": "^1.5.2", - "mkdirp": "^0.5.4", - "object-assign": "^4.1.1", - "type-is": "^1.6.4", - "xtend": "^4.0.0" - } - }, - "natural-compare": { - "version": "1.4.0", - "dev": true - }, - "negotiator": { - "version": "0.6.3" - }, - "neo-async": { - "version": "2.6.2" - }, - "node-addon-api": { - "version": "5.0.0" - }, - "node-fetch": { - "version": "2.6.7", - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "node-int64": { - "version": "0.4.0", - "dev": true - }, - "node-releases": { - "version": "2.0.7" - }, - "nodemailer": { - "version": "6.8.0" - }, - "nodemailer-express-handlebars": { - "version": "5.0.0", - "requires": { - "express-handlebars": "^6.0.0" - } - }, - "nodemon": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz", - "integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==", - "dev": true, - "requires": { - "chokidar": "^3.5.2", - "debug": "^3.2.7", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.1.2", - "pstree.remy": "^1.1.8", - "semver": "^7.5.3", - "simple-update-notifier": "^2.0.0", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.5" - }, - "dependencies": { - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "nopt": { - "version": "5.0.0", - "requires": { - "abbrev": "1" - } - }, - "normalize-path": { - "version": "3.0.0", - "dev": true - }, - "npm-audit-helper": { - "version": "3.1.1", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "get-stdin": "^8.0.0", - "lodash": "^4.17.20", - "minimist": "^1.2.5", - "npm-audit-report": "npm:npm-audit-report@^1.3.3", - "npm-audit-report-v2": "npm:npm-audit-report@^2.1.4" - }, - "dependencies": { - "npm-audit-report-v2": { - "version": "npm:npm-audit-report@2.1.5", - "dev": true, - "requires": { - "chalk": "^4.0.0" - } - } - } - }, - "npm-audit-report": { - "version": "1.3.3", - "dev": true, - "requires": { - "cli-table3": "^0.5.0", - "console-control-strings": "^1.1.0" - } - }, - "npm-run-path": { - "version": "4.0.1", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "npmlog": { - "version": "5.0.1", - "requires": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "nth-check": { - "version": "2.1.1", - "requires": { - "boolbase": "^1.0.0" - } - }, - "object-assign": { - "version": "4.1.1" - }, - "object-inspect": { - "version": "1.12.2" - }, - "on-finished": { - "version": "2.3.0", - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2" - }, - "once": { - "version": "1.4.0", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "optional-require": { - "version": "1.0.3" - }, - "p-limit": { - "version": "3.1.0", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - }, - "dependencies": { - "p-limit": { - "version": "2.3.0", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - } - } - }, - "p-try": { - "version": "2.2.0", - "dev": true - }, - "parent-module": { - "version": "1.0.1", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "parseurl": { - "version": "1.3.3" - }, - "passport": { - "version": "0.6.0", - "requires": { - "passport-strategy": "1.x.x", - "pause": "0.0.1", - "utils-merge": "^1.0.1" - } - }, - "passport-local": { - "version": "1.0.0", - "requires": { - "passport-strategy": "1.x.x" - } - }, - "passport-strategy": { - "version": "1.0.0" - }, - "path-exists": { - "version": "4.0.0", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1" - }, - "path-key": { - "version": "3.1.1", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7" - }, - "pause": { - "version": "0.0.1" - }, - "picocolors": { - "version": "1.0.0" - }, - "picomatch": { - "version": "2.3.1", - "dev": true - }, - "pirates": { - "version": "4.0.5", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "prelude-ls": { - "version": "1.2.1", - "dev": true - }, - "pretty-format": { - "version": "29.3.1", - "dev": true, - "requires": { - "@jest/schemas": "^29.0.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "dev": true - } - } - }, - "process-nextick-args": { - "version": "2.0.1" - }, - "prompts": { - "version": "2.4.2", - "dev": true, - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - } - }, - "proxy-addr": { - "version": "2.0.7", - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - } - }, - "pstree.remy": { - "version": "1.1.8", - "dev": true - }, - "punycode": { - "version": "2.1.1" - }, - "q": { - "version": "1.5.1" - }, - "qs": { - "version": "6.11.0", - "requires": { - "side-channel": "^1.0.4" - } - }, - "queue-microtask": { - "version": "1.2.3", - "dev": true - }, - "random-bytes": { - "version": "1.0.0" - }, - "range-parser": { - "version": "1.2.1" - }, - "rate-limit-mongo": { - "version": "2.3.2", - "requires": { - "mongodb": "^3.6.7", - "twostep": "0.4.2", - "underscore": "1.12.1" - } - }, - "raw-body": { - "version": "2.5.1", - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "react-is": { - "version": "18.2.0", - "dev": true - }, - "readable-stream": { - "version": "2.3.7", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "3.6.0", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "regenerate": { - "version": "1.4.2", - "dev": true - }, - "regenerate-unicode-properties": { - "version": "10.1.0", - "dev": true, - "requires": { - "regenerate": "^1.4.2" - } - }, - "regenerator-runtime": { - "version": "0.13.11", - "dev": true - }, - "regenerator-transform": { - "version": "0.15.1", - "dev": true, - "requires": { - "@babel/runtime": "^7.8.4" - } - }, - "regexpp": { - "version": "3.2.0", - "dev": true - }, - "regexpu-core": { - "version": "5.2.2", - "dev": true, - "requires": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsgen": "^0.7.1", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - } - }, - "regjsgen": { - "version": "0.7.1", - "dev": true - }, - "regjsparser": { - "version": "0.9.1", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "dev": true - } - } - }, - "require-directory": { - "version": "2.1.1", - "dev": true - }, - "resolve": { - "version": "1.22.1", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "dev": true - }, - "resolve.exports": { - "version": "1.1.0", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "requires": { - "glob": "^7.1.3" - } - }, - "run-parallel": { - "version": "1.2.0", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "safe-buffer": { - "version": "5.1.2" - }, - "safer-buffer": { - "version": "2.1.2" - }, - "saslprep": { - "version": "1.0.3", - "optional": true, - "requires": { - "sparse-bitfield": "^3.0.3" - } - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" - }, - "send": { - "version": "0.18.0", - "requires": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0" - } - } - }, - "ms": { - "version": "2.1.3" - }, - "on-finished": { - "version": "2.4.1", - "requires": { - "ee-first": "1.1.1" - } - } - } - }, - "serve-static": { - "version": "1.15.0", - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - } - }, - "set-blocking": { - "version": "2.0.0" - }, - "setprototypeof": { - "version": "1.2.0" - }, - "shebang-command": { - "version": "2.0.0", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "dev": true - }, - "side-channel": { - "version": "1.0.4", - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "sift": { - "version": "16.0.1" - }, - "signal-exit": { - "version": "3.0.7" - }, - "simple-update-notifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", - "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", - "dev": true, - "requires": { - "semver": "^7.5.3" - }, - "dependencies": { - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "sisteransi": { - "version": "1.0.5", - "dev": true - }, - "slash": { - "version": "3.0.0", - "dev": true - }, - "smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" - }, - "socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", - "requires": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - } - }, - "source-map": { - "version": "0.6.1" - }, - "source-map-support": { - "version": "0.5.13", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "sparse-bitfield": { - "version": "3.0.3", - "optional": true, - "requires": { - "memory-pager": "^1.0.2" - } - }, - "sprintf-js": { - "version": "1.0.3", - "dev": true - }, - "stack-utils": { - "version": "2.0.6", - "dev": true, - "requires": { - "escape-string-regexp": "^2.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "dev": true - } - } - }, - "statuses": { - "version": "2.0.1" - }, - "streamsearch": { - "version": "1.1.0" - }, - "string_decoder": { - "version": "1.1.1", - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "string-length": { - "version": "4.0.2", - "dev": true, - "requires": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - } - }, - "string-width": { - "version": "4.2.3", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "4.0.0", - "dev": true - }, - "strip-final-newline": { - "version": "2.0.0", - "dev": true - }, - "strip-json-comments": { - "version": "3.1.1", - "dev": true - }, - "strnum": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", - "optional": true - }, - "superagent": { - "version": "8.0.6", - "dev": true, - "requires": { - "component-emitter": "^1.3.0", - "cookiejar": "^2.1.3", - "debug": "^4.3.4", - "fast-safe-stringify": "^2.1.1", - "form-data": "^4.0.0", - "formidable": "^2.1.1", - "methods": "^1.1.2", - "mime": "2.6.0", - "qs": "^6.11.0", - "semver": "^7.3.8" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "mime": { - "version": "2.6.0", - "dev": true - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "supertest": { - "version": "6.3.3", - "dev": true, - "requires": { - "methods": "^1.1.2", - "superagent": "^8.0.5" - } - }, - "supports-color": { - "version": "5.5.0", - "requires": { - "has-flag": "^3.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "dev": true - }, - "tar": { - "version": "6.1.13", - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^4.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4" - } - } - }, - "test-exclude": { - "version": "6.0.0", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "text-table": { - "version": "0.2.0", - "dev": true - }, - "tmpl": { - "version": "1.0.5", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0" - }, - "to-regex-range": { - "version": "5.0.1", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "toidentifier": { - "version": "1.0.1" - }, - "touch": { - "version": "3.1.0", - "dev": true, - "requires": { - "nopt": "~1.0.10" - }, - "dependencies": { - "nopt": { - "version": "1.0.10", - "dev": true, - "requires": { - "abbrev": "1" - } - } - } - }, - "tr46": { - "version": "0.0.3" - }, - "tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "devOptional": true - }, - "twostep": { - "version": "0.4.2" - }, - "type-check": { - "version": "0.4.0", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-detect": { - "version": "4.0.8", - "dev": true - }, - "type-fest": { - "version": "0.20.2", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typedarray": { - "version": "0.0.6" - }, - "uglify-js": { - "version": "3.15.2", - "optional": true - }, - "uhyphen": { - "version": "0.1.0" - }, - "uid-safe": { - "version": "2.1.5", - "requires": { - "random-bytes": "~1.0.0" - } - }, - "undefsafe": { - "version": "2.0.5", - "dev": true - }, - "underscore": { - "version": "1.12.1" - }, - "unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "dev": true - }, - "unicode-match-property-ecmascript": { - "version": "2.0.0", - "dev": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "dev": true - }, - "unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "dev": true - }, - "unpipe": { - "version": "1.0.0" - }, - "update-browserslist-db": { - "version": "1.0.10", - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "uri-js": { - "version": "4.4.1", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2" - }, - "utils-merge": { - "version": "1.0.1" - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "optional": true - }, - "v8-to-istanbul": { - "version": "9.0.1", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" - } - }, - "validator": { - "version": "13.7.0" - }, - "vary": { - "version": "1.1.2" - }, - "walker": { - "version": "1.0.8", - "dev": true, - "requires": { - "makeerror": "1.0.12" - } - }, - "webidl-conversions": { - "version": "3.0.1" - }, - "whatwg-url": { - "version": "5.0.0", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "which": { - "version": "2.0.2", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wide-align": { - "version": "1.1.5", - "requires": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true - }, - "wordwrap": { - "version": "1.0.0" - }, - "wrap-ansi": { - "version": "7.0.0", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "dev": true - } - } - }, - "wrappy": { - "version": "1.0.2" - }, - "write-file-atomic": { - "version": "4.0.2", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - } - }, - "xtend": { - "version": "4.0.2" - }, - "y18n": { - "version": "5.0.8", - "dev": true - }, - "yallist": { - "version": "4.0.0" - }, - "yargs": { - "version": "17.6.2", - "dev": true, - "requires": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - } - }, - "yargs-parser": { - "version": "21.1.1", - "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "dev": true - } } } diff --git a/package.json b/package.json index f40ee259..86e2371e 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,7 @@ "bcrypt": "^5.1.0", "cloudinary": "^1.32.0", "dotenv-flow": "^3.2.0", + "expect": "^29.5.0", "express": "^4.18.2", "express-rate-limit": "^6.7.0", "express-session": "^1.17.3", diff --git a/src/api/middleware/application.js b/src/api/middleware/application.js new file mode 100644 index 00000000..66c181f7 --- /dev/null +++ b/src/api/middleware/application.js @@ -0,0 +1,13 @@ +import CompanyApplication, { CompanyApplicationRules } from "../../models/CompanyApplication.js"; +import { APIError, ErrorTypes } from "./errorHandler.js"; +import { StatusCodes as HTTPStatus } from "http-status-codes/build/cjs/status-codes.js"; +import { VALIDATION_LINK_EXPIRATION } from "../../models/constants/ApplicationStatus.js"; +import { SECOND_IN_MS } from "../../models/constants/TimeConstants.js"; + +export const exceededCreationTimeLimit = async (req, res, next) => { + const application = await CompanyApplication.findOne({ email: req.body.email, isVerified: false }); + if (application !== null && Date.now() < application.submittedAt.getTime() + (VALIDATION_LINK_EXPIRATION * SECOND_IN_MS)) { + return next(new APIError(HTTPStatus.FORBIDDEN, ErrorTypes.FORBIDDEN, CompanyApplicationRules.APPLICATION_RECENTLY_CREATED.msg)); + } + return next(); +}; diff --git a/src/api/middleware/auth.js b/src/api/middleware/auth.js index a469b1e5..65cd2355 100644 --- a/src/api/middleware/auth.js +++ b/src/api/middleware/auth.js @@ -78,15 +78,26 @@ export const hasAdminPrivileges = async (req, res, next) => { }; export const validToken = (req, res, next) => { - const decoded = verifyAndDecodeToken(req.params.token, config.jwt_secret); + try { + const decoded = verifyAndDecodeToken(req.params.token, config.jwt_secret); - if (!decoded) { - return next(new APIError(HTTPStatus.FORBIDDEN, ErrorTypes.FORBIDDEN, ValidationReasons.INVALID_TOKEN)); - } + storeInLocals(req, { + token: decoded, + }); - storeInLocals(req, { - token: decoded, - }); + return next(); + } catch (jwtErr) { + if (jwtErr.name === "TokenExpiredError") { + return next(new APIError(HTTPStatus.FORBIDDEN, ErrorTypes.FORBIDDEN, ValidationReasons.EXPIRED_TOKEN)); + } else { + return next(new APIError(HTTPStatus.NOT_FOUND, ErrorTypes.FORBIDDEN, ValidationReasons.INVALID_TOKEN)); + } + } +}; +export const hasCompanyAccess = (companyId) => (req, res, next) => { + if (!req.user?.company?._id.equals(companyId)) { + return next(new APIError(HTTPStatus.UNAUTHORIZED, ErrorTypes.FORBIDDEN, ValidationReasons.MUST_BE_ADMIN)); + } return next(); }; diff --git a/src/api/middleware/validators/application.js b/src/api/middleware/validators/application.js index 59cd85c9..c78203e2 100644 --- a/src/api/middleware/validators/application.js +++ b/src/api/middleware/validators/application.js @@ -112,3 +112,13 @@ export const search = useExpressValidators([ .custom(sortByParamValidator) .customSanitizer(parseSortByField), ]); + + +export const token = param("token", ValidationReasons.DEFAULT) + .exists().withMessage(ValidationReasons.REQUIRED).bail() + .isString().withMessage(ValidationReasons.STRING) + .trim(); + +export const finishValidation = useExpressValidators([ + token.exists().withMessage(ValidationReasons.NON_EXISTING_APPLICATION).bail(), +]); diff --git a/src/api/middleware/validators/company.js b/src/api/middleware/validators/company.js index de202522..4648eedf 100644 --- a/src/api/middleware/validators/company.js +++ b/src/api/middleware/validators/company.js @@ -132,3 +132,7 @@ export const edit = useExpressValidators([ body("logo", ValidationReasons.DEFAULT) .optional() ]); + +export const getApplication = useExpressValidators([ + existingCompanyParamValidator, +]); diff --git a/src/api/middleware/validators/validationReasons.js b/src/api/middleware/validators/validationReasons.js index 7a38a793..99066a19 100644 --- a/src/api/middleware/validators/validationReasons.js +++ b/src/api/middleware/validators/validationReasons.js @@ -41,6 +41,7 @@ const ValidationReasons = Object.freeze({ OFFER_EDIT_PERIOD_OVER: (value) => `offer-edit-period-over:${value}-hours`, INVALID_QUERY_TOKEN: "invalid-query-token", INVALID_TOKEN: "invalid-token", + EXPIRED_TOKEN: "expired-token", JOB_MIN_DURATION_NOT_SPECIFIED: "job-max-duration-requires-job-min-duration", REGISTRATION_FINISHED: "registration-already-finished", REGISTRATION_NOT_FINISHED: "registration-not-finished-yet", @@ -48,8 +49,10 @@ const ValidationReasons = Object.freeze({ IMAGE_FORMAT: "formats-supported-png-jpeg-jpg", OFFER_BLOCKED_ADMIN: "offer-blocked-by-admin", OFFER_HIDDEN: "offer-is-hidden", + NON_EXISTING_APPLICATION: "application-does-not-exist", FILE_TOO_LARGE: (max) => `file-cant-be-larger-than-${max}MB`, MUST_BE_GREATER_THAN_OR_EQUAL_TO: (field) => `must-be-greater-than-or-equal-to:${field}`, + }); export default ValidationReasons; diff --git a/src/api/routes/application.js b/src/api/routes/application.js index d129b452..a2acbf3b 100644 --- a/src/api/routes/application.js +++ b/src/api/routes/application.js @@ -1,7 +1,10 @@ import { Router } from "express"; - import * as validators from "../middleware/validators/application.js"; -import ApplicationService from "../../services/application.js"; +import ApplicationService, { CompanyApplicationAlreadyValidated } from "../../services/application.js"; +import * as applicationMiddleware from "../middleware/application.js"; +import { validToken } from "../middleware/auth.js"; +import { StatusCodes as HTTPStatus } from "http-status-codes/build/cjs/status-codes.js"; +import { buildErrorResponse, ErrorTypes } from "../middleware/errorHandler.js"; const router = Router(); @@ -11,15 +14,34 @@ export default (app) => { /** * Creates a new Company Application */ - router.post("/", validators.create, async (req, res, next) => { - + router.post("/", validators.create, applicationMiddleware.exceededCreationTimeLimit, async (req, res, next) => { try { - // This is safe since the service is destructuring the passed object and the fields have been validated - const application = await (new ApplicationService()).create(req.body); + const applicationService = new ApplicationService(); + const application = await applicationService.updateOrCreate({ email: req.body.email }, req.body); return res.json(application); } catch (err) { console.error(err); return next(err); } }); + + /** + * Validates application + */ + router.post("/:token/validate", validators.finishValidation, validToken, async (req, res, next) => { + const { _id: id } = req.locals.token; + try { + await new ApplicationService().validateApplication(id); + return res.status(HTTPStatus.OK).json({}); + } catch (err) { + if (err instanceof CompanyApplicationAlreadyValidated) { + return res + .status(HTTPStatus.CONFLICT) + .json(buildErrorResponse(ErrorTypes.FORBIDDEN, [{ msg: err.message }])); + } + console.error(err); + return next(err); + } + }); + }; diff --git a/src/api/routes/company.js b/src/api/routes/company.js index fa1ff69b..1c815697 100644 --- a/src/api/routes/company.js +++ b/src/api/routes/company.js @@ -17,6 +17,9 @@ import * as fileMiddleware from "../middleware/files.js"; import OfferService from "../../services/offer.js"; import AccountService from "../../services/account.js"; import Offer from "../../models/Offer.js"; +import Account from "../../models/Account.js"; +import CompanyApplication from "../../models/CompanyApplication.js"; + const router = Router(); @@ -254,4 +257,27 @@ export default (app) => { } } ); + + /** + * Get the application of a company with its id + */ + router.get("/:companyId/application", + or([ + authMiddleware.isAdmin, + authMiddleware.isGod, + (req, res, next) => authMiddleware.hasCompanyAccess(req.params.companyId)(req, res, next), + ], { status_code: HTTPStatus.UNAUTHORIZED, error_code: ErrorTypes.FORBIDDEN, msg: ValidationReasons.INSUFFICIENT_PERMISSIONS }), + validators.getApplication, + + async (req, res, next) => { + + try { + const account = await Account.findOne({ "company": req.params.companyId }); + const application = (await CompanyApplication.findOne({ "email": account.email })).toObject(); + return res.json(application); + } catch (err) { + console.error(err); + return next(err); + } + }); }; diff --git a/src/api/routes/offer.js b/src/api/routes/offer.js index 0e8b3db7..252d6b8c 100644 --- a/src/api/routes/offer.js +++ b/src/api/routes/offer.js @@ -11,6 +11,9 @@ import ValidationReasons from "../middleware/validators/validationReasons.js"; import { or, when } from "../middleware/utils.js"; import OfferConstants from "../../models/constants/Offer.js"; import * as companyValidators from "../middleware/validators/company.js"; +import CompanyApplication from "../../models/CompanyApplication.js"; +import Account from "../../models/Account.js"; +import ApplicationStatus from "../../models/constants/ApplicationStatus.js"; const router = Router(); @@ -98,14 +101,14 @@ export default (app) => { validators.offersDateSanitizers, async (req, res, next) => { try { - + const account = await Account.findOne({ company: req.targetOwner }); + const application = await CompanyApplication.findOne({ email: account.email }); const params = { ...req.body, - owner: req.targetOwner + owner: req.targetOwner, + isPending: application.state !== ApplicationStatus.APPROVED, }; - const offer = await (new OfferService()).create(params); - return res.json(offer); } catch (err) { console.error(err); diff --git a/src/api/routes/review.js b/src/api/routes/review.js index 27b459ea..89965f98 100644 --- a/src/api/routes/review.js +++ b/src/api/routes/review.js @@ -5,11 +5,12 @@ import * as authMiddleware from "../middleware/auth.js"; import * as companyApplicationValidators from "../middleware/validators/application.js"; import ApplicationService, { CompanyApplicationAlreadyReviewed, - CompanyApplicationEmailAlreadyInUse, - CompanyApplicationNotFound + CompanyApplicationNotFound, CompanyApplicationUnverified } from "../../services/application.js"; import { buildErrorResponse, ErrorTypes } from "../middleware/errorHandler.js"; +import Company from "../../models/Company.js"; +import CompanyService from "../../services/company.js"; const router = Router(); @@ -82,7 +83,9 @@ export default (app) => { async (req, res, next) => { try { - const { account } = await (new ApplicationService()).approve(req.params.id); + const account = await (new ApplicationService()).approve(req.params.id); + const company = await Company.findOne({ _id: account.company }); + await (new CompanyService()).releaseOffers(company._id); return res.json(account); } catch (err) { console.error(err); @@ -92,7 +95,7 @@ export default (app) => { .json(buildErrorResponse(ErrorTypes.VALIDATION_ERROR, [{ msg: err.message }])); } else if ( err instanceof CompanyApplicationAlreadyReviewed || - err instanceof CompanyApplicationEmailAlreadyInUse + err instanceof CompanyApplicationUnverified ) { return res .status(HTTPStatus.CONFLICT) @@ -121,7 +124,10 @@ export default (app) => { return res .status(HTTPStatus.NOT_FOUND) .json(buildErrorResponse(ErrorTypes.VALIDATION_ERROR, [{ msg: err.message }])); - } else if (err instanceof CompanyApplicationAlreadyReviewed) { + } else if ( + err instanceof CompanyApplicationAlreadyReviewed || + err instanceof CompanyApplicationUnverified + ) { return res .status(HTTPStatus.CONFLICT) .json(buildErrorResponse(ErrorTypes.VALIDATION_ERROR, [{ msg: err.message }])); diff --git a/src/config/env.js b/src/config/env.js index b910e901..78a36ffa 100644 --- a/src/config/env.js +++ b/src/config/env.js @@ -23,6 +23,7 @@ export default Object.freeze({ session_secret: process.env.SESSION_SECRET, jwt_secret: process.env.JWT_SECRET, password_recovery_link: process.env.PASSWORD_RECOVERY_LINK, + application_confirmation_link: process.env.APPLICATION_CONFIRMATION_LINK, port: process.env.PORT, god_token: process.env.GOD_TOKEN, test_log_requests: JSON.parse(process.env.TEST_LOG_REQUESTS), diff --git a/src/email-templates/approval_notification.handlebars b/src/email-templates/approval_notification.handlebars index cc7c3806..cb4d8aa8 100644 --- a/src/email-templates/approval_notification.handlebars +++ b/src/email-templates/approval_notification.handlebars @@ -1,9 +1,8 @@ -

Glad to have you on board, {{companyName}}!

-

We decided to accept your application, and you are just one step away from being able to use NIJobs!

-

Now, you can log in to NIJobs and complete your registration. -Once you finish, you'll be able to place some work offers!

+

We are delighted to have you on board, {{companyName}}!

+

We are pleased to inform you that your application has been accepted, and all the offers you have created are now accessible to the public!

+

From now on, any offer you create will be immediately available to the public audience.


-

If you need anything else, don't hesitate to contact us!

+

If you have any further questions, don't hesitate to contact us at nijobs@aefeup.pt!


Sincerely,

-

NIJobs team at NIAEFEUP

\ No newline at end of file +

NIJobs team at NIAEFEUP

diff --git a/src/email-templates/companyApplicationApproval.js b/src/email-templates/companyApplicationApproval.js index 626aba37..078677d4 100644 --- a/src/email-templates/companyApplicationApproval.js +++ b/src/email-templates/companyApplicationApproval.js @@ -8,6 +8,11 @@ export const NEW_COMPANY_APPLICATION_COMPANY = (companyName, applicationId) => ( template: "new_company_application_company", context: { companyName, applicationId }, }); +export const APPLICATION_CONFIRMATION = (link) => ({ + subject: "Confirm your NIJobs application", + template: "confirm-application", + context: { link }, +}); export const APPROVAL_NOTIFICATION = (companyName) => ({ subject: "Welcome to NIJobs!", template: "approval_notification", diff --git a/src/email-templates/confirm-application.handlebars b/src/email-templates/confirm-application.handlebars new file mode 100644 index 00000000..4dae304b --- /dev/null +++ b/src/email-templates/confirm-application.handlebars @@ -0,0 +1,6 @@ +

Confirm your NIJobs application

+

We have received your application successfully!

+

To complete the process, please click on this link. Kindly note that the link will expire in 10 minutes.


+

If you did not make this request or require any further assistance, please reach out to us at nijobs@aefeup.pt!


+

Sincerely,

+

NIJobs team at NIAEFEUP

diff --git a/src/email-templates/new_company_application_company.handlebars b/src/email-templates/new_company_application_company.handlebars index 8966ef10..9d2c616a 100644 --- a/src/email-templates/new_company_application_company.handlebars +++ b/src/email-templates/new_company_application_company.handlebars @@ -1,8 +1,11 @@ -

We have successfully received your application!

-

We will now review your application, and in case you're approved, you will receive another email with further instructions in order to complete your registration.

-

Your Application ID is {{applicationId}} and you registered {{companyName}}

+

Your application has been validated!

+

We will now review your application. + In the meantime, you can complete your registration by logging into your account and begin creating offers. + Please note that your offers will remain hidden from the public until your company is approved.

+

Your Application ID is {{applicationId}} and you registered {{companyName}}.

+

Once you are approved, you will receive an email notification, and your offers will become visible to the public.


If you did not request this or if you need anything else, don't hesitate to contact us at nijobs@aefeup.pt!


Sincerely,

-

NIJobs team at NIAEFEUP

\ No newline at end of file +

NIJobs team at NIAEFEUP

diff --git a/src/lib/token.js b/src/lib/token.js index 171906bf..be8ed801 100644 --- a/src/lib/token.js +++ b/src/lib/token.js @@ -6,10 +6,4 @@ export const generateToken = (data, secret, expiresInSeconds) => jwt.sign( { expiresIn: `${expiresInSeconds} seconds`, algorithm: "HS256" } ); -export const verifyAndDecodeToken = (token, secret) => { - try { - return jwt.verify(token, secret, { algorithm: "HS256" }); - } catch (err) { - return null; - } -}; +export const verifyAndDecodeToken = (token, secret) => jwt.verify(token, secret, { algorithm: "HS256" }); diff --git a/src/models/Account.js b/src/models/Account.js index 2430a4e7..b3dd067d 100644 --- a/src/models/Account.js +++ b/src/models/Account.js @@ -35,6 +35,7 @@ const AccountSchema = new Schema({ }, }, + }); AccountSchema.methods.validatePassword = async function(password) { diff --git a/src/models/CompanyApplication.js b/src/models/CompanyApplication.js index 766f8962..36ac5f4c 100644 --- a/src/models/CompanyApplication.js +++ b/src/models/CompanyApplication.js @@ -2,6 +2,8 @@ import mongoose from "mongoose"; import ApplicationStatus from "./constants/ApplicationStatus.js"; import CompanyApplicationConstants from "./constants/CompanyApplication.js"; import { checkDuplicatedEmail } from "../api/middleware/validators/validatorUtils.js"; +import { CompanyApplicationAlreadyReviewed, CompanyApplicationUnverified } from "../services/application.js"; + const { Schema } = mongoose; @@ -33,6 +35,15 @@ export const CompanyApplicationRules = Object.freeze({ CANNOT_REVIEW_TWICE: { msg: "company-application-already-reviewed", }, + APPLICATION_RECENTLY_CREATED: { + msg: "company-application-recently-created", + }, + APPLICATION_ALREADY_VALIDATED: { + msg: "application-already-validated", + }, + MUST_BE_VERIFIED: { + msg: "application-must-be-verified", + } }); export const CompanyApplicationProps = { @@ -80,6 +91,10 @@ export const CompanyApplicationProps = { return !!this.rejectedAt; }, }, + isVerified: { + type: Boolean, + default: true, + }, }; const CompanyApplicationSchema = new Schema(CompanyApplicationProps); @@ -87,7 +102,8 @@ const CompanyApplicationSchema = new Schema(CompanyApplicationProps); CompanyApplicationSchema.index({ companyName: "text" }); CompanyApplicationSchema.virtual("state").get(function() { - if (!this.approvedAt && !this.rejectedAt) return ApplicationStatus.PENDING; + if (!this.isVerified) return ApplicationStatus.UNVERIFIED; + else if (!this.approvedAt && !this.rejectedAt) return ApplicationStatus.PENDING; else if (this.approvedAt) return ApplicationStatus.APPROVED; else return ApplicationStatus.REJECTED; }); @@ -117,7 +133,7 @@ export const applicationUniqueness = async (email) => { const existingApplications = await CompanyApplication.find({ email }); if (existingApplications.some((application) => application.state === ApplicationStatus.PENDING || - application.state === ApplicationStatus.APPROVED) + application.state === ApplicationStatus.APPROVED) ) { throw new Error(CompanyApplicationRules.ONLY_ONE_APPLICATION_ACTIVE_PER_EMAIL.msg); } @@ -136,20 +152,35 @@ async function validateSingleActiveApplication(value) { export const isApprovable = (application) => { + if (application.state === ApplicationStatus.UNVERIFIED) + throw new CompanyApplicationUnverified(CompanyApplicationRules.MUST_BE_VERIFIED.msg); + if (application.state !== ApplicationStatus.PENDING) - throw new Error(CompanyApplicationRules.CANNOT_REVIEW_TWICE.msg); + throw new CompanyApplicationAlreadyReviewed(CompanyApplicationRules.CANNOT_REVIEW_TWICE.msg); return true; }; export const isRejectable = (application) => { + if (application.state === ApplicationStatus.UNVERIFIED) + throw new CompanyApplicationUnverified(CompanyApplicationRules.MUST_BE_VERIFIED.msg); + if (application.state !== ApplicationStatus.PENDING) - throw new Error(CompanyApplicationRules.CANNOT_REVIEW_TWICE.msg); + throw new CompanyApplicationAlreadyReviewed(CompanyApplicationRules.CANNOT_REVIEW_TWICE.msg); return true; }; + +CompanyApplicationSchema.methods.verifyCompany = function() { + if (this.isVerified) + throw new Error(CompanyApplicationRules.APPLICATION_ALREADY_VALIDATED.msg); + + this.isVerified = true; + return this.save({ validateModifiedOnly: true }); +}; + CompanyApplicationSchema.methods.approve = function() { isApprovable(this); this.approvedAt = Date.now(); diff --git a/src/models/Offer.js b/src/models/Offer.js index f8b53fd9..51645b3f 100644 --- a/src/models/Offer.js +++ b/src/models/Offer.js @@ -83,6 +83,10 @@ const OfferSchema = new Schema({ type: Boolean, default: false }, + isPending: { + type: Boolean, + default: false, + }, isArchived: { type: Boolean, default: false @@ -161,6 +165,10 @@ OfferSchema.query.current = function() { return this.where(this.model.filterCurrent()); }; +OfferSchema.query.notPending = function() { + return this.where({ isPending: false }); +}; + /** * Currently active and non-hidden Offers */ diff --git a/src/models/constants/ApplicationStatus.js b/src/models/constants/ApplicationStatus.js index a6f504ca..72f35baf 100644 --- a/src/models/constants/ApplicationStatus.js +++ b/src/models/constants/ApplicationStatus.js @@ -1,7 +1,10 @@ const ApplicationStatus = Object.freeze({ + "UNVERIFIED": "UNVERIFIED", "PENDING": "PENDING", "APPROVED": "APPROVED", "REJECTED": "REJECTED", }); export default ApplicationStatus; + +export const VALIDATION_LINK_EXPIRATION = 600; diff --git a/src/services/account.js b/src/services/account.js index bb9572bb..b66ef251 100644 --- a/src/services/account.js +++ b/src/services/account.js @@ -29,16 +29,11 @@ class AccountService { const company = await Company.create({ name: companyName }); - const account = await Account.create({ + await Account.create({ email, password, company, }); - - return { - email: account.email, - companyName: account.company.name, - }; } async updatePassword(email, password) { diff --git a/src/services/application.js b/src/services/application.js index abc0bc8c..5bb60d90 100644 --- a/src/services/application.js +++ b/src/services/application.js @@ -1,5 +1,7 @@ import CompanyApplication, { CompanyApplicationRules } from "../models/CompanyApplication.js"; +import { generateToken } from "../lib/token.js"; import hash from "../lib/passwordHashing.js"; +import { VALIDATION_LINK_EXPIRATION } from "../models/constants/ApplicationStatus.js"; import AccountService from "./account.js"; import EmailService from "../lib/emailService.js"; import { @@ -7,8 +9,11 @@ import { NEW_COMPANY_APPLICATION_COMPANY, APPROVAL_NOTIFICATION, REJECTION_NOTIFICATION, + APPLICATION_CONFIRMATION } from "../email-templates/companyApplicationApproval.js"; import config from "../config/env.js"; +import Account from "../models/Account.js"; + export class CompanyApplicationNotFound extends Error { constructor(msg) { @@ -28,6 +33,17 @@ export class CompanyApplicationEmailAlreadyInUse extends Error { } } +export class CompanyApplicationAlreadyValidated extends Error { + constructor(msg) { + super(msg); + } +} +export class CompanyApplicationUnverified extends Error { + constructor(msg) { + super(msg); + } +} + class CompanyApplicationService { async create({ @@ -39,18 +55,13 @@ class CompanyApplicationService { companyName, motivation, submittedAt: Date.now(), + isVerified: false, }); - + const link = this.buildConfirmationLink(application._id); await EmailService.sendMail({ - to: config.mail_from, - ...NEW_COMPANY_APPLICATION_ADMINS(application.email, companyName, motivation) + to: email, + ...APPLICATION_CONFIRMATION(link), }); - - await EmailService.sendMail({ - to: application.email, - ...NEW_COMPANY_APPLICATION_COMPANY(companyName, application._id.toString()) - }); - return application.toObject(); } @@ -172,31 +183,18 @@ class CompanyApplicationService { const application = await CompanyApplication.findById(id, {}, options); if (!application) throw new CompanyApplicationNotFound(CompanyApplicationRules.MUST_EXIST_TO_APPROVE.msg); try { - application.approve(); - } catch (e) { - console.error(e); - throw new CompanyApplicationAlreadyReviewed(CompanyApplicationRules.CANNOT_REVIEW_TWICE.msg); - } - - try { - const account = await (new AccountService()).registerCompany(application.email, application.password, application.companyName); - + await application.approve(); await EmailService.sendMail({ to: application.email, ...APPROVAL_NOTIFICATION(application.companyName), }); - - return { application, account }; - } catch (err) { - console.error(`Error creating account for approved Company Application, rolling back approval of ${application._id}`, err); - application.undoApproval(); - if (err.name === "MongoServerError" && /E11000\s.*collection:\s.*\.accounts.*/.test(err.errmsg)) { - throw new CompanyApplicationEmailAlreadyInUse(CompanyApplicationRules.EMAIL_ALREADY_IN_USE.msg); - } else { - throw err; - } + if (!(err instanceof CompanyApplicationUnverified || err instanceof CompanyApplicationAlreadyReviewed)) + await application.undoApproval(); + console.error("Error while approving company ", err.msg); + throw err; } + return Account.findOne({ email: application.email }); } async reject(id, reason, options) { @@ -213,9 +211,53 @@ class CompanyApplicationService { return application.toObject(); } catch (e) { console.error(e); - throw new CompanyApplicationAlreadyReviewed(CompanyApplicationRules.CANNOT_REVIEW_TWICE.msg); + throw e; } } + + buildConfirmationLink(id) { + const token = generateToken({ _id: id }, config.jwt_secret, VALIDATION_LINK_EXPIRATION); + return `${config.application_confirmation_link}${token}/validate`; + } + + async validateApplication(id) { + const application = await this.findById(id); + + try { + application.verifyCompany(); + await EmailService.sendMail({ + to: config.mail_from, + ...NEW_COMPANY_APPLICATION_ADMINS(application.email, application.companyName, application.motivation) + }); + + await EmailService.sendMail({ + to: application.email, + ...NEW_COMPANY_APPLICATION_COMPANY(application.companyName, application._id.toString()) + }); + } catch (err) { + console.error(err); + throw new CompanyApplicationAlreadyValidated(CompanyApplicationRules.APPLICATION_ALREADY_VALIDATED.msg); + } + + try { + await (new AccountService()).registerCompany(application.email, application.password, application.companyName); + } catch (err) { + console.error("Error creating account for validated Company Application", err); + throw err; + + } + } + + async updateOrCreate(query, update) { + let application = await CompanyApplication.findOne(query); + if (!application) application = await this.create(update); + else application = await CompanyApplication.findOneAndUpdate(query, update, { new: true }); + return application; + } + async deleteApplications(email) { + await CompanyApplication.deleteMany({ email: email, isVerified: false }); + } } + export default CompanyApplicationService; diff --git a/src/services/company.js b/src/services/company.js index c3e42490..5fa8a8bd 100644 --- a/src/services/company.js +++ b/src/services/company.js @@ -8,6 +8,8 @@ import { import EmailService from "../lib/emailService.js"; import Account from "../models/Account.js"; import Company from "../models/Company.js"; +import Offer from "../models/Offer.js"; + class CompanyService { getOffersInTimePeriod(owner, publishDate, publishEndDate, OfferModel) { return OfferModel.find({ @@ -196,6 +198,16 @@ class CompanyService { throw err; } } + + + async releaseOffers(companyId) { + try { + await Offer.updateMany({ owner: companyId }, { $set: { "isPending": false } }); + } catch (err) { + console.error(err); + throw err; + } + } } export default CompanyService; diff --git a/src/services/offer.js b/src/services/offer.js index e0991cc4..aa318514 100644 --- a/src/services/offer.js +++ b/src/services/offer.js @@ -35,6 +35,7 @@ class OfferService { fields, technologies, isHidden, + isPending, owner, location, coordinates, @@ -58,6 +59,7 @@ class OfferService { fields, technologies, isHidden, + isPending, owner, ownerName, ownerLogo, @@ -386,6 +388,7 @@ class OfferService { selectSearchOffers(offers, showHidden, showAdminReason) { offers.current(); + offers.notPending(); if (!showHidden) offers.withoutHidden(); if (!showAdminReason) offers.select("-adminReason"); diff --git a/test/end-to-end/application.js b/test/end-to-end/application.js index 28fb316f..37c4afab 100644 --- a/test/end-to-end/application.js +++ b/test/end-to-end/application.js @@ -1,4 +1,3 @@ -import EmailService from "../../src/lib/emailService"; import { StatusCodes as HTTPStatus } from "http-status-codes"; import CompanyApplication, { CompanyApplicationRules } from "../../src/models/CompanyApplication"; import Account from "../../src/models/Account"; @@ -7,9 +6,6 @@ import ValidationReasons from "../../src/api/middleware/validators/validationRea import CompanyApplicationConstants from "../../src/models/constants/CompanyApplication"; import AccountConstants from "../../src/models/constants/Account"; import CompanyConstants from "../../src/models/constants/Company"; -import { NEW_COMPANY_APPLICATION_ADMINS, NEW_COMPANY_APPLICATION_COMPANY } from "../../src/email-templates/companyApplicationApproval"; -import config from "../../src/config/env"; - describe("Company application endpoint test", () => { describe("POST /application", () => { @@ -87,39 +83,6 @@ describe("Company application endpoint test", () => { expect(created_application).toHaveProperty("submittedAt", mockCurrentDate); }); - test("Should send an email to admin and to company user", async () => { - const application = { - email: "test2@test.com", - password: "password123", - companyName: "Testing company", - motivation: "This company has a very valid motivation because otherwise, the tests would not exist.", - }; - const res = await request() - .post("/apply/company") - .send(application); - - expect(res.status).toBe(HTTPStatus.OK); - - const adminEmailOptions = NEW_COMPANY_APPLICATION_ADMINS( - application.email, application.companyName, application.motivation); - const companyEmailOptions = NEW_COMPANY_APPLICATION_COMPANY( - application.companyName, res.body._id); - - expect(EmailService.sendMail).toHaveBeenCalledWith(expect.objectContaining({ - subject: adminEmailOptions.subject, - to: config.mail_from, - template: adminEmailOptions.template, - context: adminEmailOptions.context, - })); - - expect(EmailService.sendMail).toHaveBeenCalledWith(expect.objectContaining({ - subject: companyEmailOptions.subject, - to: application.email, - template: companyEmailOptions.template, - context: { ...companyEmailOptions.context }, - })); - }); - describe("Invalid input", () => { test("Should fail while using an email with an associated Account", async () => { const application = { diff --git a/test/end-to-end/applications/company/:id/approve.js b/test/end-to-end/applications/company/:id/approve.js new file mode 100644 index 00000000..a09822e8 --- /dev/null +++ b/test/end-to-end/applications/company/:id/approve.js @@ -0,0 +1,237 @@ +import AccountService from "../../../../../src/services/account.js"; +jest.mock("../../../../../src/lib/emailService"); +import { StatusCodes } from "http-status-codes"; +import { APPROVAL_NOTIFICATION } from "../../../../../src/email-templates/companyApplicationApproval"; +import EmailService, { EmailService as EmailServiceClass } from "../../../../../src/lib/emailService"; +import hash from "../../../../../src/lib/passwordHashing"; +import Account from "../../../../../src/models/Account"; +import CompanyApplication, { CompanyApplicationRules } from "../../../../../src/models/CompanyApplication"; +import ApplicationStatus from "../../../../../src/models/constants/ApplicationStatus"; +jest.spyOn(EmailServiceClass.prototype, "verifyConnection").mockImplementation(() => Promise.resolve()); + +import mongoose from "mongoose"; +import ValidationReasons from "../../../../../src/api/middleware/validators/validationReasons.js"; + +const { ObjectId } = mongoose.Types; + +describe("POST /applications/company/:id/approve", () => { + + const test_agent = agent(); + + const test_user_admin = { + email: "admin@email.com", + password: "password123", + }; + + beforeAll(async () => { + await CompanyApplication.deleteMany({}); + + await Account.deleteMany({}); + await Account.create({ + email: test_user_admin.email, + password: await hash(test_user_admin.password), + isAdmin: true + }); + }); + + afterAll(async () => { + await Account.deleteMany({}); + await CompanyApplication.deleteMany({}); + }); + + beforeEach(async () => { + // default login + await test_agent + .post("/auth/login") + .send(test_user_admin) + .expect(StatusCodes.OK); + }); + + describe("ID Validation", () => { + test("Should fail if trying to approve not existent application", async () => { + + const id = new ObjectId(); + + await test_agent + .post(`/applications/company/${id}/approve`) + .expect(StatusCodes.NOT_FOUND); + + }); + }); + + describe("Without previous applications", () => { + + const pendingApplication1Data = { + email: "pending1@test.com", + password: "password123", + companyName: "Testing company", + motivation: "This company has a very valid motivation, because otherwise the tests would not exist.", + submittedAt: new Date("2019-11-25"), + }; + const pendingApplication2Data = { + email: "pending2@test.com", + password: "password123", + companyName: "Testing company", + motivation: "This company has a very valid motivation, because otherwise the tests would not exist.", + submittedAt: new Date("2019-11-25"), + }; + const pendingApplication3Data = { + email: "pending3@test.com", + password: "password123", + companyName: "Testing company", + motivation: "This company has a very valid motivation, because otherwise the tests would not exist.", + submittedAt: new Date("2019-11-25"), + }; + const unverifiedApplicationData = { + email: "unverified@test.com", + password: "password123", + companyName: "Testing company", + motivation: "This company has a very valid motivation, because otherwise the tests would not exist.", + submittedAt: new Date("2019-11-25"), + isVerified: false + }; + + let pendingApplication1, pendingApplication2, pendingApplication3, unverifiedApplication; + + beforeAll(async () => { + await CompanyApplication.deleteMany({}); + + [ + pendingApplication1, + pendingApplication2, + pendingApplication3, + unverifiedApplication + + ] = await CompanyApplication.create([ + pendingApplication1Data, + pendingApplication2Data, + pendingApplication3Data, + unverifiedApplicationData + ]); + + await (new AccountService()).registerCompany( + pendingApplication1Data.email, + pendingApplication1Data.password, + pendingApplication1Data.companyName + ); + + await (new AccountService()).registerCompany( + pendingApplication2Data.email, + pendingApplication2Data.password, + pendingApplication2Data.companyName + ); + await (new AccountService()).registerCompany( + pendingApplication3Data.email, + pendingApplication3Data.password, + pendingApplication3Data.companyName + ); + }); + + afterAll(async () => { + await CompanyApplication.deleteMany({}); + }); + + test("Should approve pending application", async () => { + + const res = await test_agent + .post(`/applications/company/${pendingApplication1._id}/approve`) + .expect(StatusCodes.OK); + + expect(res.body).toHaveProperty("email", pendingApplication1Data.email); + const approved_application = await CompanyApplication.findById(pendingApplication1._id); + expect(approved_application.state).toBe(ApplicationStatus.APPROVED); + }); + + test("Should send approval email to company email", async () => { + + await test_agent + .post(`/applications/company/${pendingApplication2._id}/approve`) + .expect(StatusCodes.OK); + + const emailOptions = APPROVAL_NOTIFICATION(pendingApplication2.companyName); + + expect(EmailService.sendMail).toHaveBeenCalledWith({ + subject: emailOptions.subject, + to: pendingApplication2.email, + template: emailOptions.template, + context: emailOptions.context, + }); + }); + + test("Should fail to approve unverified application", async () => { + + const res = await test_agent + .post(`/applications/company/${unverifiedApplication._id}/approve`) + .expect(StatusCodes.CONFLICT); + + expect(res.body.errors).toContainEqual(CompanyApplicationRules.MUST_BE_VERIFIED); + const approved_application = await CompanyApplication.findById(unverifiedApplication._id); + expect(approved_application.state).toBe(ApplicationStatus.UNVERIFIED); + }); + test("if email fails to be sent application should not be approved", async () => { + jest.spyOn(EmailServiceClass.prototype, "sendMail").mockImplementation(() => { + throw Error(); + }); + const res = await test_agent + .post(`/applications/company/${pendingApplication3._id}/approve`) + .expect(StatusCodes.INTERNAL_SERVER_ERROR); + + jest.spyOn(EmailServiceClass.prototype, "sendMail").mockClear(); + expect(res.body.errors).toContainEqual({ msg: ValidationReasons.UNKNOWN }); + const pending_application = await CompanyApplication.findById(pendingApplication3._id); + expect(pending_application.state).toBe(ApplicationStatus.PENDING); + }); + }); + + describe("With previous applications", () => { + + const approvedApplicationData = { + email: "approved@test.com", + password: "password123", + companyName: "Testing company", + motivation: "This company has a very valid motivation, because otherwise the tests would not exist.", + submittedAt: new Date("2019-11-25"), + approvedAt: new Date("2019-11-26"), + rejectReason: null + }; + const rejectedApplicationData = { + email: "rejected@test.com", + password: "password123", + companyName: "Testing company", + motivation: "This company has a very valid motivation, because otherwise the tests would not exist.", + submittedAt: new Date("2019-11-25"), + rejectedAt: new Date("2019-11-26"), + rejectReason: "test-reason" + }; + + let approvedApplication, rejectedApplication; + + beforeAll(async () => { + await CompanyApplication.deleteMany({}); + + [ + approvedApplication, + rejectedApplication, + ] = await CompanyApplication.create([ + approvedApplicationData, + rejectedApplicationData, + ]); + }); + + afterAll(async () => { + await CompanyApplication.deleteMany({}); + }); + + test("Should fail if trying to approve already approved application", async () => { + await test_agent + .post(`/applications/company/${approvedApplication._id}/approve`) + .expect(StatusCodes.CONFLICT); + }); + + test("Should fail if trying to approve already rejected application", async () => { + await test_agent + .post(`/applications/company/${rejectedApplication._id}/approve`) + .expect(StatusCodes.CONFLICT); + }); + }); +}); diff --git a/test/end-to-end/applications/company/:id/reject.js b/test/end-to-end/applications/company/:id/reject.js new file mode 100644 index 00000000..1bad155d --- /dev/null +++ b/test/end-to-end/applications/company/:id/reject.js @@ -0,0 +1,204 @@ +jest.mock("../../../../../src/lib/emailService"); +import EmailService, { EmailService as EmailServiceClass } from "../../../../../src/lib/emailService"; +jest.spyOn(EmailServiceClass.prototype, "verifyConnection").mockImplementation(() => Promise.resolve()); +import { StatusCodes } from "http-status-codes"; +import Account from "../../../../../src/models/Account"; +import CompanyApplication, { CompanyApplicationRules } from "../../../../../src/models/CompanyApplication"; +import hash from "../../../../../src/lib/passwordHashing"; +import { REJECTION_NOTIFICATION } from "../../../../../src/email-templates/companyApplicationApproval"; + +import mongoose from "mongoose"; + +const { ObjectId } = mongoose.Types; + +describe("POST /applications/company/:id/reject", () => { + + const test_agent = agent(); + + const test_user_admin = { + email: "admin@email.com", + password: "password123", + }; + + beforeAll(async () => { + await CompanyApplication.deleteMany({}); + + await Account.deleteMany({}); + await Account.create({ + email: test_user_admin.email, + password: await hash(test_user_admin.password), + isAdmin: true + }); + }); + + afterAll(async () => { + await Account.deleteMany({}); + await CompanyApplication.deleteMany({}); + }); + + beforeEach(async () => { + // default login + await test_agent + .post("/auth/login") + .send(test_user_admin) + .expect(StatusCodes.OK); + }); + + describe("ID Validation", () => { + test("Should fail if trying to reject non existent application", async () => { + + const id = new ObjectId(); + + await test_agent + .post(`/applications/company/${id}/reject`) + .send({ rejectReason: "Some reason which is valid" }) + .expect(StatusCodes.NOT_FOUND); + }); + }); + + describe("Without previous applications", () => { + + const pendingApplication1Data = { + email: "pending1@test.com", + password: "password123", + companyName: "Testing company", + motivation: "This company has a very valid motivation, because otherwise the tests would not exist.", + submittedAt: new Date("2019-11-25"), + }; + const pendingApplication2Data = { + email: "pending2@test.com", + password: "password123", + companyName: "Testing company", + motivation: "This company has a very valid motivation, because otherwise the tests would not exist.", + submittedAt: new Date("2019-11-25"), + }; + + const unverifiedApplicationData = { + email: "unverified@test.com", + password: "password123", + companyName: "Testing company", + motivation: "This company has a very valid motivation, because otherwise the tests would not exist.", + submittedAt: new Date("2019-11-25"), + isVerified: false + }; + + let pendingApplication1, pendingApplication2, unverifiedApplication; + + beforeAll(async () => { + await CompanyApplication.deleteMany({}); + + [ + pendingApplication1, + pendingApplication2, + unverifiedApplication, + ] = await CompanyApplication.create([ + pendingApplication1Data, + pendingApplication2Data, + unverifiedApplicationData, + ]); + }); + + afterAll(async () => { + await CompanyApplication.deleteMany({}); + }); + + test("Should fail if no rejectReason provided", async () => { + const res = await test_agent + .post(`/applications/company/${pendingApplication1._id}/reject`); + + expect(res.status).toBe(StatusCodes.UNPROCESSABLE_ENTITY); + expect(res.body.errors[0]).toStrictEqual({ location: "body", msg: "required", param: "rejectReason" }); + }); + + test("Should fail if application is not verified", async () => { + const res = await test_agent + .post(`/applications/company/${unverifiedApplication._id}/reject`) + .send({ rejectReason: "Some reason which is valid" }) + .expect(StatusCodes.CONFLICT); + + expect(res.body.errors).toContainEqual(CompanyApplicationRules.MUST_BE_VERIFIED); + }); + + test("Should reject pending application", async () => { + + const res = await test_agent + .post(`/applications/company/${pendingApplication1._id}/reject`) + .send({ rejectReason: "Some reason which is valid" }) + .expect(StatusCodes.OK); + + expect(res.body).toHaveProperty("email", pendingApplication1Data.email); + expect(res.body).toHaveProperty("companyName", pendingApplication1Data.companyName); + }); + + test("Should send rejection email to company email", async () => { + + await test_agent + .post(`/applications/company/${pendingApplication2._id}/reject`) + .send({ rejectReason: "Some reason which is valid" }) + .expect(StatusCodes.OK); + + const emailOptions = REJECTION_NOTIFICATION(pendingApplication2.companyName); + + expect(EmailService.sendMail).toHaveBeenCalledWith({ + subject: emailOptions.subject, + to: pendingApplication2.email, + template: emailOptions.template, + context: emailOptions.context, + }); + }); + }); + + describe("With previous applications", () => { + + const approvedApplicationData = { + email: "approved@test.com", + password: "password123", + companyName: "Testing company", + motivation: "This company has a very valid motivation, because otherwise the tests would not exist.", + submittedAt: new Date("2019-11-25"), + approvedAt: new Date("2019-11-26"), + rejectReason: null + }; + const rejectedApplicationData = { + email: "rejected@test.com", + password: "password123", + companyName: "Testing company", + motivation: "This company has a very valid motivation, because otherwise the tests would not exist.", + submittedAt: new Date("2019-11-25"), + rejectedAt: new Date("2019-11-26"), + rejectReason: "test-reason" + }; + + let approvedApplication, rejectedApplication; + + beforeAll(async () => { + await CompanyApplication.deleteMany({}); + + [ + approvedApplication, + rejectedApplication, + ] = await CompanyApplication.create([ + approvedApplicationData, + rejectedApplicationData, + ]); + }); + + afterAll(async () => { + await CompanyApplication.deleteMany({}); + }); + + test("Should fail if trying to reject already approved application", async () => { + await test_agent + .post(`/applications/company/${approvedApplication._id}/reject`) + .send({ rejectReason: "Some reason which is valid" }) + .expect(StatusCodes.CONFLICT); + }); + + test("Should fail if trying to reject already rejected application", async () => { + await test_agent + .post(`/applications/company/${rejectedApplication._id}/reject`) + .send({ rejectReason: "Some reason which is valid" }) + .expect(StatusCodes.CONFLICT); + }); + }); +}); diff --git a/test/end-to-end/apply/company/:token/validate.js b/test/end-to-end/apply/company/:token/validate.js new file mode 100644 index 00000000..fe6af34b --- /dev/null +++ b/test/end-to-end/apply/company/:token/validate.js @@ -0,0 +1,135 @@ +import EmailService from "../../../../../src/lib/emailService"; +import { StatusCodes } from "http-status-codes"; +import CompanyApplication from "../../../../../src/models/CompanyApplication.js"; +import Account from "../../../../../src/models/Account.js"; +import { NEW_COMPANY_APPLICATION_ADMINS, NEW_COMPANY_APPLICATION_COMPANY } + from "../../../../../src/email-templates/companyApplicationApproval"; +import config from "../../../../../src/config/env"; +import * as token from "../../../../../src/lib/token.js"; +import Company from "../../../../../src/models/Company"; +import { VALIDATION_LINK_EXPIRATION } from "../../../../../src/models/constants/ApplicationStatus.js"; +import { SECOND_IN_MS } from "../../../../../src/models/constants/TimeConstants.js"; +const generateTokenSpy = jest.spyOn(token, "generateToken"); +jest.spyOn(token, "verifyAndDecodeToken"); + +describe("POST /apply/company/:token/validate", () => { + + describe("Validating application", () => { + const application = { + email: "test@test.com", + password: "password123", + companyName: "Testing company", + motivation: "This company has a very valid motivation because otherwise, the tests would not exist.", + }; + + beforeAll(async () => { + await CompanyApplication.deleteMany({}); + await Account.deleteMany({}); + }); + + afterEach(async () => { + await CompanyApplication.deleteMany({}); + await Account.deleteMany({}); + await Company.deleteMany({}); + }); + + test("Should validate application and create its account and company", async () => { + await request() + .post("/apply/company") + .send(application) + .expect(StatusCodes.OK); + + const generatedToken = generateTokenSpy.mock.results[0].value; + + await request() + .post(`/apply/company/${generatedToken}/validate`) + .expect(StatusCodes.OK); + + const applicationUpdated = await CompanyApplication.findOne({ application }); + const account = await Account.findOne({ email: application.email }); + + expect(account).not.toBeNull(); + expect(Company.findOne({ _id: account.company })).toBeTruthy(); + expect(applicationUpdated.state).toBe("PENDING"); + }); + + test("Should send an email to the company and one to the NIJobs team", async () => { + const res = await request() + .post("/apply/company") + .send(application) + .expect(StatusCodes.OK); + + const generatedToken = generateTokenSpy.mock.results[0].value; + + await request() + .post(`/apply/company/${generatedToken}/validate`) + .expect(StatusCodes.OK); + + const adminEmailOptions = NEW_COMPANY_APPLICATION_ADMINS( + application.email, + application.companyName, + application.motivation + ); + + const companyEmailOptions = NEW_COMPANY_APPLICATION_COMPANY( + application.companyName, + res.body.id + ); + + expect(EmailService.sendMail).toHaveBeenNthCalledWith(2, expect.objectContaining({ + subject: adminEmailOptions.subject, + to: config.mail_from, + template: adminEmailOptions.template, + context: { ...adminEmailOptions.context }, + })); + + expect(EmailService.sendMail).toHaveBeenNthCalledWith(3, expect.objectContaining({ + subject: companyEmailOptions.subject, + to: application.email, + template: companyEmailOptions.template, + context: { ...companyEmailOptions.context }, + })); + }); + + test("Should fail if application is already validated", async () => { + await request() + .post("/apply/company") + .send(application) + .expect(StatusCodes.OK); + + const generatedToken = generateTokenSpy.mock.results[0].value; + + await request() + .post(`/apply/company/${generatedToken}/validate`) + .expect(StatusCodes.OK); + + await request() + .post(`/apply/company/${generatedToken}/validate`) + .expect(StatusCodes.CONFLICT); + }); + + test("Should fail if token does not exist", async () => { + await request() + .post(`/apply/company/${0}/validate`) + .expect(StatusCodes.NOT_FOUND); + + }); + + test("Should fail if link has expired", async () => { + await request() + .post("/apply/company") + .send(application) + .expect(StatusCodes.OK); + + const generatedToken = generateTokenSpy.mock.results[0].value; + const RealDateNow = Date.now; + const mockCurrentDate = new Date(Date.now() + (VALIDATION_LINK_EXPIRATION * SECOND_IN_MS)); + Date.now = () => mockCurrentDate; + await request() + .post(`/apply/company/${generatedToken}/validate`) + .expect(StatusCodes.FORBIDDEN); + + Date.now = RealDateNow; + }); + }); +}); diff --git a/test/end-to-end/apply/company/index.js b/test/end-to-end/apply/company/index.js new file mode 100644 index 00000000..28c36163 --- /dev/null +++ b/test/end-to-end/apply/company/index.js @@ -0,0 +1,242 @@ +import EmailService from "../../../../src/lib/emailService"; +import { StatusCodes } from "http-status-codes"; +import CompanyApplication, { CompanyApplicationRules } from "../../../../src/models/CompanyApplication"; +import Account from "../../../../src/models/Account"; +import ValidatorTester from "../../../utils/ValidatorTester"; +import ValidationReasons from "../../../../src/api/middleware/validators/validationReasons"; +import CompanyApplicationConstants from "../../../../src/models/constants/CompanyApplication"; +import AccountConstants from "../../../../src/models/constants/Account"; +import CompanyConstants from "../../../../src/models/constants/Company"; +import { APPLICATION_CONFIRMATION } + from "../../../../src/email-templates/companyApplicationApproval"; +import config from "../../../../src/config/env"; +import * as token from "../../../../src/lib/token.js"; +import env from "../../../../src/config/env.js"; +import { VALIDATION_LINK_EXPIRATION } from "../../../../src/models/constants/ApplicationStatus.js"; +import mongoose from "mongoose"; +import { SECOND_IN_MS } from "../../../../src/models/constants/TimeConstants.js"; +const generateTokenSpy = jest.spyOn(token, "generateToken"); +jest.spyOn(token, "verifyAndDecodeToken"); + +describe("POST /apply/company", () => { + describe("Input Validation", () => { + const EndpointValidatorTester = ValidatorTester((params) => request().post("/apply/company").send(params)); + const BodyValidatorTester = EndpointValidatorTester("body"); + + describe("email", () => { + const FieldValidatorTester = BodyValidatorTester("email"); + FieldValidatorTester.isRequired(); + FieldValidatorTester.mustBeEmail(); + }); + + describe("password", () => { + const FieldValidatorTester = BodyValidatorTester("password"); + FieldValidatorTester.isRequired(); + FieldValidatorTester.mustBeString(); + FieldValidatorTester.hasMinLength(AccountConstants.password.min_length); + FieldValidatorTester.hasNumber(); + }); + + describe("motivation", () => { + const FieldValidatorTester = BodyValidatorTester("motivation"); + FieldValidatorTester.isRequired(); + FieldValidatorTester.mustBeString(); + FieldValidatorTester.hasMinLength(CompanyApplicationConstants.motivation.min_length); + FieldValidatorTester.hasMaxLength(CompanyApplicationConstants.motivation.max_length); + }); + + describe("companyName", () => { + const FieldValidatorTester = BodyValidatorTester("companyName"); + FieldValidatorTester.isRequired(); + FieldValidatorTester.mustBeString(); + FieldValidatorTester.hasMinLength(CompanyConstants.companyName.min_length); + FieldValidatorTester.hasMaxLength(CompanyConstants.companyName.max_length); + }); + }); + + describe("Without any existing application and accounts", () => { + + const RealDateNow = Date.now; + const mockCurrentDate = new Date("2019-11-23"); + + beforeAll(async () => { + await CompanyApplication.deleteMany({}); + await Account.deleteMany({}); + + Date.now = () => mockCurrentDate.getTime(); + }); + + afterAll(async () => { + await CompanyApplication.deleteMany({}); + await Account.deleteMany({}); + + Date.now = RealDateNow; + }); + + test("Valid creation", async () => { + const application = { + email: "test@test.com", + password: "password123", + companyName: "Testing company", + motivation: "This company has a very valid motivation because otherwise, the tests would not exist.", + }; + const res = await request() + .post("/apply/company") + .send(application) + .expect(StatusCodes.OK); + + // eslint-disable-next-line no-unused-vars + const { password, ...rest } = application; + expect(res.body).toMatchObject(rest); + }); + + test("Should send an email to company user after creating application", async () => { + const application = { + email: "test2@test.com", + password: "password123", + companyName: "Testing company", + motivation: "This company has a very valid motivation because otherwise, the tests would not exist.", + }; + + const res = await request() + .post("/apply/company") + .send(application) + .expect(StatusCodes.OK); + + expect(token.generateToken).toHaveBeenCalledWith( + { _id: mongoose.Types.ObjectId(res.body.id) }, env.jwt_secret, VALIDATION_LINK_EXPIRATION + ); + + const generatedToken = generateTokenSpy.mock.results[0].value; + + const companyEmailOptions = APPLICATION_CONFIRMATION( + `${config.application_confirmation_link}${generatedToken}/validate` + ); + + expect(EmailService.sendMail).toHaveBeenCalledWith(expect.objectContaining({ + subject: companyEmailOptions.subject, + to: application.email, + template: companyEmailOptions.template, + context: { ...companyEmailOptions.context }, + })); + }); + + test("Should update old application if new one is created after 10 minutes", async () => { + const application = { + email: "test3@test.com", + password: "password123", + companyName: "Testing company", + motivation: "This company has a very valid motivation, because otherwise the tests would not exist.", + }; + const updated_application = { + email: "test3@test.com", + password: "password123", + companyName: "Updated Testing company", + motivation: "This company has a very valid motivation, because otherwise the tests would not exist.", + }; + + const res1 = await request() + .post("/apply/company") + .send(application) + .expect(StatusCodes.OK); + + const TempRealDate = Date.now; + const tenMinAfter = new Date(Date.now() + (VALIDATION_LINK_EXPIRATION * SECOND_IN_MS)); + Date.now = () => tenMinAfter.getTime(); + + const res2 = await request() + .post("/apply/company") + .send(updated_application) + .expect(StatusCodes.OK); + + expect(await CompanyApplication.findOne({ _id: res1.body._id })).toBeTruthy(); + expect(res1.body.id).toBe(res2.body.id); + expect(res2.body.companyName).toBe(updated_application.companyName); + + Date.now = TempRealDate; + }); + + + describe("Invalid input", () => { + + const application = { + email: "test2@test.com", + password: "password123", + companyName: "Testing company", + motivation: "This company has a very valid motivation, because otherwise the tests would not exist.", + }; + + beforeAll(async () => { + await Account.deleteMany({}); + await CompanyApplication.deleteMany({}); + }); + + afterAll(async () => { + await Account.deleteMany({}); + await CompanyApplication.deleteMany({}); + }); + + test("Should fail while using an email with an associated Account", async () => { + + await Account.create({ + email: application.email, + password: application.password, + isAdmin: true, + }); + + const res = await request() + .post("/apply/company") + .send(application) + .expect(StatusCodes.UNPROCESSABLE_ENTITY); + + expect(res.body.errors).toContainEqual({ + "location": "body", + "msg": ValidationReasons.ALREADY_EXISTS("email"), + "param": "email", + "value": application.email, + }); + }); + + test("Should fail while using an email with an associated application that was not rejected", async () => { + + // Guarantees that the company application will succeed regarding account rules + await Account.deleteOne({ email: application.email }); + + // Existing Application - Default `Pending` state + await CompanyApplication.create({ + ...application, + submittedAt: Date.now(), + }); + + const res = await request() + .post("/apply/company") + .send(application) + .expect(StatusCodes.UNPROCESSABLE_ENTITY); + + expect(res.body.errors).toContainEqual({ + "location": "body", + "msg": CompanyApplicationRules.ONLY_ONE_APPLICATION_ACTIVE_PER_EMAIL.msg, + "param": "email", + "value": application.email, + }); + }); + test("Should fail while using an email associated with an unverified application 10 minutes before its creation", async () => { + await Account.deleteMany({}); + await CompanyApplication.deleteMany({}); + await request() + .post("/apply/company") + .send(application) + .expect(StatusCodes.OK); + + const res = await request() + .post("/apply/company") + .send(application) + .expect(StatusCodes.FORBIDDEN); + + expect(res.body.errors).toContainEqual({ + "msg": CompanyApplicationRules.APPLICATION_RECENTLY_CREATED.msg, + }); + }); + }); + }); +}); diff --git a/test/end-to-end/auth.js b/test/end-to-end/auth.js index 3d005b60..601f82ce 100644 --- a/test/end-to-end/auth.js +++ b/test/end-to-end/auth.js @@ -145,7 +145,6 @@ describe("Login endpoint test", () => { email: "user@gmail.com", password: "password", }); - expect(res.status).toBe(HTTPStatus.UNAUTHORIZED); }); @@ -159,7 +158,7 @@ describe("Login endpoint test", () => { expect(res.status).toBe(HTTPStatus.OK); }); - test("should return the informations of the logged in user (admin)", async () => { + test("should return the information of the logged in user (admin)", async () => { await test_agent .post("/auth/login") @@ -175,7 +174,7 @@ describe("Login endpoint test", () => { expect(res.body).not.toHaveProperty("data.company"); }); - test("should return the informations of the logged in user (company)", async () => { + test("should return the information of the logged in user (company)", async () => { await test_agent .post("/auth/login") .send(test_user_company); @@ -192,7 +191,7 @@ describe("Login endpoint test", () => { )); }); - test("should be successful when loging out the current user", async () => { + test("should be successful when logging out the current user", async () => { const res = await test_agent .delete("/auth/login") .send(); @@ -287,7 +286,7 @@ describe("Password recovery endpoint test", () => { const res = await request() .get("/auth/recover/token/confirm"); - expect(res.status).toBe(HTTPStatus.FORBIDDEN); + expect(res.status).toBe(HTTPStatus.NOT_FOUND); expect(res.body).toHaveProperty("errors"); expect(res.body.errors[0]).toHaveProperty("msg", ValidationReasons.INVALID_TOKEN); }); @@ -328,7 +327,7 @@ describe("Password recovery endpoint test", () => { expect(res.status).toBe(HTTPStatus.FORBIDDEN); expect(res.body).toHaveProperty("errors"); - expect(res.body.errors[0]).toHaveProperty("msg", ValidationReasons.INVALID_TOKEN); + expect(res.body.errors[0]).toHaveProperty("msg", ValidationReasons.EXPIRED_TOKEN); Date.now = realTime; }); @@ -340,7 +339,7 @@ describe("Password recovery endpoint test", () => { .post("/auth/recover/token/confirm") .send({ password: newPassword }); - expect(res.status).toBe(HTTPStatus.FORBIDDEN); + expect(res.status).toBe(HTTPStatus.NOT_FOUND); expect(res.body).toHaveProperty("errors"); expect(res.body.errors[0]).toHaveProperty("msg", ValidationReasons.INVALID_TOKEN); }); @@ -383,7 +382,7 @@ describe("Password recovery endpoint test", () => { expect(res.status).toBe(HTTPStatus.FORBIDDEN); expect(res.body).toHaveProperty("errors"); - expect(res.body.errors[0]).toHaveProperty("msg", ValidationReasons.INVALID_TOKEN); + expect(res.body.errors[0]).toHaveProperty("msg", ValidationReasons.EXPIRED_TOKEN); Date.now = realTime; }); diff --git a/test/end-to-end/auth/recover/:token/confirm.js b/test/end-to-end/auth/recover/:token/confirm.js new file mode 100644 index 00000000..2125fd5d --- /dev/null +++ b/test/end-to-end/auth/recover/:token/confirm.js @@ -0,0 +1,188 @@ +import { StatusCodes } from "http-status-codes"; +import Account from "../../../../../src/models/Account"; +import ValidatorTester from "../../../../utils/ValidatorTester"; +import ValidationReasons from "../../../../../src/api/middleware/validators/validationReasons"; +import hash from "../../../../../src/lib/passwordHashing"; +import AccountConstants, { RECOVERY_LINK_EXPIRATION } from "../../../../../src/models/constants/Account"; +import * as token from "../../../../../src/lib/token"; +import env from "../../../../../src/config/env"; +import { SECOND_IN_MS } from "../../../../../src/models/constants/TimeConstants"; +import { generateToken } from "../../../../../src/lib/token"; + +const generateTokenSpy = jest.spyOn(token, "generateToken"); +jest.spyOn(token, "verifyAndDecodeToken"); + +describe("GET /auth/recover/:token/confirm", () => { + + const test_account = { + email: "recover_email@gmail.com", + password: "password123", + }; + + beforeEach(async () => { + await Account.deleteMany({ email: test_account.email }); + + await Account.create({ + email: test_account.email, + password: await hash(test_account.password), + isAdmin: true, + }); + + jest.clearAllMocks(); + }); + + test("should fail if invalid token", async () => { + const res = await request() + .get("/auth/recover/token/confirm"); + + expect(res.status).toBe(StatusCodes.NOT_FOUND); + expect(res.body).toHaveProperty("errors"); + expect(res.body.errors[0]).toHaveProperty("msg", ValidationReasons.INVALID_TOKEN); + }); + + test("should accept if valid token", async () => { + let res = await request() + .post("/auth/recover/request") + .send({ email: test_account.email }); + + expect(token.generateToken).toHaveBeenCalledWith({ email: test_account.email }, env.jwt_secret, RECOVERY_LINK_EXPIRATION); + + const generatedToken = generateTokenSpy.mock.results[0].value; + expect(res.status).toBe(StatusCodes.OK); + + res = await request() + .get(`/auth/recover/${generatedToken}/confirm`); + + expect(res.status).toBe(StatusCodes.OK); + }); + + test("should fail if valid token expired", async () => { + let res = await request() + .post("/auth/recover/request") + .send({ email: test_account.email }); + + expect(token.generateToken).toHaveBeenCalledWith({ email: test_account.email }, env.jwt_secret, RECOVERY_LINK_EXPIRATION); + + const generatedToken = generateTokenSpy.mock.results[0].value; + expect(res.status).toBe(StatusCodes.OK); + + + const realTime = Date.now; + const mockDate = Date.now() + (RECOVERY_LINK_EXPIRATION * SECOND_IN_MS); + Date.now = () => mockDate; + + res = await request() + .get(`/auth/recover/${generatedToken}/confirm`); + + expect(res.status).toBe(StatusCodes.FORBIDDEN); + expect(res.body).toHaveProperty("errors"); + expect(res.body.errors[0]).toHaveProperty("msg", ValidationReasons.EXPIRED_TOKEN); + + Date.now = realTime; + }); +}); + +describe("POST /auth/recover/:token/confirm", () => { + + const test_account = { + email: "recover_email@gmail.com", + password: "password123", + }; + + const newPassword = "new_password_123"; + + beforeEach(async () => { + await Account.deleteMany({ email: test_account.email }); + + await Account.create({ + email: test_account.email, + password: await hash(test_account.password), + isAdmin: true, + }); + + jest.clearAllMocks(); + }); + + afterAll(async () => { + await Account.deleteMany({}); + }); + + describe("Input Validation", () => { + describe("password", () => { + let generatedToken; + + beforeAll(async () => { + await request() + .post("/auth/recover/request") + .send({ email: test_account.email }).expect(StatusCodes.OK); + + expect(token.generateToken).toHaveBeenCalledWith({ email: test_account.email }, env.jwt_secret, RECOVERY_LINK_EXPIRATION); + + generatedToken = generateTokenSpy.mock.results[0].value; + }); + + const EndpointValidatorTester = + ValidatorTester((params) => request().post(`/auth/recover/${generatedToken}/confirm`).send(params)); + const BodyValidatorTester = EndpointValidatorTester("body"); + const FieldValidatorTester = BodyValidatorTester("password"); + FieldValidatorTester.isRequired(); + FieldValidatorTester.mustBeString(); + FieldValidatorTester.hasMinLength(AccountConstants.password.min_length); + FieldValidatorTester.hasNumber(); + }); + }); + + test("should fail if invalid token", async () => { + const res = await request() + .post("/auth/recover/token/confirm") + .send({ password: newPassword }); + + expect(res.status).toBe(StatusCodes.NOT_FOUND); + expect(res.body).toHaveProperty("errors"); + expect(res.body.errors[0]).toHaveProperty("msg", ValidationReasons.INVALID_TOKEN); + }); + + test("should accept if valid token", async () => { + const generatedToken = generateToken({ email: test_account.email }, env.jwt_secret, RECOVERY_LINK_EXPIRATION); + + const res = await request() + .post(`/auth/recover/${generatedToken}/confirm`) + .send({ password: newPassword }); + + expect(res.status).toBe(StatusCodes.OK); + }); + + test("should fail if valid token expired", async () => { + + const generatedToken = generateToken({ email: test_account.email }, env.jwt_secret, RECOVERY_LINK_EXPIRATION); + + const realTime = Date.now; + const mockDate = Date.now() + (RECOVERY_LINK_EXPIRATION * SECOND_IN_MS); + Date.now = () => mockDate; + + const res = await request() + .post(`/auth/recover/${generatedToken}/confirm`) + .send({ password: newPassword }); + + expect(res.status).toBe(StatusCodes.FORBIDDEN); + expect(res.body).toHaveProperty("errors"); + expect(res.body.errors[0]).toHaveProperty("msg", ValidationReasons.EXPIRED_TOKEN); + + Date.now = realTime; + }); + + test("should succeed to complete the whole password recovery process", async () => { + const generatedToken = generateToken({ email: test_account.email }, env.jwt_secret, RECOVERY_LINK_EXPIRATION); + + await request() + .post(`/auth/recover/${generatedToken}/confirm`) + .send({ password: newPassword }) + .expect(StatusCodes.OK); + + await request() + .post("/auth/login") + .send({ email: test_account.email, password: newPassword }) + .expect(StatusCodes.OK); + + }); +}); diff --git a/test/end-to-end/company/:companyId/application.js b/test/end-to-end/company/:companyId/application.js new file mode 100644 index 00000000..23458d93 --- /dev/null +++ b/test/end-to-end/company/:companyId/application.js @@ -0,0 +1,173 @@ +import { StatusCodes } from "http-status-codes"; +import CompanyApplication from "../../../../src/models/CompanyApplication"; +import Account from "../../../../src/models/Account"; +import Company from "../../../../src/models/Company.js"; +import AccountService from "../../../../src/services/account.js"; +import CompanyApplicationService from "../../../../src/services/application.js"; +import withGodToken from "../../../utils/GodToken.js"; +import hash from "../../../../src/lib/passwordHashing.js"; + + +describe("GET /company/:companyId/application", () => { + const test_agent = agent(); + + let companyId; + + const test_user_company1 = { + email: "company1@email.com", + password: "password123", + }; + + describe("Testing permissions", () => { + + const test_user_admin = { + email: "admin@email.com", + password: "password123", + }; + + const test_user_company2 = { + email: "company2@email.com", + password: "password123", + }; + + beforeAll(async () => { + await Account.deleteMany({}); + await Company.deleteMany({}); + await CompanyApplication.deleteMany({}); + await test_agent + .delete("/auth/login"); + const accountService = new AccountService(); + await (new CompanyApplicationService()).create({ + email: test_user_company1.email, + password: test_user_company1.password, + companyName: "test company", + motivation: "I want people for job :)" + }); + await accountService.registerAdmin(test_user_admin.email, test_user_admin.password); + await accountService.registerCompany(test_user_company1.email, await hash(test_user_company1.password), "test company"); + await accountService.registerCompany(test_user_company2.email, await hash(test_user_company2.password), "test company 2"); + + companyId = (await Company.findOne({ name: "test company" }))._id; + }); + + + afterEach(async () => { + + await test_agent + .delete("/auth/login"); + }); + + afterAll(async () => { + await Account.deleteMany({}); + await Company.deleteMany({}); + await CompanyApplication.deleteMany({}); + }); + + test("Should succeed if the user is logged in an admin account", async () => { + await test_agent + .post("/auth/login") + .send(test_user_admin) + .expect(StatusCodes.OK); + + const res = await test_agent + .get(`/company/${companyId.toString()}/application`); + + expect(res.status).toBe(StatusCodes.OK); + }); + + test("Should succeed if the user is logged in a god account", async () => { + await test_agent.delete("/auth/login"); + await test_agent + .post("/auth/login") + .send(test_user_company1) + .expect(StatusCodes.OK); + + const res = await test_agent + .get(`/company/${companyId}/application`) + .send(withGodToken()); + + expect(res.status).toBe(StatusCodes.OK); + }); + + test("Should succeed if the user is logged in to its company account", async () => { + await test_agent + .post("/auth/login") + .send(test_user_company1) + .expect(StatusCodes.OK); + + const res = await test_agent + .get(`/company/${companyId}/application`); + + expect(res.status).toBe(StatusCodes.OK); + }); + + test("Should failed if the user is not logged in", async () => { + await test_agent + .get(`/company/${companyId}/application`).expect(StatusCodes.UNAUTHORIZED); + + }); + + test("Should fail if the user is logged in to an account without access to the company", async () => { + await test_agent + .post("/auth/login") + .send(test_user_company2) + .expect(StatusCodes.OK); + + await test_agent + .get(`/company/${companyId}/application`) + .expect(StatusCodes.UNAUTHORIZED); + }); + }); + + describe("Testing endpoint's result", () => { + let application; + const RealDateNow = Date.now; + const mockCurrentDate = new Date("2019-11-23"); + beforeAll(async () => { + await Account.deleteMany({}); + await Company.deleteMany({}); + await CompanyApplication.deleteMany({}); + await test_agent + .delete("/auth/login"); + const accountService = new AccountService(); + + Date.now = () => mockCurrentDate.getTime(); + + application = await (new CompanyApplicationService()).create({ + email: test_user_company1.email, + password: test_user_company1.password, + companyName: "test company", + motivation: "I want people for job :)", + }); + await accountService.registerCompany(test_user_company1.email, await hash(test_user_company1.password), "test company"); + + companyId = (await Company.findOne({ name: "test company" }))._id; + Date.now = RealDateNow; + }); + + afterAll(async () => { + await Account.deleteMany({}); + await Company.deleteMany({}); + await CompanyApplication.deleteMany({}); + }); + + test("Should return the company's application", async () => { + await test_agent + .post("/auth/login") + .send(test_user_company1) + .expect(StatusCodes.OK); + + const res = await test_agent + .get(`/company/${companyId}/application`) + .expect(StatusCodes.OK); + + expect(res.body).toBeDefined(); + expect(res.body).toHaveProperty("email", application.email); + expect(res.body).toHaveProperty("companyName", application.companyName); + expect(res.body).toHaveProperty("motivation", application.motivation); + expect(res.body).toHaveProperty("submittedAt", mockCurrentDate.toJSON()); + expect(res.body).not.toHaveProperty("password", application.password); + }); + + }); +}); diff --git a/test/end-to-end/offer.js b/test/end-to-end/offer.js index d79cfe6b..daf54bbe 100644 --- a/test/end-to-end/offer.js +++ b/test/end-to-end/offer.js @@ -22,6 +22,7 @@ import EmailService from "../../src/lib/emailService"; import { concurrentOffersNotExceeded } from "../../src/api/middleware/validators/validatorUtils"; import { OFFER_DISABLED_NOTIFICATION } from "../../src/email-templates/companyOfferDisabled"; import base64url from "base64url"; +import CompanyApplication from "../../src/models/CompanyApplication.js"; //---------------------------------------------------------------- describe("Offer endpoint tests", () => { @@ -60,6 +61,16 @@ describe("Offer endpoint tests", () => { beforeAll(async () => { await Company.deleteMany({}); + await CompanyApplication.deleteMany({}); + await Account.deleteMany({}); + await CompanyApplication.create({ + email: test_user_company.email, + password: test_user_company.password, + companyName: "test verified company", + motivation: "I want people for job :)", + isVerified: true, + submittedAt: Date.now() + }); test_company = await Company.create({ name: "test company", bio: "a bio", @@ -67,7 +78,7 @@ describe("Offer endpoint tests", () => { hasFinishedRegistration: true, logo: "http://awebsite.com/alogo.jpg", }); - await Account.deleteMany({}); + await Account.create({ email: test_user_admin.email, password: await hash(test_user_admin.password), @@ -79,6 +90,11 @@ describe("Offer endpoint tests", () => { company: test_company._id }); }); + afterAll(async () => { + await Company.deleteMany({}); + await Account.deleteMany({}); + await CompanyApplication.deleteMany({}); + }); describe("POST /offers", () => { @@ -1062,6 +1078,7 @@ describe("Offer endpoint tests", () => { owner: test_company._id, ownerName: test_company.name, ownerLogo: test_company.logo, + isPending: false }; await Offer.deleteMany({}); diff --git a/test/end-to-end/offers/index.js b/test/end-to-end/offers/index.js new file mode 100644 index 00000000..efdad084 --- /dev/null +++ b/test/end-to-end/offers/index.js @@ -0,0 +1,202 @@ +import Company from "../../../src/models/Company.js"; +import Offer from "../../../src/models/Offer.js"; +import { StatusCodes as HTTPStatus } from "http-status-codes/build/cjs/status-codes.js"; +import { DAY_TO_MS } from "../../utils/TimeConstants.js"; +import CompanyApplication from "../../../src/models/CompanyApplication.js"; +import Account from "../../../src/models/Account.js"; +import hash from "../../../src/lib/passwordHashing.js"; + +describe("Using already created offer(s)", () => { + const generateTestOffer = (params) => ({ + title: "Test Offer", + publishDate: (new Date(Date.now())).toISOString(), + publishEndDate: (new Date(Date.now() + (DAY_TO_MS))).toISOString(), + description: "For Testing Purposes", + contacts: ["geral@niaefeup.pt", "229417766"], + jobMinDuration: 1, + jobMaxDuration: 6, + jobType: "SUMMER INTERNSHIP", + fields: ["DEVOPS", "BACKEND", "OTHER"], + technologies: ["React", "CSS"], + location: "Testing Street, Test City, 123", + isHidden: false, + isArchived: false, + requirements: ["The candidate must be tested", "Fluent in testJS"], + vacancies: 2, + ...params, + }); + + + const test_user_admin = { + email: "admin@email.com", + password: "password123", + }; + + const test_user_company = { + email: "company@email.com", + password: "password123", + }; + + const approved_test_user_company = { + email: "approvedCompany@email.com", + password: "password123", + }; + + let test_company; + + let approved_test_company; + + let test_offer; + + const testPublishDate = "2019-11-22T00:00:00.000Z"; + + const testPublishEndDate = "2019-11-28T00:00:00.000Z"; + + + const RealDateNow = Date.now; + const mockCurrentDate = new Date("2019-11-23"); + + + beforeAll(async () => { + await Company.deleteMany({}); + await CompanyApplication.deleteMany({}); + + await CompanyApplication.create({ + email: test_user_company.email, + password: test_user_company.password, + companyName: "test verified company", + motivation: "I want people for job :)", + isVerified: true, + submittedAt: Date.now() + }); + + await CompanyApplication.create({ + email: approved_test_user_company.email, + password: approved_test_user_company.password, + companyName: "approved test company", + motivation: "I want people for job :)", + isVerified: true, + submittedAt: Date.now() - 1, + approvedAt: Date.now() + }); + + test_company = await Company.create({ + name: "test company", + bio: "a bio", + contacts: ["a contact"], + hasFinishedRegistration: true, + logo: "http://awebsite.com/alogo.jpg", + }); + + approved_test_company = await Company.create({ + name: "approved test company", + bio: "a bio", + contacts: ["a contact"], + hasFinishedRegistration: true, + logo: "http://awebsite.com/alogo.jpg", + }); + + await Account.deleteMany({}); + + await Account.create({ + email: test_user_admin.email, + password: await hash(test_user_admin.password), + isAdmin: true + }); + + await Account.create({ + email: test_user_company.email, + password: await hash(test_user_company.password), + company: test_company._id + }); + + await Account.create({ + email: approved_test_user_company.email, + password: await hash(approved_test_user_company.password), + company: approved_test_company._id + }); + + test_offer = { + ...generateTestOffer({ + "publishDate": testPublishDate, + "publishEndDate": testPublishEndDate + }), + owner: test_company._id, + ownerName: test_company.name, + ownerLogo: test_company.logo, + isPending: false + }; + + await Offer.deleteMany({}); + await Offer.create(test_offer); + }); + + afterAll(async () => { + await Company.deleteMany({}); + await Account.deleteMany({}); + await CompanyApplication.deleteMany({}); + await Offer.deleteMany({}); + }); + + beforeEach(() => { + Date.now = () => mockCurrentDate.getTime(); + }); + + afterEach(() => { + Date.now = RealDateNow; + }); + + describe("Only current offers are returned", () => { + + const expired_test_offer = generateTestOffer({ + "publishDate": (new Date(Date.now() - (2 * DAY_TO_MS))).toISOString(), + "publishEndDate": (new Date(Date.now() - (DAY_TO_MS))).toISOString() + }); + + const future_test_offer = generateTestOffer({ + "publishDate": (new Date(Date.now() + (DAY_TO_MS))).toISOString(), + "publishEndDate": (new Date(Date.now() + (2 * DAY_TO_MS))).toISOString() + }); + + beforeAll(async () => { + + [expired_test_offer, future_test_offer] + .forEach((offer) => { + offer.owner = test_company._id; + offer.ownerName = test_company.name; + offer.ownerLogo = test_company.logo; + }); + + await Offer.create([future_test_offer]); + }); + + test("should provide only current offer info (no pending offers)", async () => { + + await Offer.create({ ...test_offer, isPending: true, title: "Pending offer" }); + const res = await request() + .get("/offers"); + + expect(res.status).toBe(HTTPStatus.OK); + expect(res.body?.results).toHaveLength(1); + + // Necessary because jest matchers appear to not be working (expect.any(Number), expect.anything(), etc) + const extracted_data = res.body.results.map((elem) => { + delete elem["_id"]; + delete elem["__v"]; + delete elem["createdAt"]; + delete elem["updatedAt"]; + delete elem["score"]; + delete elem["queryToken"]; + return elem; + }); + + const prepared_test_offer = { + ...test_offer, + isHidden: false, + owner: test_offer.owner.toString(), + }; + + expect(extracted_data).toContainEqual(prepared_test_offer); + }); + }); +}); diff --git a/test/end-to-end/offers/new.js b/test/end-to-end/offers/new.js new file mode 100644 index 00000000..29ac2094 --- /dev/null +++ b/test/end-to-end/offers/new.js @@ -0,0 +1,142 @@ +import { DAY_TO_MS } from "../../utils/TimeConstants.js"; +import Company from "../../../src/models/Company.js"; +import Account from "../../../src/models/Account.js"; +import hash from "../../../src/lib/passwordHashing.js"; +import { StatusCodes as HTTPStatus } from "http-status-codes/build/cjs/status-codes.js"; +import withGodToken from "../../utils/GodToken.js"; +import Offer from "../../../src/models/Offer.js"; +import CompanyApplication from "../../../src/models/CompanyApplication.js"; + +describe("POST /offers/new", () => { + const generateTestOffer = (params) => ({ + title: "Test Offer", + publishDate: (new Date(Date.now())).toISOString(), + publishEndDate: (new Date(Date.now() + (DAY_TO_MS))).toISOString(), + description: "For Testing Purposes", + contacts: ["geral@niaefeup.pt", "229417766"], + jobMinDuration: 1, + jobMaxDuration: 6, + jobType: "SUMMER INTERNSHIP", + fields: ["DEVOPS", "BACKEND", "OTHER"], + technologies: ["React", "CSS"], + location: "Testing Street, Test City, 123", + isHidden: false, + isArchived: false, + requirements: ["The candidate must be tested", "Fluent in testJS"], + vacancies: 2, + ...params, + }); + + let test_company, approved_test_company; + + + const test_user_admin = { + email: "admin@email.com", + password: "password123", + }; + const test_user_company = { + email: "company@email.com", + password: "password123", + }; + + const approved_test_user_company = { + email: "approvedCompany@email.com", + password: "password123", + }; + + beforeAll(async () => { + + await Company.deleteMany({}); + + await Account.deleteMany({}); + + await CompanyApplication.deleteMany({}); + + test_company = await Company.create({ + name: "test company", + bio: "a bio", + contacts: ["a contact"], + hasFinishedRegistration: true, + logo: "http://awebsite.com/alogo.jpg", + }); + + approved_test_company = await Company.create({ + name: " approved test company", + bio: "a bio", + contacts: ["a contact"], + hasFinishedRegistration: true, + logo: "http://awebsite.com/alogo.jpg", + }); + + await CompanyApplication.create({ + email: test_user_company.email, + password: test_user_company.password, + companyName: "test verified company", + motivation: "I want people for job :)", + isVerified: true, + submittedAt: Date.now() + }); + + await CompanyApplication.create({ + email: approved_test_user_company.email, + password: approved_test_user_company.password, + companyName: "approved test company", + motivation: "I want people for job :)", + isVerified: true, + submittedAt: Date.now() - 1, + approvedAt: Date.now(), + }); + + await Account.create({ + email: test_user_admin.email, + password: await hash(test_user_admin.password), + isAdmin: true + }); + + await Account.create({ + email: test_user_company.email, + password: await hash(test_user_company.password), + company: test_company._id, + }); + + await Account.create({ + email: approved_test_user_company.email, + password: await hash(approved_test_user_company.password), + company: approved_test_company._id, + }); + + }); + + afterAll(async () => { + await Company.deleteMany({}); + await Account.deleteMany({}); + await CompanyApplication.deleteMany({}); + }); + + describe("Without pre-existing offers", () => { + beforeAll(async () => { + await Offer.deleteMany({}); + }); + + beforeEach(async () => { + await Offer.deleteMany({}); + }); + + test("Offer should be pending if the company hasn't been approved", async () => { + const offer = generateTestOffer({ owner: test_company._id }); + const res = await request() + .post("/offers/new") + .send(withGodToken(offer)).expect(HTTPStatus.OK); + expect(res.body.isPending).toBe(true); + }); + + test("Offer should not be pending if the company has been approved", async () => { + const offer = generateTestOffer({ owner: approved_test_company._id }); + const res = await request() + .post("/offers/new") + .send(withGodToken(offer)).expect(HTTPStatus.OK); + expect(res.body.isPending).toBe(false); + }); + }); + +}); diff --git a/test/end-to-end/review.js b/test/end-to-end/review.js index aab25cdc..b5917da8 100644 --- a/test/end-to-end/review.js +++ b/test/end-to-end/review.js @@ -1,14 +1,16 @@ + + jest.mock("../../src/lib/emailService"); import EmailService, { EmailService as EmailServiceClass } from "../../src/lib/emailService"; jest.spyOn(EmailServiceClass.prototype, "verifyConnection").mockImplementation(() => Promise.resolve()); import { StatusCodes as HTTPStatus } from "http-status-codes"; -import CompanyApplication, { CompanyApplicationRules } from "../../src/models/CompanyApplication"; +import CompanyApplication from "../../src/models/CompanyApplication"; import hash from "../../src/lib/passwordHashing"; import Account from "../../src/models/Account"; -import { ErrorTypes } from "../../src/api/middleware/errorHandler"; import ApplicationStatus from "../../src/models/constants/ApplicationStatus"; import { APPROVAL_NOTIFICATION, REJECTION_NOTIFICATION } from "../../src/email-templates/companyApplicationApproval"; import mongoose from "mongoose"; +import AccountService from "../../src/services/account.js"; const { ObjectId } = mongoose.Types; @@ -141,7 +143,7 @@ describe("Company application review endpoint test", () => { expect(wrongFormatQuery.status).toBe(HTTPStatus.UNPROCESSABLE_ENTITY); expect(wrongFormatQuery.body.errors[0]).toStrictEqual({ location: "query", - msg: "must-be-in:[PENDING,APPROVED,REJECTED]", + msg: "must-be-in:[UNVERIFIED,PENDING,APPROVED,REJECTED]", param: "state", value: [`<["${ApplicationStatus.APPROVED}"]`] }); @@ -291,6 +293,12 @@ describe("Company application review endpoint test", () => { beforeEach(async () => { await Account.deleteMany({ email: pendingApplication.email }); application = await CompanyApplication.create(pendingApplication); + await (new AccountService()).registerCompany( + pendingApplication.email, + pendingApplication.password, + pendingApplication.companyName + ); + }); afterEach(async () => { @@ -298,13 +306,14 @@ describe("Company application review endpoint test", () => { }); test("Should approve pending application", async () => { - const res = await test_agent .post(`/applications/company/${application._id}/approve`); expect(res.status).toBe(HTTPStatus.OK); expect(res.body.email).toBe(pendingApplication.email); - expect(res.body.companyName).toBe(pendingApplication.companyName); + const approved_application = await CompanyApplication.findById(application._id); + expect(approved_application.state).toBe(ApplicationStatus.APPROVED); + }); test("Should send approval email to company email", async () => { @@ -348,26 +357,12 @@ describe("Company application review endpoint test", () => { .post(`/applications/company/${application._id}/reject`) .send({ rejectReason: "Some reason which is valid" }); - const res = await test_agent .post(`/applications/company/${application._id}/approve`); expect(res.status).toBe(HTTPStatus.CONFLICT); }); - test("Should fail if approving application with an existing account with same email, and then rollback", async () => { - await Account.create({ email: application.email, password: "passwordHashedButNotReally", isAdmin: true }); - - const res = await test_agent - .post(`/applications/company/${application._id}/approve`); - - expect(res.status).toBe(HTTPStatus.CONFLICT); - expect(res.body.error_code).toBe(ErrorTypes.VALIDATION_ERROR); - expect(res.body.errors[0].msg).toBe(CompanyApplicationRules.EMAIL_ALREADY_IN_USE.msg); - - const result_application = await CompanyApplication.findById(application._id); - expect(result_application.state).toBe(ApplicationStatus.PENDING); - }); }); describe("Reject application", () => { diff --git a/test/unit/token.js b/test/unit/token.js index d52461d4..dfa8d422 100644 --- a/test/unit/token.js +++ b/test/unit/token.js @@ -1,5 +1,7 @@ import { verifyAndDecodeToken, generateToken } from "../../src/lib/token"; import { SECOND_IN_MS } from "../../src/models/constants/TimeConstants"; +import { JsonWebTokenError } from "jsonwebtoken"; + describe("JWT Token tests", () => { const data = { @@ -20,7 +22,9 @@ describe("JWT Token tests", () => { }); test("should fail to decode token if invalid secret", () => { - expect(verifyAndDecodeToken(token, `${secret}o`)).toBeNull(); + expect(() => verifyAndDecodeToken(token, `${secret}o`)).toThrow(JsonWebTokenError); + expect(() => verifyAndDecodeToken(token, `${secret}o`)).toThrow("invalid signature"); + }); test("should fail to decode token if expired", () => { @@ -28,7 +32,8 @@ describe("JWT Token tests", () => { const mockDate = Date.now() + (11 * SECOND_IN_MS); Date.now = () => mockDate; - expect(verifyAndDecodeToken(token, `${secret}`)).toBeNull(); + expect(() => verifyAndDecodeToken(token, `${secret}`)).toThrow(JsonWebTokenError); + expect(() => verifyAndDecodeToken(token, `${secret}`)).toThrow("jwt expired"); Date.now = realTime; });