From 3171a88eded10e6639aded89977542fd05deebfd Mon Sep 17 00:00:00 2001 From: Janishar Ali Date: Sun, 11 Dec 2022 21:47:27 +0530 Subject: [PATCH 01/33] update libraries --- package-lock.json | 19437 ++++++++++++++++++++++++++++++-------------- package.json | 87 +- 2 files changed, 13366 insertions(+), 6158 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6da3f4d..1d9bcb2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,262 +1,10463 @@ { "name": "nodejs-backend-architecture", - "version": "1.0.2", - "lockfileVersion": 1, + "version": "2.0.0", + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "name": "nodejs-backend-architecture", + "version": "2.0.0", + "license": "Apache-2.0", + "dependencies": { + "axios": "^1.2.1", + "bcrypt": "^5.1.0", + "body-parser": "^1.20.1", + "cookie-parser": "^1.4.6", + "cors": "^2.8.5", + "express": "^4.18.2", + "joi": "^17.7.0", + "jsonwebtoken": "^8.5.1", + "lodash": "^4.17.21", + "moment": "^2.29.4", + "mongoose": "^6.8.0", + "multer": "^1.4.5-lts.1", + "newrelic": "^9.7.2", + "qs": "^6.11.0", + "request": "^2.88.2", + "winston": "^3.8.2", + "winston-daily-rotate-file": "^4.7.1" + }, + "devDependencies": { + "@types/bcrypt": "^5.0.0", + "@types/body-parser": "^1.19.2", + "@types/cookie-parser": "^1.4.3", + "@types/cors": "^2.8.13", + "@types/express": "^4.17.14", + "@types/jsonwebtoken": "^8.5.9", + "@types/lodash": "^4.14.191", + "@types/morgan": "^1.9.3", + "@types/multer": "^1.4.7", + "@types/newrelic": "^9.4.0", + "@types/newrelic__winston-enricher": "^0.1.1", + "@types/node": "^18.11.13", + "@types/request": "^2.48.8", + "@typescript-eslint/eslint-plugin": "^5.46.0", + "@typescript-eslint/parser": "^5.46.0", + "colors": "^1.4.0", + "dotenv": "^16.0.3", + "eslint": "^8.29.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-prettier": "^4.2.1", + "jest": "^29.3.1", + "nodemon": "^2.0.20", + "prettier": "^2.8.1", + "supertest": "^6.3.3", + "ts-jest": "^29.0.3", + "ts-node": "^10.9.1", + "tslint": "^6.1.3", + "typescript": "^4.9.4" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@aws-crypto/ie11-detection": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-2.0.2.tgz", + "integrity": "sha512-5XDMQY98gMAf/WRTic5G++jfmS/VLM0rwpiOpaainKi4L0nqWMSB1SzsrEG5rjFZGYN6ZAefO+/Yta2dFM0kMw==", + "optional": true, + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/ie11-detection/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true + }, + "node_modules/@aws-crypto/sha256-browser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-2.0.0.tgz", + "integrity": "sha512-rYXOQ8BFOaqMEHJrLHul/25ckWH6GTJtdLSajhlqGMx0PmSueAuvboCuZCTqEKlxR8CQOwRarxYMZZSYlhRA1A==", + "optional": true, + "dependencies": { + "@aws-crypto/ie11-detection": "^2.0.0", + "@aws-crypto/sha256-js": "^2.0.0", + "@aws-crypto/supports-web-crypto": "^2.0.0", + "@aws-crypto/util": "^2.0.0", + "@aws-sdk/types": "^3.1.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true + }, + "node_modules/@aws-crypto/sha256-js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-2.0.0.tgz", + "integrity": "sha512-VZY+mCY4Nmrs5WGfitmNqXzaE873fcIZDu54cbaDaaamsaTOP1DBImV9F4pICc3EHjQXujyE8jig+PFCaew9ig==", + "optional": true, + "dependencies": { + "@aws-crypto/util": "^2.0.0", + "@aws-sdk/types": "^3.1.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha256-js/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true + }, + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-2.0.2.tgz", + "integrity": "sha512-6mbSsLHwZ99CTOOswvCRP3C+VCWnzBf+1SnbWxzzJ9lR0mA0JnY2JEAhp8rqmTE0GPFy88rrM27ffgp62oErMQ==", + "optional": true, + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true + }, + "node_modules/@aws-crypto/util": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-2.0.2.tgz", + "integrity": "sha512-Lgu5v/0e/BcrZ5m/IWqzPUf3UYFTy/PpeED+uc9SWUR1iZQL8XXbGQg10UfllwwBryO3hFF5dizK+78aoXC1eA==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "^3.110.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/util/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true + }, + "node_modules/@aws-sdk/abort-controller": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.226.0.tgz", + "integrity": "sha512-cJVzr1xxPBd08voknXvR0RLgtZKGKt6WyDpH/BaPCu3rfSqWCDZKzwqe940eqosjmKrxC6pUZNKASIqHOQ8xxQ==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.226.0.tgz", + "integrity": "sha512-f97yYtFN2YyVLCkDM51yLakb5NKy9gTSSXWe9mA9rgynLPfgsJbIHXv3zr1Qg0Ay0p4j1eLYukLaVw1MKlHDgw==", + "optional": true, + "dependencies": { + "@aws-crypto/sha256-browser": "2.0.0", + "@aws-crypto/sha256-js": "2.0.0", + "@aws-sdk/client-sts": "3.226.0", + "@aws-sdk/config-resolver": "3.226.0", + "@aws-sdk/credential-provider-node": "3.226.0", + "@aws-sdk/fetch-http-handler": "3.226.0", + "@aws-sdk/hash-node": "3.226.0", + "@aws-sdk/invalid-dependency": "3.226.0", + "@aws-sdk/middleware-content-length": "3.226.0", + "@aws-sdk/middleware-endpoint": "3.226.0", + "@aws-sdk/middleware-host-header": "3.226.0", + "@aws-sdk/middleware-logger": "3.226.0", + "@aws-sdk/middleware-recursion-detection": "3.226.0", + "@aws-sdk/middleware-retry": "3.226.0", + "@aws-sdk/middleware-serde": "3.226.0", + "@aws-sdk/middleware-signing": "3.226.0", + "@aws-sdk/middleware-stack": "3.226.0", + "@aws-sdk/middleware-user-agent": "3.226.0", + "@aws-sdk/node-config-provider": "3.226.0", + "@aws-sdk/node-http-handler": "3.226.0", + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/smithy-client": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/url-parser": "3.226.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.226.0", + "@aws-sdk/util-defaults-mode-node": "3.226.0", + "@aws-sdk/util-endpoints": "3.226.0", + "@aws-sdk/util-user-agent-browser": "3.226.0", + "@aws-sdk/util-user-agent-node": "3.226.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "@aws-sdk/util-utf8-node": "3.208.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.226.0.tgz", + "integrity": "sha512-+Hl1YSLKrxPnQLijhWryI6uV8eKZIsUhvWlzFKx75kjxzjsC/jyk5zV59jnCu0SCCepXB8DKyLVa2WpH7iAHew==", + "optional": true, + "dependencies": { + "@aws-crypto/sha256-browser": "2.0.0", + "@aws-crypto/sha256-js": "2.0.0", + "@aws-sdk/config-resolver": "3.226.0", + "@aws-sdk/fetch-http-handler": "3.226.0", + "@aws-sdk/hash-node": "3.226.0", + "@aws-sdk/invalid-dependency": "3.226.0", + "@aws-sdk/middleware-content-length": "3.226.0", + "@aws-sdk/middleware-endpoint": "3.226.0", + "@aws-sdk/middleware-host-header": "3.226.0", + "@aws-sdk/middleware-logger": "3.226.0", + "@aws-sdk/middleware-recursion-detection": "3.226.0", + "@aws-sdk/middleware-retry": "3.226.0", + "@aws-sdk/middleware-serde": "3.226.0", + "@aws-sdk/middleware-stack": "3.226.0", + "@aws-sdk/middleware-user-agent": "3.226.0", + "@aws-sdk/node-config-provider": "3.226.0", + "@aws-sdk/node-http-handler": "3.226.0", + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/smithy-client": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/url-parser": "3.226.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.226.0", + "@aws-sdk/util-defaults-mode-node": "3.226.0", + "@aws-sdk/util-endpoints": "3.226.0", + "@aws-sdk/util-user-agent-browser": "3.226.0", + "@aws-sdk/util-user-agent-node": "3.226.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "@aws-sdk/util-utf8-node": "3.208.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.226.0.tgz", + "integrity": "sha512-IKzAhL6RoPs7IZ/rJvekjedQ4oesazCO+Aqh9l2Xct+XY0MFBdh4amgg4t/8fjksfIzmJH48BZoNv5gVak6yRw==", + "optional": true, + "dependencies": { + "@aws-crypto/sha256-browser": "2.0.0", + "@aws-crypto/sha256-js": "2.0.0", + "@aws-sdk/config-resolver": "3.226.0", + "@aws-sdk/fetch-http-handler": "3.226.0", + "@aws-sdk/hash-node": "3.226.0", + "@aws-sdk/invalid-dependency": "3.226.0", + "@aws-sdk/middleware-content-length": "3.226.0", + "@aws-sdk/middleware-endpoint": "3.226.0", + "@aws-sdk/middleware-host-header": "3.226.0", + "@aws-sdk/middleware-logger": "3.226.0", + "@aws-sdk/middleware-recursion-detection": "3.226.0", + "@aws-sdk/middleware-retry": "3.226.0", + "@aws-sdk/middleware-serde": "3.226.0", + "@aws-sdk/middleware-stack": "3.226.0", + "@aws-sdk/middleware-user-agent": "3.226.0", + "@aws-sdk/node-config-provider": "3.226.0", + "@aws-sdk/node-http-handler": "3.226.0", + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/smithy-client": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/url-parser": "3.226.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.226.0", + "@aws-sdk/util-defaults-mode-node": "3.226.0", + "@aws-sdk/util-endpoints": "3.226.0", + "@aws-sdk/util-user-agent-browser": "3.226.0", + "@aws-sdk/util-user-agent-node": "3.226.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "@aws-sdk/util-utf8-node": "3.208.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.226.0.tgz", + "integrity": "sha512-ZBlqRVbnHvvbkN5g56+mXltNybHNzgV69+2ARubQ8ge9U2qF/LweCmGqZnZLWqdGXwaB9IOvz5ZW2npyJh1X/A==", + "optional": true, + "dependencies": { + "@aws-crypto/sha256-browser": "2.0.0", + "@aws-crypto/sha256-js": "2.0.0", + "@aws-sdk/config-resolver": "3.226.0", + "@aws-sdk/credential-provider-node": "3.226.0", + "@aws-sdk/fetch-http-handler": "3.226.0", + "@aws-sdk/hash-node": "3.226.0", + "@aws-sdk/invalid-dependency": "3.226.0", + "@aws-sdk/middleware-content-length": "3.226.0", + "@aws-sdk/middleware-endpoint": "3.226.0", + "@aws-sdk/middleware-host-header": "3.226.0", + "@aws-sdk/middleware-logger": "3.226.0", + "@aws-sdk/middleware-recursion-detection": "3.226.0", + "@aws-sdk/middleware-retry": "3.226.0", + "@aws-sdk/middleware-sdk-sts": "3.226.0", + "@aws-sdk/middleware-serde": "3.226.0", + "@aws-sdk/middleware-signing": "3.226.0", + "@aws-sdk/middleware-stack": "3.226.0", + "@aws-sdk/middleware-user-agent": "3.226.0", + "@aws-sdk/node-config-provider": "3.226.0", + "@aws-sdk/node-http-handler": "3.226.0", + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/smithy-client": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/url-parser": "3.226.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.226.0", + "@aws-sdk/util-defaults-mode-node": "3.226.0", + "@aws-sdk/util-endpoints": "3.226.0", + "@aws-sdk/util-user-agent-browser": "3.226.0", + "@aws-sdk/util-user-agent-node": "3.226.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "@aws-sdk/util-utf8-node": "3.208.0", + "fast-xml-parser": "4.0.11", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/config-resolver": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.226.0.tgz", + "integrity": "sha512-0UWXtfnTT0OtnRP8jJodc8V7xAnWSqsh4RCRyV5uu3Z2Tv+xyW91GKxO+gOXoUP0hHu0lvBM9lYiMJcJWZYLYw==", + "optional": true, + "dependencies": { + "@aws-sdk/signature-v4": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/util-config-provider": "3.208.0", + "@aws-sdk/util-middleware": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.226.0.tgz", + "integrity": "sha512-ukueK6kgTxvUX89oQBoArj7Oh0dYfkToHypnin08SHRZry9VNnK5IfSMO+Q1tXmxCnDtai1ejaAOny900OjMyg==", + "optional": true, + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.226.0", + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.226.0.tgz", + "integrity": "sha512-sd8uK1ojbXxaZXlthzw/VXZwCPUtU3PjObOfr3Evj7MPIM2IH8h29foOlggx939MdLQGboJf9gKvLlvKDWtJRA==", + "optional": true, + "dependencies": { + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-imds": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.226.0.tgz", + "integrity": "sha512-//z/COQm2AjYFI1Lb0wKHTQSrvLFTyuKLFQGPJsKS7DPoxGOCKB7hmYerlbl01IDoCxTdyL//TyyPxbZEOQD5Q==", + "optional": true, + "dependencies": { + "@aws-sdk/node-config-provider": "3.226.0", + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/url-parser": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.226.0.tgz", + "integrity": "sha512-Sj7SGl53qmKkD7wvgU0MSTyj8ho6A3tKVbadTHljVz60jiauTEM97Z1DIai6U3oPFVteaKqx7npc8ozeK6mKNg==", + "optional": true, + "dependencies": { + "@aws-sdk/credential-provider-env": "3.226.0", + "@aws-sdk/credential-provider-imds": "3.226.0", + "@aws-sdk/credential-provider-sso": "3.226.0", + "@aws-sdk/credential-provider-web-identity": "3.226.0", + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/shared-ini-file-loader": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.226.0.tgz", + "integrity": "sha512-kuOeiVmlhSyMC1Eix0pqHmb4EmpbMHrTw+9ObZbQ2bRXy05Q9fLA6SVBcI01bI1KVh7Qqz9i8ojOY3A2zscjyA==", + "optional": true, + "dependencies": { + "@aws-sdk/credential-provider-env": "3.226.0", + "@aws-sdk/credential-provider-imds": "3.226.0", + "@aws-sdk/credential-provider-ini": "3.226.0", + "@aws-sdk/credential-provider-process": "3.226.0", + "@aws-sdk/credential-provider-sso": "3.226.0", + "@aws-sdk/credential-provider-web-identity": "3.226.0", + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/shared-ini-file-loader": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.226.0.tgz", + "integrity": "sha512-iUDMdnrTvbvaCFhWwqyXrhvQ9+ojPqPqXhwZtY1X/Qaz+73S9gXBPJHZaZb2Ke0yKE1Ql3bJbKvmmxC/qLQMng==", + "optional": true, + "dependencies": { + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/shared-ini-file-loader": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.226.0.tgz", + "integrity": "sha512-QSBeyOIAus4/8u/DeAstE8w/zw+F7PQohdB8JFP/BPaCfc8uKue4UkqqvQWRfm4VSEnHeXt037MDopmCpd98Iw==", + "optional": true, + "dependencies": { + "@aws-sdk/client-sso": "3.226.0", + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/shared-ini-file-loader": "3.226.0", + "@aws-sdk/token-providers": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.226.0.tgz", + "integrity": "sha512-CCpv847rLB0SFOHz2igvUMFAzeT2fD3YnY4C8jltuJoEkn0ITn1Hlgt13nTJ5BUuvyti2mvyXZHmNzhMIMrIlw==", + "optional": true, + "dependencies": { + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.226.0.tgz", + "integrity": "sha512-oNkUBxlX0kmwt8jEyQAH7p5Tk1g9iWEKGGCTPPZ7A5RoZpmv83zT8ReZ/+QsSmJIWGb0zzraHMzKbmfMSeztZg==", + "optional": true, + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.226.0", + "@aws-sdk/client-sso": "3.226.0", + "@aws-sdk/client-sts": "3.226.0", + "@aws-sdk/credential-provider-cognito-identity": "3.226.0", + "@aws-sdk/credential-provider-env": "3.226.0", + "@aws-sdk/credential-provider-imds": "3.226.0", + "@aws-sdk/credential-provider-ini": "3.226.0", + "@aws-sdk/credential-provider-node": "3.226.0", + "@aws-sdk/credential-provider-process": "3.226.0", + "@aws-sdk/credential-provider-sso": "3.226.0", + "@aws-sdk/credential-provider-web-identity": "3.226.0", + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/shared-ini-file-loader": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/fetch-http-handler": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.226.0.tgz", + "integrity": "sha512-JewZPMNEBXfi1xVnRa7pVtK/zgZD8/lQ/YnD8pq79WuMa2cwyhDtr8oqCoqsPW+WJT5ScXoMtuHxN78l8eKWgg==", + "optional": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/querystring-builder": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/util-base64": "3.208.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/hash-node": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.226.0.tgz", + "integrity": "sha512-MdlJhJ9/Espwd0+gUXdZRsHuostB2WxEVAszWxobP0FTT9PnicqnfK7ExmW+DUAc0ywxtEbR3e0UND65rlSTVw==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.226.0", + "@aws-sdk/util-buffer-from": "3.208.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/invalid-dependency": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.226.0.tgz", + "integrity": "sha512-QXOYFmap8g9QzRjumcRCIo2GEZkdCwd7ePQW0OABWPhKHzlJ74vvBxywjU3s39EEBEluWXtZ7Iufg6GxZM4ifw==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/is-array-buffer": { + "version": "3.201.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.201.0.tgz", + "integrity": "sha512-UPez5qLh3dNgt0DYnPD/q0mVJY84rA17QE26hVNOW3fAji8W2wrwrxdacWOxyXvlxWsVRcKmr+lay1MDqpAMfg==", + "optional": true, + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-content-length": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.226.0.tgz", + "integrity": "sha512-ksUzlHJN2JMuyavjA46a4sctvnrnITqt2tbGGWWrAuXY1mel2j+VbgnmJUiwHKUO6bTFBBeft5Vd1TSOb4JmiA==", + "optional": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-endpoint": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.226.0.tgz", + "integrity": "sha512-EvLFafjtUxTT0AC9p3aBQu1/fjhWdIeK58jIXaNFONfZ3F8QbEYUPuF/SqZvJM6cWfOO9qwYKkRDbCSTYhprIg==", + "optional": true, + "dependencies": { + "@aws-sdk/middleware-serde": "3.226.0", + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/signature-v4": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/url-parser": "3.226.0", + "@aws-sdk/util-config-provider": "3.208.0", + "@aws-sdk/util-middleware": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.226.0.tgz", + "integrity": "sha512-haVkWVh6BUPwKgWwkL6sDvTkcZWvJjv8AgC8jiQuSl8GLZdzHTB8Qhi3IsfFta9HAuoLjxheWBE5Z/L0UrfhLA==", + "optional": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.226.0.tgz", + "integrity": "sha512-m9gtLrrYnpN6yckcQ09rV7ExWOLMuq8mMPF/K3DbL/YL0TuILu9i2T1W+JuxSX+K9FMG2HrLAKivE/kMLr55xA==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.226.0.tgz", + "integrity": "sha512-mwRbdKEUeuNH5TEkyZ5FWxp6bL2UC1WbY+LDv6YjHxmSMKpAoOueEdtU34PqDOLrpXXxIGHDFmjeGeMfktyEcA==", + "optional": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-retry": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.226.0.tgz", + "integrity": "sha512-uMn4dSkv9Na2uvt6K3HgTnVrCRAlGv1MBAtUDLXONqUv1L/Z1fp3CkFkLKQHKylfBwBhe6dXfYEo87i8LZFoqg==", + "optional": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/service-error-classification": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/util-middleware": "3.226.0", + "tslib": "^2.3.1", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-sts": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.226.0.tgz", + "integrity": "sha512-NN9T/qoSD1kZvAT+VLny3NnlqgylYQcsgV3rvi/8lYzw/G/2s8VS6sm/VTWGGZhx08wZRv20MWzYu3bftcyqUg==", + "optional": true, + "dependencies": { + "@aws-sdk/middleware-signing": "3.226.0", + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/signature-v4": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-serde": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.226.0.tgz", + "integrity": "sha512-nPuOOAkSfx9TxzdKFx0X2bDlinOxGrqD7iof926K/AEflxGD1DBdcaDdjlYlPDW2CVE8LV/rAgbYuLxh/E/1VA==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-signing": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.226.0.tgz", + "integrity": "sha512-E6HmtPcl+IjYDDzi1xI2HpCbBq2avNWcjvCriMZWuTAtRVpnA6XDDGW5GY85IfS3A8G8vuWqEVPr8JcYUcjfew==", + "optional": true, + "dependencies": { + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/signature-v4": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/util-middleware": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-stack": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.226.0.tgz", + "integrity": "sha512-85wF29LvPvpoed60fZGDYLwv1Zpd/cM0C22WSSFPw1SSJeqO4gtFYyCg2squfT3KI6kF43IIkOCJ+L7GtryPug==", + "optional": true, + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.226.0.tgz", + "integrity": "sha512-N1WnfzCW1Y5yWhVAphf8OPGTe8Df3vmV7/LdsoQfmpkCZgLZeK2o0xITkUQhRj1mbw7yp8tVFLFV3R2lMurdAQ==", + "optional": true, + "dependencies": { + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/node-config-provider": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.226.0.tgz", + "integrity": "sha512-B8lQDqiRk7X5izFEUMXmi8CZLOKCTWQJU9HQf3ako+sF0gexo4nHN3jhoRWyLtcgC5S3on/2jxpAcqtm7kuY3w==", + "optional": true, + "dependencies": { + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/shared-ini-file-loader": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/node-http-handler": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.226.0.tgz", + "integrity": "sha512-xQCddnZNMiPmjr3W7HYM+f5ir4VfxgJh37eqZwX6EZmyItFpNNeVzKUgA920ka1VPz/ZUYB+2OFGiX3LCLkkaA==", + "optional": true, + "dependencies": { + "@aws-sdk/abort-controller": "3.226.0", + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/querystring-builder": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/property-provider": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.226.0.tgz", + "integrity": "sha512-TsljjG+Sg0LmdgfiAlWohluWKnxB/k8xenjeozZfzOr5bHmNHtdbWv6BtNvD/R83hw7SFXxbJHlD5H4u9p2NFg==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/protocol-http": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.226.0.tgz", + "integrity": "sha512-zWkVqiTA9RXL6y0hhfZc9bcU4DX2NI6Hw9IhQmSPeM59mdbPjJlY4bLlMr5YxywqO3yQ/ylNoAfrEzrDjlOSRg==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/querystring-builder": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.226.0.tgz", + "integrity": "sha512-LVurypuNeotO4lmirKXRC4NYrZRAyMJXuwO0f2a5ZAUJCjauwYrifKue6yCfU7bls7gut7nfcR6B99WBYpHs3g==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.226.0", + "@aws-sdk/util-uri-escape": "3.201.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/querystring-parser": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.226.0.tgz", + "integrity": "sha512-FzB+VrQ47KAFxiPt2YXrKZ8AOLZQqGTLCKHzx4bjxGmwgsjV8yIbtJiJhZLMcUQV4LtGeIY9ixIqQhGvnZHE4A==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/service-error-classification": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.226.0.tgz", + "integrity": "sha512-9R01dBpE8JILe2CTft7YN2tMufT2mMWMTqxmHwPSmOpsxHTj8hEII7GTfvpb95ThHwW7XMNhg7pbHLbrTJZCVA==", + "optional": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/shared-ini-file-loader": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.226.0.tgz", + "integrity": "sha512-661VQefsARxVyyV2FX9V61V+nNgImk7aN2hYlFKla6BCwZfMng+dEtD0xVGyg1PfRw0qvEv5LQyxMVgHcUSevA==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.226.0.tgz", + "integrity": "sha512-/R5q5agdPd7HJB68XMzpxrNPk158EHUvkFkuRu5Qf3kkkHebEzWEBlWoVpUe6ss4rP9Tqcue6xPuaftEmhjpYw==", + "optional": true, + "dependencies": { + "@aws-sdk/is-array-buffer": "3.201.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/util-hex-encoding": "3.201.0", + "@aws-sdk/util-middleware": "3.226.0", + "@aws-sdk/util-uri-escape": "3.201.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/smithy-client": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.226.0.tgz", + "integrity": "sha512-BWr1FhWSUhkSBp0TLzliD5AQBjA2Jmo9FlOOt+cBwd9BKkSGlGj+HgATYJ83Sjjg2+J6qvEZBxB78LKVHhorBw==", + "optional": true, + "dependencies": { + "@aws-sdk/middleware-stack": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.226.0.tgz", + "integrity": "sha512-3ouRt2i3ve8ivg54PxPhtOTcipzf6BoQsMw0EiO23yYKujhyeFH2IkxV4EYC687xFrUjheqJf8FWU/DD8EQ/ow==", + "optional": true, + "dependencies": { + "@aws-sdk/client-sso-oidc": "3.226.0", + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/shared-ini-file-loader": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.226.0.tgz", + "integrity": "sha512-MmmNHrWeO4man7wpOwrAhXlevqtOV9ZLcH4RhnG5LmRce0RFOApx24HoKENfFCcOyCm5LQBlsXCqi0dZWDWU0A==", + "optional": true, + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/url-parser": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.226.0.tgz", + "integrity": "sha512-p5RLE0QWyP0OcTOLmFcLdVgUcUEzmEfmdrnOxyNzomcYb0p3vUagA5zfa1HVK2azsQJFBv28GfvMnba9bGhObg==", + "optional": true, + "dependencies": { + "@aws-sdk/querystring-parser": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/util-base64": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64/-/util-base64-3.208.0.tgz", + "integrity": "sha512-PQniZph5A6N7uuEOQi+1hnMz/FSOK/8kMFyFO+4DgA1dZ5pcKcn5wiFwHkcTb/BsgVqQa3Jx0VHNnvhlS8JyTg==", + "optional": true, + "dependencies": { + "@aws-sdk/util-buffer-from": "3.208.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-body-length-browser": { + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.188.0.tgz", + "integrity": "sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg==", + "optional": true, + "dependencies": { + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/util-body-length-node": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.208.0.tgz", + "integrity": "sha512-3zj50e5g7t/MQf53SsuuSf0hEELzMtD8RX8C76f12OSRo2Bca4FLLYHe0TZbxcfQHom8/hOaeZEyTyMogMglqg==", + "optional": true, + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-buffer-from": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.208.0.tgz", + "integrity": "sha512-7L0XUixNEFcLUGPeBF35enCvB9Xl+K6SQsmbrPk1P3mlV9mguWSDQqbOBwY1Ir0OVbD6H/ZOQU7hI/9RtRI0Zw==", + "optional": true, + "dependencies": { + "@aws-sdk/is-array-buffer": "3.201.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-config-provider": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.208.0.tgz", + "integrity": "sha512-DSRqwrERUsT34ug+anlMBIFooBEGwM8GejC7q00Y/9IPrQy50KnG5PW2NiTjuLKNi7pdEOlwTSEocJE15eDZIg==", + "optional": true, + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-defaults-mode-browser": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.226.0.tgz", + "integrity": "sha512-chLx+6AeMSjuPsCVbI1B4Pg3jftjjcsuTsJucjo0DKBb1VSWqPCitmOILQVvKiA2Km8TSs3VcbUuOCyDExkzAg==", + "optional": true, + "dependencies": { + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/types": "3.226.0", + "bowser": "^2.11.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/util-defaults-mode-node": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.226.0.tgz", + "integrity": "sha512-Zr0AEj6g8gqiOhr31Pa2tdOFdPQciaAUCg3Uj/eH0znNBdVoptCj67oCW/I5v4pY4ZLZtGhr3uuoxDJH2MB3yg==", + "optional": true, + "dependencies": { + "@aws-sdk/config-resolver": "3.226.0", + "@aws-sdk/credential-provider-imds": "3.226.0", + "@aws-sdk/node-config-provider": "3.226.0", + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.226.0.tgz", + "integrity": "sha512-iqOkac/zLmyPBUJd7SLN0PeZMkOmlGgD5PHmmekTClOkce2eUjK9SNX1PzL73aXPoPTyhg9QGLH8uEZEQ8YUzg==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-hex-encoding": { + "version": "3.201.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.201.0.tgz", + "integrity": "sha512-7t1vR1pVxKx0motd3X9rI3m/xNp78p3sHtP5yo4NP4ARpxyJ0fokBomY8ScaH2D/B+U5o9ARxldJUdMqyBlJcA==", + "optional": true, + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.208.0.tgz", + "integrity": "sha512-iua1A2+P7JJEDHVgvXrRJSvsnzG7stYSGQnBVphIUlemwl6nN5D+QrgbjECtrbxRz8asYFHSzhdhECqN+tFiBg==", + "optional": true, + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-middleware": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.226.0.tgz", + "integrity": "sha512-B96CQnwX4gRvQdaQkdUtqvDPkrptV5+va6FVeJOocU/DbSYMAScLxtR3peMS8cnlOT6nL1Eoa42OI9AfZz1VwQ==", + "optional": true, + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-uri-escape": { + "version": "3.201.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.201.0.tgz", + "integrity": "sha512-TeTWbGx4LU2c5rx0obHeDFeO9HvwYwQtMh1yniBz00pQb6Qt6YVOETVQikRZ+XRQwEyCg/dA375UplIpiy54mA==", + "optional": true, + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.226.0.tgz", + "integrity": "sha512-PhBIu2h6sPJPcv2I7ELfFizdl5pNiL4LfxrasMCYXQkJvVnoXztHA1x+CQbXIdtZOIlpjC+6BjDcE0uhnpvfcA==", + "optional": true, + "dependencies": { + "@aws-sdk/types": "3.226.0", + "bowser": "^2.11.0", + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.226.0.tgz", + "integrity": "sha512-othPc5Dz/pkYkxH+nZPhc1Al0HndQT8zHD4e9h+EZ+8lkd8n+IsnLfTS/mSJWrfiC6UlNRVw55cItstmJyMe/A==", + "optional": true, + "dependencies": { + "@aws-sdk/node-config-provider": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/util-utf8-browser": { + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.188.0.tgz", + "integrity": "sha512-jt627x0+jE+Ydr9NwkFstg3cUvgWh56qdaqAMDsqgRlKD21md/6G226z/Qxl7lb1VEW2LlmCx43ai/37Qwcj2Q==", + "optional": true, + "dependencies": { + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/util-utf8-node": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.208.0.tgz", + "integrity": "sha512-jKY87Acv0yWBdFxx6bveagy5FYjz+dtV8IPT7ay1E2WPWH1czoIdMAkc8tSInK31T6CRnHWkLZ1qYwCbgRfERQ==", + "optional": true, + "dependencies": { + "@aws-sdk/util-buffer-from": "3.208.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.5.tgz", + "integrity": "sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.5.tgz", + "integrity": "sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ==", + "dev": true, + "dependencies": { + "@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" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/@babel/core/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/core/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.5.tgz", + "integrity": "sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.5", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", + "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.20.0", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "dev": true, + "dependencies": { + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz", + "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==", + "dev": true, + "dependencies": { + "@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" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.6.tgz", + "integrity": "sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w==", + "dev": true, + "dependencies": { + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.5", + "@babel/types": "^7.20.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/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==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/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==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz", + "integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", + "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", + "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.5.tgz", + "integrity": "sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.5", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.20.5", + "@babel/types": "^7.20.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/traverse/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@babel/types": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", + "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@contrast/fn-inspect": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@contrast/fn-inspect/-/fn-inspect-3.3.0.tgz", + "integrity": "sha512-iulijoAuhfamXZNWsEy4ORNd8TxqD6aKeMiukDpWSwuRJ3sB+4lOmY2DkP2WwlBpYMmh3k4/7LHP2I925Y2xKQ==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "nan": "^2.16.0", + "node-gyp-build": "^4.4.0" + }, + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@dabh/diagnostics": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", + "dependencies": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", + "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@eslint/eslintrc/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@grpc/grpc-js": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.8.0.tgz", + "integrity": "sha512-ySMTXQuMvvswoobvN+0LsaPf7ITO2JVfJmHxQKI4cGehNrrUms+n81BlHEX7Hl/LExji6XE3fnI9U04GSkRruA==", + "dependencies": { + "@grpc/proto-loader": "^0.7.0", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.4.tgz", + "integrity": "sha512-MnWjkGwqQ3W8fx94/c1CwqLsNmHHv2t0CFn+9++6+cDphC1lolpg9M2OU0iebIjK//pBNX9e94ho+gjx6vz39w==", + "dependencies": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^7.0.0", + "yargs": "^16.2.0" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.7", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", + "integrity": "sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.3.1.tgz", + "integrity": "sha512-IRE6GD47KwcqA09RIWrabKdHPiKDGgtAL31xDxbi/RjQMsr+lY+ppxmHwY0dUEV3qvvxZzoe5Hl0RXZJOjQNUg==", + "dev": true, + "dependencies": { + "@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" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.3.1.tgz", + "integrity": "sha512-0ohVjjRex985w5MmO5L3u5GR1O30DexhBSpuwx2P+9ftyqHdJXnk7IUWiP80oHMvt7ubHCJHxV0a0vlKVuZirw==", + "dev": true, + "dependencies": { + "@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" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.3.1.tgz", + "integrity": "sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/node": "*", + "jest-mock": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.3.1.tgz", + "integrity": "sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg==", + "dev": true, + "dependencies": { + "expect": "^29.3.1", + "jest-snapshot": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.3.1.tgz", + "integrity": "sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.2.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.3.1.tgz", + "integrity": "sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==", + "dev": true, + "dependencies": { + "@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" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.3.1.tgz", + "integrity": "sha512-cTicd134vOcwO59OPaB6AmdHQMCtWOe+/DitpTZVxWgMJ+YvXL1HNAmPyiGbSHmF/mXVBkvlm8YYtQhyHPnV6Q==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.3.1", + "@jest/expect": "^29.3.1", + "@jest/types": "^29.3.1", + "jest-mock": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.3.1.tgz", + "integrity": "sha512-GhBu3YFuDrcAYW/UESz1JphEAbvUjaY2vShRZRoRY1mxpCMB3yGSJ4j9n0GxVlEOdCf7qjvUfBCrTUUqhVfbRA==", + "dev": true, + "dependencies": { + "@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" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.0.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", + "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.24.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.2.0.tgz", + "integrity": "sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.15", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.3.1.tgz", + "integrity": "sha512-qeLa6qc0ddB0kuOZyZIhfN5q0e2htngokyTWsGriedsDhItisW7SDYZ7ceOe57Ii03sL988/03wAcBh3TChMGw==", + "dev": true, + "dependencies": { + "@jest/console": "^29.3.1", + "@jest/types": "^29.3.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.3.1.tgz", + "integrity": "sha512-IqYvLbieTv20ArgKoAMyhLHNrVHJfzO6ARZAbQRlY4UGWfdDnLlZEF0BvKOMd77uIiIjSZRwq3Jb3Fa3I8+2UA==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.3.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.3.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.3.1.tgz", + "integrity": "sha512-8wmCFBTVGYqFNLWfcOWoVuMuKYPUBTnTMDkdvFtAYELwDOl9RGwOsvQWGPFxDJ8AWY9xM/8xCXdqmPK3+Q5Lug==", + "dev": true, + "dependencies": { + "@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" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "dependencies": { + "@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" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", + "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==", + "dependencies": { + "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" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@newrelic/aws-sdk": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@newrelic/aws-sdk/-/aws-sdk-5.0.2.tgz", + "integrity": "sha512-vn5Aj0ZznjzqqxR69mHIWi7QUjBeab9f0Dfra/UOPZlyLy3Q/HbK4/sYV9/q/Ifmx85B3kJI4ca7mytCx073VQ==", + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "newrelic": ">=8.7.0" + } + }, + "node_modules/@newrelic/koa": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@newrelic/koa/-/koa-7.1.0.tgz", + "integrity": "sha512-jKYzlw8NGZpRMpxKmHv97F5ms+YxD+YZ0sC8fG3lQqjQ+Ie+IEgP8pbI/qVAMc07CBhe07ygstQthu86Rb5RZw==", + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "newrelic": ">=6.11.0" + } + }, + "node_modules/@newrelic/native-metrics": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@newrelic/native-metrics/-/native-metrics-9.0.0.tgz", + "integrity": "sha512-WYDRs4hlFerUyism2TjF1PIJfP8w50Nc9Kt61zWNrGM3QYOrKXZ5ibA3R0fQgU0+LM7UWtQ9g7onFpVUGsj8QQ==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "https-proxy-agent": "^5.0.0", + "nan": "^2.16.0", + "semver": "^5.5.1" + }, + "engines": { + "node": ">=14", + "npm": ">=6" + } + }, + "node_modules/@newrelic/native-metrics/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@newrelic/superagent": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@newrelic/superagent/-/superagent-6.0.0.tgz", + "integrity": "sha512-5nClQp9ACd4BvLusAgFHjjKLDgAaC+dKmIsRNOPC82LOLFaoOgxxtbecnDIJ0NWCKQS+WOdmXdgYutwH+e5dsA==", + "engines": { + "node": ">=14.0" + }, + "peerDependencies": { + "newrelic": ">=6.11.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@sideway/address": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", + "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", + "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" + }, + "node_modules/@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", + "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "dev": true + }, + "node_modules/@types/babel__core": { + "version": "7.1.20", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.20.tgz", + "integrity": "sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", + "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.3.0" + } + }, + "node_modules/@types/bcrypt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/bcrypt/-/bcrypt-5.0.0.tgz", + "integrity": "sha512-agtcFKaruL8TmcvqbndlqHPSJgsolhf/qPWchFlgnW1gECTN/nKbFcoFnvKAQRFfKbh+BO6A3SWdJu9t+xF3Lw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/caseless": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", + "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==", + "dev": true + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cookie-parser": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@types/cookie-parser/-/cookie-parser-1.4.3.tgz", + "integrity": "sha512-CqSKwFwefj4PzZ5n/iwad/bow2hTCh0FlNAeWLtQM3JA/NX/iYagIpWG2cf1bQKQ2c9gU2log5VUCrn7LDOs0w==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/cors": { + "version": "2.8.13", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", + "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.14", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.14.tgz", + "integrity": "sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.31", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz", + "integrity": "sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "node_modules/@types/jsonwebtoken": { + "version": "8.5.9", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.9.tgz", + "integrity": "sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/lodash": { + "version": "4.14.191", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz", + "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==", + "dev": true + }, + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + }, + "node_modules/@types/mime": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", + "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", + "dev": true + }, + "node_modules/@types/morgan": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.3.tgz", + "integrity": "sha512-BiLcfVqGBZCyNCnCH3F4o2GmDLrpy0HeBVnNlyZG4fo88ZiE9SoiBe3C+2ezuwbjlEyT+PDZ17//TAlRxAn75Q==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/multer": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/@types/multer/-/multer-1.4.7.tgz", + "integrity": "sha512-/SNsDidUFCvqqcWDwxv2feww/yqhNeTRL5CVoL3jU4Goc4kKEL10T7Eye65ZqPNi4HRx8sAEX59pV1aEH7drNA==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/newrelic": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/@types/newrelic/-/newrelic-9.4.0.tgz", + "integrity": "sha512-09jlh+c8zBwbYegstS74IDfWliDf72Bwf4gNyRQ81u29Xm/vIKfzkGfAywVLfMjE6nsii4WRNu7raRAyNSLNVQ==", + "dev": true + }, + "node_modules/@types/newrelic__winston-enricher": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@types/newrelic__winston-enricher/-/newrelic__winston-enricher-0.1.1.tgz", + "integrity": "sha512-wJve+73AEYmRJITXsRArZPcUPTfM2Lq4KTlmSJgj2DZkK+U4vyQuADIWnw9unSFwEl2/KoSbUoBf2IvJXSVXYA==", + "dev": true, + "dependencies": { + "winston": "^3.0.0" + } + }, + "node_modules/@types/node": { + "version": "18.11.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.13.tgz", + "integrity": "sha512-IASpMGVcWpUsx5xBOrxMj7Bl8lqfuTY7FKAnPmu5cHkfQVWF8GulWS1jbRqA934qZL35xh5xN/+Xe/i26Bod4w==" + }, + "node_modules/@types/prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==", + "dev": true + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "node_modules/@types/request": { + "version": "2.48.8", + "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.8.tgz", + "integrity": "sha512-whjk1EDJPcAR2kYHRbFl/lKeeKYTi05A15K9bnLInCVroNDCtXce57xKdI0/rQaA3K+6q0eFyUBPmqfSndUZdQ==", + "dev": true, + "dependencies": { + "@types/caseless": "*", + "@types/node": "*", + "@types/tough-cookie": "*", + "form-data": "^2.5.0" + } + }, + "node_modules/@types/request/node_modules/form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "dev": true + }, + "node_modules/@types/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", + "dev": true, + "dependencies": { + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "node_modules/@types/tough-cookie": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", + "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==", + "dev": true + }, + "node_modules/@types/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog==" + }, + "node_modules/@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==", + "dependencies": { + "@types/node": "*", + "@types/webidl-conversions": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.17.tgz", + "integrity": "sha512-72bWxFKTK6uwWJAVT+3rF6Jo6RTojiJ27FQo8Rf60AL+VZbzoVPnMFhKsUnbjR8A3BTCYQ7Mv3hnl8T0A+CX9g==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.46.0.tgz", + "integrity": "sha512-QrZqaIOzJAjv0sfjY4EjbXUi3ZOFpKfzntx22gPGr9pmFcTjcFw/1sS1LJhEubfAGwuLjNrPV0rH+D1/XZFy7Q==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.46.0", + "@typescript-eslint/type-utils": "5.46.0", + "@typescript-eslint/utils": "5.46.0", + "debug": "^4.3.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.46.0.tgz", + "integrity": "sha512-joNO6zMGUZg+C73vwrKXCd8usnsmOYmgW/w5ZW0pG0RGvqeznjtGDk61EqqTpNrFLUYBW2RSBFrxdAZMqA4OZA==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.46.0", + "@typescript-eslint/types": "5.46.0", + "@typescript-eslint/typescript-estree": "5.46.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.46.0.tgz", + "integrity": "sha512-7wWBq9d/GbPiIM6SqPK9tfynNxVbfpihoY5cSFMer19OYUA3l4powA2uv0AV2eAZV6KoAh6lkzxv4PoxOLh1oA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.46.0", + "@typescript-eslint/visitor-keys": "5.46.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.46.0.tgz", + "integrity": "sha512-dwv4nimVIAsVS2dTA0MekkWaRnoYNXY26dKz8AN5W3cBFYwYGFQEqm/cG+TOoooKlncJS4RTbFKgcFY/pOiBCg==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "5.46.0", + "@typescript-eslint/utils": "5.46.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@typescript-eslint/types": { + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.46.0.tgz", + "integrity": "sha512-wHWgQHFB+qh6bu0IAPAJCdeCdI0wwzZnnWThlmHNY01XJ9Z97oKqKOzWYpR2I83QmshhQJl6LDM9TqMiMwJBTw==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.46.0.tgz", + "integrity": "sha512-kDLNn/tQP+Yp8Ro2dUpyyVV0Ksn2rmpPpB0/3MO874RNmXtypMwSeazjEN/Q6CTp8D7ExXAAekPEcCEB/vtJkw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.46.0", + "@typescript-eslint/visitor-keys": "5.46.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.46.0.tgz", + "integrity": "sha512-4O+Ps1CRDw+D+R40JYh5GlKLQERXRKW5yIQoNDpmXPJ+C7kaPF9R7GWl+PxGgXjB3PQCqsaaZUpZ9dG4U6DO7g==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.46.0", + "@typescript-eslint/types": "5.46.0", + "@typescript-eslint/typescript-estree": "5.46.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.46.0.tgz", + "integrity": "sha512-E13gBoIXmaNhwjipuvQg1ByqSAu/GbEpP/qzFihugJ+MomtoJtFAJG/+2DRPByf57B863m0/q7Zt16V9ohhANw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.46.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@tyriar/fibonacci-heap": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@tyriar/fibonacci-heap/-/fibonacci-heap-2.0.9.tgz", + "integrity": "sha512-bYuSNomfn4hu2tPiDN+JZtnzCpSpbJ/PNeulmocDy3xN2X5OkJL65zo6rPZp65cPPhLF9vfT/dgE+RtFRCSxOA==" + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/agent-base/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansi-styles/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/ansi-styles/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" + }, + "node_modules/axios": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.2.1.tgz", + "integrity": "sha512-I88cFiGu9ryt/tfVEi4kX2SITsvDddTajXTOFmt2uK1ZVA8LytjtdeyefdQWEf5PU8w+4SSJDoYnggflB5tW4A==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/babel-jest": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.3.1.tgz", + "integrity": "sha512-aard+xnMoxgjwV70t0L6wkW/3HQQtV+O0PEimxKgzNqCJnbYmroPojdP2tqKSOAt8QAKV/uSZU8851M7B5+fcA==", + "dev": true, + "dependencies": { + "@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" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.2.0.tgz", + "integrity": "sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@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" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.2.0.tgz", + "integrity": "sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^29.2.0", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bcrypt": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.0.tgz", + "integrity": "sha512-RHBS7HI5N5tEnGTmtR/pppX0mmDSBpQ4aCBsj7CEQfYXDcO74A8sIBYcJMuCsis2E81zDxeENYhv66oZwLiA+Q==", + "hasInstallScript": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.10", + "node-addon-api": "^5.0.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "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" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/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 + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/bson": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.0.tgz", + "integrity": "sha512-VrlEE4vuiO1WTpfof4VmaVolCVYkYTgB9iWgYNOrVlnifpME/06fhFRmONgBhClD5pFC1t9ZWqFUQEQAzY43bA==", + "dependencies": { + "buffer": "^5.6.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001439", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001439.tgz", + "integrity": "sha512-1MgUzEkoMO6gKfXflStpYgZDlFM7M/ck/bgfVCACO5vnAf0fXoNVHdWtqGU+MYca+4bL9Z5bpOVmR33cWW9G2A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.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" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.0.tgz", + "integrity": "sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "dev": true + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "node_modules/color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, + "node_modules/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==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/colorspace": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", + "dependencies": { + "color": "^3.1.3", + "text-hex": "1.0.x" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "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" + } + }, + "node_modules/concat-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/concat-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-parser": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", + "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", + "dependencies": { + "cookie": "0.4.1", + "cookie-signature": "1.0.6" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/cookiejar": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz", + "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==", + "dev": true + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dev": true, + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.3.1.tgz", + "integrity": "sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dotenv": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-ex/node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.29.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.29.0.tgz", + "integrity": "sha512-isQ4EEiyUjZFbEKvEGJKKGBwXtvXX+zJbkVKCgTuB9t/+jUBcy8avhkEwWJecI15BkRkOYmvIM5ynbhRjEkoeg==", + "dev": true, + "dependencies": { + "@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" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", + "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": ">=7.28.0", + "prettier": ">=2.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/eslint/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/espree": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", + "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", + "dev": true, + "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.3.1.tgz", + "integrity": "sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==", + "dev": true, + "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" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "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" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true + }, + "node_modules/fast-xml-parser": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz", + "integrity": "sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA==", + "optional": true, + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + }, + "funding": { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + }, + "node_modules/fastq": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", + "integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-stream-rotator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/file-stream-rotator/-/file-stream-rotator-0.6.1.tgz", + "integrity": "sha512-u+dBid4PvZw17PmDeRcNOtCP9CCK/9lRN2w+r1xIS7yOL9JFrIBKTvrYsxT4P0pGtThYTn++QS5ChHaUov3+zQ==", + "dependencies": { + "moment": "^2.29.1" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "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" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "node_modules/fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/formidable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.1.tgz", + "integrity": "sha512-0EcS9wCFEzLvfiks7omJ+SiYJAiD+TzK4Pcw1UlUoGnhUxDcMKjt0P7x8wEb0u6OHu8Nb98WG3nxtlF5C7bvUQ==", + "dev": true, + "dependencies": { + "dezalgo": "^1.0.4", + "hexoid": "^1.0.0", + "once": "^1.4.0", + "qs": "^6.11.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dependencies": { + "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" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "13.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.18.0.tgz", + "integrity": "sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, + "node_modules/hexoid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", + "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.1.tgz", + "integrity": "sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.3.1.tgz", + "integrity": "sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA==", + "dev": true, + "dependencies": { + "@jest/core": "^29.3.1", + "@jest/types": "^29.3.1", + "import-local": "^3.0.2", + "jest-cli": "^29.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.2.0.tgz", + "integrity": "sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.3.1.tgz", + "integrity": "sha512-wpr26sEvwb3qQQbdlmei+gzp6yoSSoSL6GsLPxnuayZSMrSd5Ka7IjAvatpIernBvT2+Ic6RLTg+jSebScmasg==", + "dev": true, + "dependencies": { + "@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" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.3.1.tgz", + "integrity": "sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ==", + "dev": true, + "dependencies": { + "@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" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-cli/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/jest-cli/node_modules/yargs": { + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/jest-cli/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/jest-config": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.3.1.tgz", + "integrity": "sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg==", + "dev": true, + "dependencies": { + "@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" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.3.1.tgz", + "integrity": "sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.3.1", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.2.0.tgz", + "integrity": "sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.3.1.tgz", + "integrity": "sha512-qrZH7PmFB9rEzCSl00BWjZYuS1BSOH8lLuC0azQE9lQrAx3PWGKHTDudQiOSwIy5dGAJh7KA0ScYlCP7JxvFYA==", + "dev": true, + "dependencies": { + "@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" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.3.1.tgz", + "integrity": "sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag==", + "dev": true, + "dependencies": { + "@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" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.2.0.tgz", + "integrity": "sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.3.1.tgz", + "integrity": "sha512-/FFtvoG1xjbbPXQLFef+WSU4yrc0fc0Dds6aRPBojUid7qlPqZvxdUBA03HW0fnVHXVCnCdkuoghYItKNzc/0A==", + "dev": true, + "dependencies": { + "@jest/types": "^29.3.1", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "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" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.3.1.tgz", + "integrity": "sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.2.0", + "pretty-format": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.3.1.tgz", + "integrity": "sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.3.1", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", + "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", + "dev": true, + "dependencies": { + "@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" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.3.1.tgz", + "integrity": "sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "jest-util": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.2.0.tgz", + "integrity": "sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.3.1.tgz", + "integrity": "sha512-amXJgH/Ng712w3Uz5gqzFBBjxV8WFLSmNjoreBGMqxgCz5cH7swmBZzgBaCIOsvb0NbpJ0vgaSFdJqMdT+rADw==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.3.1.tgz", + "integrity": "sha512-Vk0cYq0byRw2WluNmNWGqPeRnZ3p3hHmjJMp2dyyZeYIfiBskwq4rpiuGFR6QGAdbj58WC7HN4hQHjf2mpvrLA==", + "dev": true, + "dependencies": { + "jest-regex-util": "^29.2.0", + "jest-snapshot": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.3.1.tgz", + "integrity": "sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA==", + "dev": true, + "dependencies": { + "@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" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.3.1.tgz", + "integrity": "sha512-jLzkIxIqXwBEOZx7wx9OO9sxoZmgT2NhmQKzHQm1xwR1kNW/dn0OjxR424VwHHf1SPN6Qwlb5pp1oGCeFTQ62A==", + "dev": true, + "dependencies": { + "@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" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.3.1.tgz", + "integrity": "sha512-+3JOc+s28upYLI2OJM4PWRGK9AgpsMs/ekNryUV0yMBClT9B1DF2u2qay8YxcQd338PPYSFNb0lsar1B49sLDA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/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" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "dev": true, + "dependencies": { + "@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" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.3.1.tgz", + "integrity": "sha512-N9Lr3oYR2Mpzuelp1F8negJR3YE+L1ebk1rYA5qYo9TTY3f9OWdptLoNSPP9itOCBIRBqjt/S5XHlzYglLN67g==", + "dev": true, + "dependencies": { + "@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" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.3.1.tgz", + "integrity": "sha512-RspXG2BQFDsZSRKGCT/NiNa8RkQ1iKAjrO0//soTMWx/QUt+OcxMqMSBxz23PYGqUuWm2+m2mNNsmj0eIoOaFg==", + "dev": true, + "dependencies": { + "@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" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.3.1.tgz", + "integrity": "sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.3.1", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/joi": { + "version": "17.7.0", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.7.0.tgz", + "integrity": "sha512-1/ugc8djfn93rTE3WRKdCzGGt/EtiYKxITMO4Wiv6q5JL1gl9ePt4kBsl1S499nbosspfctIQTpYIhSmHA3WAg==", + "dependencies": { + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0", + "@sideway/address": "^4.1.3", + "@sideway/formula": "^3.0.0", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/js-sdsl": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", + "integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + }, + "node_modules/json5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonwebtoken": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", + "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=4", + "npm": ">=1.4.28" + } + }, + "node_modules/jsonwebtoken/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/jsonwebtoken/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/kareem": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.0.tgz", + "integrity": "sha512-rVBUGGwvqg130iwYu8k7lutHuDBFj1yGRdnlE44wEhxAmFBad1zcL66PdWC1raw3tIObY6XWhtv3VL04xQb/cg==", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, + "node_modules/logform": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.4.2.tgz", + "integrity": "sha512-W4c9himeAwXEdZ05dQNerhFz2XG80P9Oj0loPUMV23VC2it0orMHQhJm4hdnnor3rd1HsGf6a2lPwBM1zeXHGw==", + "dependencies": { + "@colors/colors": "1.5.0", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + } + }, + "node_modules/logform/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.0.tgz", + "integrity": "sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "engines": { + "node": "*" + } + }, + "node_modules/mongodb": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.12.1.tgz", + "integrity": "sha512-koT87tecZmxPKtxRQD8hCKfn+ockEL2xBiUvx3isQGI6mFmagWt4f4AyCE9J4sKepnLhMacoCTQQA6SLAI2L6w==", + "dependencies": { + "bson": "^4.7.0", + "mongodb-connection-string-url": "^2.5.4", + "socks": "^2.7.1" + }, + "engines": { + "node": ">=12.9.0" + }, + "optionalDependencies": { + "@aws-sdk/credential-providers": "^3.186.0", + "saslprep": "^1.0.3" + } + }, + "node_modules/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==", + "dependencies": { + "@types/whatwg-url": "^8.2.1", + "whatwg-url": "^11.0.0" + } + }, + "node_modules/mongodb-connection-string-url/node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/mongodb-connection-string-url/node_modules/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==", + "engines": { + "node": ">=12" + } + }, + "node_modules/mongodb-connection-string-url/node_modules/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==", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/mongoose": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.8.0.tgz", + "integrity": "sha512-zlUfjcLya3pLfLTxwyH5S9bZUolJWGKF2M7PEV0118jv4VWHR/krjb6LIWu1RPQN2rwYmnmjjzJLVhbhmHqSmg==", + "dependencies": { + "bson": "^4.7.0", + "kareem": "2.5.0", + "mongodb": "4.12.1", + "mpath": "0.9.0", + "mquery": "4.0.3", + "ms": "2.1.3", + "sift": "16.0.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mongoose" + } + }, + "node_modules/mongoose/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/mpath": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", + "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mquery": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-4.0.3.tgz", + "integrity": "sha512-J5heI+P08I6VJ2Ky3+33IpCdAvlYGTSUjwTPxkAr8i8EoduPMBX2OY/wa3IKZIQl7MU4SbFk8ndgSKyB/cl1zA==", + "dependencies": { + "debug": "4.x" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/mquery/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/mquery/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/multer": { + "version": "1.4.5-lts.1", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", + "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", + "dependencies": { + "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" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/multer/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/nan": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", + "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", + "optional": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/newrelic": { + "version": "9.7.2", + "resolved": "https://registry.npmjs.org/newrelic/-/newrelic-9.7.2.tgz", + "integrity": "sha512-SzjngZYv4VNQpseBN1KkHoEOKo5dl0Hrtbs1uKi+kIO0899vh2u7fLKJuLtp6jBSgwTMp71dO6G2/cclbUXz7w==", + "dependencies": { + "@grpc/grpc-js": "^1.7.3", + "@grpc/proto-loader": "^0.7.3", + "@newrelic/aws-sdk": "^5.0.0", + "@newrelic/koa": "^7.0.0", + "@newrelic/superagent": "^6.0.0", + "@tyriar/fibonacci-heap": "^2.0.7", + "concat-stream": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "json-stringify-safe": "^5.0.0", + "readable-stream": "^3.6.0", + "semver": "^5.3.0", + "winston-transport": "^4.5.0" + }, + "bin": { + "newrelic-naming-rules": "bin/test-naming-rules.js" + }, + "engines": { + "node": ">=14", + "npm": ">=6.0.0" + }, + "optionalDependencies": { + "@contrast/fn-inspect": "^3.3.0", + "@newrelic/native-metrics": "^9.0.0" + } + }, + "node_modules/newrelic/node_modules/concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "engines": [ + "node >= 6.0" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/newrelic/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/node-addon-api": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.0.0.tgz", + "integrity": "sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA==" + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-gyp-build": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", + "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", + "optional": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "dev": true + }, + "node_modules/nodemon": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.20.tgz", + "integrity": "sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nodemon/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/nodemon/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/nodemon/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/nodemon/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "dependencies": { + "fn.name": "1.x.x" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.1.tgz", + "integrity": "sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/pretty-format": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", + "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/protobufjs": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.1.2.tgz", + "integrity": "sha512-4ZPTPkXCdel3+L81yw3dG6+Kq3umdWKh7Dc7GW/CpNk4SX3hK58iPCWeCyhVTDrbkNeKrYNZ7EojM5WDaEWTLQ==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/protobufjs/node_modules/long": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.1.tgz", + "integrity": "sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A==" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request/node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/request/node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/request/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve.exports": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", + "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-stable-stringify": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.1.tgz", + "integrity": "sha512-dVHE6bMtS/bnL2mwualjc6IxEv1F+OCUpA46pKUj6F8uDbUM0jCCulPqRNPSnWwGNKx5etqMjZYdXtrm5KJZGA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "dependencies": { + "sparse-bitfield": "^3.0.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sift": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz", + "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==" + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-update-notifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", + "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", + "dev": true, + "dependencies": { + "semver": "~7.0.0" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "optional": true, + "dependencies": { + "memory-pager": "^1.0.2" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "engines": { + "node": "*" + } + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", + "optional": true + }, + "node_modules/superagent": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.0.6.tgz", + "integrity": "sha512-HqSe6DSIh3hEn6cJvCkaM1BLi466f1LHi4yubR0tpewlMpk4RUFFy35bKz8SsPBwYfIIJy5eclp+3tCYAuX0bw==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": ">=6.4.0 <13 || >=14" + } + }, + "node_modules/superagent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/superagent/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/superagent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/supertest": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.3.3.tgz", + "integrity": "sha512-EMCG6G8gDu5qEqRQ3JjjPs6+FYT1a7Hv5ApHvtSghmOFJYtsU5S+pSb6Y2EUeCEY3CmEL3mmQ8YWlPOzQomabA==", + "dev": true, + "dependencies": { + "methods": "^1.1.2", + "superagent": "^8.0.5" + }, + "engines": { + "node": ">=6.4.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tar": { + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", + "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", + "dependencies": { + "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" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/touch/node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/triple-beam": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", + "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" + }, + "node_modules/ts-jest": { + "version": "29.0.3", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.0.3.tgz", + "integrity": "sha512-Ibygvmuyq1qp/z3yTh9QTwVVAbFdDy/+4BtIQR2sp6baF2SJU/8CKK/hhnGIDY2L90Az2jIqTwZPnN2p+BweiQ==", + "dev": true, + "dependencies": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.1", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "7.x", + "yargs-parser": "^21.0.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "optional": true + }, + "node_modules/tslint": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", + "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", + "deprecated": "TSLint has been deprecated in favor of ESLint. Please see https://github.com/palantir/tslint/issues/4534 for more information.", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^4.0.1", + "glob": "^7.1.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.3", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.13.0", + "tsutils": "^2.29.0" + }, + "bin": { + "tslint": "bin/tslint" + }, + "engines": { + "node": ">=4.8.0" + }, + "peerDependencies": { + "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev || >= 4.0.0-dev" + } + }, + "node_modules/tslint/node_modules/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==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tslint/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/tslint/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tslint/node_modules/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==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/tslint/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/tslint/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/tslint/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/tslint/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/tslint/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tslint/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tslint/node_modules/tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "peerDependencies": { + "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" + } + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "node_modules/typescript": { + "version": "4.9.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", + "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/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, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/v8-to-istanbul": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", + "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/winston": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.8.2.tgz", + "integrity": "sha512-MsE1gRx1m5jdTTO9Ld/vND4krP2To+lgDoMEHGGa4HIlAUyXJtfc7CxQcGXVyz2IBpw5hbFkj2b/AtUdQwyRew==", + "dependencies": { + "@colors/colors": "1.5.0", + "@dabh/diagnostics": "^2.0.2", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.4.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.5.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-daily-rotate-file": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/winston-daily-rotate-file/-/winston-daily-rotate-file-4.7.1.tgz", + "integrity": "sha512-7LGPiYGBPNyGHLn9z33i96zx/bd71pjBn9tqQzO3I4Tayv94WPmBNwKC7CO1wPHdP9uvu+Md/1nr6VSH9h0iaA==", + "dependencies": { + "file-stream-rotator": "^0.6.1", + "object-hash": "^2.0.1", + "triple-beam": "^1.3.0", + "winston-transport": "^4.4.0" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "winston": "^3" + } + }, + "node_modules/winston-transport": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.5.0.tgz", + "integrity": "sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==", + "dependencies": { + "logform": "^2.3.2", + "readable-stream": "^3.6.0", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 6.4.0" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, "dependencies": { + "@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@aws-crypto/ie11-detection": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-2.0.2.tgz", + "integrity": "sha512-5XDMQY98gMAf/WRTic5G++jfmS/VLM0rwpiOpaainKi4L0nqWMSB1SzsrEG5rjFZGYN6ZAefO+/Yta2dFM0kMw==", + "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": "2.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-2.0.0.tgz", + "integrity": "sha512-rYXOQ8BFOaqMEHJrLHul/25ckWH6GTJtdLSajhlqGMx0PmSueAuvboCuZCTqEKlxR8CQOwRarxYMZZSYlhRA1A==", + "optional": true, + "requires": { + "@aws-crypto/ie11-detection": "^2.0.0", + "@aws-crypto/sha256-js": "^2.0.0", + "@aws-crypto/supports-web-crypto": "^2.0.0", + "@aws-crypto/util": "^2.0.0", + "@aws-sdk/types": "^3.1.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": "2.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-2.0.0.tgz", + "integrity": "sha512-VZY+mCY4Nmrs5WGfitmNqXzaE873fcIZDu54cbaDaaamsaTOP1DBImV9F4pICc3EHjQXujyE8jig+PFCaew9ig==", + "optional": true, + "requires": { + "@aws-crypto/util": "^2.0.0", + "@aws-sdk/types": "^3.1.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": "2.0.2", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-2.0.2.tgz", + "integrity": "sha512-6mbSsLHwZ99CTOOswvCRP3C+VCWnzBf+1SnbWxzzJ9lR0mA0JnY2JEAhp8rqmTE0GPFy88rrM27ffgp62oErMQ==", + "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": "2.0.2", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-2.0.2.tgz", + "integrity": "sha512-Lgu5v/0e/BcrZ5m/IWqzPUf3UYFTy/PpeED+uc9SWUR1iZQL8XXbGQg10UfllwwBryO3hFF5dizK+78aoXC1eA==", + "optional": true, + "requires": { + "@aws-sdk/types": "^3.110.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/abort-controller": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.226.0.tgz", + "integrity": "sha512-cJVzr1xxPBd08voknXvR0RLgtZKGKt6WyDpH/BaPCu3rfSqWCDZKzwqe940eqosjmKrxC6pUZNKASIqHOQ8xxQ==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/client-cognito-identity": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.226.0.tgz", + "integrity": "sha512-f97yYtFN2YyVLCkDM51yLakb5NKy9gTSSXWe9mA9rgynLPfgsJbIHXv3zr1Qg0Ay0p4j1eLYukLaVw1MKlHDgw==", + "optional": true, + "requires": { + "@aws-crypto/sha256-browser": "2.0.0", + "@aws-crypto/sha256-js": "2.0.0", + "@aws-sdk/client-sts": "3.226.0", + "@aws-sdk/config-resolver": "3.226.0", + "@aws-sdk/credential-provider-node": "3.226.0", + "@aws-sdk/fetch-http-handler": "3.226.0", + "@aws-sdk/hash-node": "3.226.0", + "@aws-sdk/invalid-dependency": "3.226.0", + "@aws-sdk/middleware-content-length": "3.226.0", + "@aws-sdk/middleware-endpoint": "3.226.0", + "@aws-sdk/middleware-host-header": "3.226.0", + "@aws-sdk/middleware-logger": "3.226.0", + "@aws-sdk/middleware-recursion-detection": "3.226.0", + "@aws-sdk/middleware-retry": "3.226.0", + "@aws-sdk/middleware-serde": "3.226.0", + "@aws-sdk/middleware-signing": "3.226.0", + "@aws-sdk/middleware-stack": "3.226.0", + "@aws-sdk/middleware-user-agent": "3.226.0", + "@aws-sdk/node-config-provider": "3.226.0", + "@aws-sdk/node-http-handler": "3.226.0", + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/smithy-client": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/url-parser": "3.226.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.226.0", + "@aws-sdk/util-defaults-mode-node": "3.226.0", + "@aws-sdk/util-endpoints": "3.226.0", + "@aws-sdk/util-user-agent-browser": "3.226.0", + "@aws-sdk/util-user-agent-node": "3.226.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "@aws-sdk/util-utf8-node": "3.208.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/client-sso": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.226.0.tgz", + "integrity": "sha512-+Hl1YSLKrxPnQLijhWryI6uV8eKZIsUhvWlzFKx75kjxzjsC/jyk5zV59jnCu0SCCepXB8DKyLVa2WpH7iAHew==", + "optional": true, + "requires": { + "@aws-crypto/sha256-browser": "2.0.0", + "@aws-crypto/sha256-js": "2.0.0", + "@aws-sdk/config-resolver": "3.226.0", + "@aws-sdk/fetch-http-handler": "3.226.0", + "@aws-sdk/hash-node": "3.226.0", + "@aws-sdk/invalid-dependency": "3.226.0", + "@aws-sdk/middleware-content-length": "3.226.0", + "@aws-sdk/middleware-endpoint": "3.226.0", + "@aws-sdk/middleware-host-header": "3.226.0", + "@aws-sdk/middleware-logger": "3.226.0", + "@aws-sdk/middleware-recursion-detection": "3.226.0", + "@aws-sdk/middleware-retry": "3.226.0", + "@aws-sdk/middleware-serde": "3.226.0", + "@aws-sdk/middleware-stack": "3.226.0", + "@aws-sdk/middleware-user-agent": "3.226.0", + "@aws-sdk/node-config-provider": "3.226.0", + "@aws-sdk/node-http-handler": "3.226.0", + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/smithy-client": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/url-parser": "3.226.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.226.0", + "@aws-sdk/util-defaults-mode-node": "3.226.0", + "@aws-sdk/util-endpoints": "3.226.0", + "@aws-sdk/util-user-agent-browser": "3.226.0", + "@aws-sdk/util-user-agent-node": "3.226.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "@aws-sdk/util-utf8-node": "3.208.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/client-sso-oidc": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.226.0.tgz", + "integrity": "sha512-IKzAhL6RoPs7IZ/rJvekjedQ4oesazCO+Aqh9l2Xct+XY0MFBdh4amgg4t/8fjksfIzmJH48BZoNv5gVak6yRw==", + "optional": true, + "requires": { + "@aws-crypto/sha256-browser": "2.0.0", + "@aws-crypto/sha256-js": "2.0.0", + "@aws-sdk/config-resolver": "3.226.0", + "@aws-sdk/fetch-http-handler": "3.226.0", + "@aws-sdk/hash-node": "3.226.0", + "@aws-sdk/invalid-dependency": "3.226.0", + "@aws-sdk/middleware-content-length": "3.226.0", + "@aws-sdk/middleware-endpoint": "3.226.0", + "@aws-sdk/middleware-host-header": "3.226.0", + "@aws-sdk/middleware-logger": "3.226.0", + "@aws-sdk/middleware-recursion-detection": "3.226.0", + "@aws-sdk/middleware-retry": "3.226.0", + "@aws-sdk/middleware-serde": "3.226.0", + "@aws-sdk/middleware-stack": "3.226.0", + "@aws-sdk/middleware-user-agent": "3.226.0", + "@aws-sdk/node-config-provider": "3.226.0", + "@aws-sdk/node-http-handler": "3.226.0", + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/smithy-client": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/url-parser": "3.226.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.226.0", + "@aws-sdk/util-defaults-mode-node": "3.226.0", + "@aws-sdk/util-endpoints": "3.226.0", + "@aws-sdk/util-user-agent-browser": "3.226.0", + "@aws-sdk/util-user-agent-node": "3.226.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "@aws-sdk/util-utf8-node": "3.208.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/client-sts": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.226.0.tgz", + "integrity": "sha512-ZBlqRVbnHvvbkN5g56+mXltNybHNzgV69+2ARubQ8ge9U2qF/LweCmGqZnZLWqdGXwaB9IOvz5ZW2npyJh1X/A==", + "optional": true, + "requires": { + "@aws-crypto/sha256-browser": "2.0.0", + "@aws-crypto/sha256-js": "2.0.0", + "@aws-sdk/config-resolver": "3.226.0", + "@aws-sdk/credential-provider-node": "3.226.0", + "@aws-sdk/fetch-http-handler": "3.226.0", + "@aws-sdk/hash-node": "3.226.0", + "@aws-sdk/invalid-dependency": "3.226.0", + "@aws-sdk/middleware-content-length": "3.226.0", + "@aws-sdk/middleware-endpoint": "3.226.0", + "@aws-sdk/middleware-host-header": "3.226.0", + "@aws-sdk/middleware-logger": "3.226.0", + "@aws-sdk/middleware-recursion-detection": "3.226.0", + "@aws-sdk/middleware-retry": "3.226.0", + "@aws-sdk/middleware-sdk-sts": "3.226.0", + "@aws-sdk/middleware-serde": "3.226.0", + "@aws-sdk/middleware-signing": "3.226.0", + "@aws-sdk/middleware-stack": "3.226.0", + "@aws-sdk/middleware-user-agent": "3.226.0", + "@aws-sdk/node-config-provider": "3.226.0", + "@aws-sdk/node-http-handler": "3.226.0", + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/smithy-client": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/url-parser": "3.226.0", + "@aws-sdk/util-base64": "3.208.0", + "@aws-sdk/util-body-length-browser": "3.188.0", + "@aws-sdk/util-body-length-node": "3.208.0", + "@aws-sdk/util-defaults-mode-browser": "3.226.0", + "@aws-sdk/util-defaults-mode-node": "3.226.0", + "@aws-sdk/util-endpoints": "3.226.0", + "@aws-sdk/util-user-agent-browser": "3.226.0", + "@aws-sdk/util-user-agent-node": "3.226.0", + "@aws-sdk/util-utf8-browser": "3.188.0", + "@aws-sdk/util-utf8-node": "3.208.0", + "fast-xml-parser": "4.0.11", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/config-resolver": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.226.0.tgz", + "integrity": "sha512-0UWXtfnTT0OtnRP8jJodc8V7xAnWSqsh4RCRyV5uu3Z2Tv+xyW91GKxO+gOXoUP0hHu0lvBM9lYiMJcJWZYLYw==", + "optional": true, + "requires": { + "@aws-sdk/signature-v4": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/util-config-provider": "3.208.0", + "@aws-sdk/util-middleware": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/credential-provider-cognito-identity": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.226.0.tgz", + "integrity": "sha512-ukueK6kgTxvUX89oQBoArj7Oh0dYfkToHypnin08SHRZry9VNnK5IfSMO+Q1tXmxCnDtai1ejaAOny900OjMyg==", + "optional": true, + "requires": { + "@aws-sdk/client-cognito-identity": "3.226.0", + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/credential-provider-env": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.226.0.tgz", + "integrity": "sha512-sd8uK1ojbXxaZXlthzw/VXZwCPUtU3PjObOfr3Evj7MPIM2IH8h29foOlggx939MdLQGboJf9gKvLlvKDWtJRA==", + "optional": true, + "requires": { + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/credential-provider-imds": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.226.0.tgz", + "integrity": "sha512-//z/COQm2AjYFI1Lb0wKHTQSrvLFTyuKLFQGPJsKS7DPoxGOCKB7hmYerlbl01IDoCxTdyL//TyyPxbZEOQD5Q==", + "optional": true, + "requires": { + "@aws-sdk/node-config-provider": "3.226.0", + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/url-parser": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/credential-provider-ini": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.226.0.tgz", + "integrity": "sha512-Sj7SGl53qmKkD7wvgU0MSTyj8ho6A3tKVbadTHljVz60jiauTEM97Z1DIai6U3oPFVteaKqx7npc8ozeK6mKNg==", + "optional": true, + "requires": { + "@aws-sdk/credential-provider-env": "3.226.0", + "@aws-sdk/credential-provider-imds": "3.226.0", + "@aws-sdk/credential-provider-sso": "3.226.0", + "@aws-sdk/credential-provider-web-identity": "3.226.0", + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/shared-ini-file-loader": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/credential-provider-node": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.226.0.tgz", + "integrity": "sha512-kuOeiVmlhSyMC1Eix0pqHmb4EmpbMHrTw+9ObZbQ2bRXy05Q9fLA6SVBcI01bI1KVh7Qqz9i8ojOY3A2zscjyA==", + "optional": true, + "requires": { + "@aws-sdk/credential-provider-env": "3.226.0", + "@aws-sdk/credential-provider-imds": "3.226.0", + "@aws-sdk/credential-provider-ini": "3.226.0", + "@aws-sdk/credential-provider-process": "3.226.0", + "@aws-sdk/credential-provider-sso": "3.226.0", + "@aws-sdk/credential-provider-web-identity": "3.226.0", + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/shared-ini-file-loader": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/credential-provider-process": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.226.0.tgz", + "integrity": "sha512-iUDMdnrTvbvaCFhWwqyXrhvQ9+ojPqPqXhwZtY1X/Qaz+73S9gXBPJHZaZb2Ke0yKE1Ql3bJbKvmmxC/qLQMng==", + "optional": true, + "requires": { + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/shared-ini-file-loader": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/credential-provider-sso": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.226.0.tgz", + "integrity": "sha512-QSBeyOIAus4/8u/DeAstE8w/zw+F7PQohdB8JFP/BPaCfc8uKue4UkqqvQWRfm4VSEnHeXt037MDopmCpd98Iw==", + "optional": true, + "requires": { + "@aws-sdk/client-sso": "3.226.0", + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/shared-ini-file-loader": "3.226.0", + "@aws-sdk/token-providers": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/credential-provider-web-identity": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.226.0.tgz", + "integrity": "sha512-CCpv847rLB0SFOHz2igvUMFAzeT2fD3YnY4C8jltuJoEkn0ITn1Hlgt13nTJ5BUuvyti2mvyXZHmNzhMIMrIlw==", + "optional": true, + "requires": { + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/credential-providers": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.226.0.tgz", + "integrity": "sha512-oNkUBxlX0kmwt8jEyQAH7p5Tk1g9iWEKGGCTPPZ7A5RoZpmv83zT8ReZ/+QsSmJIWGb0zzraHMzKbmfMSeztZg==", + "optional": true, + "requires": { + "@aws-sdk/client-cognito-identity": "3.226.0", + "@aws-sdk/client-sso": "3.226.0", + "@aws-sdk/client-sts": "3.226.0", + "@aws-sdk/credential-provider-cognito-identity": "3.226.0", + "@aws-sdk/credential-provider-env": "3.226.0", + "@aws-sdk/credential-provider-imds": "3.226.0", + "@aws-sdk/credential-provider-ini": "3.226.0", + "@aws-sdk/credential-provider-node": "3.226.0", + "@aws-sdk/credential-provider-process": "3.226.0", + "@aws-sdk/credential-provider-sso": "3.226.0", + "@aws-sdk/credential-provider-web-identity": "3.226.0", + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/shared-ini-file-loader": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/fetch-http-handler": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.226.0.tgz", + "integrity": "sha512-JewZPMNEBXfi1xVnRa7pVtK/zgZD8/lQ/YnD8pq79WuMa2cwyhDtr8oqCoqsPW+WJT5ScXoMtuHxN78l8eKWgg==", + "optional": true, + "requires": { + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/querystring-builder": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/util-base64": "3.208.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/hash-node": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.226.0.tgz", + "integrity": "sha512-MdlJhJ9/Espwd0+gUXdZRsHuostB2WxEVAszWxobP0FTT9PnicqnfK7ExmW+DUAc0ywxtEbR3e0UND65rlSTVw==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.226.0", + "@aws-sdk/util-buffer-from": "3.208.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/invalid-dependency": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.226.0.tgz", + "integrity": "sha512-QXOYFmap8g9QzRjumcRCIo2GEZkdCwd7ePQW0OABWPhKHzlJ74vvBxywjU3s39EEBEluWXtZ7Iufg6GxZM4ifw==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/is-array-buffer": { + "version": "3.201.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.201.0.tgz", + "integrity": "sha512-UPez5qLh3dNgt0DYnPD/q0mVJY84rA17QE26hVNOW3fAji8W2wrwrxdacWOxyXvlxWsVRcKmr+lay1MDqpAMfg==", + "optional": true, + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-content-length": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.226.0.tgz", + "integrity": "sha512-ksUzlHJN2JMuyavjA46a4sctvnrnITqt2tbGGWWrAuXY1mel2j+VbgnmJUiwHKUO6bTFBBeft5Vd1TSOb4JmiA==", + "optional": true, + "requires": { + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-endpoint": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.226.0.tgz", + "integrity": "sha512-EvLFafjtUxTT0AC9p3aBQu1/fjhWdIeK58jIXaNFONfZ3F8QbEYUPuF/SqZvJM6cWfOO9qwYKkRDbCSTYhprIg==", + "optional": true, + "requires": { + "@aws-sdk/middleware-serde": "3.226.0", + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/signature-v4": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/url-parser": "3.226.0", + "@aws-sdk/util-config-provider": "3.208.0", + "@aws-sdk/util-middleware": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-host-header": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.226.0.tgz", + "integrity": "sha512-haVkWVh6BUPwKgWwkL6sDvTkcZWvJjv8AgC8jiQuSl8GLZdzHTB8Qhi3IsfFta9HAuoLjxheWBE5Z/L0UrfhLA==", + "optional": true, + "requires": { + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-logger": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.226.0.tgz", + "integrity": "sha512-m9gtLrrYnpN6yckcQ09rV7ExWOLMuq8mMPF/K3DbL/YL0TuILu9i2T1W+JuxSX+K9FMG2HrLAKivE/kMLr55xA==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-recursion-detection": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.226.0.tgz", + "integrity": "sha512-mwRbdKEUeuNH5TEkyZ5FWxp6bL2UC1WbY+LDv6YjHxmSMKpAoOueEdtU34PqDOLrpXXxIGHDFmjeGeMfktyEcA==", + "optional": true, + "requires": { + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-retry": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.226.0.tgz", + "integrity": "sha512-uMn4dSkv9Na2uvt6K3HgTnVrCRAlGv1MBAtUDLXONqUv1L/Z1fp3CkFkLKQHKylfBwBhe6dXfYEo87i8LZFoqg==", + "optional": true, + "requires": { + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/service-error-classification": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/util-middleware": "3.226.0", + "tslib": "^2.3.1", + "uuid": "^8.3.2" + } + }, + "@aws-sdk/middleware-sdk-sts": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.226.0.tgz", + "integrity": "sha512-NN9T/qoSD1kZvAT+VLny3NnlqgylYQcsgV3rvi/8lYzw/G/2s8VS6sm/VTWGGZhx08wZRv20MWzYu3bftcyqUg==", + "optional": true, + "requires": { + "@aws-sdk/middleware-signing": "3.226.0", + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/signature-v4": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-serde": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.226.0.tgz", + "integrity": "sha512-nPuOOAkSfx9TxzdKFx0X2bDlinOxGrqD7iof926K/AEflxGD1DBdcaDdjlYlPDW2CVE8LV/rAgbYuLxh/E/1VA==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-signing": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.226.0.tgz", + "integrity": "sha512-E6HmtPcl+IjYDDzi1xI2HpCbBq2avNWcjvCriMZWuTAtRVpnA6XDDGW5GY85IfS3A8G8vuWqEVPr8JcYUcjfew==", + "optional": true, + "requires": { + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/signature-v4": "3.226.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/util-middleware": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-stack": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.226.0.tgz", + "integrity": "sha512-85wF29LvPvpoed60fZGDYLwv1Zpd/cM0C22WSSFPw1SSJeqO4gtFYyCg2squfT3KI6kF43IIkOCJ+L7GtryPug==", + "optional": true, + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/middleware-user-agent": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.226.0.tgz", + "integrity": "sha512-N1WnfzCW1Y5yWhVAphf8OPGTe8Df3vmV7/LdsoQfmpkCZgLZeK2o0xITkUQhRj1mbw7yp8tVFLFV3R2lMurdAQ==", + "optional": true, + "requires": { + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/node-config-provider": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.226.0.tgz", + "integrity": "sha512-B8lQDqiRk7X5izFEUMXmi8CZLOKCTWQJU9HQf3ako+sF0gexo4nHN3jhoRWyLtcgC5S3on/2jxpAcqtm7kuY3w==", + "optional": true, + "requires": { + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/shared-ini-file-loader": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/node-http-handler": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.226.0.tgz", + "integrity": "sha512-xQCddnZNMiPmjr3W7HYM+f5ir4VfxgJh37eqZwX6EZmyItFpNNeVzKUgA920ka1VPz/ZUYB+2OFGiX3LCLkkaA==", + "optional": true, + "requires": { + "@aws-sdk/abort-controller": "3.226.0", + "@aws-sdk/protocol-http": "3.226.0", + "@aws-sdk/querystring-builder": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/property-provider": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.226.0.tgz", + "integrity": "sha512-TsljjG+Sg0LmdgfiAlWohluWKnxB/k8xenjeozZfzOr5bHmNHtdbWv6BtNvD/R83hw7SFXxbJHlD5H4u9p2NFg==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/protocol-http": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.226.0.tgz", + "integrity": "sha512-zWkVqiTA9RXL6y0hhfZc9bcU4DX2NI6Hw9IhQmSPeM59mdbPjJlY4bLlMr5YxywqO3yQ/ylNoAfrEzrDjlOSRg==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/querystring-builder": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.226.0.tgz", + "integrity": "sha512-LVurypuNeotO4lmirKXRC4NYrZRAyMJXuwO0f2a5ZAUJCjauwYrifKue6yCfU7bls7gut7nfcR6B99WBYpHs3g==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.226.0", + "@aws-sdk/util-uri-escape": "3.201.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/querystring-parser": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.226.0.tgz", + "integrity": "sha512-FzB+VrQ47KAFxiPt2YXrKZ8AOLZQqGTLCKHzx4bjxGmwgsjV8yIbtJiJhZLMcUQV4LtGeIY9ixIqQhGvnZHE4A==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/service-error-classification": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.226.0.tgz", + "integrity": "sha512-9R01dBpE8JILe2CTft7YN2tMufT2mMWMTqxmHwPSmOpsxHTj8hEII7GTfvpb95ThHwW7XMNhg7pbHLbrTJZCVA==", + "optional": true + }, + "@aws-sdk/shared-ini-file-loader": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.226.0.tgz", + "integrity": "sha512-661VQefsARxVyyV2FX9V61V+nNgImk7aN2hYlFKla6BCwZfMng+dEtD0xVGyg1PfRw0qvEv5LQyxMVgHcUSevA==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/signature-v4": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.226.0.tgz", + "integrity": "sha512-/R5q5agdPd7HJB68XMzpxrNPk158EHUvkFkuRu5Qf3kkkHebEzWEBlWoVpUe6ss4rP9Tqcue6xPuaftEmhjpYw==", + "optional": true, + "requires": { + "@aws-sdk/is-array-buffer": "3.201.0", + "@aws-sdk/types": "3.226.0", + "@aws-sdk/util-hex-encoding": "3.201.0", + "@aws-sdk/util-middleware": "3.226.0", + "@aws-sdk/util-uri-escape": "3.201.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/smithy-client": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.226.0.tgz", + "integrity": "sha512-BWr1FhWSUhkSBp0TLzliD5AQBjA2Jmo9FlOOt+cBwd9BKkSGlGj+HgATYJ83Sjjg2+J6qvEZBxB78LKVHhorBw==", + "optional": true, + "requires": { + "@aws-sdk/middleware-stack": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/token-providers": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.226.0.tgz", + "integrity": "sha512-3ouRt2i3ve8ivg54PxPhtOTcipzf6BoQsMw0EiO23yYKujhyeFH2IkxV4EYC687xFrUjheqJf8FWU/DD8EQ/ow==", + "optional": true, + "requires": { + "@aws-sdk/client-sso-oidc": "3.226.0", + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/shared-ini-file-loader": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/types": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.226.0.tgz", + "integrity": "sha512-MmmNHrWeO4man7wpOwrAhXlevqtOV9ZLcH4RhnG5LmRce0RFOApx24HoKENfFCcOyCm5LQBlsXCqi0dZWDWU0A==", + "optional": true, + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/url-parser": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.226.0.tgz", + "integrity": "sha512-p5RLE0QWyP0OcTOLmFcLdVgUcUEzmEfmdrnOxyNzomcYb0p3vUagA5zfa1HVK2azsQJFBv28GfvMnba9bGhObg==", + "optional": true, + "requires": { + "@aws-sdk/querystring-parser": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-base64": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64/-/util-base64-3.208.0.tgz", + "integrity": "sha512-PQniZph5A6N7uuEOQi+1hnMz/FSOK/8kMFyFO+4DgA1dZ5pcKcn5wiFwHkcTb/BsgVqQa3Jx0VHNnvhlS8JyTg==", + "optional": true, + "requires": { + "@aws-sdk/util-buffer-from": "3.208.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-body-length-browser": { + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.188.0.tgz", + "integrity": "sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg==", + "optional": true, + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-body-length-node": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.208.0.tgz", + "integrity": "sha512-3zj50e5g7t/MQf53SsuuSf0hEELzMtD8RX8C76f12OSRo2Bca4FLLYHe0TZbxcfQHom8/hOaeZEyTyMogMglqg==", + "optional": true, + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-buffer-from": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.208.0.tgz", + "integrity": "sha512-7L0XUixNEFcLUGPeBF35enCvB9Xl+K6SQsmbrPk1P3mlV9mguWSDQqbOBwY1Ir0OVbD6H/ZOQU7hI/9RtRI0Zw==", + "optional": true, + "requires": { + "@aws-sdk/is-array-buffer": "3.201.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-config-provider": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.208.0.tgz", + "integrity": "sha512-DSRqwrERUsT34ug+anlMBIFooBEGwM8GejC7q00Y/9IPrQy50KnG5PW2NiTjuLKNi7pdEOlwTSEocJE15eDZIg==", + "optional": true, + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-defaults-mode-browser": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.226.0.tgz", + "integrity": "sha512-chLx+6AeMSjuPsCVbI1B4Pg3jftjjcsuTsJucjo0DKBb1VSWqPCitmOILQVvKiA2Km8TSs3VcbUuOCyDExkzAg==", + "optional": true, + "requires": { + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/types": "3.226.0", + "bowser": "^2.11.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-defaults-mode-node": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.226.0.tgz", + "integrity": "sha512-Zr0AEj6g8gqiOhr31Pa2tdOFdPQciaAUCg3Uj/eH0znNBdVoptCj67oCW/I5v4pY4ZLZtGhr3uuoxDJH2MB3yg==", + "optional": true, + "requires": { + "@aws-sdk/config-resolver": "3.226.0", + "@aws-sdk/credential-provider-imds": "3.226.0", + "@aws-sdk/node-config-provider": "3.226.0", + "@aws-sdk/property-provider": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-endpoints": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.226.0.tgz", + "integrity": "sha512-iqOkac/zLmyPBUJd7SLN0PeZMkOmlGgD5PHmmekTClOkce2eUjK9SNX1PzL73aXPoPTyhg9QGLH8uEZEQ8YUzg==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-hex-encoding": { + "version": "3.201.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.201.0.tgz", + "integrity": "sha512-7t1vR1pVxKx0motd3X9rI3m/xNp78p3sHtP5yo4NP4ARpxyJ0fokBomY8ScaH2D/B+U5o9ARxldJUdMqyBlJcA==", + "optional": true, + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-locate-window": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.208.0.tgz", + "integrity": "sha512-iua1A2+P7JJEDHVgvXrRJSvsnzG7stYSGQnBVphIUlemwl6nN5D+QrgbjECtrbxRz8asYFHSzhdhECqN+tFiBg==", + "optional": true, + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-middleware": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.226.0.tgz", + "integrity": "sha512-B96CQnwX4gRvQdaQkdUtqvDPkrptV5+va6FVeJOocU/DbSYMAScLxtR3peMS8cnlOT6nL1Eoa42OI9AfZz1VwQ==", + "optional": true, + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-uri-escape": { + "version": "3.201.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.201.0.tgz", + "integrity": "sha512-TeTWbGx4LU2c5rx0obHeDFeO9HvwYwQtMh1yniBz00pQb6Qt6YVOETVQikRZ+XRQwEyCg/dA375UplIpiy54mA==", + "optional": true, + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-user-agent-browser": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.226.0.tgz", + "integrity": "sha512-PhBIu2h6sPJPcv2I7ELfFizdl5pNiL4LfxrasMCYXQkJvVnoXztHA1x+CQbXIdtZOIlpjC+6BjDcE0uhnpvfcA==", + "optional": true, + "requires": { + "@aws-sdk/types": "3.226.0", + "bowser": "^2.11.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-user-agent-node": { + "version": "3.226.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.226.0.tgz", + "integrity": "sha512-othPc5Dz/pkYkxH+nZPhc1Al0HndQT8zHD4e9h+EZ+8lkd8n+IsnLfTS/mSJWrfiC6UlNRVw55cItstmJyMe/A==", + "optional": true, + "requires": { + "@aws-sdk/node-config-provider": "3.226.0", + "@aws-sdk/types": "3.226.0", + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-utf8-browser": { + "version": "3.188.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.188.0.tgz", + "integrity": "sha512-jt627x0+jE+Ydr9NwkFstg3cUvgWh56qdaqAMDsqgRlKD21md/6G226z/Qxl7lb1VEW2LlmCx43ai/37Qwcj2Q==", + "optional": true, + "requires": { + "tslib": "^2.3.1" + } + }, + "@aws-sdk/util-utf8-node": { + "version": "3.208.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.208.0.tgz", + "integrity": "sha512-jKY87Acv0yWBdFxx6bveagy5FYjz+dtV8IPT7ay1E2WPWH1czoIdMAkc8tSInK31T6CRnHWkLZ1qYwCbgRfERQ==", + "optional": true, + "requires": { + "@aws-sdk/util-buffer-from": "3.208.0", + "tslib": "^2.3.1" + } + }, "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", "dev": true, "requires": { - "@babel/highlight": "^7.8.3" + "@babel/highlight": "^7.18.6" } }, + "@babel/compat-data": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.5.tgz", + "integrity": "sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g==", + "dev": true + }, "@babel/core": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", - "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.1", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.1", - "@babel/parser": "^7.12.3", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.5.tgz", + "integrity": "sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ==", + "dev": true, + "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.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" }, "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" } }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } }, "@babel/generator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz", - "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.5.tgz", + "integrity": "sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA==", "dev": true, "requires": { - "@babel/types": "^7.12.1", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" + "@babel/types": "^7.20.5", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" }, "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } } } }, - "@babel/helper-function-name": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", - "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "@babel/helper-compilation-targets": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", + "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/compat-data": "^7.20.0", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, - "@babel/helper-get-function-arity": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", - "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true + }, + "@babel/helper-function-name": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" } }, - "@babel/helper-member-expression-to-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", - "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", + "@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", "dev": true, "requires": { - "@babel/types": "^7.12.1" + "@babel/types": "^7.18.6" } }, "@babel/helper-module-imports": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz", - "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", "dev": true, "requires": { - "@babel/types": "^7.12.1" + "@babel/types": "^7.18.6" } }, "@babel/helper-module-transforms": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", - "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-simple-access": "^7.12.1", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/helper-validator-identifier": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1", - "lodash": "^4.17.19" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true - } - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", - "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz", + "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@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-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", "dev": true }, - "@babel/helper-replace-supers": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz", - "integrity": "sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.12.1", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1" - } - }, "@babel/helper-simple-access": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", - "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", "dev": true, "requires": { - "@babel/types": "^7.12.1" + "@babel/types": "^7.20.2" } }, "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", "dev": true, "requires": { - "@babel/types": "^7.11.0" + "@babel/types": "^7.18.6" } }, + "@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true + }, "@babel/helper-validator-identifier": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz", - "integrity": "sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", "dev": true }, "@babel/helpers": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.1.tgz", - "integrity": "sha512-9JoDSBGoWtmbay98efmT2+mySkwjzeFeAL9BuWNoVQpkPFQF8SIIFUfY5os9u8wVzglzoiPRSW7cuJmBDUt43g==", + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.6.tgz", + "integrity": "sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w==", "dev": true, "requires": { - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1" + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.5", + "@babel/types": "^7.20.5" } }, "@babel/highlight": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", - "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.9.0", + "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", "js-tokens": "^4.0.0" + }, + "dependencies": { + "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==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "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==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "@babel/parser": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz", - "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz", + "integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==", "dev": true }, "@babel/plugin-syntax-async-generators": { @@ -278,12 +10479,12 @@ } }, "@babel/plugin-syntax-class-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz", - "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-syntax-import-meta": { @@ -304,6 +10505,15 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, + "@babel/plugin-syntax-jsx": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", + "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, "@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", @@ -358,92 +10568,57 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - } + "@babel/helper-plugin-utils": "^7.14.5" } }, - "@babel/traverse": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz", - "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==", + "@babel/plugin-syntax-typescript": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", + "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.19.0" + } + }, + "@babel/template": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.1", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.12.1", - "@babel/types": "^7.12.1", + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" + } + }, + "@babel/traverse": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.5.tgz", + "integrity": "sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.5", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.20.5", + "@babel/types": "^7.20.5", "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" + "globals": "^11.1.0" }, "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -455,12 +10630,6 @@ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -470,50 +10639,62 @@ } }, "@babel/types": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", - "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", + "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", - "dev": true - }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true - } } }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "@cnakazawa/watch": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", - "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==" + }, + "@contrast/fn-inspect": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@contrast/fn-inspect/-/fn-inspect-3.3.0.tgz", + "integrity": "sha512-iulijoAuhfamXZNWsEy4ORNd8TxqD6aKeMiukDpWSwuRJ3sB+4lOmY2DkP2WwlBpYMmh3k4/7LHP2I925Y2xKQ==", + "optional": true, + "requires": { + "nan": "^2.16.0", + "node-gyp-build": "^4.4.0" + } + }, + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, "requires": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" + "@jridgewell/trace-mapping": "0.3.9" + }, + "dependencies": { + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + } } }, "@dabh/diagnostics": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.2.tgz", - "integrity": "sha512-+A1YivoVDNNVCdfozHSR8v/jyuuLTMXwjWuxPFlFlUapXoGc+Gj9mDlTDDfrwl7rXCl2tNZ0kE8sIBO6YOn96Q==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", "requires": { "colorspace": "1.1.x", "enabled": "2.0.x", @@ -521,593 +10702,657 @@ } }, "@eslint/eslintrc": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.1.tgz", - "integrity": "sha512-XRUeBZ5zBWLYgSANMpThFddrZZkEbGHgUdt5UJjZfnlN9BGCiUBrf+nvbRupSjMvqzwnQN0qwCmOxITt1cfywA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", + "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", "dev": true, "requires": { "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", + "debug": "^4.3.2", + "espree": "^9.4.0", + "globals": "^13.15.0", + "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "lodash": "^4.17.19", - "minimatch": "^3.0.4", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, "dependencies": { "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" } }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true } } }, - "@hapi/address": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@hapi/address/-/address-4.0.1.tgz", - "integrity": "sha512-0oEP5UiyV4f3d6cBL8F3Z5S7iWSX39Knnl0lY8i+6gfmmIBj44JCBNtcMgwyS+5v7j3VYavNay0NFHDS+UGQcw==", + "@grpc/grpc-js": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.8.0.tgz", + "integrity": "sha512-ySMTXQuMvvswoobvN+0LsaPf7ITO2JVfJmHxQKI4cGehNrrUms+n81BlHEX7Hl/LExji6XE3fnI9U04GSkRruA==", "requires": { - "@hapi/hoek": "^9.0.0" + "@grpc/proto-loader": "^0.7.0", + "@types/node": ">=12.12.47" } }, - "@hapi/formula": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@hapi/formula/-/formula-2.0.0.tgz", - "integrity": "sha512-V87P8fv7PI0LH7LiVi8Lkf3x+KCO7pQozXRssAHNXXL9L1K+uyu4XypLXwxqVDKgyQai6qj3/KteNlrqDx4W5A==" - }, - "@hapi/hoek": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.0.4.tgz", - "integrity": "sha512-EwaJS7RjoXUZ2cXXKZZxZqieGtc7RbvQhUy8FwDoMQtxWVi14tFjeFCYPZAM1mBCpOpiBpyaZbb9NeHc7eGKgw==" - }, - "@hapi/joi": { - "version": "17.1.1", - "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-17.1.1.tgz", - "integrity": "sha512-p4DKeZAoeZW4g3u7ZeRo+vCDuSDgSvtsB/NpfjXEHTUjSeINAi/RrVOWiVQ1isaoLzMvFEhe8n5065mQq1AdQg==", + "@grpc/proto-loader": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.4.tgz", + "integrity": "sha512-MnWjkGwqQ3W8fx94/c1CwqLsNmHHv2t0CFn+9++6+cDphC1lolpg9M2OU0iebIjK//pBNX9e94ho+gjx6vz39w==", "requires": { - "@hapi/address": "^4.0.1", - "@hapi/formula": "^2.0.0", - "@hapi/hoek": "^9.0.0", - "@hapi/pinpoint": "^2.0.0", - "@hapi/topo": "^5.0.0" + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^7.0.0", + "yargs": "^16.2.0" } }, - "@hapi/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@hapi/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-vzXR5MY7n4XeIvLpfl3HtE3coZYO4raKXW766R6DZw/6aLqR26iuZ109K7a0NtF2Db0jxqh7xz2AxkUwpUFybw==" + "@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" }, "@hapi/topo": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.0.0.tgz", - "integrity": "sha512-tFJlT47db0kMqVm3H4nQYgn6Pwg10GTZHb1pwmSiv1K4ks6drQOtfEF5ZnPjkvC+y4/bUPHK+bc87QvLcL+WMw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", "requires": { "@hapi/hoek": "^9.0.0" } }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "@humanwhocodes/config-array": { + "version": "0.11.7", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", + "integrity": "sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==", "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" + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" }, "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true } } }, - "@istanbuljs/schema": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", - "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true }, - "@jest/console": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.1.tgz", - "integrity": "sha512-cjqcXepwC5M+VeIhwT6Xpi/tT4AiNzlIx8SMJ9IihduHnsSrnWNvTBfKIpmqOOCNOPqtbBx6w2JqfoLOJguo8g==", + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, "requires": { - "@jest/types": "^26.6.1", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^26.6.1", - "jest-util": "^26.6.1", - "slash": "^3.0.0" + "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" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { - "color-convert": "^2.0.1" + "sprintf-js": "~1.0.2" } }, - "chalk": { + "find-up": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "requires": { - "color-name": "~1.1.4" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } - } - }, - "@jest/core": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.1.tgz", - "integrity": "sha512-p4F0pgK3rKnoS9olXXXOkbus1Bsu6fd8pcvLMPsUy4CVXZ8WSeiwQ1lK5hwkCIqJ+amZOYPd778sbPha/S8Srw==", - "dev": true, - "requires": { - "@jest/console": "^26.6.1", - "@jest/reporters": "^26.6.1", - "@jest/test-result": "^26.6.1", - "@jest/transform": "^26.6.1", - "@jest/types": "^26.6.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-changed-files": "^26.6.1", - "jest-config": "^26.6.1", - "jest-haste-map": "^26.6.1", - "jest-message-util": "^26.6.1", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.1", - "jest-resolve-dependencies": "^26.6.1", - "jest-runner": "^26.6.1", - "jest-runtime": "^26.6.1", - "jest-snapshot": "^26.6.1", - "jest-util": "^26.6.1", - "jest-validate": "^26.6.1", - "jest-watcher": "^26.6.1", - "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { + "locate-path": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { - "color-convert": "^2.0.1" + "p-locate": "^4.1.0" } }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "p-try": "^2.0.0" } }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { - "color-name": "~1.1.4" + "p-limit": "^2.2.0" } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } } } }, - "@jest/create-cache-key-function": { - "version": "26.5.0", - "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-26.5.0.tgz", - "integrity": "sha512-DJ+pEBUIqarrbv1W/C39f9YH0rJ4wsXZ/VC6JafJPlHW2HOucKceeaqTOQj9MEDQZjySxMLkOq5mfXZXNZcmWw==", + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true }, + "@jest/console": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.3.1.tgz", + "integrity": "sha512-IRE6GD47KwcqA09RIWrabKdHPiKDGgtAL31xDxbi/RjQMsr+lY+ppxmHwY0dUEV3qvvxZzoe5Hl0RXZJOjQNUg==", + "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", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.3.1.tgz", + "integrity": "sha512-0ohVjjRex985w5MmO5L3u5GR1O30DexhBSpuwx2P+9ftyqHdJXnk7IUWiP80oHMvt7ubHCJHxV0a0vlKVuZirw==", + "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": "26.6.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.1.tgz", - "integrity": "sha512-GNvHwkOFJtNgSwdzH9flUPzF9AYAZhUg124CBoQcwcZCM9s5TLz8Y3fMtiaWt4ffbigoetjGk5PU2Dd8nLrSEw==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.3.1.tgz", + "integrity": "sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==", "dev": true, "requires": { - "@jest/fake-timers": "^26.6.1", - "@jest/types": "^26.6.1", + "@jest/fake-timers": "^29.3.1", + "@jest/types": "^29.3.1", "@types/node": "*", - "jest-mock": "^26.6.1" + "jest-mock": "^29.3.1" + } + }, + "@jest/expect": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.3.1.tgz", + "integrity": "sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg==", + "dev": true, + "requires": { + "expect": "^29.3.1", + "jest-snapshot": "^29.3.1" + } + }, + "@jest/expect-utils": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.3.1.tgz", + "integrity": "sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g==", + "dev": true, + "requires": { + "jest-get-type": "^29.2.0" } }, "@jest/fake-timers": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.1.tgz", - "integrity": "sha512-T/SkMLgOquenw/nIisBRD6XAYpFir0kNuclYLkse5BpzeDUukyBr+K31xgAo9M0hgjU9ORlekAYPSzc0DKfmKg==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.3.1.tgz", + "integrity": "sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==", "dev": true, "requires": { - "@jest/types": "^26.6.1", - "@sinonjs/fake-timers": "^6.0.1", + "@jest/types": "^29.3.1", + "@sinonjs/fake-timers": "^9.1.2", "@types/node": "*", - "jest-message-util": "^26.6.1", - "jest-mock": "^26.6.1", - "jest-util": "^26.6.1" + "jest-message-util": "^29.3.1", + "jest-mock": "^29.3.1", + "jest-util": "^29.3.1" } }, "@jest/globals": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.1.tgz", - "integrity": "sha512-acxXsSguuLV/CeMYmBseefw6apO7NuXqpE+v5r3yD9ye2PY7h1nS20vY7Obk2w6S7eJO4OIAJeDnoGcLC/McEQ==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.3.1.tgz", + "integrity": "sha512-cTicd134vOcwO59OPaB6AmdHQMCtWOe+/DitpTZVxWgMJ+YvXL1HNAmPyiGbSHmF/mXVBkvlm8YYtQhyHPnV6Q==", "dev": true, "requires": { - "@jest/environment": "^26.6.1", - "@jest/types": "^26.6.1", - "expect": "^26.6.1" + "@jest/environment": "^29.3.1", + "@jest/expect": "^29.3.1", + "@jest/types": "^29.3.1", + "jest-mock": "^29.3.1" } }, "@jest/reporters": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.1.tgz", - "integrity": "sha512-J6OlXVFY3q1SXWJhjme5i7qT/BAZSikdOK2t8Ht5OS32BDo6KfG5CzIzzIFnAVd82/WWbc9Hb7SJ/jwSvVH9YA==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.3.1.tgz", + "integrity": "sha512-GhBu3YFuDrcAYW/UESz1JphEAbvUjaY2vShRZRoRY1mxpCMB3yGSJ4j9n0GxVlEOdCf7qjvUfBCrTUUqhVfbRA==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^26.6.1", - "@jest/test-result": "^26.6.1", - "@jest/transform": "^26.6.1", - "@jest/types": "^26.6.1", + "@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.2", - "graceful-fs": "^4.2.4", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-instrument": "^5.1.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "jest-haste-map": "^26.6.1", - "jest-resolve": "^26.6.1", - "jest-util": "^26.6.1", - "jest-worker": "^26.6.1", - "node-notifier": "^8.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", - "source-map": "^0.6.0", "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^6.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + } + }, + "@jest/schemas": { + "version": "29.0.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", + "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", + "dev": true, + "requires": { + "@sinclair/typebox": "^0.24.1" } }, "@jest/source-map": { - "version": "26.5.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.5.0.tgz", - "integrity": "sha512-jWAw9ZwYHJMe9eZq/WrsHlwF8E3hM9gynlcDpOyCb9bR8wEd9ZNBZCi7/jZyzHxC7t3thZ10gO2IDhu0bPKS5g==", + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.2.0.tgz", + "integrity": "sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ==", "dev": true, "requires": { + "@jridgewell/trace-mapping": "^0.3.15", "callsites": "^3.0.0", - "graceful-fs": "^4.2.4", - "source-map": "^0.6.0" + "graceful-fs": "^4.2.9" } }, "@jest/test-result": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.1.tgz", - "integrity": "sha512-wqAgIerIN2gSdT2A8WeA5+AFh9XQBqYGf8etK143yng3qYd0mF0ie2W5PVmgnjw4VDU6ammI9NdXrKgNhreawg==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.3.1.tgz", + "integrity": "sha512-qeLa6qc0ddB0kuOZyZIhfN5q0e2htngokyTWsGriedsDhItisW7SDYZ7ceOe57Ii03sL988/03wAcBh3TChMGw==", "dev": true, "requires": { - "@jest/console": "^26.6.1", - "@jest/types": "^26.6.1", + "@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": "26.6.1", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.1.tgz", - "integrity": "sha512-0csqA/XApZiNeTIPYh6koIDCACSoR6hi29T61tKJMtCZdEC+tF3PoNt7MS0oK/zKC6daBgCbqXxia5ztr/NyCQ==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.3.1.tgz", + "integrity": "sha512-IqYvLbieTv20ArgKoAMyhLHNrVHJfzO6ARZAbQRlY4UGWfdDnLlZEF0BvKOMd77uIiIjSZRwq3Jb3Fa3I8+2UA==", "dev": true, "requires": { - "@jest/test-result": "^26.6.1", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.1", - "jest-runner": "^26.6.1", - "jest-runtime": "^26.6.1" + "@jest/test-result": "^29.3.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.3.1", + "slash": "^3.0.0" } }, "@jest/transform": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.1.tgz", - "integrity": "sha512-oNFAqVtqRxZRx6vXL3I4bPKUK0BIlEeaalkwxyQGGI8oXDQBtYQBpiMe5F7qPs4QdvvFYB42gPGIMMcxXaBBxQ==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.3.1.tgz", + "integrity": "sha512-8wmCFBTVGYqFNLWfcOWoVuMuKYPUBTnTMDkdvFtAYELwDOl9RGwOsvQWGPFxDJ8AWY9xM/8xCXdqmPK3+Q5Lug==", "dev": true, "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^26.6.1", - "babel-plugin-istanbul": "^6.0.0", + "@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": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.1", - "jest-regex-util": "^26.0.0", - "jest-util": "^26.6.1", - "micromatch": "^4.0.2", - "pirates": "^4.0.1", + "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", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } + "write-file-atomic": "^4.0.1" } }, "@jest/types": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.1.tgz", - "integrity": "sha512-ywHavIKNpAVrStiRY5wiyehvcktpijpItvGiK72RAn5ctqmzvPk8OvKnvHeBqa1XdQr959CTWAJMqxI8BTibyg==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", "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": "^15.0.0", + "@types/yargs": "^17.0.8", "chalk": "^4.0.0" + } + }, + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "@mapbox/node-pre-gyp": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", + "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==", + "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" + } + }, + "@newrelic/aws-sdk": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@newrelic/aws-sdk/-/aws-sdk-5.0.2.tgz", + "integrity": "sha512-vn5Aj0ZznjzqqxR69mHIWi7QUjBeab9f0Dfra/UOPZlyLy3Q/HbK4/sYV9/q/Ifmx85B3kJI4ca7mytCx073VQ==", + "requires": {} + }, + "@newrelic/koa": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@newrelic/koa/-/koa-7.1.0.tgz", + "integrity": "sha512-jKYzlw8NGZpRMpxKmHv97F5ms+YxD+YZ0sC8fG3lQqjQ+Ie+IEgP8pbI/qVAMc07CBhe07ygstQthu86Rb5RZw==", + "requires": {} + }, + "@newrelic/native-metrics": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@newrelic/native-metrics/-/native-metrics-9.0.0.tgz", + "integrity": "sha512-WYDRs4hlFerUyism2TjF1PIJfP8w50Nc9Kt61zWNrGM3QYOrKXZ5ibA3R0fQgU0+LM7UWtQ9g7onFpVUGsj8QQ==", + "optional": true, + "requires": { + "https-proxy-agent": "^5.0.0", + "nan": "^2.16.0", + "semver": "^5.5.1" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "optional": true } } }, + "@newrelic/superagent": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@newrelic/superagent/-/superagent-6.0.0.tgz", + "integrity": "sha512-5nClQp9ACd4BvLusAgFHjjKLDgAaC+dKmIsRNOPC82LOLFaoOgxxtbecnDIJ0NWCKQS+WOdmXdgYutwH+e5dsA==", + "requires": {} + }, "@nodelib/fs.scandir": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", - "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "requires": { - "@nodelib/fs.stat": "2.0.3", + "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "@nodelib/fs.stat": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", - "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true }, "@nodelib/fs.walk": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", - "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "requires": { - "@nodelib/fs.scandir": "2.1.3", + "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "requires": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "@sideway/address": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", + "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", + "requires": { + "@hapi/hoek": "^9.0.0" + } + }, + "@sideway/formula": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", + "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==" + }, + "@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" + }, + "@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", "dev": true }, "@sinonjs/commons": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz", - "integrity": "sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==", + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", "dev": true, "requires": { "type-detect": "4.0.8" } }, "@sinonjs/fake-timers": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", - "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", + "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", "dev": true, "requires": { "@sinonjs/commons": "^1.7.0" } }, - "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dev": true, - "requires": { - "defer-to-connect": "^1.0.1" - } + "@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "dev": true }, "@types/babel__core": { - "version": "7.1.10", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.10.tgz", - "integrity": "sha512-x8OM8XzITIMyiwl5Vmo2B1cR1S1Ipkyv4mdlbJjMa1lmuKvKY9FrBbEANIaMlnWn5Rf7uO+rC/VgYabNkE17Hw==", + "version": "7.1.20", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.20.tgz", + "integrity": "sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -1118,18 +11363,18 @@ } }, "@types/babel__generator": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", - "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", "dev": true, "requires": { "@babel/types": "^7.0.0" } }, "@types/babel__template": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.3.tgz", - "integrity": "sha512-uCoznIPDmnickEi6D0v11SBpW0OuVqHJCa7syXqQHy5uktSCreIlt0iglsCnmvz8yCb38hGcWeseA8cWJSwv5Q==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -1137,88 +11382,82 @@ } }, "@types/babel__traverse": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.15.tgz", - "integrity": "sha512-Pzh9O3sTK8V6I1olsXpCfj2k/ygO2q1X0vhhnDrEQyYLHZesWz+zMZMVcwXLCYf0U36EtmyYaFGPfXlTtDHe3A==", + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", + "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", "dev": true, "requires": { "@babel/types": "^7.3.0" } }, "@types/bcrypt": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/bcrypt/-/bcrypt-3.0.0.tgz", - "integrity": "sha512-nohgNyv+1ViVcubKBh0+XiNJ3dO8nYu///9aJ4cgSqv70gBL+94SNy/iC2NLzKPT2Zt/QavrOkBVbZRLZmw6NQ==", - "dev": true - }, - "@types/body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/bcrypt/-/bcrypt-5.0.0.tgz", + "integrity": "sha512-agtcFKaruL8TmcvqbndlqHPSJgsolhf/qPWchFlgnW1gECTN/nKbFcoFnvKAQRFfKbh+BO6A3SWdJu9t+xF3Lw==", "dev": true, "requires": { - "@types/connect": "*", "@types/node": "*" } }, - "@types/bson": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.3.tgz", - "integrity": "sha512-mVRvYnTOZJz3ccpxhr3wgxVmSeiYinW+zlzQz3SXWaJmD1DuL05Jeq7nKw3SnbKmbleW5qrLG5vdyWe/A9sXhw==", + "@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", "dev": true, "requires": { + "@types/connect": "*", "@types/node": "*" } }, + "@types/caseless": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", + "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==", + "dev": true + }, "@types/connect": { - "version": "3.4.33", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.33.tgz", - "integrity": "sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A==", + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", "dev": true, "requires": { "@types/node": "*" } }, "@types/cookie-parser": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@types/cookie-parser/-/cookie-parser-1.4.2.tgz", - "integrity": "sha512-uwcY8m6SDQqciHsqcKDGbo10GdasYsPCYkH3hVegj9qAah6pX5HivOnOuI3WYmyQMnOATV39zv/Ybs0bC/6iVg==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@types/cookie-parser/-/cookie-parser-1.4.3.tgz", + "integrity": "sha512-CqSKwFwefj4PzZ5n/iwad/bow2hTCh0FlNAeWLtQM3JA/NX/iYagIpWG2cf1bQKQ2c9gU2log5VUCrn7LDOs0w==", "dev": true, "requires": { "@types/express": "*" } }, - "@types/cookiejar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==", - "dev": true - }, "@types/cors": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.8.tgz", - "integrity": "sha512-fO3gf3DxU2Trcbr75O7obVndW/X5k8rJNZkLXlQWStTHhP71PkRqjwPIEI0yMnJdg9R9OasjU+Bsr+Hr1xy/0w==", + "version": "2.8.13", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", + "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", "dev": true, "requires": { - "@types/express": "*" + "@types/node": "*" } }, "@types/express": { - "version": "4.17.8", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.8.tgz", - "integrity": "sha512-wLhcKh3PMlyA2cNAB9sjM1BntnhPMiM0JOBwPBqttjHev2428MLEB4AYVN+d8s2iyCVZac+o41Pflm/ZH5vLXQ==", + "version": "4.17.14", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.14.tgz", + "integrity": "sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==", "dev": true, "requires": { "@types/body-parser": "*", - "@types/express-serve-static-core": "*", + "@types/express-serve-static-core": "^4.17.18", "@types/qs": "*", "@types/serve-static": "*" } }, "@types/express-serve-static-core": { - "version": "4.17.13", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.13.tgz", - "integrity": "sha512-RgDi5a4nuzam073lRGKTUIaL3eF2+H7LJvJ8eUnCI0wA6SNjXc44DCmWNiTLs/AZ7QlsFWZiw/gTG3nSQGL0fA==", + "version": "4.17.31", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz", + "integrity": "sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==", "dev": true, "requires": { "@types/node": "*", @@ -1227,33 +11466,18 @@ } }, "@types/graceful-fs": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.4.tgz", - "integrity": "sha512-mWA/4zFQhfvOA8zWkXobwJvBD7vzcxgrOQ0J5CH1votGqdq9m7+FwtGaqyCZqC3NyyBkc9z4m+iry4LlqcMWJg==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", "dev": true, "requires": { "@types/node": "*" } }, - "@types/hapi__joi": { - "version": "17.1.6", - "resolved": "https://registry.npmjs.org/@types/hapi__joi/-/hapi__joi-17.1.6.tgz", - "integrity": "sha512-y3A1MzNC0FmzD5+ys59RziE1WqKrL13nxtJgrSzjoO7boue5B7zZD2nZLPwrSuUviFjpKFQtgHYSvhDGfIE4jA==", - "dev": true - }, - "@types/helmet": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/helmet/-/helmet-4.0.0.tgz", - "integrity": "sha512-ONIn/nSNQA57yRge3oaMQESef/6QhoeX7llWeDli0UZIfz8TQMkfNPTXA8VnnyeA1WUjG2pGqdjEIueYonMdfQ==", - "dev": true, - "requires": { - "helmet": "*" - } - }, "@types/istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", "dev": true }, "@types/istanbul-lib-report": { @@ -1266,179 +11490,205 @@ } }, "@types/istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", "dev": true, "requires": { "@types/istanbul-lib-report": "*" } }, - "@types/jest": { - "version": "26.0.15", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.15.tgz", - "integrity": "sha512-s2VMReFXRg9XXxV+CW9e5Nz8fH2K1aEhwgjUqPPbQd7g95T0laAcvLv032EhFHIa5GHsZ8W7iJEQVaJq6k3Gog==", - "dev": true, - "requires": { - "jest-diff": "^26.0.0", - "pretty-format": "^26.0.0" - } - }, "@types/json-schema": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", - "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, "@types/jsonwebtoken": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.0.tgz", - "integrity": "sha512-9bVao7LvyorRGZCw0VmH/dr7Og+NdjYSsKAxB43OQoComFbBgsEpoR9JW6+qSq/ogwVBg8GI2MfAlk4SYI4OLg==", + "version": "8.5.9", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.9.tgz", + "integrity": "sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg==", "dev": true, "requires": { "@types/node": "*" } }, "@types/lodash": { - "version": "4.14.163", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.163.tgz", - "integrity": "sha512-BeZM/FZaV53emqyHxn9L39Oz6XbHMBRLA1b1quROku48J/1kYYxPmVOJ/qSQheb81on4BI7H6QDo6bkUuRaDNQ==", + "version": "4.14.191", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz", + "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==", "dev": true }, + "@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + }, "@types/mime": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.3.tgz", - "integrity": "sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", + "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", "dev": true }, - "@types/mongodb": { - "version": "3.5.32", - "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.5.32.tgz", - "integrity": "sha512-lBV8D5S5UNlWihHYQkEebqQTRazm5SglwQ126ls03eeYk2NJN4P72udUxJtyuKSmSFKvhLeekfNoPcyFa3BNdQ==", + "@types/morgan": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.3.tgz", + "integrity": "sha512-BiLcfVqGBZCyNCnCH3F4o2GmDLrpy0HeBVnNlyZG4fo88ZiE9SoiBe3C+2ezuwbjlEyT+PDZ17//TAlRxAn75Q==", "dev": true, "requires": { - "@types/bson": "*", "@types/node": "*" } }, - "@types/mongoose": { - "version": "5.7.36", - "resolved": "https://registry.npmjs.org/@types/mongoose/-/mongoose-5.7.36.tgz", - "integrity": "sha512-ggFXgvkHgCNlT35B9d/heDYfSqOSwTmQjkRoR32sObGV5Xjd0N0WWuYlLzqeCg94j4hYN/OZxZ1VNNLltX/IVQ==", + "@types/multer": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/@types/multer/-/multer-1.4.7.tgz", + "integrity": "sha512-/SNsDidUFCvqqcWDwxv2feww/yqhNeTRL5CVoL3jU4Goc4kKEL10T7Eye65ZqPNi4HRx8sAEX59pV1aEH7drNA==", "dev": true, "requires": { - "@types/mongodb": "*", - "@types/node": "*" + "@types/express": "*" } }, - "@types/morgan": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.2.tgz", - "integrity": "sha512-edtGMEdit146JwwIeyQeHHg9yID4WSolQPxpEorHmN3KuytuCHyn2ELNr5Uxy8SerniFbbkmgKMrGM933am5BQ==", + "@types/newrelic": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/@types/newrelic/-/newrelic-9.4.0.tgz", + "integrity": "sha512-09jlh+c8zBwbYegstS74IDfWliDf72Bwf4gNyRQ81u29Xm/vIKfzkGfAywVLfMjE6nsii4WRNu7raRAyNSLNVQ==", + "dev": true + }, + "@types/newrelic__winston-enricher": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@types/newrelic__winston-enricher/-/newrelic__winston-enricher-0.1.1.tgz", + "integrity": "sha512-wJve+73AEYmRJITXsRArZPcUPTfM2Lq4KTlmSJgj2DZkK+U4vyQuADIWnw9unSFwEl2/KoSbUoBf2IvJXSVXYA==", "dev": true, "requires": { - "@types/node": "*" + "winston": "^3.0.0" } }, "@types/node": { - "version": "14.14.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.6.tgz", - "integrity": "sha512-6QlRuqsQ/Ox/aJEQWBEJG7A9+u7oSYl3mem/K8IzxXG/kAGbV1YPD9Bg9Zw3vyxC/YP+zONKwy8hGkSt1jxFMw==", - "dev": true - }, - "@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", - "dev": true + "version": "18.11.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.13.tgz", + "integrity": "sha512-IASpMGVcWpUsx5xBOrxMj7Bl8lqfuTY7FKAnPmu5cHkfQVWF8GulWS1jbRqA934qZL35xh5xN/+Xe/i26Bod4w==" }, "@types/prettier": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.1.5.tgz", - "integrity": "sha512-UEyp8LwZ4Dg30kVU2Q3amHHyTn1jEdhCIE59ANed76GaT1Vp76DD3ZWSAxgCrw6wJ0TqeoBpqmfUHiUDPs//HQ==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==", "dev": true }, "@types/qs": { - "version": "6.9.5", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.5.tgz", - "integrity": "sha512-/JHkVHtx/REVG0VVToGRGH2+23hsYLHdyG+GrvoUGlGAd0ErauXDyvHtRI/7H7mzLm+tBCKA7pfcpkQ1lf58iQ==", + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", "dev": true }, "@types/range-parser": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", - "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", "dev": true }, - "@types/serve-static": { - "version": "1.13.6", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.6.tgz", - "integrity": "sha512-nuRJmv7jW7VmCVTn+IgYDkkbbDGyIINOeu/G0d74X3lm6E5KfMeQPJhxIt1ayQeQB3cSxvYs1RA/wipYoFB4EA==", + "@types/request": { + "version": "2.48.8", + "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.8.tgz", + "integrity": "sha512-whjk1EDJPcAR2kYHRbFl/lKeeKYTi05A15K9bnLInCVroNDCtXce57xKdI0/rQaA3K+6q0eFyUBPmqfSndUZdQ==", "dev": true, "requires": { - "@types/mime": "*", - "@types/node": "*" + "@types/caseless": "*", + "@types/node": "*", + "@types/tough-cookie": "*", + "form-data": "^2.5.0" + }, + "dependencies": { + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + } } }, - "@types/stack-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", - "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", + "@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", "dev": true }, - "@types/superagent": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.10.tgz", - "integrity": "sha512-xAgkb2CMWUMCyVc/3+7iQfOEBE75NvuZeezvmixbUw3nmENf2tCnQkW5yQLTYqvXUQ+R6EXxdqKKbal2zM5V/g==", + "@types/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", "dev": true, "requires": { - "@types/cookiejar": "*", + "@types/mime": "*", "@types/node": "*" } }, - "@types/supertest": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-2.0.10.tgz", - "integrity": "sha512-Xt8TbEyZTnD5Xulw95GLMOkmjGICrOQyJ2jqgkSjAUR3mm7pAIzSR0NFBaMcwlzVvlpCjNwbATcWWwjNiZiFrQ==", - "dev": true, + "@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "@types/tough-cookie": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", + "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==", + "dev": true + }, + "@types/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog==" + }, + "@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/superagent": "*" + "@types/node": "*", + "@types/webidl-conversions": "*" } }, "@types/yargs": { - "version": "15.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz", - "integrity": "sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g==", + "version": "17.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.17.tgz", + "integrity": "sha512-72bWxFKTK6uwWJAVT+3rF6Jo6RTojiJ27FQo8Rf60AL+VZbzoVPnMFhKsUnbjR8A3BTCYQ7Mv3hnl8T0A+CX9g==", "dev": true, "requires": { "@types/yargs-parser": "*" } }, "@types/yargs-parser": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", - "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.6.0.tgz", - "integrity": "sha512-1+419X+Ynijytr1iWI+/IcX/kJryc78YNpdaXR1aRO1sU3bC0vZrIAF1tIX7rudVI84W7o7M4zo5p1aVt70fAg==", - "dev": true, - "requires": { - "@typescript-eslint/experimental-utils": "4.6.0", - "@typescript-eslint/scope-manager": "4.6.0", - "debug": "^4.1.1", - "functional-red-black-tree": "^1.0.1", - "regexpp": "^3.0.0", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.46.0.tgz", + "integrity": "sha512-QrZqaIOzJAjv0sfjY4EjbXUi3ZOFpKfzntx22gPGr9pmFcTjcFw/1sS1LJhEubfAGwuLjNrPV0rH+D1/XZFy7Q==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.46.0", + "@typescript-eslint/type-utils": "5.46.0", + "@typescript-eslint/utils": "5.46.0", + "debug": "^4.3.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" }, "dependencies": { "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -1449,45 +11699,25 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true - }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true } } }, - "@typescript-eslint/experimental-utils": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.6.0.tgz", - "integrity": "sha512-pnh6Beh2/4xjJVNL+keP49DFHk3orDHHFylSp3WEjtgW3y1U+6l+jNnJrGlbs6qhAz5z96aFmmbUyKhunXKvKw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/scope-manager": "4.6.0", - "@typescript-eslint/types": "4.6.0", - "@typescript-eslint/typescript-estree": "4.6.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" - } - }, "@typescript-eslint/parser": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.6.0.tgz", - "integrity": "sha512-Dj6NJxBhbdbPSZ5DYsQqpR32MwujF772F2H3VojWU6iT4AqL4BKuoNWOPFCoSZvCcADDvQjDpa6OLDAaiZPz2Q==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.46.0.tgz", + "integrity": "sha512-joNO6zMGUZg+C73vwrKXCd8usnsmOYmgW/w5ZW0pG0RGvqeznjtGDk61EqqTpNrFLUYBW2RSBFrxdAZMqA4OZA==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "4.6.0", - "@typescript-eslint/types": "4.6.0", - "@typescript-eslint/typescript-estree": "4.6.0", - "debug": "^4.1.1" + "@typescript-eslint/scope-manager": "5.46.0", + "@typescript-eslint/types": "5.46.0", + "@typescript-eslint/typescript-estree": "5.46.0", + "debug": "^4.3.4" }, "dependencies": { "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -1502,41 +11732,69 @@ } }, "@typescript-eslint/scope-manager": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.6.0.tgz", - "integrity": "sha512-uZx5KvStXP/lwrMrfQQwDNvh2ppiXzz5TmyTVHb+5TfZ3sUP7U1onlz3pjoWrK9konRyFe1czyxObWTly27Ang==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.46.0.tgz", + "integrity": "sha512-7wWBq9d/GbPiIM6SqPK9tfynNxVbfpihoY5cSFMer19OYUA3l4powA2uv0AV2eAZV6KoAh6lkzxv4PoxOLh1oA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.46.0", + "@typescript-eslint/visitor-keys": "5.46.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.46.0.tgz", + "integrity": "sha512-dwv4nimVIAsVS2dTA0MekkWaRnoYNXY26dKz8AN5W3cBFYwYGFQEqm/cG+TOoooKlncJS4RTbFKgcFY/pOiBCg==", "dev": true, "requires": { - "@typescript-eslint/types": "4.6.0", - "@typescript-eslint/visitor-keys": "4.6.0" + "@typescript-eslint/typescript-estree": "5.46.0", + "@typescript-eslint/utils": "5.46.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } } }, "@typescript-eslint/types": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.6.0.tgz", - "integrity": "sha512-5FAgjqH68SfFG4UTtIFv+rqYJg0nLjfkjD0iv+5O27a0xEeNZ5rZNDvFGZDizlCD1Ifj7MAbSW2DPMrf0E9zjA==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.46.0.tgz", + "integrity": "sha512-wHWgQHFB+qh6bu0IAPAJCdeCdI0wwzZnnWThlmHNY01XJ9Z97oKqKOzWYpR2I83QmshhQJl6LDM9TqMiMwJBTw==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.6.0.tgz", - "integrity": "sha512-s4Z9qubMrAo/tw0CbN0IN4AtfwuehGXVZM0CHNMdfYMGBDhPdwTEpBrecwhP7dRJu6d9tT9ECYNaWDHvlFSngA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.6.0", - "@typescript-eslint/visitor-keys": "4.6.0", - "debug": "^4.1.1", - "globby": "^11.0.1", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^7.3.2", - "tsutils": "^3.17.1" + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.46.0.tgz", + "integrity": "sha512-kDLNn/tQP+Yp8Ro2dUpyyVV0Ksn2rmpPpB0/3MO874RNmXtypMwSeazjEN/Q6CTp8D7ExXAAekPEcCEB/vtJkw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.46.0", + "@typescript-eslint/visitor-keys": "5.46.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" }, "dependencies": { "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -1547,30 +11805,57 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true + } + } + }, + "@typescript-eslint/utils": { + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.46.0.tgz", + "integrity": "sha512-4O+Ps1CRDw+D+R40JYh5GlKLQERXRKW5yIQoNDpmXPJ+C7kaPF9R7GWl+PxGgXjB3PQCqsaaZUpZ9dG4U6DO7g==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.46.0", + "@typescript-eslint/types": "5.46.0", + "@typescript-eslint/typescript-estree": "5.46.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0", + "semver": "^7.3.7" + }, + "dependencies": { + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true } } }, "@typescript-eslint/visitor-keys": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.6.0.tgz", - "integrity": "sha512-38Aa9Ztl0XyFPVzmutHXqDMCu15Xx8yKvUo38Gu3GhsuckCh3StPI5t2WIO9LHEsOH7MLmlGfKUisU8eW1Sjhg==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.46.0.tgz", + "integrity": "sha512-E13gBoIXmaNhwjipuvQg1ByqSAu/GbEpP/qzFihugJ+MomtoJtFAJG/+2DRPByf57B863m0/q7Zt16V9ohhANw==", "dev": true, "requires": { - "@typescript-eslint/types": "4.6.0", - "eslint-visitor-keys": "^2.0.0" + "@typescript-eslint/types": "5.46.0", + "eslint-visitor-keys": "^3.3.0" } }, - "abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", - "dev": true + "@tyriar/fibonacci-heap": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@tyriar/fibonacci-heap/-/fibonacci-heap-2.0.9.tgz", + "integrity": "sha512-bYuSNomfn4hu2tPiDN+JZtnzCpSpbJ/PNeulmocDy3xN2X5OkJL65zo6rPZp65cPPhLF9vfT/dgE+RtFRCSxOA==" }, "abbrev": { "version": "1.1.1", @@ -1578,156 +11863,139 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" } }, "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", "dev": true }, - "acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, "acorn-jsx": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", - "dev": true + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} }, "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "dev": true }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "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-align": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", - "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", - "dev": true, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "requires": { - "string-width": "^3.0.0" + "debug": "4" }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "ms": "2.1.2" } }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "requires": { - "type-fest": "^0.11.0" + "type-fest": "^0.21.3" }, "dependencies": { "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true } } }, "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "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==", - "dev": true, + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { - "color-convert": "^1.9.0" + "color-convert": "^2.0.1" + }, + "dependencies": { + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + } } }, "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, + "append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" + }, "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" }, "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", "requires": { "delegates": "^1.0.0", - "readable-stream": "^2.0.6" + "readable-stream": "^3.6.0" } }, "arg": { @@ -1737,36 +12005,15 @@ "dev": true }, "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, "array-union": { "version": "2.1.0", @@ -1774,17 +12021,16 @@ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true }, "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "requires": { "safer-buffer": "~2.1.0" } @@ -1792,131 +12038,82 @@ "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==" }, "async": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", - "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==" }, "aws4": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", - "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==", - "dev": true + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" + }, + "axios": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.2.1.tgz", + "integrity": "sha512-I88cFiGu9ryt/tfVEi4kX2SITsvDddTajXTOFmt2uK1ZVA8LytjtdeyefdQWEf5PU8w+4SSJDoYnggflB5tW4A==", + "requires": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } }, "babel-jest": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.1.tgz", - "integrity": "sha512-duMWEOKrSBYRVTTNpL2SipNIWnZOjP77auOBMPQ3zXAdnDbyZQWU8r/RxNWpUf9N6cgPFecQYelYLytTVXVDtA==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.3.1.tgz", + "integrity": "sha512-aard+xnMoxgjwV70t0L6wkW/3HQQtV+O0PEimxKgzNqCJnbYmroPojdP2tqKSOAt8QAKV/uSZU8851M7B5+fcA==", "dev": true, "requires": { - "@jest/transform": "^26.6.1", - "@jest/types": "^26.6.1", - "@types/babel__core": "^7.1.7", - "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^26.5.0", + "@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.4", + "graceful-fs": "^4.2.9", "slash": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } } }, "babel-plugin-istanbul": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", - "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "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": "^4.0.0", + "istanbul-lib-instrument": "^5.0.4", "test-exclude": "^6.0.0" } }, "babel-plugin-jest-hoist": { - "version": "26.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.5.0.tgz", - "integrity": "sha512-ck17uZFD3CDfuwCLATWZxkkuGGFhMij8quP8CNhwj8ek1mqFgbFzRJ30xwC04LLscj/aKsVFfRST+b5PT7rSuw==", + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.2.0.tgz", + "integrity": "sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA==", "dev": true, "requires": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", + "@types/babel__core": "^7.1.14", "@types/babel__traverse": "^7.0.6" } }, "babel-preset-current-node-syntax": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.4.tgz", - "integrity": "sha512-5/INNCYhUGqw7VbVjT/hb3ucjgkVHKXY7lX3ZjlN4gm565VyFmJUrJ/h+h16ECVB38R/9SF6aACydpKMLZ/c9w==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", "dev": true, "requires": { "@babel/plugin-syntax-async-generators": "^7.8.4", @@ -1929,223 +12126,77 @@ "@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-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" } }, "babel-preset-jest": { - "version": "26.5.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.5.0.tgz", - "integrity": "sha512-F2vTluljhqkiGSJGBg/jOruA8vIIIL11YrxRcO7nviNTMbbofPSHwnm8mgP7d/wS7wRSexRoI6X1A6T74d4LQA==", + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.2.0.tgz", + "integrity": "sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA==", "dev": true, "requires": { - "babel-plugin-jest-hoist": "^26.5.0", - "babel-preset-current-node-syntax": "^0.1.3" + "babel-plugin-jest-hoist": "^29.2.0", + "babel-preset-current-node-syntax": "^1.0.0" } }, "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, "bcrypt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.0.0.tgz", - "integrity": "sha512-jB0yCBl4W/kVHM2whjfyqnxTmOHkCX4kHEa5nYKSoGeYe8YrjTYTc87/6bwt1g8cmV0QrbhKriETg9jWtcREhg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.0.tgz", + "integrity": "sha512-RHBS7HI5N5tEnGTmtR/pppX0mmDSBpQ4aCBsj7CEQfYXDcO74A8sIBYcJMuCsis2E81zDxeENYhv66oZwLiA+Q==", "requires": { - "node-addon-api": "^3.0.0", - "node-pre-gyp": "0.15.0" + "@mapbox/node-pre-gyp": "^1.0.10", + "node-addon-api": "^5.0.0" } }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "requires": { "tweetnacl": "^0.14.3" } }, "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, - "bl": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", - "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", - "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "bluebird": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" - }, "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", "requires": { - "bytes": "3.1.0", + "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" } }, - "boxen": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", - "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", - "dev": true, - "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^5.3.1", - "chalk": "^3.0.0", - "cli-boxes": "^2.2.0", - "string-width": "^4.1.0", - "term-size": "^2.1.0", - "type-fest": "^0.8.1", - "widest-line": "^3.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } + "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", @@ -2165,11 +12216,17 @@ "fill-range": "^7.0.1" } }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true + "browserslist": { + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" + } }, "bs-logger": { "version": "0.2.6", @@ -2190,79 +12247,58 @@ } }, "bson": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.5.tgz", - "integrity": "sha512-kDuEzldR21lHciPQAIulLs1LZlCXdLziXI6Mb/TDkwXhb//UORJNPXgcRs2CuO4H0DcMkpfT3/ySsP3unoZjBg==" + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.0.tgz", + "integrity": "sha512-VrlEE4vuiO1WTpfof4VmaVolCVYkYTgB9iWgYNOrVlnifpME/06fhFRmONgBhClD5pFC1t9ZWqFUQEQAzY43bA==", + "requires": { + "buffer": "^5.6.0" + } + }, + "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", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" }, "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", "dev": true }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, + "busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" + "streamsearch": "^1.1.0" } }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - } + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" } }, "callsites": { @@ -2277,41 +12313,25 @@ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, - "capture-exit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", - "dev": true, - "requires": { - "rsvp": "^4.8.4" - } + "caniuse-lite": { + "version": "1.0.30001439", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001439.tgz", + "integrity": "sha512-1MgUzEkoMO6gKfXflStpYgZDlFM7M/ck/bgfVCACO5vnAf0fXoNVHdWtqGU+MYca+4bL9Z5bpOVmR33cWW9G2A==", + "dev": true }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, "char-regex": { @@ -2321,155 +12341,78 @@ "dev": true }, "chokidar": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", - "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, "requires": { - "anymatch": "~3.1.1", + "anymatch": "~3.1.2", "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", + "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.5.0" - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "cjs-module-lexer": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.4.3.tgz", - "integrity": "sha512-5RLK0Qfs0PNDpEyBXIr3bIT1Muw3ojSlvpw6dAmkUcO0+uTrsBn7GuEIgx40u+OzbCBLDta7nvmud85P4EmTsQ==", - "dev": true - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" + "readdirp": "~3.6.0" }, "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-glob": "^4.0.1" } } } }, - "cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + }, + "ci-info": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.0.tgz", + "integrity": "sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog==", + "dev": true + }, + "cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", "dev": true }, "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" + "wrap-ansi": "^7.0.0" } }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" - }, "collect-v8-coverage": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", "dev": true }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, "color": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", - "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.2" + "color-convert": "^1.9.3", + "color-string": "^1.6.0" } }, "color-convert": { @@ -2483,28 +12426,34 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "color-string": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.4.tgz", - "integrity": "sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", "requires": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" } }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" + }, "colors": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true }, "colorspace": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz", - "integrity": "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", "requires": { - "color": "3.0.x", + "color": "^3.1.3", "text-hex": "1.0.x" } }, @@ -2512,7 +12461,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, "requires": { "delayed-stream": "~1.0.0" } @@ -2532,177 +12480,59 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, - "concurrently": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-5.3.0.tgz", - "integrity": "sha512-8MhqOB6PWlBfA2vJ8a0bSFKATOdWlHiQlk11IfmQBPaHVP8oP2gsh2MObE6UR3hqDHqvaIvLTyceNW6obVuFHQ==", - "dev": true, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "requires": { - "chalk": "^2.4.2", - "date-fns": "^2.0.1", - "lodash": "^4.17.15", - "read-pkg": "^4.0.1", - "rxjs": "^6.5.2", - "spawn-command": "^0.0.2-1", - "supports-color": "^6.1.0", - "tree-kill": "^1.2.2", - "yargs": "^13.3.0" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" }, "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "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" } }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "safe-buffer": "~5.1.0" } } } }, - "configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - } - }, "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" }, "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "5.2.1" } }, "content-type": { @@ -2711,49 +12541,40 @@ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true }, "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" }, "cookie-parser": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.5.tgz", - "integrity": "sha512-f13bPUj/gG/5mDr+xLmSxxDsB9DQiTIfhJS/sqjrmfAWiAN+x2O4i/XguTL9yDZ+/IFDanJ+5x7hC4CXT9Tdzw==", + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", + "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", "requires": { - "cookie": "0.4.0", + "cookie": "0.4.1", "cookie-signature": "1.0.6" } }, "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, "cookiejar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==", - "dev": true - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz", + "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==", "dev": true }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" }, "cors": { "version": "2.8.5", @@ -2764,6 +12585,12 @@ "vary": "^1" } }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -2775,61 +12602,14 @@ "which": "^2.0.1" } }, - "crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true - }, - "cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true - }, - "cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "requires": { - "cssom": "~0.3.6" - }, - "dependencies": { - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - } - } - }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "requires": { "assert-plus": "^1.0.0" } }, - "data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dev": true, - "requires": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - } - }, - "date-fns": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.16.1.tgz", - "integrity": "sha512-sAJVKx/FqrLYHAQeN7VpJrPhagZc9R4ImZIWYRFZaaohR3KzmuK88touwsSwSVT8Qcbd4zoDsnGfX4GFB4imyQ==", - "dev": true - }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -2838,42 +12618,16 @@ "ms": "2.0.0" } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decimal.js": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", - "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", "dev": true }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" - }, "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, "deepmerge": { @@ -2882,83 +12636,30 @@ "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", "dev": true }, - "defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" }, "delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" - }, - "denque": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz", - "integrity": "sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ==" + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" }, "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" }, "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" }, "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==" }, "detect-newline": { "version": "3.1.0", @@ -2966,6 +12667,16 @@ "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true }, + "dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dev": true, + "requires": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, "diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", @@ -2973,9 +12684,9 @@ "dev": true }, "diff-sequences": { - "version": "26.5.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.5.0.tgz", - "integrity": "sha512-ZXx86srb/iYy6jG71k++wBN9P9J05UNQ5hQHQd9MtMPvcqXPx/vKU69jfHV637D00Q2gSgPk2D+jSx3l1lDW/Q==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.3.1.tgz", + "integrity": "sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==", "dev": true }, "dir-glob": { @@ -2984,61 +12695,28 @@ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "dev": true, - "requires": { - "webidl-conversions": "^5.0.0" - }, - "dependencies": { - "webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true - } + "path-type": "^4.0.0" } }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "requires": { - "is-obj": "^2.0.0" + "esutils": "^2.0.2" } }, "dotenv": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", - "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", - "dev": true - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", "dev": true }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", "requires": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -3055,19 +12733,24 @@ "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "electron-to-chromium": { + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", + "dev": true }, "emittery": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", - "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "enabled": { "version": "2.0.0", @@ -3077,25 +12760,7 @@ "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1" - } + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" }, "error-ex": { "version": "1.3.2", @@ -3109,285 +12774,149 @@ "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true } } }, - "escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "dev": true + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true }, - "escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - } - } - }, "eslint": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.12.1.tgz", - "integrity": "sha512-HlMTEdr/LicJfN08LB3nM1rRYliDXOmfoO4vj39xN6BLpFzF00hbwBoqHk8UcJ2M/3nlARZWy/mslvGEuZFvsg==", + "version": "8.29.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.29.0.tgz", + "integrity": "sha512-isQ4EEiyUjZFbEKvEGJKKGBwXtvXX+zJbkVKCgTuB9t/+jUBcy8avhkEwWJecI15BkRkOYmvIM5ynbhRjEkoeg==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@eslint/eslintrc": "^0.2.1", + "@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.0.1", + "debug": "^4.3.2", "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.0", - "esquery": "^1.2.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", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", + "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", - "js-yaml": "^3.13.1", + "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": "^4.17.19", - "minimatch": "^3.0.4", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "text-table": "^0.2.0" }, "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" } }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true - }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true } } }, "eslint-config-prettier": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz", - "integrity": "sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", + "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", "dev": true, - "requires": { - "get-stdin": "^6.0.0" - } + "requires": {} }, "eslint-plugin-prettier": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.4.tgz", - "integrity": "sha512-jZDa8z76klRqo+TdGDTFJSavwbnWK2ZpqGKNZ+VvweMW516pDUMmQ2koXvxEE4JhzNvTv+radye/bWGBmA6jmg==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", "dev": true, "requires": { "prettier-linter-helpers": "^1.0.0" } }, "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", "dev": true, "requires": { "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "estraverse": "^5.2.0" } }, "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, "requires": { - "eslint-visitor-keys": "^1.1.0" + "eslint-visitor-keys": "^2.0.0" }, "dependencies": { "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true } } }, "eslint-visitor-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", - "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "dev": true }, "espree": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz", - "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==", + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", + "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", "dev": true, "requires": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.3.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" } }, "esprima": { @@ -3397,20 +12926,12 @@ "dev": true }, "esquery": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", - "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", "dev": true, "requires": { "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true - } } }, "esrecurse": { @@ -3420,20 +12941,12 @@ "dev": true, "requires": { "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true - } } }, "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true }, "esutils": { @@ -3445,295 +12958,103 @@ "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" - }, - "exec-sh": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", - "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==", - "dev": true + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" }, "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } + "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", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "dev": true }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, "expect": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.1.tgz", - "integrity": "sha512-BRfxIBHagghMmr1D2MRY0Qv5d3Nc8HCqgbDwNXw/9izmM5eBb42a2YjLKSbsqle76ozGkAEPELQX4IdNHAKRNA==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.3.1.tgz", + "integrity": "sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==", "dev": true, "requires": { - "@jest/types": "^26.6.1", - "ansi-styles": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-matcher-utils": "^26.6.1", - "jest-message-util": "^26.6.1", - "jest-regex-util": "^26.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } + "@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.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "requires": { - "accepts": "~1.3.7", + "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.0", + "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", + "depd": "2.0.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "~1.1.2", + "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.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", + "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" - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" }, "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" } } }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==" }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "fast-diff": { "version": "1.2.0", @@ -3742,74 +13063,93 @@ "dev": true }, "fast-glob": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", - "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", + "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" + "micromatch": "^4.0.4" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } } }, "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, "fast-safe-stringify": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", - "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true + }, + "fast-xml-parser": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz", + "integrity": "sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA==", + "optional": true, + "requires": { + "strnum": "^1.0.5" + } }, "fastq": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.9.0.tgz", - "integrity": "sha512-i7FVWL8HhVY+CTkwFxkN2mk3h+787ixS5S63eb78diVRc1MCssarHq3W5cj0av7YDSwmaV928RNag+U1etRQ7w==", + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", + "integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==", "dev": true, "requires": { "reusify": "^1.0.4" } }, "fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, "requires": { "bser": "2.1.1" } }, "fecha": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.0.tgz", - "integrity": "sha512-aN3pcx/DSmtyoovUudctc8+6Hl4T+hI9GBBHLjA76jdZl7+b1sgh5g4k+u/GL3dTy1/pnYzKp69FpJ0OicE3Wg==" + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" }, "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "requires": { - "flat-cache": "^2.0.1" + "flat-cache": "^3.0.4" } }, "file-stream-rotator": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/file-stream-rotator/-/file-stream-rotator-0.5.7.tgz", - "integrity": "sha512-VYb3HZ/GiAGUCrfeakO8Mp54YGswNUHvL7P09WQcXAJNSj3iQ5QraYSp3cIn1MUyw6uzfgN/EFOarCNa4JvUHQ==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/file-stream-rotator/-/file-stream-rotator-0.6.1.tgz", + "integrity": "sha512-u+dBid4PvZw17PmDeRcNOtCP9CCK/9lRN2w+r1xIS7yOL9JFrIBKTvrYsxT4P0pGtThYTn++QS5ChHaUov3+zQ==", "requires": { - "moment": "^2.11.2" + "moment": "^2.29.1" } }, "fill-range": { @@ -3822,55 +13162,43 @@ } }, "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "requires": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "statuses": "~1.5.0", + "statuses": "2.0.1", "unpipe": "~1.0.0" } }, "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "requires": { - "locate-path": "^5.0.0", + "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - }, - "dependencies": { - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } + "flatted": "^3.1.0", + "rimraf": "^3.0.2" } }, "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true }, "fn.name": { @@ -3878,99 +13206,97 @@ "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true + "follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==" }, "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "requires": { "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", + "combined-stream": "^1.0.8", "mime-types": "^2.1.12" } }, "formidable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", - "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==", - "dev": true - }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.1.tgz", + "integrity": "sha512-0EcS9wCFEzLvfiks7omJ+SiYJAiD+TzK4Pcw1UlUoGnhUxDcMKjt0P7x8wEb0u6OHu8Nb98WG3nxtlF5C7bvUQ==", "dev": true, "requires": { - "map-cache": "^0.2.2" + "dezalgo": "^1.0.4", + "hexoid": "^1.0.0", + "once": "^1.4.0", + "qs": "^6.11.0" } }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" }, "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "requires": { - "minipass": "^2.6.0" + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + } } }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "optional": true }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", "requires": { - "aproba": "^1.0.3", + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" } }, "gensync": { @@ -3982,8 +13308,17 @@ "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } }, "get-package-type": { "version": "0.1.0", @@ -3991,133 +13326,86 @@ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true }, - "get-stdin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", - "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", - "dev": true - }, "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "requires": { "assert-plus": "^1.0.0" } }, "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "global-dirs": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz", - "integrity": "sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "requires": { - "ini": "^1.3.5" + "is-glob": "^4.0.3" } }, "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "version": "13.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.18.0.tgz", + "integrity": "sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==", "dev": true, "requires": { - "type-fest": "^0.8.1" + "type-fest": "^0.20.2" } }, "globby": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", - "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "requires": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", "slash": "^3.0.0" } }, - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - } - }, "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, - "growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", - "dev": true, - "optional": true + "grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==" }, "har-validator": { "version": "5.1.5", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "dev": true, "requires": { "ajv": "^6.12.3", "har-schema": "^2.0.0" @@ -4127,139 +13415,88 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, "requires": { "function-bind": "^1.1.1" } }, "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" }, - "has-values": { + "hexoid": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "dev": true - }, - "helmet": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/helmet/-/helmet-4.1.1.tgz", - "integrity": "sha512-Avg4XxSBrehD94mkRwEljnO+6RZx7AGfk8Wa6K1nxaU+hbXlFOhlOIMgPfFqOYQB/dBCsTpootTGuiOG+CHiQA==" - }, - "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", + "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", "dev": true }, - "html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "dev": true, - "requires": { - "whatwg-encoding": "^1.0.5" - } - }, "html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "dev": true - }, "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" } }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", "requires": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", "sshpk": "^1.7.0" } }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "requires": { + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true }, "iconv-lite": { @@ -4270,54 +13507,37 @@ "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.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.1.tgz", + "integrity": "sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA==", "dev": true }, "ignore-by-default": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", "dev": true }, - "ignore-walk": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", - "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", - "requires": { - "minimatch": "^3.0.4" - } - }, "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - } } }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "dev": true - }, "import-local": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", - "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "dev": true, "requires": { "pkg-dir": "^4.2.0", @@ -4327,59 +13547,33 @@ "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "requires": { "once": "^1.3.0", "wrappy": "1" } }, "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", - "dev": true + "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", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "is-arrayish": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", @@ -4394,93 +13588,25 @@ "binary-extensions": "^2.0.0" } }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "requires": { - "ci-info": "^2.0.0" - } - }, "is-core-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.0.0.tgz", - "integrity": "sha512-jq1AH6C8MuteOoBPwkxHafmByhL9j5q4OaPGdbuD+ZtQJVzH+i6E3BJDQcBA09k57i2Hh2yQbEG8yObZ0jdlWw==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", "dev": true, "requires": { "has": "^1.0.3" } }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "is-docker": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", - "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", - "dev": true, - "optional": true - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true }, "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "is-generator-fn": { "version": "2.1.0", @@ -4489,135 +13615,68 @@ "dev": true }, "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-installed-globally": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", - "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", - "dev": true, - "requires": { - "global-dirs": "^2.0.1", - "is-path-inside": "^3.0.1" - } - }, - "is-npm": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", - "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - }, - "is-path-inside": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", - "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "requires": { - "isobject": "^3.0.1" + "is-extglob": "^2.1.1" } }, - "is-potential-custom-element-name": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz", - "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=", + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "optional": true, - "requires": { - "is-docker": "^2.0.0" - } - }, - "is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", - "dev": true + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" }, "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true }, "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, "requires": { - "@babel/core": "^7.7.5", + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-coverage": "^3.2.0", "semver": "^6.3.0" }, "dependencies": { @@ -4641,9 +13700,9 @@ } }, "istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, "requires": { "debug": "^4.1.1", @@ -4652,9 +13711,9 @@ }, "dependencies": { "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -4669,9 +13728,9 @@ } }, "istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", "dev": true, "requires": { "html-escaper": "^2.0.0", @@ -4679,998 +13738,486 @@ } }, "jest": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.1.tgz", - "integrity": "sha512-f+ahfqw3Ffy+9vA7sWFGpTmhtKEMsNAZiWBVXDkrpIO73zIz22iimjirnV78kh/eWlylmvLh/0WxHN6fZraZdA==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.3.1.tgz", + "integrity": "sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA==", "dev": true, "requires": { - "@jest/core": "^26.6.1", + "@jest/core": "^29.3.1", + "@jest/types": "^29.3.1", "import-local": "^3.0.2", - "jest-cli": "^26.6.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "jest-cli": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.1.tgz", - "integrity": "sha512-aPLoEjlwFrCWhiPpW5NUxQA1X1kWsAnQcQ0SO/fHsCvczL3W75iVAcH9kP6NN+BNqZcHNEvkhxT5cDmBfEAh+w==", - "dev": true, - "requires": { - "@jest/core": "^26.6.1", - "@jest/test-result": "^26.6.1", - "@jest/types": "^26.6.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "import-local": "^3.0.2", - "is-ci": "^2.0.0", - "jest-config": "^26.6.1", - "jest-util": "^26.6.1", - "jest-validate": "^26.6.1", - "prompts": "^2.0.1", - "yargs": "^15.4.1" - } - } + "jest-cli": "^29.3.1" } }, "jest-changed-files": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.1.tgz", - "integrity": "sha512-NhSdZ5F6b/rIN5V46x1l31vrmukD/bJUXgYAY8VtP1SknYdJwjYDRxuLt7Z8QryIdqCjMIn2C0Cd98EZ4umo8Q==", + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.2.0.tgz", + "integrity": "sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA==", + "dev": true, + "requires": { + "execa": "^5.0.0", + "p-limit": "^3.1.0" + } + }, + "jest-circus": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.3.1.tgz", + "integrity": "sha512-wpr26sEvwb3qQQbdlmei+gzp6yoSSoSL6GsLPxnuayZSMrSd5Ka7IjAvatpIernBvT2+Ic6RLTg+jSebScmasg==", + "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", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.3.1.tgz", + "integrity": "sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ==", "dev": true, "requires": { - "@jest/types": "^26.6.1", - "execa": "^4.0.0", - "throat": "^5.0.0" + "@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" }, "dependencies": { - "execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" } }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "yargs": { + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", "dev": true, "requires": { - "pump": "^3.0.0" + "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" } }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } } } }, "jest-config": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.1.tgz", - "integrity": "sha512-mtJzIynIwW1d1nMlKCNCQiSgWaqFn8cH/fOSNY97xG7Y9tBCZbCSuW2GTX0RPmceSJGO7l27JgwC18LEg0Vg+g==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.3.1.tgz", + "integrity": "sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg==", "dev": true, "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^26.6.1", - "@jest/types": "^26.6.1", - "babel-jest": "^26.6.1", + "@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.1", - "graceful-fs": "^4.2.4", - "jest-environment-jsdom": "^26.6.1", - "jest-environment-node": "^26.6.1", - "jest-get-type": "^26.3.0", - "jest-jasmine2": "^26.6.1", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.1", - "jest-util": "^26.6.1", - "jest-validate": "^26.6.1", - "micromatch": "^4.0.2", - "pretty-format": "^26.6.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } + "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": "26.6.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.1.tgz", - "integrity": "sha512-BBNy/zin2m4kG5In126O8chOBxLLS/XMTuuM2+YhgyHk87ewPzKTuTJcqj3lOWOi03NNgrl+DkMeV/exdvG9gg==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.3.1.tgz", + "integrity": "sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==", "dev": true, "requires": { "chalk": "^4.0.0", - "diff-sequences": "^26.5.0", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } + "diff-sequences": "^29.3.1", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.3.1" } }, "jest-docblock": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", - "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.2.0.tgz", + "integrity": "sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==", "dev": true, "requires": { "detect-newline": "^3.0.0" } }, "jest-each": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.1.tgz", - "integrity": "sha512-gSn8eB3buchuq45SU7pLB7qmCGax1ZSxfaWuEFblCyNMtyokYaKFh9dRhYPujK6xYL57dLIPhLKatjmB5XWzGA==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.3.1.tgz", + "integrity": "sha512-qrZH7PmFB9rEzCSl00BWjZYuS1BSOH8lLuC0azQE9lQrAx3PWGKHTDudQiOSwIy5dGAJh7KA0ScYlCP7JxvFYA==", "dev": true, "requires": { - "@jest/types": "^26.6.1", + "@jest/types": "^29.3.1", "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-util": "^26.6.1", - "pretty-format": "^26.6.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } - } - }, - "jest-environment-jsdom": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.1.tgz", - "integrity": "sha512-A17RiXuHYNVlkM+3QNcQ6n5EZyAc6eld8ra9TW26luounGWpku4tj03uqRgHJCI1d4uHr5rJiuCH5JFRtdmrcA==", - "dev": true, - "requires": { - "@jest/environment": "^26.6.1", - "@jest/fake-timers": "^26.6.1", - "@jest/types": "^26.6.1", - "@types/node": "*", - "jest-mock": "^26.6.1", - "jest-util": "^26.6.1", - "jsdom": "^16.4.0" + "jest-get-type": "^29.2.0", + "jest-util": "^29.3.1", + "pretty-format": "^29.3.1" } }, "jest-environment-node": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.1.tgz", - "integrity": "sha512-YffaCp6h0j1kbcf1NVZ7umC6CPgD67YS+G1BeornfuSkx5s3xdhuwG0DCxSiHPXyT81FfJzA1L7nXvhq50OWIg==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.3.1.tgz", + "integrity": "sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag==", "dev": true, "requires": { - "@jest/environment": "^26.6.1", - "@jest/fake-timers": "^26.6.1", - "@jest/types": "^26.6.1", + "@jest/environment": "^29.3.1", + "@jest/fake-timers": "^29.3.1", + "@jest/types": "^29.3.1", "@types/node": "*", - "jest-mock": "^26.6.1", - "jest-util": "^26.6.1" + "jest-mock": "^29.3.1", + "jest-util": "^29.3.1" } }, "jest-get-type": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", - "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.2.0.tgz", + "integrity": "sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==", "dev": true }, "jest-haste-map": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.1.tgz", - "integrity": "sha512-9kPafkv0nX6ta1PrshnkiyhhoQoFWncrU/uUBt3/AP1r78WSCU5iLceYRTwDvJl67H3RrXqSlSVDDa/AsUB7OQ==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.3.1.tgz", + "integrity": "sha512-/FFtvoG1xjbbPXQLFef+WSU4yrc0fc0Dds6aRPBojUid7qlPqZvxdUBA03HW0fnVHXVCnCdkuoghYItKNzc/0A==", "dev": true, "requires": { - "@jest/types": "^26.6.1", - "@types/graceful-fs": "^4.1.2", + "@jest/types": "^29.3.1", + "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", - "fsevents": "^2.1.2", - "graceful-fs": "^4.2.4", - "jest-regex-util": "^26.0.0", - "jest-serializer": "^26.5.0", - "jest-util": "^26.6.1", - "jest-worker": "^26.6.1", - "micromatch": "^4.0.2", - "sane": "^4.0.3", - "walker": "^1.0.7" - } - }, - "jest-jasmine2": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.1.tgz", - "integrity": "sha512-2uYdT32o/ZzSxYAPduAgokO8OlAL1YdG/9oxcEY138EDNpIK5XRRJDaGzTZdIBWSxk0aR8XxN44FvfXtHB+Fiw==", - "dev": true, - "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^26.6.1", - "@jest/source-map": "^26.5.0", - "@jest/test-result": "^26.6.1", - "@jest/types": "^26.6.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^26.6.1", - "is-generator-fn": "^2.0.0", - "jest-each": "^26.6.1", - "jest-matcher-utils": "^26.6.1", - "jest-message-util": "^26.6.1", - "jest-runtime": "^26.6.1", - "jest-snapshot": "^26.6.1", - "jest-util": "^26.6.1", - "pretty-format": "^26.6.1", - "throat": "^5.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } + "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": "26.6.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.1.tgz", - "integrity": "sha512-j9ZOtJSJKlHjrs4aIxWjiQUjyrffPdiAQn2Iw0916w7qZE5Lk0T2KhIH6E9vfhzP6sw0Q0jtnLLb4vQ71o1HlA==", - "dev": true, - "requires": { - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.1" - } - }, - "jest-matcher-utils": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.1.tgz", - "integrity": "sha512-9iu3zrsYlUnl8pByhREF9rr5eYoiEb1F7ymNKg6lJr/0qD37LWS5FSW/JcoDl8UdMX2+zAzabDs7sTO+QFKjCg==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.3.1.tgz", + "integrity": "sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA==", "dev": true, "requires": { - "chalk": "^4.0.0", - "jest-diff": "^26.6.1", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } + "jest-get-type": "^29.2.0", + "pretty-format": "^29.3.1" + } + }, + "jest-matcher-utils": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.3.1.tgz", + "integrity": "sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ==", + "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": "26.6.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.1.tgz", - "integrity": "sha512-cqM4HnqncIebBNdTKrBoWR/4ufHTll0pK/FWwX0YasK+TlBQEMqw3IEdynuuOTjDPFO3ONlFn37280X48beByw==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", + "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/types": "^26.6.1", + "@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.4", - "micromatch": "^4.0.2", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.3.1", "slash": "^3.0.0", - "stack-utils": "^2.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } + "stack-utils": "^2.0.3" } }, "jest-mock": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.1.tgz", - "integrity": "sha512-my0lPTBu1awY8iVG62sB2sx9qf8zxNDVX+5aFgoB8Vbqjb6LqIOsfyFA8P1z6H2IsqMbvOX9oCJnK67Y3yUIMA==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.3.1.tgz", + "integrity": "sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==", "dev": true, "requires": { - "@jest/types": "^26.6.1", - "@types/node": "*" + "@jest/types": "^29.3.1", + "@types/node": "*", + "jest-util": "^29.3.1" } }, "jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "dev": true + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "requires": {} }, "jest-regex-util": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", - "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.2.0.tgz", + "integrity": "sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==", "dev": true }, "jest-resolve": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.1.tgz", - "integrity": "sha512-hiHfQH6rrcpAmw9xCQ0vD66SDuU+7ZulOuKwc4jpbmFFsz0bQG/Ib92K+9/489u5rVw0btr/ZhiHqBpmkbCvuQ==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.3.1.tgz", + "integrity": "sha512-amXJgH/Ng712w3Uz5gqzFBBjxV8WFLSmNjoreBGMqxgCz5cH7swmBZzgBaCIOsvb0NbpJ0vgaSFdJqMdT+rADw==", "dev": true, "requires": { - "@jest/types": "^26.6.1", "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.3.1", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.6.1", - "read-pkg-up": "^7.0.1", - "resolve": "^1.18.1", + "jest-util": "^29.3.1", + "jest-validate": "^29.3.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", "slash": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "resolve": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", - "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", - "dev": true, - "requires": { - "is-core-module": "^2.0.0", - "path-parse": "^1.0.6" - } - } } }, "jest-resolve-dependencies": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.1.tgz", - "integrity": "sha512-MN6lufbZJ3RBfTnJesZtHu3hUCBqPdHRe2+FhIt0yiqJ3fMgzWRqMRQyN/d/QwOE7KXwAG2ekZutbPhuD7s51A==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.3.1.tgz", + "integrity": "sha512-Vk0cYq0byRw2WluNmNWGqPeRnZ3p3hHmjJMp2dyyZeYIfiBskwq4rpiuGFR6QGAdbj58WC7HN4hQHjf2mpvrLA==", "dev": true, "requires": { - "@jest/types": "^26.6.1", - "jest-regex-util": "^26.0.0", - "jest-snapshot": "^26.6.1" + "jest-regex-util": "^29.2.0", + "jest-snapshot": "^29.3.1" } }, "jest-runner": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.1.tgz", - "integrity": "sha512-DmpNGdgsbl5s0FGkmsInmqnmqCtliCSnjWA2TFAJS1m1mL5atwfPsf+uoZ8uYQ2X0uDj4NM+nPcDnUpbNTRMBA==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.3.1.tgz", + "integrity": "sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA==", "dev": true, "requires": { - "@jest/console": "^26.6.1", - "@jest/environment": "^26.6.1", - "@jest/test-result": "^26.6.1", - "@jest/types": "^26.6.1", + "@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.7.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-config": "^26.6.1", - "jest-docblock": "^26.0.0", - "jest-haste-map": "^26.6.1", - "jest-leak-detector": "^26.6.1", - "jest-message-util": "^26.6.1", - "jest-resolve": "^26.6.1", - "jest-runtime": "^26.6.1", - "jest-util": "^26.6.1", - "jest-worker": "^26.6.1", - "source-map-support": "^0.5.6", - "throat": "^5.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } + "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": "26.6.1", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.1.tgz", - "integrity": "sha512-7uOCNeezXDWgjEyzYbRN2ViY7xNZzusNVGAMmU0UHRUNXuY4j4GBHKGMqPo/cBPZA9bSYp+lwK2DRRBU5Dv6YQ==", - "dev": true, - "requires": { - "@jest/console": "^26.6.1", - "@jest/environment": "^26.6.1", - "@jest/fake-timers": "^26.6.1", - "@jest/globals": "^26.6.1", - "@jest/source-map": "^26.5.0", - "@jest/test-result": "^26.6.1", - "@jest/transform": "^26.6.1", - "@jest/types": "^26.6.1", - "@types/yargs": "^15.0.0", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.3.1.tgz", + "integrity": "sha512-jLzkIxIqXwBEOZx7wx9OO9sxoZmgT2NhmQKzHQm1xwR1kNW/dn0OjxR424VwHHf1SPN6Qwlb5pp1oGCeFTQ62A==", + "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": "^0.4.2", + "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", "glob": "^7.1.3", - "graceful-fs": "^4.2.4", - "jest-config": "^26.6.1", - "jest-haste-map": "^26.6.1", - "jest-message-util": "^26.6.1", - "jest-mock": "^26.6.1", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.1", - "jest-snapshot": "^26.6.1", - "jest-util": "^26.6.1", - "jest-validate": "^26.6.1", + "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", - "yargs": "^15.4.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } - } - }, - "jest-serializer": { - "version": "26.5.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.5.0.tgz", - "integrity": "sha512-+h3Gf5CDRlSLdgTv7y0vPIAoLgX/SI7T4v6hy+TEXMgYbv+ztzbg5PSN6mUXAT/hXYHvZRWm+MaObVfqkhCGxA==", - "dev": true, - "requires": { - "@types/node": "*", - "graceful-fs": "^4.2.4" + "strip-bom": "^4.0.0" } }, "jest-snapshot": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.1.tgz", - "integrity": "sha512-JA7bZp7HRTIJYAi85pJ/OZ2eur2dqmwIToA5/6d7Mn90isGEfeF9FvuhDLLEczgKP1ihreBzrJ6Vr7zteP5JNA==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.3.1.tgz", + "integrity": "sha512-+3JOc+s28upYLI2OJM4PWRGK9AgpsMs/ekNryUV0yMBClT9B1DF2u2qay8YxcQd338PPYSFNb0lsar1B49sLDA==", "dev": true, "requires": { - "@babel/types": "^7.0.0", - "@jest/types": "^26.6.1", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.0.0", + "@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": "^26.6.1", - "graceful-fs": "^4.2.4", - "jest-diff": "^26.6.1", - "jest-get-type": "^26.3.0", - "jest-haste-map": "^26.6.1", - "jest-matcher-utils": "^26.6.1", - "jest-message-util": "^26.6.1", - "jest-resolve": "^26.6.1", + "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": "^26.6.1", - "semver": "^7.3.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - } + "pretty-format": "^29.3.1", + "semver": "^7.3.5" } }, "jest-util": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.1.tgz", - "integrity": "sha512-xCLZUqVoqhquyPLuDXmH7ogceGctbW8SMyQVjD9o+1+NPWI7t0vO08udcFLVPLgKWcvc+zotaUv/RuaR6l8HIA==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", "dev": true, "requires": { - "@jest/types": "^26.6.1", + "@jest/types": "^29.3.1", "@types/node": "*", "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "is-ci": "^2.0.0", - "micromatch": "^4.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" } }, "jest-validate": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.1.tgz", - "integrity": "sha512-BEFpGbylKocnNPZULcnk+TGaz1oFZQH/wcaXlaXABbu0zBwkOGczuWgdLucUouuQqn7VadHZZeTvo8VSFDLMOA==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.3.1.tgz", + "integrity": "sha512-N9Lr3oYR2Mpzuelp1F8negJR3YE+L1ebk1rYA5qYo9TTY3f9OWdptLoNSPP9itOCBIRBqjt/S5XHlzYglLN67g==", "dev": true, "requires": { - "@jest/types": "^26.6.1", - "camelcase": "^6.0.0", + "@jest/types": "^29.3.1", + "camelcase": "^6.2.0", "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", + "jest-get-type": "^29.2.0", "leven": "^3.1.0", - "pretty-format": "^26.6.1" + "pretty-format": "^29.3.1" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true } } }, "jest-watcher": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.1.tgz", - "integrity": "sha512-0LBIPPncNi9CaLKK15bnxyd2E8OMl4kJg0PTiNOI+MXztXw1zVdtX/x9Pr6pXaQYps+eS/ts43O4+HByZ7yJSw==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.3.1.tgz", + "integrity": "sha512-RspXG2BQFDsZSRKGCT/NiNa8RkQ1iKAjrO0//soTMWx/QUt+OcxMqMSBxz23PYGqUuWm2+m2mNNsmj0eIoOaFg==", "dev": true, "requires": { - "@jest/test-result": "^26.6.1", - "@jest/types": "^26.6.1", + "@jest/test-result": "^29.3.1", + "@jest/types": "^29.3.1", "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^26.6.1", - "string-length": "^4.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } + "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": "26.6.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.1.tgz", - "integrity": "sha512-R5IE3qSGz+QynJx8y+ICEkdI2OJ3RJjRQVEyCcFAd3yVhQSEtquziPO29Mlzgn07LOVE8u8jhJ1FqcwegiXWOw==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.3.1.tgz", + "integrity": "sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==", "dev": true, "requires": { "@types/node": "*", + "jest-util": "^29.3.1", "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" + "supports-color": "^8.0.0" + }, + "dependencies": { + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "joi": { + "version": "17.7.0", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.7.0.tgz", + "integrity": "sha512-1/ugc8djfn93rTE3WRKdCzGGt/EtiYKxITMO4Wiv6q5JL1gl9ePt4kBsl1S499nbosspfctIQTpYIhSmHA3WAg==", + "requires": { + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0", + "@sideway/address": "^4.1.3", + "@sideway/formula": "^3.0.0", + "@sideway/pinpoint": "^2.0.0" } }, + "js-sdsl": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", + "integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==", + "dev": true + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -5678,54 +14225,18 @@ "dev": true }, "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" } }, "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "jsdom": { - "version": "16.4.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.4.0.tgz", - "integrity": "sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w==", - "dev": true, - "requires": { - "abab": "^2.0.3", - "acorn": "^7.1.1", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.2.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.0", - "domexception": "^2.0.1", - "escodegen": "^1.14.1", - "html-encoding-sniffer": "^2.0.1", - "is-potential-custom-element-name": "^1.0.0", - "nwsapi": "^2.2.0", - "parse5": "5.1.1", - "request": "^2.88.2", - "request-promise-native": "^1.0.8", - "saxes": "^5.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^3.0.1", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0", - "ws": "^7.2.3", - "xml-name-validator": "^3.0.0" - } + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" }, "jsesc": { "version": "2.5.2", @@ -5733,18 +14244,6 @@ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, "json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -5752,37 +14251,31 @@ "dev": true }, "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" }, "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "dev": true }, "jsonwebtoken": { "version": "8.5.1", @@ -5802,21 +14295,25 @@ }, "dependencies": { "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", - "json-schema": "0.2.3", + "json-schema": "0.4.0", "verror": "1.10.0" } }, @@ -5840,24 +14337,9 @@ } }, "kareem": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.1.tgz", - "integrity": "sha512-l3hLhffs9zqoDe8zjmb/mAN4B8VT3L56EUvKNqLFVs9YlFA+zx7ke1DO8STAdDyYNkeSo1nKmjuvQeI12So8Xw==" - }, - "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, - "requires": { - "json-buffer": "3.0.0" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.0.tgz", + "integrity": "sha512-rVBUGGwvqg130iwYu8k7lutHuDBFj1yGRdnlE44wEhxAmFBad1zcL66PdWC1raw3tIObY6XWhtv3VL04xQb/cg==" }, "kleur": { "version": "3.0.3", @@ -5870,15 +14352,6 @@ "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" }, - "latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "dev": true, - "requires": { - "package-json": "^6.3.0" - } - }, "leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -5896,102 +14369,113 @@ } }, "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "requires": { - "p-locate": "^4.1.0" + "p-locate": "^5.0.0" } }, "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" }, "lodash.includes": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" }, "lodash.isboolean": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" }, "lodash.isinteger": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" }, "lodash.isnumber": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" }, "lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" }, "lodash.isstring": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, "lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" - }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", - "dev": true + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" }, "logform": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.2.0.tgz", - "integrity": "sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.4.2.tgz", + "integrity": "sha512-W4c9himeAwXEdZ05dQNerhFz2XG80P9Oj0loPUMV23VC2it0orMHQhJm4hdnnor3rd1HsGf6a2lPwBM1zeXHGw==", "requires": { - "colors": "^1.2.1", - "fast-safe-stringify": "^2.0.4", + "@colors/colors": "1.5.0", "fecha": "^4.2.0", "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", "triple-beam": "^1.3.0" }, "dependencies": { "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" } } }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, "requires": { "semver": "^6.0.0" }, @@ -5999,8 +14483,7 @@ "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, @@ -6011,33 +14494,18 @@ "dev": true }, "makeerror": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", - "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", - "dev": true, - "requires": { - "tmpl": "1.0.x" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, "requires": { - "object-visit": "^1.0.0" + "tmpl": "1.0.5" } }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" }, "memory-pager": { "version": "1.5.0", @@ -6048,7 +14516,7 @@ "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" }, "merge-stream": { "version": "2.0.0", @@ -6065,16 +14533,16 @@ "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" + "braces": "^3.0.2", + "picomatch": "^2.3.1" } }, "mime": { @@ -6083,16 +14551,16 @@ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, "mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" }, "mime-types": { - "version": "2.1.26", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", - "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "requires": { - "mime-db": "1.43.0" + "mime-db": "1.52.0" } }, "mimic-fn": { @@ -6101,317 +14569,315 @@ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true - }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" }, "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.0.tgz", + "integrity": "sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw==", "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" + "yallist": "^4.0.0" } }, "minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "requires": { - "minipass": "^2.9.0" - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" + "minipass": "^3.0.0", + "yallist": "^4.0.0" }, "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "requires": { - "is-plain-object": "^2.0.4" + "yallist": "^4.0.0" } } } }, "mkdirp": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", - "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", - "requires": { - "minimist": "^1.2.5" - } + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" }, "moment": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", - "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" }, "mongodb": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.6.2.tgz", - "integrity": "sha512-sSZOb04w3HcnrrXC82NEh/YGCmBuRgR+C1hZgmmv4L6dBz4BkRse6Y8/q/neXer9i95fKUBbFi4KgeceXmbsOA==", - "requires": { - "bl": "^2.2.1", - "bson": "^1.1.4", - "denque": "^1.4.1", - "require_optional": "^1.0.1", - "safe-buffer": "^5.1.2", - "saslprep": "^1.0.0" + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.12.1.tgz", + "integrity": "sha512-koT87tecZmxPKtxRQD8hCKfn+ockEL2xBiUvx3isQGI6mFmagWt4f4AyCE9J4sKepnLhMacoCTQQA6SLAI2L6w==", + "requires": { + "@aws-sdk/credential-providers": "^3.186.0", + "bson": "^4.7.0", + "mongodb-connection-string-url": "^2.5.4", + "saslprep": "^1.0.3", + "socks": "^2.7.1" } }, - "mongoose": { - "version": "5.10.11", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.10.11.tgz", - "integrity": "sha512-R5BFitKW94/S/Z48w+X+qi/eto66jWBcVEVA8nYVkBoBAPFGq7JSYP/0uso+ZHs+7XjSzTuui+SUllzxIrf9yA==", - "requires": { - "bson": "^1.1.4", - "kareem": "2.3.1", - "mongodb": "3.6.2", - "mongoose-legacy-pluralize": "1.0.2", - "mpath": "0.7.0", - "mquery": "3.2.2", - "ms": "2.1.2", - "regexp-clone": "1.0.0", - "safe-buffer": "5.2.1", - "sift": "7.0.1", - "sliced": "1.0.1" + "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": { - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "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" + } }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + "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-legacy-pluralize": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", - "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==" + "mongoose": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.8.0.tgz", + "integrity": "sha512-zlUfjcLya3pLfLTxwyH5S9bZUolJWGKF2M7PEV0118jv4VWHR/krjb6LIWu1RPQN2rwYmnmjjzJLVhbhmHqSmg==", + "requires": { + "bson": "^4.7.0", + "kareem": "2.5.0", + "mongodb": "4.12.1", + "mpath": "0.9.0", + "mquery": "4.0.3", + "ms": "2.1.3", + "sift": "16.0.1" + }, + "dependencies": { + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } }, "mpath": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.7.0.tgz", - "integrity": "sha512-Aiq04hILxhz1L+f7sjGyn7IxYzWm1zLNNXcfhDtx04kZ2Gk7uvFdgZ8ts1cWa/6d0TQmag2yR8zSGZUmp0tFNg==" + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", + "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==" }, "mquery": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.2.tgz", - "integrity": "sha512-XB52992COp0KP230I3qloVUbkLUxJIu328HBP2t2EsxSFtf4W1HPSOBWOXf1bqxK4Xbb66lfMJ+Bpfd9/yZE1Q==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-4.0.3.tgz", + "integrity": "sha512-J5heI+P08I6VJ2Ky3+33IpCdAvlYGTSUjwTPxkAr8i8EoduPMBX2OY/wa3IKZIQl7MU4SbFk8ndgSKyB/cl1zA==", "requires": { - "bluebird": "3.5.1", - "debug": "3.1.0", - "regexp-clone": "^1.0.0", - "safe-buffer": "5.1.2", - "sliced": "1.0.1" + "debug": "4.x" }, "dependencies": { "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { - "ms": "2.0.0" + "ms": "2.1.2" } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "multer": { + "version": "1.4.5-lts.1", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", + "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", + "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" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "requires": { + "minimist": "^1.2.6" + } + } } }, + "nan": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", + "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", + "optional": true + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "needle": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.5.2.tgz", - "integrity": "sha512-LbRIwS9BfkPvNwNHlsA41Q29kL2L/6VaOJ0qisM5lLWsTV3nP15abO5ITL6L81zqFhzjRKDAYjpcBcwM0AVvLQ==", - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" + "natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, + "newrelic": { + "version": "9.7.2", + "resolved": "https://registry.npmjs.org/newrelic/-/newrelic-9.7.2.tgz", + "integrity": "sha512-SzjngZYv4VNQpseBN1KkHoEOKo5dl0Hrtbs1uKi+kIO0899vh2u7fLKJuLtp6jBSgwTMp71dO6G2/cclbUXz7w==", + "requires": { + "@contrast/fn-inspect": "^3.3.0", + "@grpc/grpc-js": "^1.7.3", + "@grpc/proto-loader": "^0.7.3", + "@newrelic/aws-sdk": "^5.0.0", + "@newrelic/koa": "^7.0.0", + "@newrelic/native-metrics": "^9.0.0", + "@newrelic/superagent": "^6.0.0", + "@tyriar/fibonacci-heap": "^2.0.7", + "concat-stream": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "json-stringify-safe": "^5.0.0", + "readable-stream": "^3.6.0", + "semver": "^5.3.0", + "winston-transport": "^4.5.0" }, "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", "requires": { - "ms": "^2.1.1" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" } }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + "node-addon-api": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.0.0.tgz", + "integrity": "sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA==" }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "requires": { + "whatwg-url": "^5.0.0" + } }, - "node-addon-api": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.0.2.tgz", - "integrity": "sha512-+D4s2HCnxPd5PjjI0STKwncjXTUKKqm74MDMz9OPXavjsGmjkvwgLtA5yoxJUdmpj52+2u+RrXgPipahKczMKg==" + "node-gyp-build": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", + "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", + "optional": true }, "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true }, - "node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", "dev": true }, - "node-notifier": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.0.tgz", - "integrity": "sha512-46z7DUmcjoYdaWyXouuFNNfUo6eFa94t23c53c+lG/9Cvauk4a98rAUp9672X5dxGdQmLpPzTxzu8f/OeEPaFA==", - "dev": true, - "optional": true, - "requires": { - "growly": "^1.3.0", - "is-wsl": "^2.2.0", - "semver": "^7.3.2", - "shellwords": "^0.1.1", - "uuid": "^8.3.0", - "which": "^2.0.2" - }, - "dependencies": { - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true, - "optional": true - } - } - }, - "node-pre-gyp": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.15.0.tgz", - "integrity": "sha512-7QcZa8/fpaU/BKenjcaeFF9hLz2+7S9AqyXFhlH/rilsQ/hPZKK32RtR5EQHJElgu+q5RfbJ34KriI79UWaorA==", - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.3", - "needle": "^2.5.0", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4.4.2" - }, - "dependencies": { - "nopt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", - "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - } - } - }, "nodemon": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.6.tgz", - "integrity": "sha512-4I3YDSKXg6ltYpcnZeHompqac4E6JeAMpGm8tJnB9Y3T0ehasLa4139dJOcCrB93HHrUMsCrKtoAlXTqT5n4AQ==", + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.20.tgz", + "integrity": "sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==", "dev": true, "requires": { - "chokidar": "^3.2.2", - "debug": "^3.2.6", + "chokidar": "^3.5.2", + "debug": "^3.2.7", "ignore-by-default": "^1.0.1", - "minimatch": "^3.0.4", - "pstree.remy": "^1.1.7", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", "supports-color": "^5.5.0", "touch": "^3.1.0", - "undefsafe": "^2.0.3", - "update-notifier": "^4.1.0" + "undefsafe": "^2.0.5" }, "dependencies": { "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { "ms": "^2.1.1" } }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true }, "supports-color": { @@ -6425,170 +14891,64 @@ } } }, - "nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "normalize-url": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", - "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", - "dev": true - }, - "npm-bundled": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", - "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" - }, - "npm-packlist": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", - "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", - "npm-normalize-package-bin": "^1.0.1" + "abbrev": "1" } }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "requires": { - "path-key": "^2.0.0" - }, - "dependencies": { - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - } + "path-key": "^3.0.0" } }, "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" } }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - }, - "nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", - "dev": true - }, "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" }, "object-hash": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.0.3.tgz", - "integrity": "sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg==" - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==" }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" }, "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "requires": { "ee-first": "1.1.1" } @@ -6596,7 +14956,7 @@ "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "requires": { "wrappy": "1" } @@ -6632,59 +14992,22 @@ "word-wrap": "^1.2.3" } }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true - }, - "p-each-series": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz", - "integrity": "sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ==", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "requires": { - "p-try": "^2.0.0" + "yocto-queue": "^0.1.0" } }, "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "requires": { - "p-limit": "^2.2.0" + "p-limit": "^3.0.2" } }, "p-try": { @@ -6693,26 +15016,6 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, - "package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dev": true, - "requires": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -6723,32 +15026,22 @@ } }, "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "requires": { + "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" } }, - "parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", - "dev": true - }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -6758,7 +15051,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" }, "path-key": { "version": "3.1.1", @@ -6767,15 +15060,15 @@ "dev": true }, "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, "path-type": { "version": "4.0.0", @@ -6786,29 +15079,25 @@ "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" }, - "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", "dev": true }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, "pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "dev": true, - "requires": { - "node-modules-regexp": "^1.0.0" - } + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "dev": true }, "pkg-dir": { "version": "4.2.0", @@ -6817,30 +15106,57 @@ "dev": true, "requires": { "find-up": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + } } }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "dev": true - }, "prettier": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.2.tgz", - "integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.1.tgz", + "integrity": "sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==", "dev": true }, "prettier-linter-helpers": { @@ -6853,45 +15169,20 @@ } }, "pretty-format": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.1.tgz", - "integrity": "sha512-MeqqsP5PYcRBbGMvwzsyBdmAJ4EFX7pWFyl7x4+dMVg5pE0ZDdBIvEH2ergvIO+Gvwv1wh64YuOY9y5LuyY/GA==", + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", + "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", "dev": true, "requires": { - "@jest/types": "^26.6.1", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^17.0.1" + "@jest/schemas": "^29.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" }, "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true } } @@ -6901,247 +15192,137 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, "prompts": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", - "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dev": true, "requires": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, + "protobufjs": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.1.2.tgz", + "integrity": "sha512-4ZPTPkXCdel3+L81yw3dG6+Kq3umdWKh7Dc7GW/CpNk4SX3hK58iPCWeCyhVTDrbkNeKrYNZ7EojM5WDaEWTLQ==", + "requires": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "dependencies": { + "long": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.1.tgz", + "integrity": "sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A==" + } + } + }, "proxy-addr": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", - "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "requires": { - "forwarded": "~0.1.2", + "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" }, "pstree.remy": { "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", - "dev": true, - "requires": { - "escape-goat": "^2.0.0" - } - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "react-is": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.1.tgz", - "integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==", - "dev": true - }, - "read-pkg": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz", - "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=", - "dev": true, - "requires": { - "normalize-package-data": "^2.3.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "parse-json": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", - "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", - "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" - } - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - } - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "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" - } + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true }, - "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", - "dev": true, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "requires": { - "picomatch": "^2.2.1" + "side-channel": "^1.0.4" } }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" } }, - "regexp-clone": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz", - "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==" - }, - "regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true }, - "registry-auth-token": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.0.tgz", - "integrity": "sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w==", - "dev": true, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { - "rc": "^1.2.8" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } }, - "registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "requires": { - "rc": "^1.2.8" + "picomatch": "^2.2.1" } }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, "request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, "requires": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -7165,98 +15346,42 @@ "uuid": "^3.3.2" }, "dependencies": { - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" } }, + "qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==" + }, "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - } - } - }, - "request-promise-core": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", - "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", - "dev": true, - "requires": { - "lodash": "^4.17.19" - }, - "dependencies": { - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true - } - } - }, - "request-promise-native": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", - "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", - "dev": true, - "requires": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - }, - "dependencies": { - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" } } }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "require_optional": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", - "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", - "requires": { - "resolve-from": "^2.0.0", - "semver": "^5.1.0" - } + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" }, "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", "dev": true, "requires": { - "path-parse": "^1.0.6" + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" } }, "resolve-cwd": { @@ -7277,29 +15402,15 @@ } }, "resolve-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", - "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "dev": true, - "requires": { - "lowercase-keys": "^1.0.0" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "resolve.exports": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", + "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", "dev": true }, "reusify": { @@ -7309,194 +15420,37 @@ "dev": true }, "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "requires": { "glob": "^7.1.3" } }, - "rsvp": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", - "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", - "dev": true - }, "run-parallel": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz", - "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==", - "dev": true - }, - "rxjs": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", - "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, "requires": { - "tslib": "^1.9.0" + "queue-microtask": "^1.2.2" } }, "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } + "safe-stable-stringify": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.1.tgz", + "integrity": "sha512-dVHE6bMtS/bnL2mwualjc6IxEv1F+OCUpA46pKUj6F8uDbUM0jCCulPqRNPSnWwGNKx5etqMjZYdXtrm5KJZGA==" }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", - "dev": true, - "requires": { - "@cnakazawa/watch": "^1.0.3", - "anymatch": "^2.0.0", - "capture-exit": "^2.0.0", - "exec-sh": "^0.3.2", - "execa": "^1.0.0", - "fb-watchman": "^2.0.0", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, "saslprep": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", @@ -7506,112 +15460,61 @@ "sparse-bitfield": "^3.0.3" } }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "requires": { - "xmlchars": "^2.2.0" - } - }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dev": true, + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "requires": { - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } + "lru-cache": "^6.0.0" } }, "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "requires": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "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": "~1.7.2", + "http-errors": "2.0.0", "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", + "ms": "2.1.3", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, "dependencies": { "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" } } }, "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.1" + "send": "0.18.0" } }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "shebang-command": { "version": "2.0.0", @@ -7628,31 +15531,51 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, - "shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "dev": true, - "optional": true + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } }, "sift": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/sift/-/sift-7.0.1.tgz", - "integrity": "sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g==" + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz", + "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==" }, "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", "requires": { "is-arrayish": "^0.3.1" } }, + "simple-update-notifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", + "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", + "dev": true, + "requires": { + "semver": "~7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, "sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -7665,133 +15588,18 @@ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - } - }, - "sliced": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", - "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } + "smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "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": { @@ -7800,102 +15608,35 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, "sparse-bitfield": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", "optional": true, "requires": { "memory-pager": "^1.0.2" } }, - "spawn-command": { - "version": "0.0.2-1", - "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", - "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=", - "dev": true - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz", - "integrity": "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw==", - "dev": true - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -7911,12 +15652,12 @@ "stack-trace": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==" }, "stack-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", - "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, "requires": { "escape-string-regexp": "^2.0.0" @@ -7930,99 +15671,50 @@ } } }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", - "dev": true + "streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==" + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } }, "string-length": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", - "integrity": "sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, "requires": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } } }, "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - } - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "requires": { - "safe-buffer": "~5.1.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" } }, "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "^5.0.1" } }, "strip-bom": { @@ -8031,12 +15723,6 @@ "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, "strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", @@ -8044,53 +15730,48 @@ "dev": true }, "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "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": "6.1.0", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-6.1.0.tgz", - "integrity": "sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==", + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.0.6.tgz", + "integrity": "sha512-HqSe6DSIh3hEn6cJvCkaM1BLi466f1LHi4yubR0tpewlMpk4RUFFy35bKz8SsPBwYfIIJy5eclp+3tCYAuX0bw==", "dev": true, "requires": { "component-emitter": "^1.3.0", - "cookiejar": "^2.1.2", - "debug": "^4.1.1", - "fast-safe-stringify": "^2.0.7", - "form-data": "^3.0.0", - "formidable": "^1.2.2", + "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.4.6", - "qs": "^6.9.4", - "readable-stream": "^3.6.0", - "semver": "^7.3.2" + "mime": "2.6.0", + "qs": "^6.11.0", + "semver": "^7.3.8" }, "dependencies": { "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" } }, - "form-data": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", - "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, "mime": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", - "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true }, "ms": { @@ -8098,157 +15779,45 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true - }, - "qs": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz", - "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==", - "dev": true - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true } } }, "supertest": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.0.0.tgz", - "integrity": "sha512-7+Skilm7kvUZIaKfALPgjS3i8zYs11zvEudAeYdqJZL3f+SGGFV4qQkkTVkYcs+zbE6de47HP8o0a0hy1BFlMA==", + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.3.3.tgz", + "integrity": "sha512-EMCG6G8gDu5qEqRQ3JjjPs6+FYT1a7Hv5ApHvtSghmOFJYtsU5S+pSb6Y2EUeCEY3CmEL3mmQ8YWlPOzQomabA==", "dev": true, "requires": { - "methods": "1.1.2", - "superagent": "6.1.0" + "methods": "^1.1.2", + "superagent": "^8.0.5" } }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - } - } - }, - "supports-hyperlinks": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", - "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", - "dev": true, - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - } } }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true }, - "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, "tar": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - } - }, - "term-size": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", - "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", - "dev": true - }, - "terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dev": true, + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", + "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", "requires": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" + "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" } }, "test-exclude": { @@ -8260,22 +15829,6 @@ "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "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" - } - } } }, "text-hex": { @@ -8286,65 +15839,21 @@ "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, "tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -8355,9 +15864,9 @@ } }, "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, "touch": { "version": "3.1.0", @@ -8366,33 +15875,32 @@ "dev": true, "requires": { "nopt": "~1.0.10" + }, + "dependencies": { + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "requires": { + "abbrev": "1" + } + } } }, "tough-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", - "dev": true, + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "requires": { - "ip-regex": "^2.1.0", "psl": "^1.1.28", "punycode": "^2.1.1" } }, "tr46": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", - "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", - "dev": true, - "requires": { - "punycode": "^2.1.1" - } - }, - "tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "triple-beam": { "version": "1.3.0", @@ -8400,63 +15908,55 @@ "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" }, "ts-jest": { - "version": "26.4.3", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.4.3.tgz", - "integrity": "sha512-pFDkOKFGY+nL9v5pkhm+BIFpoAuno96ff7GMnIYr/3L6slFOS365SI0fGEVYx2RKGji5M2elxhWjDMPVcOCdSw==", + "version": "29.0.3", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.0.3.tgz", + "integrity": "sha512-Ibygvmuyq1qp/z3yTh9QTwVVAbFdDy/+4BtIQR2sp6baF2SJU/8CKK/hhnGIDY2L90Az2jIqTwZPnN2p+BweiQ==", "dev": true, "requires": { - "@jest/create-cache-key-function": "^26.5.0", - "@types/jest": "26.x", "bs-logger": "0.x", - "buffer-from": "1.x", "fast-json-stable-stringify": "2.x", - "jest-util": "^26.1.0", - "json5": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.1", "lodash.memoize": "4.x", "make-error": "1.x", - "mkdirp": "1.x", "semver": "7.x", - "yargs-parser": "20.x" + "yargs-parser": "^21.0.1" }, "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - }, "yargs-parser": { - "version": "20.2.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.3.tgz", - "integrity": "sha512-emOFRT9WVHw03QSvN5qor9QQT9+sw5vwxfYweivSMHTcAXPefwVae2FjO7JJjj8hCE4CzPOPeFM83VwT29HCww==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true } } }, "ts-node": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.0.0.tgz", - "integrity": "sha512-/TqB4SnererCDR/vb4S/QvSZvzQMJN8daAslg7MeaiHvD8rDZsSfXmNeNumyZZzMned72Xoq/isQljYSt8Ynfg==", - "dev": true, - "requires": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "requires": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", "arg": "^4.1.0", + "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", - "source-map-support": "^0.5.17", + "v8-compile-cache-lib": "^3.0.1", "yn": "3.1.1" } }, "tslib": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", - "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", - "dev": true + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "optional": true }, "tslint": { "version": "6.1.3", @@ -8479,6 +15979,81 @@ "tsutils": "^2.29.0" }, "dependencies": { + "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==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "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==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "requires": { + "minimist": "^1.2.6" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, "tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", @@ -8497,19 +16072,26 @@ } }, "tsutils": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", - "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, "requires": { "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } } }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "requires": { "safe-buffer": "^5.0.1" } @@ -8517,8 +16099,7 @@ "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" }, "type-check": { "version": "0.4.0", @@ -8536,9 +16117,9 @@ "dev": true }, "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true }, "type-is": { @@ -8550,308 +16131,123 @@ "mime-types": "~2.1.24" } }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" }, "typescript": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.5.tgz", - "integrity": "sha512-ywmr/VrTVCmNTJ6iV2LwIrfG1P+lv6luD8sUJs+2eI9NLGigaN+nUQc13iHqisq7bra9lnmUSYqbJvegraBOPQ==", + "version": "4.9.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", + "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", "dev": true }, "undefsafe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", - "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==", - "dev": true, - "requires": { - "debug": "^2.2.0" - } - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dev": true, - "requires": { - "crypto-random-string": "^2.0.0" - } + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" }, - "update-notifier": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", - "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", + "update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", "dev": true, "requires": { - "boxen": "^4.2.0", - "chalk": "^3.0.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.3.1", - "is-npm": "^4.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.0.0", - "pupa": "^2.0.1", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } + "escalade": "^3.1.1", + "picocolors": "^1.0.0" } }, "uri-js": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", - "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", - "dev": true, + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "requires": { "punycode": "^2.1.0" } }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "dev": true, - "requires": { - "prepend-http": "^2.0.0" - } - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" }, "uuid": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.1.tgz", - "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==", - "dev": true, + "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-compile-cache": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", - "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", "dev": true }, "v8-to-istanbul": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-6.0.1.tgz", - "integrity": "sha512-PzM1WlqquhBvsV+Gco6WSFeg1AGdD53ccMRkFeyHRE/KRZaVacPOmQYP3EeVgDBtKD2BJ8kgynBQ5OtKiHCH+w==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", + "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", "dev": true, "requires": { + "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" + "convert-source-map": "^1.6.0" }, "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true } } }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" } }, - "w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "requires": { - "browser-process-hrtime": "^1.0.0" - } - }, - "w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dev": true, - "requires": { - "xml-name-validator": "^3.0.0" - } - }, "walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, "requires": { - "makeerror": "1.0.x" + "makeerror": "1.0.12" } }, "webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true - }, - "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dev": true, - "requires": { - "iconv-lite": "0.4.24" - } - }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "whatwg-url": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.4.0.tgz", - "integrity": "sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw==", - "dev": true, + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^2.0.2", - "webidl-conversions": "^6.1.0" + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" } }, "which": { @@ -8863,114 +16259,51 @@ "isexe": "^2.0.0" } }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dev": true, + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", "requires": { - "string-width": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } + "string-width": "^1.0.2 || 2 || 3 || 4" } }, "winston": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.3.3.tgz", - "integrity": "sha512-oEXTISQnC8VlSAKf1KYSSd7J6IWuRPQqDdo8eoRNaYKLvwSb5+79Z3Yi1lrl6KDpU6/VWaxpakDAtb1oQ4n9aw==", + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.8.2.tgz", + "integrity": "sha512-MsE1gRx1m5jdTTO9Ld/vND4krP2To+lgDoMEHGGa4HIlAUyXJtfc7CxQcGXVyz2IBpw5hbFkj2b/AtUdQwyRew==", "requires": { + "@colors/colors": "1.5.0", "@dabh/diagnostics": "^2.0.2", - "async": "^3.1.0", + "async": "^3.2.3", "is-stream": "^2.0.0", - "logform": "^2.2.0", + "logform": "^2.4.0", "one-time": "^1.0.0", "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", "stack-trace": "0.0.x", "triple-beam": "^1.3.0", - "winston-transport": "^4.4.0" - }, - "dependencies": { - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } + "winston-transport": "^4.5.0" } }, "winston-daily-rotate-file": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/winston-daily-rotate-file/-/winston-daily-rotate-file-4.5.0.tgz", - "integrity": "sha512-/HqeWiU48dzGqcrABRlxYWVMdL6l3uKCtFSJyrqK+E2rLnSFNsgYpvwx15EgTitBLNzH69lQd/+z2ASryV2aqw==", + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/winston-daily-rotate-file/-/winston-daily-rotate-file-4.7.1.tgz", + "integrity": "sha512-7LGPiYGBPNyGHLn9z33i96zx/bd71pjBn9tqQzO3I4Tayv94WPmBNwKC7CO1wPHdP9uvu+Md/1nr6VSH9h0iaA==", "requires": { - "file-stream-rotator": "^0.5.7", + "file-stream-rotator": "^0.6.1", "object-hash": "^2.0.1", "triple-beam": "^1.3.0", - "winston-transport": "^4.2.0" + "winston-transport": "^4.4.0" } }, "winston-transport": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.0.tgz", - "integrity": "sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.5.0.tgz", + "integrity": "sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==", "requires": { - "readable-stream": "^2.3.7", - "triple-beam": "^1.2.0" + "logform": "^2.3.2", + "readable-stream": "^3.6.0", + "triple-beam": "^1.3.0" } }, "word-wrap": { @@ -8980,203 +16313,75 @@ "dev": true }, "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } } }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, "requires": { "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" + "signal-exit": "^3.0.7" } }, - "ws": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", - "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==", - "dev": true - }, - "xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "dev": true - }, - "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true - }, - "xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" }, "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" } }, "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" }, "yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true } } } diff --git a/package.json b/package.json index a443e18..c15f8e9 100644 --- a/package.json +++ b/package.json @@ -1,13 +1,13 @@ { "name": "nodejs-backend-architecture", - "version": "1.0.2", + "version": "2.0.0", "description": "The architecture for nodejs backend application. It is build on top of expressjs using typescript.", "main": "index.js", "scripts": { "start": "npm run build && npm run serve", "serve": "node -r dotenv/config build/server.js", "build": "npm run clean && npm run build-ts", - "watch": "concurrently -k -p \"[{name}]\" -n \"TypeScript,Node\" -c \"yellow.bold,cyan.bold,green.bold\" \"npm run watch-ts\" \"npm run watch-node\"", + "watch": "npx concurrently -k -p \"[{name}]\" -n \"TypeScript,Node\" -c \"yellow.bold,cyan.bold,green.bold\" \"npm run watch-ts\" \"npm run watch-node\"", "watch-node": "nodemon -r dotenv/config build/server.js", "clean": "rimraf ./build", "build-ts": "tsc", @@ -20,52 +20,55 @@ "type": "git", "url": "https://github.com/afteracademy/nodejs-backend-architecture-typescript.git" }, - "author": "AfterAcademy", + "author": "Janishar Ali", "license": "Apache-2.0", "dependencies": { - "@hapi/joi": "^17.1.1", - "bcrypt": "^5.0.0", - "body-parser": "^1.19.0", - "cookie-parser": "^1.4.5", + "axios": "^1.2.1", + "bcrypt": "^5.1.0", + "body-parser": "^1.20.1", + "cookie-parser": "^1.4.6", "cors": "^2.8.5", - "express": "^4.17.1", - "helmet": "^4.1.1", + "express": "^4.18.2", + "joi": "^17.7.0", "jsonwebtoken": "^8.5.1", - "lodash": "^4.17.20", - "mongoose": "^5.10.11", - "winston": "^3.3.3", - "winston-daily-rotate-file": "^4.5.0" + "lodash": "^4.17.21", + "moment": "^2.29.4", + "mongoose": "^6.8.0", + "multer": "^1.4.5-lts.1", + "newrelic": "^9.7.2", + "qs": "^6.11.0", + "request": "^2.88.2", + "winston": "^3.8.2", + "winston-daily-rotate-file": "^4.7.1" }, "devDependencies": { - "@types/bcrypt": "^3.0.0", - "@types/body-parser": "^1.19.0", - "@types/cookie-parser": "^1.4.2", - "@types/cors": "^2.8.8", - "@types/express": "^4.17.8", - "@types/hapi__joi": "^17.1.6", - "@types/helmet": "^4.0.0", - "@types/jest": "^26.0.15", - "@types/jsonwebtoken": "^8.5.0", - "@types/lodash": "^4.14.163", - "@types/mongoose": "^5.7.36", - "@types/morgan": "^1.9.2", - "@types/node": "^14.14.6", - "@types/supertest": "^2.0.10", - "@typescript-eslint/eslint-plugin": "^4.6.0", - "@typescript-eslint/parser": "^4.6.0", + "@types/bcrypt": "^5.0.0", + "@types/body-parser": "^1.19.2", + "@types/cookie-parser": "^1.4.3", + "@types/cors": "^2.8.13", + "@types/express": "^4.17.14", + "@types/jsonwebtoken": "^8.5.9", + "@types/lodash": "^4.14.191", + "@types/morgan": "^1.9.3", + "@types/multer": "^1.4.7", + "@types/newrelic": "^9.4.0", + "@types/newrelic__winston-enricher": "^0.1.1", + "@types/node": "^18.11.13", + "@types/request": "^2.48.8", + "@typescript-eslint/eslint-plugin": "^5.46.0", + "@typescript-eslint/parser": "^5.46.0", "colors": "^1.4.0", - "concurrently": "^5.3.0", - "dotenv": "^8.2.0", - "eslint": "^7.12.1", - "eslint-config-prettier": "^6.15.0", - "eslint-plugin-prettier": "^3.1.4", - "jest": "^26.6.1", - "nodemon": "^2.0.6", - "prettier": "^2.1.2", - "supertest": "^6.0.0", - "ts-jest": "^26.4.3", - "ts-node": "^9.0.0", - "tslint": "^6.1.0", - "typescript": "^4.0.5" + "dotenv": "^16.0.3", + "eslint": "^8.29.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-prettier": "^4.2.1", + "jest": "^29.3.1", + "nodemon": "^2.0.20", + "prettier": "^2.8.1", + "supertest": "^6.3.3", + "ts-jest": "^29.0.3", + "ts-node": "^10.9.1", + "tslint": "^6.1.3", + "typescript": "^4.9.4" } } From 73be1923f75590a145c68a6b7a6d4a14d9e8ae26 Mon Sep 17 00:00:00 2001 From: Janishar Ali Date: Sun, 11 Dec 2022 23:06:17 +0530 Subject: [PATCH 02/33] update all files --- .env.example | 21 +++++--- .gitignore | 14 ++++- src/app.ts | 14 ++--- src/auth/apikey.ts | 10 ++-- src/auth/authUtils.ts | 4 +- src/auth/authentication.ts | 2 +- src/auth/authorization.ts | 22 +++++--- src/auth/schema.ts | 5 +- src/config.ts | 7 ++- src/core/ApiError.ts | 2 +- src/core/ApiResponse.ts | 32 +++++------ src/core/JWT.ts | 4 +- src/core/Logger.ts | 39 +++++++------- src/core/utils.ts | 4 ++ src/database/index.ts | 23 ++++---- src/database/model/ApiKey.ts | 40 +++++++++++--- src/database/model/Blog.ts | 7 +-- src/database/model/Keystore.ts | 13 +++-- src/database/model/Role.ts | 15 +++--- src/database/model/User.ts | 32 ++++++----- src/database/repository/ApiKeyRepo.ts | 4 +- src/database/repository/BlogRepo.ts | 41 +++++++------- src/database/repository/KeystoreRepo.ts | 12 +++-- src/database/repository/RoleRepo.ts | 8 ++- src/database/repository/UserRepo.ts | 53 ++++++++++++------- src/helpers/permission.ts | 16 ++++++ src/helpers/role.ts | 9 ++-- src/helpers/security.ts | 10 ++++ src/helpers/utils.ts | 16 ++++++ src/helpers/validator.ts | 37 ++++++------- src/routes/v1/access/credential.ts | 44 +++++++++++++++ src/routes/v1/access/login.ts | 15 ++++-- src/routes/v1/access/logout.ts | 3 +- src/routes/v1/access/schema.ts | 4 +- src/routes/v1/access/signup.ts | 5 +- src/routes/v1/access/token.ts | 4 +- src/routes/v1/access/utils.ts | 12 +++++ src/routes/v1/blog/editor.ts | 3 +- .../v1/blog/{blogDetail.ts => index.ts} | 11 ++-- src/routes/v1/blog/schema.ts | 12 +---- src/routes/v1/blog/writer.ts | 12 +++-- .../v1/{blog/blogList.ts => blogs/index.ts} | 19 ++----- src/routes/v1/blogs/schema.ts | 18 +++++++ src/routes/v1/index.ts | 32 +++++------ src/routes/v1/profile/{user.ts => index.ts} | 36 +++++-------- src/routes/v1/profile/schema.ts | 6 +-- src/types/app-request.d.ts | 5 +- 47 files changed, 478 insertions(+), 279 deletions(-) create mode 100644 src/core/utils.ts create mode 100644 src/helpers/permission.ts create mode 100644 src/helpers/security.ts create mode 100644 src/helpers/utils.ts create mode 100644 src/routes/v1/access/credential.ts create mode 100644 src/routes/v1/access/utils.ts rename src/routes/v1/blog/{blogDetail.ts => index.ts} (89%) rename src/routes/v1/{blog/blogList.ts => blogs/index.ts} (85%) create mode 100644 src/routes/v1/blogs/schema.ts rename src/routes/v1/profile/{user.ts => index.ts} (56%) diff --git a/.env.example b/.env.example index aea48f4..212d4e5 100644 --- a/.env.example +++ b/.env.example @@ -3,6 +3,9 @@ # Environment Name NODE_ENV=development +# TimeZone +TZ=UTC + # Server listen to this port PORT=3000 @@ -11,17 +14,19 @@ CORS_URL=* # Databse # YOUR_MONGO_DB_NAME -DB_NAME=afteracademy-blog-db +DB_NAME=blogs-db +DB_MIN_POOL_SIZE=2 +DB_MAX_POOL_SIZE=5 #localhost or IP of the server # If using the docker installation then use 'mongo' for host name else localhost or ip or db server #YOUR_MONGO_DB_HOST_NAME -DB_HOST=mongo +DB_HOST=localhost DB_PORT=27017 #YOUR_MONGO_DB_USER_NAME -DB_USER=afteracademy-blog-db-user +DB_USER=blogs-db-user #YOUR_MONGO_DB_USER_PWD DB_USER_PWD=changeit @@ -36,7 +41,9 @@ DB_ADMIN_PWD=changeit # LOG_DIR=YOUR_DIRECTORY_PATH_FOR_LOG_FILES # Token Info -ACCESS_TOKEN_VALIDITY_DAYS=30 -REFRESH_TOKEN_VALIDITY_DAYS=120 -TOKEN_ISSUER=afteracademy.com -TOKEN_AUDIENCE=afteracademy.com \ No newline at end of file +# 2 DAYS: 172800 Sec +ACCESS_TOKEN_VALIDITY_SEC=172800 +# 7 DAYS: 604800 Sec +REFRESH_TOKEN_VALIDITY_SEC=604800 +TOKEN_ISSUER=api.dev.xyz.com +TOKEN_AUDIENCE=xyz.com diff --git a/.gitignore b/.gitignore index 2719735..dd5f7d5 100644 --- a/.gitignore +++ b/.gitignore @@ -22,4 +22,16 @@ coverage # Environment varibles *.env -*.env.* \ No newline at end of file +*.env.test + +#keys +keys/* +!keys/*.md +!keys/*.example + +#temp +temp +.DS_Store + +*.save +*.save.* \ No newline at end of file diff --git a/src/app.ts b/src/app.ts index 4fed2ba..bd2e964 100644 --- a/src/app.ts +++ b/src/app.ts @@ -1,10 +1,9 @@ import express, { Request, Response, NextFunction } from 'express'; import Logger from './core/Logger'; -import bodyParser from 'body-parser'; import cors from 'cors'; import { corsUrl, environment } from './config'; import './database'; // initialize database -import { NotFoundError, ApiError, InternalError } from './core/ApiError'; +import { NotFoundError, ApiError, InternalError, ErrorType } from './core/ApiError'; import routesV1 from './routes/v1'; process.on('uncaughtException', (e) => { @@ -13,8 +12,8 @@ process.on('uncaughtException', (e) => { const app = express(); -app.use(bodyParser.json({ limit: '10mb' })); -app.use(bodyParser.urlencoded({ limit: '10mb', extended: true, parameterLimit: 50000 })); +app.use(express.json({ limit: '10mb' })); +app.use(express.urlencoded({ limit: '10mb', extended: true, parameterLimit: 50000 })); app.use(cors({ origin: corsUrl, optionsSuccessStatus: 200 })); // Routes @@ -28,10 +27,13 @@ app.use((req, res, next) => next(new NotFoundError())); app.use((err: Error, req: Request, res: Response, next: NextFunction) => { if (err instanceof ApiError) { ApiError.handle(err, res); + if (err.type === ErrorType.INTERNAL) + Logger.error(`500 - ${err.message} - ${req.originalUrl} - ${req.method} - ${req.ip}`); } else { + Logger.error(`500 - ${err.message} - ${req.originalUrl} - ${req.method} - ${req.ip}`); + Logger.error(err); if (environment === 'development') { - Logger.error(err); - return res.status(500).send(err.message); + return res.status(500).send(err); } ApiError.handle(new InternalError(), res); } diff --git a/src/auth/apikey.ts b/src/auth/apikey.ts index d487b8c..3ee2708 100755 --- a/src/auth/apikey.ts +++ b/src/auth/apikey.ts @@ -6,19 +6,21 @@ import { PublicRequest } from 'app-request'; import schema from './schema'; import validator, { ValidationSource } from '../helpers/validator'; import asyncHandler from '../helpers/asyncHandler'; +import { Header } from '../core/utils'; const router = express.Router(); export default router.use( validator(schema.apiKey, ValidationSource.HEADER), asyncHandler(async (req: PublicRequest, res, next) => { - // @ts-ignore - req.apiKey = req.headers['x-api-key'].toString(); + const key = req.headers[Header.API_KEY]?.toString(); + if (!key) throw new ForbiddenError(); - const apiKey = await ApiKeyRepo.findByKey(req.apiKey); + const apiKey = await ApiKeyRepo.findByKey(key); + if (!apiKey) throw new ForbiddenError(); Logger.info(apiKey); - if (!apiKey) throw new ForbiddenError(); + req.apiKey = apiKey; return next(); }), ); diff --git a/src/auth/authUtils.ts b/src/auth/authUtils.ts index 92517cc..2dc98a0 100755 --- a/src/auth/authUtils.ts +++ b/src/auth/authUtils.ts @@ -37,7 +37,7 @@ export const createTokens = async ( tokenInfo.audience, user._id.toString(), accessTokenKey, - tokenInfo.accessTokenValidityDays, + tokenInfo.accessTokenValidity, ), ); @@ -49,7 +49,7 @@ export const createTokens = async ( tokenInfo.audience, user._id.toString(), refreshTokenKey, - tokenInfo.refreshTokenValidityDays, + tokenInfo.refreshTokenValidity, ), ); diff --git a/src/auth/authentication.ts b/src/auth/authentication.ts index cab39f1..2e3abe0 100755 --- a/src/auth/authentication.ts +++ b/src/auth/authentication.ts @@ -25,7 +25,7 @@ export default router.use( if (!user) throw new AuthFailureError('User not registered'); req.user = user; - const keystore = await KeystoreRepo.findforKey(req.user._id, payload.prm); + const keystore = await KeystoreRepo.findforKey(req.user, payload.prm); if (!keystore) throw new AuthFailureError('Invalid access token'); req.keystore = keystore; diff --git a/src/auth/authorization.ts b/src/auth/authorization.ts index 6f23177..14bb7ce 100755 --- a/src/auth/authorization.ts +++ b/src/auth/authorization.ts @@ -8,17 +8,25 @@ const router = express.Router(); export default router.use( asyncHandler(async (req: ProtectedRequest, res, next) => { - if (!req.user || !req.user.roles || !req.currentRoleCode) + if (!req.user || !req.user.roles || !req.currentRoleCodes) throw new AuthFailureError('Permission denied'); - const role = await RoleRepo.findByCode(req.currentRoleCode); - if (!role) throw new AuthFailureError('Permission denied'); + const roles = await RoleRepo.findByCodes(req.currentRoleCodes); + if (roles.length === 0) throw new AuthFailureError('Permission denied'); - const validRoles = req.user.roles.filter( - (userRole) => userRole._id.toHexString() === role._id.toHexString(), - ); + let authorized = false; - if (!validRoles || validRoles.length == 0) throw new AuthFailureError('Permission denied'); + for (const userRole of req.user.roles) { + if (authorized) break; + for (const role of roles) { + if (userRole._id.equals(role._id)) { + authorized = true; + break; + } + } + } + + if (!authorized) throw new AuthFailureError('Permission denied'); return next(); }), diff --git a/src/auth/schema.ts b/src/auth/schema.ts index 4c1f3aa..24864d4 100644 --- a/src/auth/schema.ts +++ b/src/auth/schema.ts @@ -1,10 +1,11 @@ -import Joi from '@hapi/joi'; +import Joi from 'joi'; +import { Header } from '../core/utils'; import { JoiAuthBearer } from '../helpers/validator'; export default { apiKey: Joi.object() .keys({ - 'x-api-key': Joi.string().required(), + [Header.API_KEY]: Joi.string().required(), }) .unknown(true), auth: Joi.object() diff --git a/src/config.ts b/src/config.ts index 2a43af5..7680573 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1,6 +1,7 @@ // Mapper for environment variables export const environment = process.env.NODE_ENV; export const port = process.env.PORT; +export const timezone = process.env.TZ; export const db = { name: process.env.DB_NAME || '', @@ -8,13 +9,15 @@ export const db = { port: process.env.DB_PORT || '', user: process.env.DB_USER || '', password: process.env.DB_USER_PWD || '', + minPoolSize: parseInt(process.env.DB_MIN_POOL_SIZE || '5'), + maxPoolSize: parseInt(process.env.DB_MAX_POOL_SIZE || '10'), }; export const corsUrl = process.env.CORS_URL; export const tokenInfo = { - accessTokenValidityDays: parseInt(process.env.ACCESS_TOKEN_VALIDITY_SEC || '0'), - refreshTokenValidityDays: parseInt(process.env.REFRESH_TOKEN_VALIDITY_SEC || '0'), + accessTokenValidity: parseInt(process.env.ACCESS_TOKEN_VALIDITY_SEC || '0'), + refreshTokenValidity: parseInt(process.env.REFRESH_TOKEN_VALIDITY_SEC || '0'), issuer: process.env.TOKEN_ISSUER || '', audience: process.env.TOKEN_AUDIENCE || '', }; diff --git a/src/core/ApiError.ts b/src/core/ApiError.ts index 6d2ba54..68c0882 100755 --- a/src/core/ApiError.ts +++ b/src/core/ApiError.ts @@ -9,7 +9,7 @@ import { ForbiddenResponse, } from './ApiResponse'; -enum ErrorType { +export enum ErrorType { BAD_TOKEN = 'BadTokenError', TOKEN_EXPIRED = 'TokenExpiredError', UNAUTHORIZED = 'AuthFailureError', diff --git a/src/core/ApiResponse.ts b/src/core/ApiResponse.ts index d8f178e..3c7a984 100644 --- a/src/core/ApiResponse.ts +++ b/src/core/ApiResponse.ts @@ -24,12 +24,17 @@ abstract class ApiResponse { protected message: string, ) {} - protected prepare(res: Response, response: T): Response { + protected prepare( + res: Response, + response: T, + headers: { [key: string]: string }, + ): Response { + for (const [key, value] of Object.entries(headers)) res.append(key, value); return res.status(this.status).json(ApiResponse.sanitize(response)); } - public send(res: Response): Response { - return this.prepare(res, this); + public send(res: Response, headers: { [key: string]: string } = {}): Response { + return this.prepare(res, this, headers); } private static sanitize(response: T): T { @@ -49,15 +54,12 @@ export class AuthFailureResponse extends ApiResponse { } export class NotFoundResponse extends ApiResponse { - private url: string | undefined; - constructor(message = 'Not Found') { super(StatusCode.FAILURE, ResponseStatus.NOT_FOUND, message); } - send(res: Response): Response { - this.url = res.req?.originalUrl; - return super.prepare(res, this); + send(res: Response, headers: { [key: string]: string } = {}): Response { + return super.prepare(res, this, headers); } } @@ -96,8 +98,8 @@ export class SuccessResponse extends ApiResponse { super(StatusCode.SUCCESS, ResponseStatus.SUCCESS, message); } - send(res: Response): Response { - return super.prepare>(res, this); + send(res: Response, headers: { [key: string]: string } = {}): Response { + return super.prepare>(res, this, headers); } } @@ -108,9 +110,9 @@ export class AccessTokenErrorResponse extends ApiResponse { super(StatusCode.INVALID_ACCESS_TOKEN, ResponseStatus.UNAUTHORIZED, message); } - send(res: Response): Response { - res.setHeader('instruction', this.instruction); - return super.prepare(res, this); + send(res: Response, headers: { [key: string]: string } = {}): Response { + headers.instruction = this.instruction; + return super.prepare(res, this, headers); } } @@ -119,7 +121,7 @@ export class TokenRefreshResponse extends ApiResponse { super(StatusCode.SUCCESS, ResponseStatus.SUCCESS, message); } - send(res: Response): Response { - return super.prepare(res, this); + send(res: Response, headers: { [key: string]: string } = {}): Response { + return super.prepare(res, this, headers); } } diff --git a/src/core/JWT.ts b/src/core/JWT.ts index e621f7b..21f62cd 100755 --- a/src/core/JWT.ts +++ b/src/core/JWT.ts @@ -37,7 +37,7 @@ export default class JWT { try { // @ts-ignore return (await promisify(verify)(token, cert)) as JwtPayload; - } catch (e) { + } catch (e: any) { Logger.debug(e); if (e && e.name === 'TokenExpiredError') throw new TokenExpiredError(); // throws error if the token has not been encrypted by the private key @@ -73,7 +73,7 @@ export class JwtPayload { this.aud = audience; this.sub = subject; this.iat = Math.floor(Date.now() / 1000); - this.exp = this.iat + validity * 24 * 60 * 60; + this.exp = this.iat + validity; this.prm = param; } } diff --git a/src/core/Logger.ts b/src/core/Logger.ts index fb8bc3f..9223b28 100644 --- a/src/core/Logger.ts +++ b/src/core/Logger.ts @@ -15,30 +15,33 @@ if (!fs.existsSync(dir)) { const logLevel = environment === 'development' ? 'debug' : 'warn'; -const options = { - file: { - level: logLevel, - filename: dir + '/%DATE%.log', - datePattern: 'YYYY-MM-DD', - zippedArchive: true, - timestamp: true, - handleExceptions: true, - humanReadableUnhandledException: true, - prettyPrint: true, - json: true, - maxSize: '20m', - colorize: true, - maxFiles: '14d', - }, -}; +const dailyRotateFile = new DailyRotateFile({ + level: logLevel, + // @ts-ignore + filename: dir + '/%DATE%.log', + datePattern: 'YYYY-MM-DD', + zippedArchive: true, + handleExceptions: true, + maxSize: '20m', + maxFiles: '14d', + format: format.combine( + format.errors({ stack: true }), + format.timestamp(), + format.json(), + ), +}); export default createLogger({ transports: [ new transports.Console({ level: logLevel, - format: format.combine(format.errors({ stack: true }), format.prettyPrint()), + format: format.combine( + format.errors({ stack: true }), + format.prettyPrint(), + ), }), + dailyRotateFile, ], - exceptionHandlers: [new DailyRotateFile(options.file)], + exceptionHandlers: [dailyRotateFile], exitOnError: false, // do not exit on handled exceptions }); diff --git a/src/core/utils.ts b/src/core/utils.ts new file mode 100644 index 0000000..279e9f0 --- /dev/null +++ b/src/core/utils.ts @@ -0,0 +1,4 @@ +export const enum Header { + API_KEY = 'x-api-key', + AUTHORIZATION = 'authorization', +} diff --git a/src/database/index.ts b/src/database/index.ts index 88aa90b..7eee8ed 100644 --- a/src/database/index.ts +++ b/src/database/index.ts @@ -8,22 +8,27 @@ const dbURI = `mongodb://${db.user}:${encodeURIComponent(db.password)}@${db.host }`; const options = { - useNewUrlParser: true, - useCreateIndex: true, - useUnifiedTopology: true, - useFindAndModify: false, autoIndex: true, - poolSize: 10, // Maintain up to 10 socket connections - // If not connected, return errors immediately rather than waiting for reconnect - bufferMaxEntries: 0, - connectTimeoutMS: 10000, // Give up initial connection after 10 seconds + minPoolSize: db.minPoolSize, // Maintain up to x socket connections + maxPoolSize: db.maxPoolSize, // Maintain up to x socket connections + connectTimeoutMS: 60000, // Give up initial connection after 10 seconds socketTimeoutMS: 45000, // Close sockets after 45 seconds of inactivity }; Logger.debug(dbURI); +function setRunValidators() { + this.setOptions({ runValidators: true }); +} + // Create the database connection mongoose + .plugin((schema: any) => { + schema.pre('findOneAndUpdate', setRunValidators); + schema.pre('updateMany', setRunValidators); + schema.pre('updateOne', setRunValidators); + schema.pre('update', setRunValidators); + }) .connect(dbURI, options) .then(() => { Logger.info('Mongoose connection done'); @@ -36,7 +41,7 @@ mongoose // CONNECTION EVENTS // When successfully connected mongoose.connection.on('connected', () => { - Logger.info('Mongoose default connection open to ' + dbURI); + Logger.debug('Mongoose default connection open to ' + dbURI); }); // If the connection throws an error diff --git a/src/database/model/ApiKey.ts b/src/database/model/ApiKey.ts index b7c0f30..5ada427 100755 --- a/src/database/model/ApiKey.ts +++ b/src/database/model/ApiKey.ts @@ -1,24 +1,31 @@ -import { Schema, model, Document } from 'mongoose'; +import { Schema, model, Types } from 'mongoose'; export const DOCUMENT_NAME = 'ApiKey'; export const COLLECTION_NAME = 'api_keys'; -export default interface ApiKey extends Document { +export enum Permission { + GENERAL = 'GENERAL', +} + +export default interface ApiKey { + _id: Types.ObjectId; key: string; version: number; - metadata: string; + permissions: Permission[]; + comments: string[]; status?: boolean; createdAt?: Date; updatedAt?: Date; } -const schema = new Schema( +const schema = new Schema( { key: { type: Schema.Types.String, required: true, unique: true, maxlength: 1024, + trim: true, }, version: { type: Schema.Types.Number, @@ -26,8 +33,25 @@ const schema = new Schema( min: 1, max: 100, }, - metadata: { - type: Schema.Types.String, + permissions: { + type: [ + { + type: Schema.Types.String, + required: true, + enum: Object.values(Permission), + }, + ], + required: true, + }, + comments: { + type: [ + { + type: Schema.Types.String, + required: true, + trim: true, + maxlength: 1000, + }, + ], required: true, }, status: { @@ -35,12 +59,12 @@ const schema = new Schema( default: true, }, createdAt: { - type: Date, + type: Schema.Types.Date, required: true, select: false, }, updatedAt: { - type: Date, + type: Schema.Types.Date, required: true, select: false, }, diff --git a/src/database/model/Blog.ts b/src/database/model/Blog.ts index d3dcb2d..e30925f 100755 --- a/src/database/model/Blog.ts +++ b/src/database/model/Blog.ts @@ -1,10 +1,11 @@ -import { Schema, model, Document } from 'mongoose'; +import { Schema, model, Types } from 'mongoose'; import User from './User'; export const DOCUMENT_NAME = 'Blog'; export const COLLECTION_NAME = 'blogs'; -export default interface Blog extends Document { +export default interface Blog { + _id: Types.ObjectId; title: string; description: string; text?: string; @@ -26,7 +27,7 @@ export default interface Blog extends Document { updatedAt?: Date; } -const schema = new Schema( +const schema = new Schema( { title: { type: Schema.Types.String, diff --git a/src/database/model/Keystore.ts b/src/database/model/Keystore.ts index 21a9b57..9277ad4 100755 --- a/src/database/model/Keystore.ts +++ b/src/database/model/Keystore.ts @@ -1,10 +1,11 @@ -import { Schema, model, Document } from 'mongoose'; +import { Schema, model, Types } from 'mongoose'; import User from './User'; export const DOCUMENT_NAME = 'Keystore'; export const COLLECTION_NAME = 'keystores'; -export default interface Keystore extends Document { +export default interface Keystore { + _id: Types.ObjectId; client: User; primaryKey: string; secondaryKey: string; @@ -13,7 +14,7 @@ export default interface Keystore extends Document { updatedAt?: Date; } -const schema = new Schema( +const schema = new Schema( { client: { type: Schema.Types.ObjectId, @@ -23,22 +24,24 @@ const schema = new Schema( primaryKey: { type: Schema.Types.String, required: true, + trim: true, }, secondaryKey: { type: Schema.Types.String, required: true, + trim: true, }, status: { type: Schema.Types.Boolean, default: true, }, createdAt: { - type: Date, + type: Schema.Types.Date, required: true, select: false, }, updatedAt: { - type: Date, + type: Schema.Types.Date, required: true, select: false, }, diff --git a/src/database/model/Role.ts b/src/database/model/Role.ts index 18df585..818956c 100755 --- a/src/database/model/Role.ts +++ b/src/database/model/Role.ts @@ -1,40 +1,41 @@ -import { Schema, model, Document } from 'mongoose'; +import { Schema, model, Types } from 'mongoose'; export const DOCUMENT_NAME = 'Role'; export const COLLECTION_NAME = 'roles'; -export const enum RoleCode { +export enum RoleCode { LEARNER = 'LEARNER', WRITER = 'WRITER', EDITOR = 'EDITOR', ADMIN = 'ADMIN', } -export default interface Role extends Document { +export default interface Role { + _id: Types.ObjectId; code: string; status?: boolean; createdAt?: Date; updatedAt?: Date; } -const schema = new Schema( +const schema = new Schema( { code: { type: Schema.Types.String, required: true, - enum: [RoleCode.LEARNER, RoleCode.WRITER, RoleCode.EDITOR, RoleCode.ADMIN], + enum: Object.values(RoleCode), }, status: { type: Schema.Types.Boolean, default: true, }, createdAt: { - type: Date, + type: Schema.Types.Date, required: true, select: false, }, updatedAt: { - type: Date, + type: Schema.Types.Date, required: true, select: false, }, diff --git a/src/database/model/User.ts b/src/database/model/User.ts index 43dec89..d53a86a 100755 --- a/src/database/model/User.ts +++ b/src/database/model/User.ts @@ -1,14 +1,15 @@ -import { model, Schema, Document } from 'mongoose'; +import { model, Schema, Types } from 'mongoose'; import Role from './Role'; export const DOCUMENT_NAME = 'User'; export const COLLECTION_NAME = 'users'; -export default interface User extends Document { - name: string; +export default interface User { + _id: Types.ObjectId; + name?: string; + profilePicUrl?: string; email?: string; password?: string; - profilePicUrl?: string; roles: Role[]; verified?: boolean; status?: boolean; @@ -16,18 +17,21 @@ export default interface User extends Document { updatedAt?: Date; } -const schema = new Schema( +const schema = new Schema( { name: { type: Schema.Types.String, - required: true, trim: true, - maxlength: 100, + maxlength: 200, + }, + profilePicUrl: { + type: Schema.Types.String, + trim: true, }, email: { type: Schema.Types.String, - required: true, unique: true, + sparse: true, // allows null trim: true, select: false, }, @@ -35,10 +39,6 @@ const schema = new Schema( type: Schema.Types.String, select: false, }, - profilePicUrl: { - type: Schema.Types.String, - trim: true, - }, roles: { type: [ { @@ -58,12 +58,12 @@ const schema = new Schema( default: true, }, createdAt: { - type: Date, + type: Schema.Types.Date, required: true, select: false, }, updatedAt: { - type: Date, + type: Schema.Types.Date, required: true, select: false, }, @@ -73,4 +73,8 @@ const schema = new Schema( }, ); +schema.index({ _id: 1, status: 1 }); +schema.index({ status: 1 }); +schema.index({ email: 1, status: 1 }); + export const UserModel = model(DOCUMENT_NAME, schema, COLLECTION_NAME); diff --git a/src/database/repository/ApiKeyRepo.ts b/src/database/repository/ApiKeyRepo.ts index f0f650e..c46b69a 100755 --- a/src/database/repository/ApiKeyRepo.ts +++ b/src/database/repository/ApiKeyRepo.ts @@ -1,7 +1,7 @@ import ApiKey, { ApiKeyModel } from '../model/ApiKey'; export default class ApiRepo { - public static async findByKey(key: string): Promise { - return ApiKeyModel.findOne({ key: key, status: true }).lean().exec(); + public static findByKey(key: string): Promise { + return ApiKeyModel.findOne({ key: key, status: true }).lean().exec(); } } diff --git a/src/database/repository/BlogRepo.ts b/src/database/repository/BlogRepo.ts index 7dcc3c2..195b682 100755 --- a/src/database/repository/BlogRepo.ts +++ b/src/database/repository/BlogRepo.ts @@ -4,9 +4,6 @@ import User from '../model/User'; export default class BlogRepo { private static AUTHOR_DETAIL = 'name profilePicUrl'; - private static BLOG_INFO_ADDITIONAL = '+isSubmitted +isDraft +isPublished +createdBy +updatedBy'; - private static BLOG_ALL_DATA = - '+text +draftText +isSubmitted +isDraft +isPublished +status +createdBy +updatedBy'; public static async create(blog: Blog): Promise { const now = new Date(); @@ -16,17 +13,15 @@ export default class BlogRepo { return createdBlog.toObject(); } - public static update(blog: Blog): Promise { + public static update(blog: Blog): Promise { blog.updatedAt = new Date(); - return BlogModel.updateOne({ _id: blog._id }, { $set: { ...blog } }) - .lean() - .exec(); + return BlogModel.findByIdAndUpdate(blog._id, blog, { new: true }).lean().exec(); } public static findInfoById(id: Types.ObjectId): Promise { return BlogModel.findOne({ _id: id, status: true }) .populate('author', this.AUTHOR_DETAIL) - .lean() + .lean() .exec(); } @@ -34,7 +29,7 @@ export default class BlogRepo { return BlogModel.findOne({ _id: id, status: true }) .select('+text') .populate('author', this.AUTHOR_DETAIL) - .lean() + .lean() .exec(); } @@ -42,15 +37,17 @@ export default class BlogRepo { return BlogModel.findOne({ _id: id, status: true }) .select('+text +draftText +isSubmitted +isDraft +isPublished +status') .populate('author', this.AUTHOR_DETAIL) - .lean() + .lean() .exec(); } public static findBlogAllDataById(id: Types.ObjectId): Promise { return BlogModel.findOne({ _id: id, status: true }) - .select(this.BLOG_ALL_DATA) + .select( + '+text +draftText +isSubmitted +isDraft +isPublished +status +createdBy +updatedBy', + ) .populate('author', this.AUTHOR_DETAIL) - .lean() + .lean() .exec(); } @@ -58,12 +55,12 @@ export default class BlogRepo { return BlogModel.findOne({ blogUrl: blogUrl, status: true }) .select('+text') .populate('author', this.AUTHOR_DETAIL) - .lean() + .lean() .exec(); } public static findUrlIfExists(blogUrl: string): Promise { - return BlogModel.findOne({ blogUrl: blogUrl }).lean().exec(); + return BlogModel.findOne({ blogUrl: blogUrl }).lean().exec(); } public static findByTagAndPaginated( @@ -76,7 +73,7 @@ export default class BlogRepo { .limit(limit) .populate('author', this.AUTHOR_DETAIL) .sort({ updatedAt: -1 }) - .lean() + .lean() .exec(); } @@ -84,7 +81,7 @@ export default class BlogRepo { return BlogModel.find({ author: user, status: true, isPublished: true }) .populate('author', this.AUTHOR_DETAIL) .sort({ updatedAt: -1 }) - .lean() + .lean() .exec(); } @@ -114,12 +111,12 @@ export default class BlogRepo { private static findDetailedBlogs(query: Record): Promise { return BlogModel.find(query) - .select(this.BLOG_INFO_ADDITIONAL) + .select('+isSubmitted +isDraft +isPublished +createdBy +updatedBy') .populate('author', this.AUTHOR_DETAIL) .populate('createdBy', this.AUTHOR_DETAIL) .populate('updatedBy', this.AUTHOR_DETAIL) .sort({ updatedAt: -1 }) - .lean() + .lean() .exec(); } @@ -129,7 +126,7 @@ export default class BlogRepo { .limit(limit) .populate('author', this.AUTHOR_DETAIL) .sort({ publishedAt: -1 }) - .lean() + .lean() .exec(); } @@ -149,7 +146,7 @@ export default class BlogRepo { .sort({ updatedAt: -1 }) .limit(limit) .sort({ similarity: { $meta: 'textScore' } }) - .lean() + .lean() .exec(); } @@ -167,7 +164,7 @@ export default class BlogRepo { .select('-status -description') .limit(limit) .sort({ similarity: { $meta: 'textScore' } }) - .lean() + .lean() .exec(); } @@ -180,7 +177,7 @@ export default class BlogRepo { .select('-status -description') .limit(limit) .sort({ score: -1 }) - .lean() + .lean() .exec(); } } diff --git a/src/database/repository/KeystoreRepo.ts b/src/database/repository/KeystoreRepo.ts index 056b905..b206968 100755 --- a/src/database/repository/KeystoreRepo.ts +++ b/src/database/repository/KeystoreRepo.ts @@ -4,11 +4,15 @@ import User from '../model/User'; export default class KeystoreRepo { public static findforKey(client: User, key: string): Promise { - return KeystoreModel.findOne({ client: client, primaryKey: key, status: true }).exec(); + return KeystoreModel.findOne({ client: client, primaryKey: key, status: true }).lean().exec(); } public static remove(id: Types.ObjectId): Promise { - return KeystoreModel.findByIdAndRemove(id).lean().exec(); + return KeystoreModel.findByIdAndRemove(id).lean().exec(); + } + + public static removeAllForClient(client: User) { + return KeystoreModel.deleteMany({ client: client }).exec(); } public static find( @@ -21,7 +25,7 @@ export default class KeystoreRepo { primaryKey: primaryKey, secondaryKey: secondaryKey, }) - .lean() + .lean() .exec(); } @@ -37,7 +41,7 @@ export default class KeystoreRepo { secondaryKey: secondaryKey, createdAt: now, updatedAt: now, - } as Keystore); + }); return keystore.toObject(); } } diff --git a/src/database/repository/RoleRepo.ts b/src/database/repository/RoleRepo.ts index 5a6e86e..9c1f1d1 100755 --- a/src/database/repository/RoleRepo.ts +++ b/src/database/repository/RoleRepo.ts @@ -2,6 +2,12 @@ import Role, { RoleModel } from '../model/Role'; export default class RoleRepo { public static findByCode(code: string): Promise { - return RoleModel.findOne({ code: code, status: true }).lean().exec(); + return RoleModel.findOne({ code: code, status: true }).lean().exec(); + } + + public static findByCodes(codes: string[]): Promise { + return RoleModel.find({ code: { $in: codes }, status: true }) + .lean() + .exec(); } } diff --git a/src/database/repository/UserRepo.ts b/src/database/repository/UserRepo.ts index 0b81052..4cac18e 100755 --- a/src/database/repository/UserRepo.ts +++ b/src/database/repository/UserRepo.ts @@ -6,44 +6,57 @@ import KeystoreRepo from './KeystoreRepo'; import Keystore from '../model/Keystore'; export default class UserRepo { - // contains critical information of the user - public static findById(id: Types.ObjectId): Promise { + public static async exists(id: Types.ObjectId): Promise { + const user = await UserModel.exists({ _id: id, status: true }); + return user !== null && user !== undefined; + } + + public static findPrivateProfileById(id: Types.ObjectId): Promise { return UserModel.findOne({ _id: id, status: true }) - .select('+email +password +roles') + .select('+email') .populate({ path: 'roles', match: { status: true }, + select: { code: 1 }, }) .lean() .exec(); } - public static findByEmail(email: string): Promise { - return UserModel.findOne({ email: email, status: true }) + // contains critical information of the user + public static findById(id: Types.ObjectId): Promise { + return UserModel.findOne({ _id: id, status: true }) .select('+email +password +roles') .populate({ path: 'roles', match: { status: true }, - select: { code: 1 }, }) - .lean() + .lean() .exec(); } - public static findProfileById(id: Types.ObjectId): Promise { - return UserModel.findOne({ _id: id, status: true }) - .select('+roles') + public static findByEmail(email: string): Promise { + return UserModel.findOne({ email: email }) + .select( + '+email +password +roles +gender +dob +grade +country +state +city +school +bio +hobbies', + ) .populate({ path: 'roles', match: { status: true }, select: { code: 1 }, }) - .lean() + .lean() + .exec(); + } + + public static findFieldsById(id: Types.ObjectId, ...fields: string[]): Promise { + return UserModel.findOne({ _id: id, status: true }, [...fields]) + .lean() .exec(); } public static findPublicProfileById(id: Types.ObjectId): Promise { - return UserModel.findOne({ _id: id, status: true }).lean().exec(); + return UserModel.findOne({ _id: id, status: true }).lean().exec(); } public static async create( @@ -54,17 +67,17 @@ export default class UserRepo { ): Promise<{ user: User; keystore: Keystore }> { const now = new Date(); - const role = await RoleModel.findOne({ code: roleCode }) - .select('+email +password') - .lean() - .exec(); + const role = await RoleModel.findOne({ code: roleCode }).select('+code').lean().exec(); if (!role) throw new InternalError('Role must be defined'); - user.roles = [role._id]; + user.roles = [role]; user.createdAt = user.updatedAt = now; const createdUser = await UserModel.create(user); - const keystore = await KeystoreRepo.create(createdUser._id, accessTokenKey, refreshTokenKey); - return { user: createdUser.toObject(), keystore: keystore }; + const keystore = await KeystoreRepo.create(createdUser, accessTokenKey, refreshTokenKey); + return { + user: { ...createdUser.toObject(), roles: user.roles }, + keystore: keystore, + }; } public static async update( @@ -76,7 +89,7 @@ export default class UserRepo { await UserModel.updateOne({ _id: user._id }, { $set: { ...user } }) .lean() .exec(); - const keystore = await KeystoreRepo.create(user._id, accessTokenKey, refreshTokenKey); + const keystore = await KeystoreRepo.create(user, accessTokenKey, refreshTokenKey); return { user: user, keystore: keystore }; } diff --git a/src/helpers/permission.ts b/src/helpers/permission.ts new file mode 100644 index 0000000..4d39dbe --- /dev/null +++ b/src/helpers/permission.ts @@ -0,0 +1,16 @@ +import { Response, NextFunction } from 'express'; +import { ForbiddenError } from '../core/ApiError'; +import { PublicRequest } from '../types/app-request'; + +export default (permission: string) => (req: PublicRequest, res: Response, next: NextFunction) => { + try { + if (!req.apiKey?.permissions) return next(new ForbiddenError('Permission Denied')); + + const exists = req.apiKey.permissions.find((entry) => entry === permission); + if (!exists) return next(new ForbiddenError('Permission Denied')); + + next(); + } catch (error) { + next(error); + } +}; diff --git a/src/helpers/role.ts b/src/helpers/role.ts index 80cb265..13c2bf6 100644 --- a/src/helpers/role.ts +++ b/src/helpers/role.ts @@ -2,7 +2,8 @@ import { RoleCode } from '../database/model/Role'; import { RoleRequest } from 'app-request'; import { Response, NextFunction } from 'express'; -export default (roleCode: RoleCode) => (req: RoleRequest, res: Response, next: NextFunction) => { - req.currentRoleCode = roleCode; - next(); -}; +export default (...roleCodes: RoleCode[]) => + (req: RoleRequest, res: Response, next: NextFunction) => { + req.currentRoleCodes = roleCodes; + next(); + }; diff --git a/src/helpers/security.ts b/src/helpers/security.ts new file mode 100644 index 0000000..e910aab --- /dev/null +++ b/src/helpers/security.ts @@ -0,0 +1,10 @@ +import { Request } from 'express'; +import { ForbiddenError } from '../core/ApiError'; +import { findIpAddress } from './utils'; + +export function restrictIpAddress(req: Request, ipAddress: string) { + if (ipAddress === '*') return; + const ip = findIpAddress(req); + if (!ip) throw new ForbiddenError('IP Address Not Recognised'); + if (ipAddress !== ip) throw new ForbiddenError('Permission Denied'); +} diff --git a/src/helpers/utils.ts b/src/helpers/utils.ts new file mode 100644 index 0000000..461393b --- /dev/null +++ b/src/helpers/utils.ts @@ -0,0 +1,16 @@ +import { Request } from 'express'; +import Logger from '../core/Logger'; + +export function findIpAddress(req: Request) { + try { + if (req.headers['x-forwarded-for']) { + return req.headers['x-forwarded-for'].toString().split(',')[0]; + } else if (req.connection && req.connection.remoteAddress) { + return req.connection.remoteAddress; + } + return req.ip; + } catch (e) { + Logger.error(e); + return undefined; + } +} diff --git a/src/helpers/validator.ts b/src/helpers/validator.ts index 617fe83..935af15 100644 --- a/src/helpers/validator.ts +++ b/src/helpers/validator.ts @@ -1,4 +1,4 @@ -import Joi from '@hapi/joi'; +import Joi from 'joi'; import { Request, Response, NextFunction } from 'express'; import Logger from '../core/Logger'; import { BadRequestError } from '../core/ApiError'; @@ -30,22 +30,19 @@ export const JoiAuthBearer = () => return value; }, 'Authorization Header Validation'); -export default (schema: Joi.ObjectSchema, source: ValidationSource = ValidationSource.BODY) => ( - req: Request, - res: Response, - next: NextFunction, -) => { - try { - const { error } = schema.validate(req[source]); - - if (!error) return next(); - - const { details } = error; - const message = details.map((i) => i.message.replace(/['"]+/g, '')).join(','); - Logger.error(message); - - next(new BadRequestError(message)); - } catch (error) { - next(error); - } -}; +export default (schema: Joi.AnySchema, source: ValidationSource = ValidationSource.BODY) => + (req: Request, res: Response, next: NextFunction) => { + try { + const { error } = schema.validate(req[source]); + + if (!error) return next(); + + const { details } = error; + const message = details.map((i) => i.message.replace(/['"]+/g, '')).join(','); + Logger.error(message); + + next(new BadRequestError(message)); + } catch (error) { + next(error); + } + }; diff --git a/src/routes/v1/access/credential.ts b/src/routes/v1/access/credential.ts new file mode 100644 index 0000000..4313904 --- /dev/null +++ b/src/routes/v1/access/credential.ts @@ -0,0 +1,44 @@ +import express from 'express'; +import { SuccessResponse } from '../../../core/ApiResponse'; +import { RoleRequest } from 'app-request'; +import UserRepo from '../../../database/repository/UserRepo'; +import { BadRequestError } from '../../../core/ApiError'; +import User from '../../../database/model/User'; +import validator from '../../../helpers/validator'; +import schema from './schema'; +import asyncHandler from '../../../helpers/asyncHandler'; +import bcrypt from 'bcrypt'; +import _ from 'lodash'; +import { RoleCode } from '../../../database/model/Role'; +import role from '../../../helpers/role'; +import authorization from '../../../auth/authorization'; +import authentication from '../../../auth/authentication'; +import KeystoreRepo from '../../../database/repository/KeystoreRepo'; + +const router = express.Router(); + +//---------------------------------------------------------------- +router.use(authentication, role(RoleCode.ADMIN), authorization); +//---------------------------------------------------------------- + +router.post( + '/user/assign', + validator(schema.credential), + asyncHandler(async (req: RoleRequest, res) => { + const user = await UserRepo.findByEmail(req.body.email); + if (!user) throw new BadRequestError('User do not exists'); + + const passwordHash = await bcrypt.hash(req.body.password, 10); + + await UserRepo.updateInfo({ + _id: user._id, + password: passwordHash, + } as User); + + await KeystoreRepo.removeAllForClient(user); + + new SuccessResponse('User password updated', _.pick(user, ['_id', 'name', 'email'])).send(res); + }), +); + +export default router; diff --git a/src/routes/v1/access/login.ts b/src/routes/v1/access/login.ts index 09871f6..d917e80 100755 --- a/src/routes/v1/access/login.ts +++ b/src/routes/v1/access/login.ts @@ -10,13 +10,15 @@ import schema from './schema'; import asyncHandler from '../../../helpers/asyncHandler'; import bcrypt from 'bcrypt'; import _ from 'lodash'; +import { getUserData } from './utils'; +import { PublicRequest } from '../../../types/app-request'; const router = express.Router(); -export default router.post( +router.post( '/basic', - validator(schema.userCredential), - asyncHandler(async (req, res) => { + validator(schema.credential), + asyncHandler(async (req: PublicRequest, res) => { const user = await UserRepo.findByEmail(req.body.email); if (!user) throw new BadRequestError('User not registered'); if (!user.password) throw new BadRequestError('Credential not set'); @@ -27,12 +29,15 @@ export default router.post( const accessTokenKey = crypto.randomBytes(64).toString('hex'); const refreshTokenKey = crypto.randomBytes(64).toString('hex'); - await KeystoreRepo.create(user._id, accessTokenKey, refreshTokenKey); + await KeystoreRepo.create(user, accessTokenKey, refreshTokenKey); const tokens = await createTokens(user, accessTokenKey, refreshTokenKey); + const userData = await getUserData(user); new SuccessResponse('Login Success', { - user: _.pick(user, ['_id', 'name', 'roles', 'profilePicUrl']), + user: userData, tokens: tokens, }).send(res); }), ); + +export default router; diff --git a/src/routes/v1/access/logout.ts b/src/routes/v1/access/logout.ts index aaa39eb..c4a2448 100755 --- a/src/routes/v1/access/logout.ts +++ b/src/routes/v1/access/logout.ts @@ -8,8 +8,7 @@ import authentication from '../../../auth/authentication'; const router = express.Router(); /*-------------------------------------------------------------------------*/ -// Below all APIs are private APIs protected for Access Token -router.use('/', authentication); +router.use(authentication); /*-------------------------------------------------------------------------*/ router.delete( diff --git a/src/routes/v1/access/schema.ts b/src/routes/v1/access/schema.ts index d98d8c9..f1787ac 100644 --- a/src/routes/v1/access/schema.ts +++ b/src/routes/v1/access/schema.ts @@ -1,8 +1,8 @@ -import Joi from '@hapi/joi'; +import Joi from 'joi'; import { JoiAuthBearer } from '../../../helpers/validator'; export default { - userCredential: Joi.object().keys({ + credential: Joi.object().keys({ email: Joi.string().required().email(), password: Joi.string().required().min(6), }), diff --git a/src/routes/v1/access/signup.ts b/src/routes/v1/access/signup.ts index 75bb9a9..7f8534f 100644 --- a/src/routes/v1/access/signup.ts +++ b/src/routes/v1/access/signup.ts @@ -12,6 +12,7 @@ import asyncHandler from '../../../helpers/asyncHandler'; import bcrypt from 'bcrypt'; import _ from 'lodash'; import { RoleCode } from '../../../database/model/Role'; +import { getUserData } from './utils'; const router = express.Router(); @@ -39,8 +40,10 @@ router.post( ); const tokens = await createTokens(createdUser, keystore.primaryKey, keystore.secondaryKey); + const userData = await getUserData(createdUser); + new SuccessResponse('Signup Successful', { - user: _.pick(createdUser, ['_id', 'name', 'email', 'roles', 'profilePicUrl']), + user: userData, tokens: tokens, }).send(res); }), diff --git a/src/routes/v1/access/token.ts b/src/routes/v1/access/token.ts index 52bd9b3..27e4ba6 100644 --- a/src/routes/v1/access/token.ts +++ b/src/routes/v1/access/token.ts @@ -35,7 +35,7 @@ router.post( throw new AuthFailureError('Invalid access token'); const keystore = await KeystoreRepo.find( - req.user._id, + req.user, accessTokenPayload.prm, refreshTokenPayload.prm, ); @@ -46,7 +46,7 @@ router.post( const accessTokenKey = crypto.randomBytes(64).toString('hex'); const refreshTokenKey = crypto.randomBytes(64).toString('hex'); - await KeystoreRepo.create(req.user._id, accessTokenKey, refreshTokenKey); + await KeystoreRepo.create(req.user, accessTokenKey, refreshTokenKey); const tokens = await createTokens(req.user, accessTokenKey, refreshTokenKey); new TokenRefreshResponse('Token Issued', tokens.accessToken, tokens.refreshToken).send(res); diff --git a/src/routes/v1/access/utils.ts b/src/routes/v1/access/utils.ts new file mode 100644 index 0000000..d60a849 --- /dev/null +++ b/src/routes/v1/access/utils.ts @@ -0,0 +1,12 @@ +import User from '../../../database/model/User'; +import _ from 'lodash'; + +export const enum AccessMode { + LOGIN = 'LOGIN', + SIGNUP = 'SIGNUP', +} + +export async function getUserData(user: User) { + const data = _.pick(user, ['_id', 'name', 'roles', 'profilePicUrl']); + return data; +} diff --git a/src/routes/v1/blog/editor.ts b/src/routes/v1/blog/editor.ts index ef72014..1c5e42c 100755 --- a/src/routes/v1/blog/editor.ts +++ b/src/routes/v1/blog/editor.ts @@ -15,8 +15,7 @@ import role from '../../../helpers/role'; const router = express.Router(); /*-------------------------------------------------------------------------*/ -// Below all APIs are private APIs protected for Access Token and Editor's Role -router.use('/', authentication, role(RoleCode.EDITOR), authorization); +router.use(authentication, role(RoleCode.EDITOR), authorization); /*-------------------------------------------------------------------------*/ router.put( diff --git a/src/routes/v1/blog/blogDetail.ts b/src/routes/v1/blog/index.ts similarity index 89% rename from src/routes/v1/blog/blogDetail.ts rename to src/routes/v1/blog/index.ts index e3614e2..3f739b6 100644 --- a/src/routes/v1/blog/blogDetail.ts +++ b/src/routes/v1/blog/index.ts @@ -1,14 +1,19 @@ import express from 'express'; import { SuccessResponse } from '../../../core/ApiResponse'; +import asyncHandler from '../../../helpers/asyncHandler'; +import validator, { ValidationSource } from '../../../helpers/validator'; +import schema from './schema'; import { BadRequestError } from '../../../core/ApiError'; import BlogRepo from '../../../database/repository/BlogRepo'; import { Types } from 'mongoose'; -import validator, { ValidationSource } from '../../../helpers/validator'; -import schema from './schema'; -import asyncHandler from '../../../helpers/asyncHandler'; +import writer from './writer'; +import editor from './editor'; const router = express.Router(); +router.use('/writer', writer); +router.use('/editor', editor); + router.get( '/url', validator(schema.blogUrl, ValidationSource.QUERY), diff --git a/src/routes/v1/blog/schema.ts b/src/routes/v1/blog/schema.ts index c885187..dd5b468 100644 --- a/src/routes/v1/blog/schema.ts +++ b/src/routes/v1/blog/schema.ts @@ -1,4 +1,4 @@ -import Joi from '@hapi/joi'; +import Joi from 'joi'; import { JoiObjectId, JoiUrlEndpoint } from '../../../helpers/validator'; export default { @@ -8,16 +8,6 @@ export default { blogId: Joi.object().keys({ id: JoiObjectId().required(), }), - blogTag: Joi.object().keys({ - tag: Joi.string().required(), - }), - pagination: Joi.object().keys({ - pageNumber: Joi.number().required().integer().min(1), - pageItemCount: Joi.number().required().integer().min(1), - }), - authorId: Joi.object().keys({ - id: JoiObjectId().required(), - }), blogCreate: Joi.object().keys({ title: Joi.string().required().min(3).max(500), description: Joi.string().required().min(3).max(2000), diff --git a/src/routes/v1/blog/writer.ts b/src/routes/v1/blog/writer.ts index 3ff54da..81152c4 100755 --- a/src/routes/v1/blog/writer.ts +++ b/src/routes/v1/blog/writer.ts @@ -16,11 +16,11 @@ import role from '../../../helpers/role'; const router = express.Router(); /*-------------------------------------------------------------------------*/ -// Below all APIs are private APIs protected for writer's role -router.use('/', authentication, role(RoleCode.WRITER), authorization); +router.use(authentication, role(RoleCode.WRITER), authorization); /*-------------------------------------------------------------------------*/ -const formatEndpoint = (endpoint: string) => endpoint.replace(/\s/g, '').replace(/\//g, '-'); +const formatEndpoint = (endpoint: string) => + endpoint.replace(/\s/g, '').replace(/\//g, '-').replace(/\?/g, ''); router.post( '/', @@ -58,16 +58,17 @@ router.put( if (!blog.author._id.equals(req.user._id)) throw new ForbiddenError("You don't have necessary permissions"); - if (req.body.blogUrl) { + if (req.body.blogUrl && blog.blogUrl !== req.body.blogUrl) { const endpoint = formatEndpoint(req.body.blogUrl); const existingBlog = await BlogRepo.findUrlIfExists(endpoint); if (existingBlog) throw new BadRequestError('Blog URL already used'); - if (req.body.blogUrl) blog.blogUrl = endpoint; + blog.blogUrl = endpoint; } if (req.body.title) blog.title = req.body.title; if (req.body.description) blog.description = req.body.description; if (req.body.text) blog.draftText = req.body.text; + if (req.body.data) blog.draftData = req.body.data; if (req.body.tags) blog.tags = req.body.tags; if (req.body.imgUrl) blog.imgUrl = req.body.imgUrl; if (req.body.score) blog.score = req.body.score; @@ -124,6 +125,7 @@ router.delete( blog.isDraft = false; // revert to the original state blog.draftText = blog.text; + blog.draftData = blog.data; } else { blog.status = false; } diff --git a/src/routes/v1/blog/blogList.ts b/src/routes/v1/blogs/index.ts similarity index 85% rename from src/routes/v1/blog/blogList.ts rename to src/routes/v1/blogs/index.ts index 8012458..bf37d03 100644 --- a/src/routes/v1/blog/blogList.ts +++ b/src/routes/v1/blogs/index.ts @@ -1,11 +1,11 @@ import express from 'express'; import { SuccessResponse } from '../../../core/ApiResponse'; -import { NoDataError, BadRequestError } from '../../../core/ApiError'; -import BlogRepo from '../../../database/repository/BlogRepo'; -import { Types } from 'mongoose'; +import asyncHandler from '../../../helpers/asyncHandler'; import validator, { ValidationSource } from '../../../helpers/validator'; import schema from './schema'; -import asyncHandler from '../../../helpers/asyncHandler'; +import { BadRequestError } from '../../../core/ApiError'; +import BlogRepo from '../../../database/repository/BlogRepo'; +import { Types } from 'mongoose'; import User from '../../../database/model/User'; const router = express.Router(); @@ -20,9 +20,6 @@ router.get( parseInt(req.query.pageNumber as string), parseInt(req.query.pageItemCount as string), ); - - if (!blogs || blogs.length < 1) throw new NoDataError(); - return new SuccessResponse('success', blogs).send(res); }), ); @@ -34,9 +31,6 @@ router.get( const blogs = await BlogRepo.findAllPublishedForAuthor({ _id: new Types.ObjectId(req.params.id), } as User); - - if (!blogs || blogs.length < 1) throw new NoDataError(); - return new SuccessResponse('success', blogs).send(res); }), ); @@ -49,9 +43,6 @@ router.get( parseInt(req.query.pageNumber as string), parseInt(req.query.pageItemCount as string), ); - - if (!blogs || blogs.length < 1) throw new NoDataError(); - return new SuccessResponse('success', blogs).send(res); }), ); @@ -64,8 +55,6 @@ router.get( if (!blog || !blog.isPublished) throw new BadRequestError('Blog is not available'); const blogs = await BlogRepo.searchSimilarBlogs(blog, 6); - if (!blogs || blogs.length < 1) throw new NoDataError(); - return new SuccessResponse('success', blogs).send(res); }), ); diff --git a/src/routes/v1/blogs/schema.ts b/src/routes/v1/blogs/schema.ts new file mode 100644 index 0000000..320f38c --- /dev/null +++ b/src/routes/v1/blogs/schema.ts @@ -0,0 +1,18 @@ +import Joi from 'joi'; +import { JoiObjectId } from '../../../helpers/validator'; + +export default { + blogId: Joi.object().keys({ + id: JoiObjectId().required(), + }), + blogTag: Joi.object().keys({ + tag: Joi.string().required(), + }), + pagination: Joi.object().keys({ + pageNumber: Joi.number().required().integer().min(1), + pageItemCount: Joi.number().required().integer().min(1), + }), + authorId: Joi.object().keys({ + id: JoiObjectId().required(), + }), +}; diff --git a/src/routes/v1/index.ts b/src/routes/v1/index.ts index b1500cc..3be67ba 100644 --- a/src/routes/v1/index.ts +++ b/src/routes/v1/index.ts @@ -1,30 +1,30 @@ import express from 'express'; import apikey from '../../auth/apikey'; -import signup from './access/signup'; +import permission from '../../helpers/permission'; +import { Permission } from '../../database/model/ApiKey'; import login from './access/login'; import logout from './access/logout'; import token from './access/token'; -import blogList from './blog/blogList'; -import blogDetail from './blog/blogDetail'; -import writer from './blog/writer'; -import editor from './blog/editor'; -import user from './profile/user'; +import credential from './access/credential'; +import blog from './blog'; +import blogs from './blogs'; +import profile from './profile'; const router = express.Router(); -/*-------------------------------------------------------------------------*/ -// Below all APIs are public APIs protected by api-key -router.use('/', apikey); -/*-------------------------------------------------------------------------*/ +/*---------------------------------------------------------*/ +router.use(apikey); +/*---------------------------------------------------------*/ -router.use('/signup', signup); +/*---------------------------------------------------------*/ +router.use(permission(Permission.GENERAL)); +/*---------------------------------------------------------*/ router.use('/login', login); router.use('/logout', logout); router.use('/token', token); -router.use('/blogs', blogList); -router.use('/blog', blogDetail); -router.use('/writer/blog', writer); -router.use('/editor/blog', editor); -router.use('/profile', user); +router.use('/credential', credential); +router.use('/profile', profile); +router.use('/blog', blog); +router.use('/blogs', blogs); export default router; diff --git a/src/routes/v1/profile/user.ts b/src/routes/v1/profile/index.ts similarity index 56% rename from src/routes/v1/profile/user.ts rename to src/routes/v1/profile/index.ts index b469891..0eeb9c0 100644 --- a/src/routes/v1/profile/user.ts +++ b/src/routes/v1/profile/index.ts @@ -3,8 +3,7 @@ import { SuccessResponse } from '../../../core/ApiResponse'; import UserRepo from '../../../database/repository/UserRepo'; import { ProtectedRequest } from 'app-request'; import { BadRequestError } from '../../../core/ApiError'; -import { Types } from 'mongoose'; -import validator, { ValidationSource } from '../../../helpers/validator'; +import validator from '../../../helpers/validator'; import schema from './schema'; import asyncHandler from '../../../helpers/asyncHandler'; import _ from 'lodash'; @@ -12,29 +11,20 @@ import authentication from '../../../auth/authentication'; const router = express.Router(); -router.get( - '/public/id/:id', - validator(schema.userId, ValidationSource.PARAM), - asyncHandler(async (req: ProtectedRequest, res) => { - const user = await UserRepo.findPublicProfileById(new Types.ObjectId(req.params.id)); - if (!user) throw new BadRequestError('User not registered'); - return new SuccessResponse('success', _.pick(user, ['name', 'profilePicUrl'])).send(res); - }), -); - /*-------------------------------------------------------------------------*/ -// Below all APIs are private APIs protected for Access Token -router.use('/', authentication); +router.use(authentication); /*-------------------------------------------------------------------------*/ router.get( '/my', asyncHandler(async (req: ProtectedRequest, res) => { - const user = await UserRepo.findProfileById(req.user._id); + const user = await UserRepo.findPrivateProfileById(req.user._id); if (!user) throw new BadRequestError('User not registered'); - return new SuccessResponse('success', _.pick(user, ['name', 'profilePicUrl', 'roles'])).send( - res, - ); + + return new SuccessResponse( + 'success', + _.pick(user, ['name', 'email', 'profilePicUrl', 'roles']), + ).send(res); }), ); @@ -42,17 +32,17 @@ router.put( '/', validator(schema.profile), asyncHandler(async (req: ProtectedRequest, res) => { - const user = await UserRepo.findProfileById(req.user._id); + const user = await UserRepo.findPrivateProfileById(req.user._id); if (!user) throw new BadRequestError('User not registered'); if (req.body.name) user.name = req.body.name; if (req.body.profilePicUrl) user.profilePicUrl = req.body.profilePicUrl; await UserRepo.updateInfo(user); - return new SuccessResponse( - 'Profile updated', - _.pick(user, ['name', 'profilePicUrl', 'roles']), - ).send(res); + + const data = _.pick(user, ['name', 'profilePicUrl']); + + return new SuccessResponse('Profile updated', data).send(res); }), ); diff --git a/src/routes/v1/profile/schema.ts b/src/routes/v1/profile/schema.ts index 3c1b6f9..998415e 100644 --- a/src/routes/v1/profile/schema.ts +++ b/src/routes/v1/profile/schema.ts @@ -1,4 +1,4 @@ -import Joi from '@hapi/joi'; +import Joi from 'joi'; import { JoiObjectId } from '../../../helpers/validator'; export default { @@ -6,7 +6,7 @@ export default { id: JoiObjectId().required(), }), profile: Joi.object().keys({ - name: Joi.string().optional().min(1).max(200), - profilePicUrl: Joi.string().optional().uri(), + name: Joi.string().min(1).max(200).optional(), + profilePicUrl: Joi.string().uri().optional(), }), }; diff --git a/src/types/app-request.d.ts b/src/types/app-request.d.ts index 0e50ba8..fd5cb36 100755 --- a/src/types/app-request.d.ts +++ b/src/types/app-request.d.ts @@ -1,13 +1,14 @@ import { Request } from 'express'; import User from '../database/model/User'; import Keystore from '../database/model/Keystore'; +import ApiKey from '../database/model/ApiKey'; declare interface PublicRequest extends Request { - apiKey: string; + apiKey: ApiKey; } declare interface RoleRequest extends PublicRequest { - currentRoleCode: string; + currentRoleCodes: string[]; } declare interface ProtectedRequest extends RoleRequest { From eba2c460494102dc61e1edb7acac6c47add0072c Mon Sep 17 00:00:00 2001 From: Janishar Ali Date: Sun, 11 Dec 2022 23:07:19 +0530 Subject: [PATCH 03/33] fix code --- src/routes/v1/blog/editor.ts | 2 +- src/routes/v1/blog/writer.ts | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/routes/v1/blog/editor.ts b/src/routes/v1/blog/editor.ts index 1c5e42c..acf31b8 100755 --- a/src/routes/v1/blog/editor.ts +++ b/src/routes/v1/blog/editor.ts @@ -15,7 +15,7 @@ import role from '../../../helpers/role'; const router = express.Router(); /*-------------------------------------------------------------------------*/ -router.use(authentication, role(RoleCode.EDITOR), authorization); +router.use(authentication, role(RoleCode.ADMIN, RoleCode.EDITOR), authorization); /*-------------------------------------------------------------------------*/ router.put( diff --git a/src/routes/v1/blog/writer.ts b/src/routes/v1/blog/writer.ts index 81152c4..88bb41f 100755 --- a/src/routes/v1/blog/writer.ts +++ b/src/routes/v1/blog/writer.ts @@ -68,7 +68,6 @@ router.put( if (req.body.title) blog.title = req.body.title; if (req.body.description) blog.description = req.body.description; if (req.body.text) blog.draftText = req.body.text; - if (req.body.data) blog.draftData = req.body.data; if (req.body.tags) blog.tags = req.body.tags; if (req.body.imgUrl) blog.imgUrl = req.body.imgUrl; if (req.body.score) blog.score = req.body.score; @@ -125,7 +124,6 @@ router.delete( blog.isDraft = false; // revert to the original state blog.draftText = blog.text; - blog.draftData = blog.data; } else { blog.status = false; } From e5c61e54ac15462f63812d15a672be46e3c13890 Mon Sep 17 00:00:00 2001 From: Janishar Ali Date: Sun, 11 Dec 2022 23:13:47 +0530 Subject: [PATCH 04/33] fix renames --- README.md | 10 +++++----- addons/init-mongo.js | 4 ++-- package.json | 2 +- tests/.env.test.example | 43 +++++++++++++++++++++++++---------------- 4 files changed, 34 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index 22edfee..a10878f 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Learn to build a Blogging platform like Medium, MindOrks, and FreeCodeCamp - Open-Source Project By Janishar Ali

- +


@@ -24,12 +24,12 @@ Following are the features of this project: * **Unit test is favored**: The tests have been written to test the functions and routes without the need of the database server. Integration tests has also been done but the unit test is favored. * **A pure backend project**: We have experienced that when a backend is developed clubbed with a frontend then in the future it becomes really difficult to scale. We would want to create a separate backend project that servers many websites and mobile apps. -## We have also open source a complete blogging website working on this backend project: [Goto Repository](https://github.com/afteracademy/react-app-architecture) +## We have also open source a complete blogging website working on this backend project: [Goto Repository](https://github.com/janishar/react-app-architecture) > In the above repository [**React.js Isomorphic Web Application Architecture**] we will learn and build a React web application for a blogging platform using this project as its API server. [Visit demo website](https://demo.react-app-architecture.afteracademy.com) ## 3RE Architecture: Router, RouteHandler, ResponseHandler, ErrorHandler

- +


@@ -220,7 +220,7 @@ Following are the features of this project: ```json { "name" : "Janishar Ali", - "email": "ali@afteracademy.com", + "email": "ali@github.com", "password": "changeit", "profilePicUrl": "https://avatars1.githubusercontent.com/u/11065002?s=460&u=1e8e42bda7e6f579a2b216767b2ed986619bbf78&v=4" } @@ -234,7 +234,7 @@ Following are the features of this project: "user": { "_id": "5e7c9d32307a223bb8a4b12b", "name": "Janishar Ali", - "email": "ali@afteracademy.com", + "email": "ali@github.com", "roles": [ "5e7b8acad7aded2407e078d7" ], diff --git a/addons/init-mongo.js b/addons/init-mongo.js index b0e33d2..deeda16 100644 --- a/addons/init-mongo.js +++ b/addons/init-mongo.js @@ -26,5 +26,5 @@ function seed(dbName, user, password) { ]); } -seed('afteracademy-blog-db', 'afteracademy-blog-db-user', 'changeit'); -seed('afteracademy-blog-test-db', 'afteracademy-blog-test-db-user', 'changeit'); +seed('blogs-db', 'blogs-db-user', 'changeit'); +seed('blogs-test-db', 'blogs-test-db-user', 'changeit'); diff --git a/package.json b/package.json index c15f8e9..91c2569 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ }, "repository": { "type": "git", - "url": "https://github.com/afteracademy/nodejs-backend-architecture-typescript.git" + "url": "https://github.com/janishar/nodejs-backend-architecture-typescript.git" }, "author": "Janishar Ali", "license": "Apache-2.0", diff --git a/tests/.env.test.example b/tests/.env.test.example index eb486c8..e7887ac 100644 --- a/tests/.env.test.example +++ b/tests/.env.test.example @@ -1,35 +1,44 @@ # .test.env.example # This set the envionment variable for the test environment - # Environment Name NODE_ENV=test +# TimeZone +TZ=UTC + +# Server listen to this port +PORT=3000 + #Cors CORS_URL=* # Databse -#YOUR_TEST_MONGO_DB_NAME -DB_NAME=afteracademy-blog-test-db +# YOUR_TEST_MONGO_DB_NAME +DB_NAME=blogs-test-db +DB_MIN_POOL_SIZE=2 +DB_MAX_POOL_SIZE=5 #localhost or IP of the server -#YOUR_TEST_MONGO_DB_HOST_NAME +# YOUR_TEST_MONGO_DB_HOST_NAME DB_HOST=localhost DB_PORT=27017 -#YOUR_TEST_MONGO_DB_USER_NAME -DB_USER=afteracademy-blog-test-db-user +# YOUR_TEST_MONGO_DB_USER_NAME +DB_USER=blogs-test-db-user -#YOUR_TEST_MONGO_DB_USER_PWD -DB_USER_PWD=changeit +# YOUR_TEST_MONGO_DB_USER_PWD +DB_USER_PWD=changeit -#Log -#Example '/Users/janisharali/logs' -#DEFAUlT is this project's directory -#LOG_DIR=YOUR_TEST_DIRECTORY_PATH_FOR_LOG_FILES +# Log +# Example '/home/node/logs' +# DEFAUlT is this project's directory +# LOG_DIR=YOUR_TEST_DIRECTORY_PATH_FOR_LOG_FILES -#Token Info -ACCESS_TOKEN_VALIDITY_DAYS=30 -REFRESH_TOKEN_VALIDITY_DAYS=120 -TOKEN_ISSUER=test.afteracademy.com -TOKEN_AUDIENCE=test.afteracademy.com \ No newline at end of file +# Token Info +# 2 DAYS: 172800 Sec +ACCESS_TOKEN_VALIDITY_SEC=172800 +# 7 DAYS: 604800 Sec +REFRESH_TOKEN_VALIDITY_SEC=604800 +TOKEN_ISSUER=api.dev.xyz.com +TOKEN_AUDIENCE=xyz.com From 22c5f9ba0a059ad921ef6490272ea2cc56631de8 Mon Sep 17 00:00:00 2001 From: Janishar Ali Date: Sun, 11 Dec 2022 23:17:49 +0530 Subject: [PATCH 05/33] remove unused lib --- package-lock.json | 2 -- package.json | 2 -- 2 files changed, 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1d9bcb2..499fdca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,6 @@ "dependencies": { "axios": "^1.2.1", "bcrypt": "^5.1.0", - "body-parser": "^1.20.1", "cookie-parser": "^1.4.6", "cors": "^2.8.5", "express": "^4.18.2", @@ -29,7 +28,6 @@ }, "devDependencies": { "@types/bcrypt": "^5.0.0", - "@types/body-parser": "^1.19.2", "@types/cookie-parser": "^1.4.3", "@types/cors": "^2.8.13", "@types/express": "^4.17.14", diff --git a/package.json b/package.json index 91c2569..2462c7c 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,6 @@ "dependencies": { "axios": "^1.2.1", "bcrypt": "^5.1.0", - "body-parser": "^1.20.1", "cookie-parser": "^1.4.6", "cors": "^2.8.5", "express": "^4.18.2", @@ -43,7 +42,6 @@ }, "devDependencies": { "@types/bcrypt": "^5.0.0", - "@types/body-parser": "^1.19.2", "@types/cookie-parser": "^1.4.3", "@types/cors": "^2.8.13", "@types/express": "^4.17.14", From 24144a22908c40fb12ccc6c3350cf8491f1b30d5 Mon Sep 17 00:00:00 2001 From: Janishar Ali Date: Sun, 11 Dec 2022 23:24:53 +0530 Subject: [PATCH 06/33] fix test files --- package-lock.json | 72 +++++++++++++++++++ package.json | 2 + .../v1/blog/{blogDetail => index}/mock.ts | 0 .../blog/{blogDetail => index}/unit.test.ts | 0 4 files changed, 74 insertions(+) rename tests/routes/v1/blog/{blogDetail => index}/mock.ts (100%) rename tests/routes/v1/blog/{blogDetail => index}/unit.test.ts (100%) diff --git a/package-lock.json b/package-lock.json index 499fdca..46fe4f9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,6 +31,7 @@ "@types/cookie-parser": "^1.4.3", "@types/cors": "^2.8.13", "@types/express": "^4.17.14", + "@types/jest": "^29.2.4", "@types/jsonwebtoken": "^8.5.9", "@types/lodash": "^4.14.191", "@types/morgan": "^1.9.3", @@ -39,6 +40,7 @@ "@types/newrelic__winston-enricher": "^0.1.1", "@types/node": "^18.11.13", "@types/request": "^2.48.8", + "@types/supertest": "^2.0.12", "@typescript-eslint/eslint-plugin": "^5.46.0", "@typescript-eslint/parser": "^5.46.0", "colors": "^1.4.0", @@ -2693,6 +2695,12 @@ "@types/express": "*" } }, + "node_modules/@types/cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==", + "dev": true + }, "node_modules/@types/cors": { "version": "2.8.13", "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", @@ -2758,6 +2766,16 @@ "@types/istanbul-lib-report": "*" } }, + "node_modules/@types/jest": { + "version": "29.2.4", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.2.4.tgz", + "integrity": "sha512-PipFB04k2qTRPePduVLTRiPzQfvMeLwUN3Z21hsAKaB/W9IIzgB2pizCL466ftJlcyZqnHoC9ZHpxLGl3fS86A==", + "dev": true, + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, "node_modules/@types/json-schema": { "version": "7.0.11", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", @@ -2894,6 +2912,25 @@ "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", "dev": true }, + "node_modules/@types/superagent": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.16.tgz", + "integrity": "sha512-tLfnlJf6A5mB6ddqF159GqcDizfzbMUB1/DeT59/wBNqzRTNNKsaw79A/1TZ84X+f/EwWH8FeuSkjlCLyqS/zQ==", + "dev": true, + "dependencies": { + "@types/cookiejar": "*", + "@types/node": "*" + } + }, + "node_modules/@types/supertest": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-2.0.12.tgz", + "integrity": "sha512-X3HPWTwXRerBZS7Mo1k6vMVR1Z6zmJcDVn5O/31whe0tnjE4te6ZJSJGq1RiqHPjzPdMTfjCFogDJmwng9xHaQ==", + "dev": true, + "dependencies": { + "@types/superagent": "*" + } + }, "node_modules/@types/tough-cookie": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", @@ -11431,6 +11468,12 @@ "@types/express": "*" } }, + "@types/cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==", + "dev": true + }, "@types/cors": { "version": "2.8.13", "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", @@ -11496,6 +11539,16 @@ "@types/istanbul-lib-report": "*" } }, + "@types/jest": { + "version": "29.2.4", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.2.4.tgz", + "integrity": "sha512-PipFB04k2qTRPePduVLTRiPzQfvMeLwUN3Z21hsAKaB/W9IIzgB2pizCL466ftJlcyZqnHoC9ZHpxLGl3fS86A==", + "dev": true, + "requires": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, "@types/json-schema": { "version": "7.0.11", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", @@ -11631,6 +11684,25 @@ "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", "dev": true }, + "@types/superagent": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.16.tgz", + "integrity": "sha512-tLfnlJf6A5mB6ddqF159GqcDizfzbMUB1/DeT59/wBNqzRTNNKsaw79A/1TZ84X+f/EwWH8FeuSkjlCLyqS/zQ==", + "dev": true, + "requires": { + "@types/cookiejar": "*", + "@types/node": "*" + } + }, + "@types/supertest": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-2.0.12.tgz", + "integrity": "sha512-X3HPWTwXRerBZS7Mo1k6vMVR1Z6zmJcDVn5O/31whe0tnjE4te6ZJSJGq1RiqHPjzPdMTfjCFogDJmwng9xHaQ==", + "dev": true, + "requires": { + "@types/superagent": "*" + } + }, "@types/tough-cookie": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", diff --git a/package.json b/package.json index 2462c7c..14a980f 100644 --- a/package.json +++ b/package.json @@ -45,6 +45,7 @@ "@types/cookie-parser": "^1.4.3", "@types/cors": "^2.8.13", "@types/express": "^4.17.14", + "@types/jest": "^29.2.4", "@types/jsonwebtoken": "^8.5.9", "@types/lodash": "^4.14.191", "@types/morgan": "^1.9.3", @@ -53,6 +54,7 @@ "@types/newrelic__winston-enricher": "^0.1.1", "@types/node": "^18.11.13", "@types/request": "^2.48.8", + "@types/supertest": "^2.0.12", "@typescript-eslint/eslint-plugin": "^5.46.0", "@typescript-eslint/parser": "^5.46.0", "colors": "^1.4.0", diff --git a/tests/routes/v1/blog/blogDetail/mock.ts b/tests/routes/v1/blog/index/mock.ts similarity index 100% rename from tests/routes/v1/blog/blogDetail/mock.ts rename to tests/routes/v1/blog/index/mock.ts diff --git a/tests/routes/v1/blog/blogDetail/unit.test.ts b/tests/routes/v1/blog/index/unit.test.ts similarity index 100% rename from tests/routes/v1/blog/blogDetail/unit.test.ts rename to tests/routes/v1/blog/index/unit.test.ts From 508e3bea3c47a9b7892682d0478fd647dc3d0fbb Mon Sep 17 00:00:00 2001 From: Janishar Ali Date: Sun, 11 Dec 2022 23:34:17 +0530 Subject: [PATCH 07/33] add template --- .templates/database/model/Sample.ts | 46 +++++++++++ .templates/database/repository/SampleRepo.ts | 21 +++++ .templates/route/index.ts | 29 +++++++ .templates/route/schema.ts | 7 ++ .vscode/launch.json | 45 +++++------ .vscode/tasks.json | 85 ++++++++++++++++++++ 6 files changed, 209 insertions(+), 24 deletions(-) create mode 100644 .templates/database/model/Sample.ts create mode 100644 .templates/database/repository/SampleRepo.ts create mode 100644 .templates/route/index.ts create mode 100644 .templates/route/schema.ts create mode 100644 .vscode/tasks.json diff --git a/.templates/database/model/Sample.ts b/.templates/database/model/Sample.ts new file mode 100644 index 0000000..5130a34 --- /dev/null +++ b/.templates/database/model/Sample.ts @@ -0,0 +1,46 @@ +import { Schema, model, Types } from 'mongoose'; + +export const DOCUMENT_NAME = 'Sample'; +export const COLLECTION_NAME = 'samples'; + +export enum Category { + ABC = 'ABC', + XYZ = 'XYZ', +} + +export default interface Sample { + _id: Types.ObjectId; + category: Category; + status?: boolean; + createdAt?: Date; + updatedAt?: Date; +} + +const schema = new Schema( + { + category: { + type: Schema.Types.String, + required: true, + enum: Object.values(Category), + }, + status: { + type: Schema.Types.Boolean, + default: true, + }, + createdAt: { + type: Schema.Types.Date, + required: true, + select: false, + }, + updatedAt: { + type: Schema.Types.Date, + required: true, + select: false, + }, + }, + { + versionKey: false, + }, +); + +export const SampleModel = model(DOCUMENT_NAME, schema, COLLECTION_NAME); diff --git a/.templates/database/repository/SampleRepo.ts b/.templates/database/repository/SampleRepo.ts new file mode 100644 index 0000000..4166c48 --- /dev/null +++ b/.templates/database/repository/SampleRepo.ts @@ -0,0 +1,21 @@ +import Sample, { SampleModel } from '../model/Sample'; +import { Types } from 'mongoose'; + +export default class SampleRepo { + public static findById(id: Types.ObjectId): Promise { + return SampleModel.findOne({ _id: id, status: true }).lean().exec(); + } + + public static async create(sample: Sample): Promise { + const now = new Date(); + sample.createdAt = now; + sample.updatedAt = now; + const created = await SampleModel.create(sample); + return created.toObject(); + } + + public static update(sample: Sample): Promise { + sample.updatedAt = new Date(); + return SampleModel.findByIdAndUpdate(sample._id, sample, { new: true }).lean().exec(); + } +} diff --git a/.templates/route/index.ts b/.templates/route/index.ts new file mode 100644 index 0000000..891c8ab --- /dev/null +++ b/.templates/route/index.ts @@ -0,0 +1,29 @@ +/* +import express from 'express'; +import { ProtectedRequest } from 'app-request'; +import { SuccessResponse } from '../../../core/ApiResponse'; +import asyncHandler from '../../../helpers/asyncHandler'; +import validator, { ValidationSource } from '../../../helpers/validator'; +import schema from './schema'; +import { BadRequestError } from '../../../core/ApiError'; +import role from '../../../helpers/role'; +import authentication from '../../../auth/authentication'; +import authorization from '../../../auth/authorization'; +import { RoleCode } from '../../../database/model/Role'; + +const router = express.Router(); + +//---------------------------------------------------------------- +router.use(authentication, role(RoleCode.LEARNER), authorization); +//---------------------------------------------------------------- + +router.post( + '/sample', + validator(schema.sample, ValidationSource.BODY), + asyncHandler(async (req: ProtectedRequest, res) => { + new SuccessResponse('Success', {}).send(res); + }), +); + +export default router; +*/ diff --git a/.templates/route/schema.ts b/.templates/route/schema.ts new file mode 100644 index 0000000..700a944 --- /dev/null +++ b/.templates/route/schema.ts @@ -0,0 +1,7 @@ +import Joi from 'joi'; + +export default { + sample: Joi.object().keys({ + key: Joi.string().required().min(1), + }), +}; diff --git a/.vscode/launch.json b/.vscode/launch.json index 6659d92..9713f22 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,25 +1,22 @@ { - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "2.0.0", - "configurations": [ - { - "type": "node", - "request": "launch", - "name": "Launch Program", - "program": "${workspaceFolder}/src/server.ts", - "preLaunchTask": "tsc: build - tsconfig.json", - "runtimeArgs": [ - "-r", - "dotenv/config" - ], - "outFiles": [ - "${workspaceFolder}/build/*.js", - "${workspaceFolder}/build/**/*.js", - "${workspaceFolder}/build/**/**/*.js", - "${workspaceFolder}/build/**/**/**/*.js" - ] - } - ] -} \ No newline at end of file + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "2.0.0", + "configurations": [ + { + "type": "node", + "request": "launch", + "name": "Launch Program", + "program": "${workspaceFolder}/build/server.js", + "preLaunchTask": "tsc: build - tsconfig.json", + "runtimeArgs": ["-r", "dotenv/config"], + "outFiles": [ + "${workspaceFolder}/build/*.js", + "${workspaceFolder}/build/**/*.js", + "${workspaceFolder}/build/**/**/*.js", + "${workspaceFolder}/build/**/**/**/*.js" + ] + } + ] +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..ad96eca --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,85 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "vscode: Install Plugins", + "type": "shell", + "command": "chmod +x ./.vscode/extensions.list | ./.vscode/extensions.list", + "presentation": { + "reveal": "always", + "panel": "new" + } + }, + { + "label": "Install Dependencies", + "type": "shell", + "command": "npm install", + "presentation": { + "reveal": "always", + "panel": "new" + } + }, + { + "label": "Start Prod Server", + "type": "npm", + "script": "start" + }, + { + "label": "Start Dev Server", + "type": "npm", + "script": "run watch" + }, + { + "label": "Template: Generate V1 Route", + "type": "shell", + "command": "cp", + "presentation": { + "reveal": "never", + "panel": "shared" + }, + "args": [ + "-r", + "${workspaceFolder}/.templates/route", + "${workspaceFolder}/src/routes/v1/${input:routeName}" + ] + }, + { + "label": "Template: Generate Model", + "type": "shell", + "command": "cp", + "presentation": { + "reveal": "never", + "panel": "shared" + }, + "args": [ + "${workspaceFolder}/.templates/database/model/Sample.ts", + "${workspaceFolder}/src/database/model/${input:modelName}.ts" + ] + }, + { + "label": "Template: Generate Repo", + "type": "shell", + "command": "cp", + "presentation": { + "reveal": "never", + "panel": "shared" + }, + "args": [ + "${workspaceFolder}/.templates/database/repository/SampleRepo.ts", + "${workspaceFolder}/src/database/repository/${input:modelName}Repo.ts" + ] + } + ], + "inputs": [ + { + "type": "promptString", + "id": "routeName", + "description": "Route name to create?" + }, + { + "type": "promptString", + "id": "modelName", + "description": "Model name to create?" + } + ] +} From 3cfa7d35581181bbf1415994434e25a56c701201 Mon Sep 17 00:00:00 2001 From: Janishar Ali Date: Sun, 11 Dec 2022 23:43:17 +0530 Subject: [PATCH 08/33] update images --- addons/github_assets/cover-nodejs-backend.png | Bin 85952 -> 80529 bytes .../github_assets/og-cover-nodejs-backend.png | Bin 41088 -> 38741 bytes docker-compose.yml | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/github_assets/cover-nodejs-backend.png b/addons/github_assets/cover-nodejs-backend.png index 2e67034208566f51390d56f57b574481d47023cc..afbd83cdf7f6d43a2aea026475b39d4b49aae3e9 100644 GIT binary patch literal 80529 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
Q@z=)$z_WCrR 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
    WSj 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 L8uB%=R^k5-hj~|1 literal 85952 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%0A#@KG61P2i_{K`;dWW#K~1*Z>N@F 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 diff --git a/addons/github_assets/og-cover-nodejs-backend.png b/addons/github_assets/og-cover-nodejs-backend.png index 127d9a176c484c7b72a95ea07ad186c418548700..fd406a406288d14231803926c3a3f4d969461c79 100644 GIT binary patch literal 38741 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%0A}-Vy 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

    vrEN3VsBZ#zWON}x1;y5L$j2x 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 diff --git a/docker-compose.yml b/docker-compose.yml index cda8af0..084a046 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -23,7 +23,7 @@ services: mongo: # To create this service, Compose will pull the mongo - image: mongo:4.2.5 + image: mongo:6.0.3 container_name: mongo restart: unless-stopped # This tells Compose that we would like to add environment variables From 38953be2c43a2094a526cbfb3c9c218454467f6e Mon Sep 17 00:00:00 2001 From: Janishar Ali Date: Mon, 12 Dec 2022 16:25:37 +0530 Subject: [PATCH 09/33] update version of docker build --- Dockerfile | 2 +- docker-compose.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 0cc3a51..262bc7b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # Here we are getting our node as Base image -FROM node:13 +FROM node:18.12.1 # create user in the docker image USER node diff --git a/docker-compose.yml b/docker-compose.yml index 084a046..707eeda 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,4 +1,4 @@ -version: '3' +version: '1' services: app: From 50ad5155521f63ed7b0f342689a3a477e3a5b730 Mon Sep 17 00:00:00 2001 From: Janishar Ali Date: Mon, 12 Dec 2022 16:32:29 +0530 Subject: [PATCH 10/33] update seed db schema --- addons/init-mongo.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/init-mongo.js b/addons/init-mongo.js index deeda16..2e1fd39 100644 --- a/addons/init-mongo.js +++ b/addons/init-mongo.js @@ -10,8 +10,9 @@ function seed(dbName, user, password) { db.createCollection('roles'); db.api_keys.insert({ - metadata: 'To be used by the xyz vendor', key: 'GCMUDiuY5a7WvyUNt9n3QztToSHzK7Uj', + permissions: ['GENERAL'], + comments: ['To be used by the xyz vendor'], version: 1, status: true, createdAt: new Date(), From d5ae4dcec70b886a62e5f1dd21f334e61c6d5405 Mon Sep 17 00:00:00 2001 From: Janishar Ali Date: Mon, 12 Dec 2022 16:46:02 +0530 Subject: [PATCH 11/33] add users in mongo init --- addons/init-mongo.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/addons/init-mongo.js b/addons/init-mongo.js index 2e1fd39..0cd1736 100644 --- a/addons/init-mongo.js +++ b/addons/init-mongo.js @@ -25,6 +25,12 @@ function seed(dbName, user, password) { { code: 'EDITOR', status: true, createdAt: new Date(), updatedAt: new Date() }, { code: 'ADMIN', status: true, createdAt: new Date(), updatedAt: new Date() }, ]); + + db.users.insert({ + name: 'Admin', + email: 'admin@xyz.com', + password: '$2a$10$psWmSrmtyZYvtIt/FuJL1OLqsK3iR1fZz5.wUYFuSNkkt.EOX9mLa' // hash of password: changeit + }); } seed('blogs-db', 'blogs-db-user', 'changeit'); From b9a4543728b146e245333d8c68363180aef19d5c Mon Sep 17 00:00:00 2001 From: Janishar Ali Date: Mon, 12 Dec 2022 17:17:31 +0530 Subject: [PATCH 12/33] add redis docker compose --- .env.example | 4 ++++ docker-compose.yml | 14 ++++++++++++++ tests/.env.test.example | 4 ++++ 3 files changed, 22 insertions(+) diff --git a/.env.example b/.env.example index 212d4e5..0351cf2 100644 --- a/.env.example +++ b/.env.example @@ -35,6 +35,10 @@ DB_USER_PWD=changeit DB_ADMIN=admin DB_ADMIN_PWD=changeit +# Redis +REDIS_CACHE_PORT= +REDIS_CACHE_PASSWORD= + # Log # Example '/home/node/logs' # DEFAUlT is this project's directory diff --git a/docker-compose.yml b/docker-compose.yml index 707eeda..7b84ab7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -20,6 +20,7 @@ services: - '$PORT:$PORT' links: - mongo + - redis mongo: # To create this service, Compose will pull the mongo @@ -45,9 +46,22 @@ services: # This will ensure that you don’t lose data in cases where you stop or remove containers. - dbdata:/data/db + redis: + image: redis:7.0.5 + container_name: redis + restart: unless-stopped + env_file: .env + ports: + - '$REDIS_CACHE_PORT:6379' + command: redis-server --save 20 1 --loglevel warning --requirepass $REDIS_CACHE_PASSWORD + volumes: + - cache:/data/cache + # Our top-level volumes key defines the volumes dbdata. # When Docker creates volumes, the contents of the volume are stored in a part of the host filesystem, /var/lib/docker/volumes/, that’s managed by Docker. # The contents of each volume are stored in a directory under /var/lib/docker/volumes/ and get mounted to any container that uses the volume. # In this way, the data that our users will create will persist in the dbdata volume even if we remove and recreate the db container. volumes: dbdata: + cache: + driver: local diff --git a/tests/.env.test.example b/tests/.env.test.example index e7887ac..9700148 100644 --- a/tests/.env.test.example +++ b/tests/.env.test.example @@ -30,6 +30,10 @@ DB_USER=blogs-test-db-user # YOUR_TEST_MONGO_DB_USER_PWD DB_USER_PWD=changeit +# Redis +REDIS_CACHE_PORT=6379 +REDIS_CACHE_PASSWORD=changeit + # Log # Example '/home/node/logs' # DEFAUlT is this project's directory From 703cfb3c37d1b1ebf240ed52ce1ccfa26cf950cc Mon Sep 17 00:00:00 2001 From: Janishar Ali Date: Mon, 12 Dec 2022 17:50:07 +0530 Subject: [PATCH 13/33] fix docker db connection --- .env.example | 6 +++--- docker-compose.yml | 7 +++++-- src/database/index.ts | 4 +++- tests/.env.test.example | 2 +- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/.env.example b/.env.example index 0351cf2..64b0eb1 100644 --- a/.env.example +++ b/.env.example @@ -21,7 +21,7 @@ DB_MAX_POOL_SIZE=5 #localhost or IP of the server # If using the docker installation then use 'mongo' for host name else localhost or ip or db server #YOUR_MONGO_DB_HOST_NAME -DB_HOST=localhost +DB_HOST=mongo DB_PORT=27017 @@ -36,8 +36,8 @@ DB_ADMIN=admin DB_ADMIN_PWD=changeit # Redis -REDIS_CACHE_PORT= -REDIS_CACHE_PASSWORD= +REDIS_CACHE_PORT=6379 +REDIS_CACHE_PASSWORD=changeit # Log # Example '/home/node/logs' diff --git a/docker-compose.yml b/docker-compose.yml index 7b84ab7..10be00a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,4 +1,4 @@ -version: '1' +version: '3.9' services: app: @@ -21,6 +21,9 @@ services: links: - mongo - redis + depends_on: + - mongo + - redis mongo: # To create this service, Compose will pull the mongo @@ -54,7 +57,7 @@ services: ports: - '$REDIS_CACHE_PORT:6379' command: redis-server --save 20 1 --loglevel warning --requirepass $REDIS_CACHE_PASSWORD - volumes: + volumes: - cache:/data/cache # Our top-level volumes key defines the volumes dbdata. diff --git a/src/database/index.ts b/src/database/index.ts index 7eee8ed..c1a1fdc 100644 --- a/src/database/index.ts +++ b/src/database/index.ts @@ -21,6 +21,8 @@ function setRunValidators() { this.setOptions({ runValidators: true }); } +mongoose.set('strictQuery', true); + // Create the database connection mongoose .plugin((schema: any) => { @@ -60,4 +62,4 @@ process.on('SIGINT', () => { Logger.info('Mongoose default connection disconnected through app termination'); process.exit(0); }); -}); +}); \ No newline at end of file diff --git a/tests/.env.test.example b/tests/.env.test.example index 9700148..a95d13b 100644 --- a/tests/.env.test.example +++ b/tests/.env.test.example @@ -20,7 +20,7 @@ DB_MAX_POOL_SIZE=5 #localhost or IP of the server # YOUR_TEST_MONGO_DB_HOST_NAME -DB_HOST=localhost +DB_HOST=mongo DB_PORT=27017 From cb8af74daa79b87090bb82792c47552600655f0d Mon Sep 17 00:00:00 2001 From: Janishar Ali Date: Mon, 12 Dec 2022 17:59:26 +0530 Subject: [PATCH 14/33] remove unused packages --- package-lock.json | 859 +--------------------------------------------- package.json | 2 - 2 files changed, 16 insertions(+), 845 deletions(-) diff --git a/package-lock.json b/package-lock.json index 46fe4f9..6d8a742 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,7 +22,6 @@ "multer": "^1.4.5-lts.1", "newrelic": "^9.7.2", "qs": "^6.11.0", - "request": "^2.88.2", "winston": "^3.8.2", "winston-daily-rotate-file": "^4.7.1" }, @@ -54,7 +53,6 @@ "supertest": "^6.3.3", "ts-jest": "^29.0.3", "ts-node": "^10.9.1", - "tslint": "^6.1.3", "typescript": "^4.9.4" } }, @@ -3355,6 +3353,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -3498,22 +3497,6 @@ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "engines": { - "node": ">=0.8" - } - }, "node_modules/async": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", @@ -3524,19 +3507,6 @@ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" - }, "node_modules/axios": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/axios/-/axios-1.2.1.tgz", @@ -3675,14 +3645,6 @@ "node": ">= 10.0.0" } }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -3835,15 +3797,6 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, - "node_modules/builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/busboy": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", @@ -3909,11 +3862,6 @@ } ] }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" - }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -4095,12 +4043,6 @@ "node": ">= 0.8" } }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, "node_modules/component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", @@ -4251,17 +4193,6 @@ "node": ">= 8" } }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -4399,15 +4330,6 @@ "node": ">=12" } }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "node_modules/ecdsa-sig-formatter": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", @@ -4835,23 +4757,11 @@ "node": ">= 0.6" } }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "engines": [ - "node >=0.6.0" - ] - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true }, "node_modules/fast-diff": { "version": "1.2.0", @@ -4890,7 +4800,8 @@ "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true }, "node_modules/fast-levenshtein": { "version": "2.0.6", @@ -5051,14 +4962,6 @@ } } }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "engines": { - "node": "*" - } - }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -5219,14 +5122,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dependencies": { - "assert-plus": "^1.0.0" - } - }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -5305,27 +5200,6 @@ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", "dev": true }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -5392,20 +5266,6 @@ "node": ">= 0.8" } }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, "node_modules/https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", @@ -5660,11 +5520,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -5676,11 +5531,6 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" - }, "node_modules/istanbul-lib-coverage": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", @@ -6418,11 +6268,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" - }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -6441,15 +6286,11 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -6508,20 +6349,6 @@ "semver": "bin/semver" } }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/jwa": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", @@ -7299,14 +7126,6 @@ "set-blocking": "^2.0.0" } }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "engines": { - "node": "*" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -7513,11 +7332,6 @@ "node": ">=8" } }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" - }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -7734,11 +7548,6 @@ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" - }, "node_modules/pstree.remy": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", @@ -7852,67 +7661,6 @@ "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/request/node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/request/node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/request/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "bin": { - "uuid": "bin/uuid" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -8278,30 +8026,6 @@ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, - "node_modules/sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/stack-trace": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", @@ -8624,18 +8348,6 @@ "node": "*" } }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -8747,154 +8459,6 @@ "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "optional": true }, - "node_modules/tslint": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", - "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", - "deprecated": "TSLint has been deprecated in favor of ESLint. Please see https://github.com/palantir/tslint/issues/4534 for more information.", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^4.0.1", - "glob": "^7.1.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.3", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.13.0", - "tsutils": "^2.29.0" - }, - "bin": { - "tslint": "bin/tslint" - }, - "engines": { - "node": ">=4.8.0" - }, - "peerDependencies": { - "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev || >= 4.0.0-dev" - } - }, - "node_modules/tslint/node_modules/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==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/tslint/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/tslint/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/tslint/node_modules/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==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/tslint/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/tslint/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/tslint/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/tslint/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/tslint/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/tslint/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/tslint/node_modules/tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "peerDependencies": { - "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" - } - }, "node_modules/tsutils": { "version": "3.21.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", @@ -8916,22 +8480,6 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -9039,6 +8587,7 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, "dependencies": { "punycode": "^2.1.0" } @@ -9099,19 +8648,6 @@ "node": ">= 0.8" } }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", @@ -11987,6 +11523,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -12097,19 +11634,6 @@ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true }, - "asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==" - }, "async": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", @@ -12120,16 +11644,6 @@ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==" - }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" - }, "axios": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/axios/-/axios-1.2.1.tgz", @@ -12229,14 +11743,6 @@ "node-addon-api": "^5.0.0" } }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "requires": { - "tweetnacl": "^0.14.3" - } - }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -12343,12 +11849,6 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", - "dev": true - }, "busboy": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", @@ -12389,11 +11889,6 @@ "integrity": "sha512-1MgUzEkoMO6gKfXflStpYgZDlFM7M/ck/bgfVCACO5vnAf0fXoNVHdWtqGU+MYca+4bL9Z5bpOVmR33cWW9G2A==", "dev": true }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" - }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -12535,12 +12030,6 @@ "delayed-stream": "~1.0.0" } }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", @@ -12672,14 +12161,6 @@ "which": "^2.0.1" } }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "requires": { - "assert-plus": "^1.0.0" - } - }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -12783,15 +12264,6 @@ "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", "dev": true }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "ecdsa-sig-formatter": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", @@ -13111,20 +12583,11 @@ } } }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==" - }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true }, "fast-diff": { "version": "1.2.0", @@ -13159,7 +12622,8 @@ "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true }, "fast-levenshtein": { "version": "2.0.6", @@ -13281,11 +12745,6 @@ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==" - }, "form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -13402,14 +12861,6 @@ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "requires": { - "assert-plus": "^1.0.0" - } - }, "glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -13467,20 +12918,6 @@ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", "dev": true }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==" - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -13529,16 +12966,6 @@ "toidentifier": "1.0.1" } }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, "https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", @@ -13710,11 +13137,6 @@ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -13726,11 +13148,6 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" - }, "istanbul-lib-coverage": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", @@ -14303,11 +13720,6 @@ "argparse": "^2.0.1" } }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" - }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -14320,15 +13732,11 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, - "json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -14376,17 +13784,6 @@ } } }, - "jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - } - }, "jwa": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", @@ -14995,11 +14392,6 @@ "set-blocking": "^2.0.0" } }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -15146,11 +14538,6 @@ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" - }, "picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -15312,11 +14699,6 @@ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, - "psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" - }, "pstree.remy": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", @@ -15389,55 +14771,6 @@ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==" - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - } - } - }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -15703,22 +15036,6 @@ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, - "sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, "stack-trace": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", @@ -15958,15 +15275,6 @@ } } }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, "tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -16028,119 +15336,6 @@ "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "optional": true }, - "tslint": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", - "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^4.0.1", - "glob": "^7.1.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.3", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.13.0", - "tsutils": "^2.29.0" - }, - "dependencies": { - "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==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "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==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "requires": { - "minimist": "^1.2.6" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - } - } - }, "tsutils": { "version": "3.21.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", @@ -16158,19 +15353,6 @@ } } }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" - }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -16237,6 +15419,7 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, "requires": { "punycode": "^2.1.0" } @@ -16287,16 +15470,6 @@ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, "walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", diff --git a/package.json b/package.json index 14a980f..76e95b1 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,6 @@ "multer": "^1.4.5-lts.1", "newrelic": "^9.7.2", "qs": "^6.11.0", - "request": "^2.88.2", "winston": "^3.8.2", "winston-daily-rotate-file": "^4.7.1" }, @@ -68,7 +67,6 @@ "supertest": "^6.3.3", "ts-jest": "^29.0.3", "ts-node": "^10.9.1", - "tslint": "^6.1.3", "typescript": "^4.9.4" } } From a8450bb9c2a0f2339f4e60a025c6024d7c4dd29c Mon Sep 17 00:00:00 2001 From: Janishar Ali Date: Tue, 13 Dec 2022 10:34:48 +0530 Subject: [PATCH 15/33] formatting fixes --- addons/init-mongo.js | 2 +- src/database/index.ts | 2 +- src/database/repository/BlogRepo.ts | 4 +- src/database/repository/UserRepo.ts | 2 +- src/routes/v1/access/login.ts | 1 - src/routes/v1/access/signup.ts | 1 - tests/auth/authentication/mock.ts | 26 ++++---- tests/auth/authorization/mock.ts | 98 ++++++++++++++--------------- tests/routes/v1/blog/index/mock.ts | 18 +++--- tests/routes/v1/blog/writer/mock.ts | 68 +++++++++----------- tests/routes/v1/login/mock.ts | 26 ++++---- 11 files changed, 114 insertions(+), 134 deletions(-) diff --git a/addons/init-mongo.js b/addons/init-mongo.js index 0cd1736..b303b78 100644 --- a/addons/init-mongo.js +++ b/addons/init-mongo.js @@ -29,7 +29,7 @@ function seed(dbName, user, password) { db.users.insert({ name: 'Admin', email: 'admin@xyz.com', - password: '$2a$10$psWmSrmtyZYvtIt/FuJL1OLqsK3iR1fZz5.wUYFuSNkkt.EOX9mLa' // hash of password: changeit + password: '$2a$10$psWmSrmtyZYvtIt/FuJL1OLqsK3iR1fZz5.wUYFuSNkkt.EOX9mLa', // hash of password: changeit }); } diff --git a/src/database/index.ts b/src/database/index.ts index c1a1fdc..18dab75 100644 --- a/src/database/index.ts +++ b/src/database/index.ts @@ -62,4 +62,4 @@ process.on('SIGINT', () => { Logger.info('Mongoose default connection disconnected through app termination'); process.exit(0); }); -}); \ No newline at end of file +}); diff --git a/src/database/repository/BlogRepo.ts b/src/database/repository/BlogRepo.ts index 195b682..7d1155e 100755 --- a/src/database/repository/BlogRepo.ts +++ b/src/database/repository/BlogRepo.ts @@ -43,9 +43,7 @@ export default class BlogRepo { public static findBlogAllDataById(id: Types.ObjectId): Promise { return BlogModel.findOne({ _id: id, status: true }) - .select( - '+text +draftText +isSubmitted +isDraft +isPublished +status +createdBy +updatedBy', - ) + .select('+text +draftText +isSubmitted +isDraft +isPublished +status +createdBy +updatedBy') .populate('author', this.AUTHOR_DETAIL) .lean() .exec(); diff --git a/src/database/repository/UserRepo.ts b/src/database/repository/UserRepo.ts index 4cac18e..3c60928 100755 --- a/src/database/repository/UserRepo.ts +++ b/src/database/repository/UserRepo.ts @@ -1,5 +1,5 @@ import User, { UserModel } from '../model/User'; -import Role, { RoleModel } from '../model/Role'; +import { RoleModel } from '../model/Role'; import { InternalError } from '../../core/ApiError'; import { Types } from 'mongoose'; import KeystoreRepo from './KeystoreRepo'; diff --git a/src/routes/v1/access/login.ts b/src/routes/v1/access/login.ts index d917e80..dac3715 100755 --- a/src/routes/v1/access/login.ts +++ b/src/routes/v1/access/login.ts @@ -9,7 +9,6 @@ import validator from '../../../helpers/validator'; import schema from './schema'; import asyncHandler from '../../../helpers/asyncHandler'; import bcrypt from 'bcrypt'; -import _ from 'lodash'; import { getUserData } from './utils'; import { PublicRequest } from '../../../types/app-request'; diff --git a/src/routes/v1/access/signup.ts b/src/routes/v1/access/signup.ts index 7f8534f..fb16378 100644 --- a/src/routes/v1/access/signup.ts +++ b/src/routes/v1/access/signup.ts @@ -10,7 +10,6 @@ import validator from '../../../helpers/validator'; import schema from './schema'; import asyncHandler from '../../../helpers/asyncHandler'; import bcrypt from 'bcrypt'; -import _ from 'lodash'; import { RoleCode } from '../../../database/model/Role'; import { getUserData } from './utils'; diff --git a/tests/auth/authentication/mock.ts b/tests/auth/authentication/mock.ts index ec536fc..6495a18 100644 --- a/tests/auth/authentication/mock.ts +++ b/tests/auth/authentication/mock.ts @@ -20,20 +20,18 @@ export const mockUserFindById = jest.fn(async (id: Types.ObjectId) => { else return null; }); -export const mockJwtValidate = jest.fn( - async (token: string): Promise => { - if (token === ACCESS_TOKEN) - return { - iss: tokenInfo.issuer, - aud: tokenInfo.audience, - sub: USER_ID.toHexString(), - iat: 1, - exp: 2, - prm: 'abcdef', - } as JwtPayload; - throw new BadTokenError(); - }, -); +export const mockJwtValidate = jest.fn(async (token: string): Promise => { + if (token === ACCESS_TOKEN) + return { + iss: tokenInfo.issuer, + aud: tokenInfo.audience, + sub: USER_ID.toHexString(), + iat: 1, + exp: 2, + prm: 'abcdef', + } as JwtPayload; + throw new BadTokenError(); +}); export const mockKeystoreFindForKey = jest.fn( async (client: User, key: string): Promise => diff --git a/tests/auth/authorization/mock.ts b/tests/auth/authorization/mock.ts index 151e806..127dc95 100644 --- a/tests/auth/authorization/mock.ts +++ b/tests/auth/authorization/mock.ts @@ -43,58 +43,54 @@ export const mockUserFindById = jest.fn(async (id: Types.ObjectId) => { else return null; }); -export const mockRoleRepoFindByCode = jest.fn( - async (code: string): Promise => { - switch (code) { - case RoleCode.WRITER: - return { - _id: WRITER_ROLE_ID, - code: RoleCode.WRITER, - status: true, - } as Role; - case RoleCode.EDITOR: - return { - _id: EDITOR_ROLE_ID, - code: RoleCode.EDITOR, - status: true, - } as Role; - case RoleCode.LEARNER: - return { - _id: LEARNER_ROLE_ID, - code: RoleCode.LEARNER, - status: true, - } as Role; - } - return null; - }, -); - -export const mockJwtValidate = jest.fn( - async (token: string): Promise => { - let subject = null; - switch (token) { - case ACCESS_TOKEN: - subject = USER_ID.toHexString(); - break; - case WRITER_ACCESS_TOKEN: - subject = USER_ID_WRITER.toHexString(); - break; - case EDITOR_ACCESS_TOKEN: - subject = USER_ID_EDITOR.toHexString(); - break; - } - if (subject) +export const mockRoleRepoFindByCode = jest.fn(async (code: string): Promise => { + switch (code) { + case RoleCode.WRITER: return { - iss: tokenInfo.issuer, - aud: tokenInfo.audience, - sub: subject, - iat: 1, - exp: 2, - prm: 'abcdef', - } as JwtPayload; - throw new BadTokenError(); - }, -); + _id: WRITER_ROLE_ID, + code: RoleCode.WRITER, + status: true, + } as Role; + case RoleCode.EDITOR: + return { + _id: EDITOR_ROLE_ID, + code: RoleCode.EDITOR, + status: true, + } as Role; + case RoleCode.LEARNER: + return { + _id: LEARNER_ROLE_ID, + code: RoleCode.LEARNER, + status: true, + } as Role; + } + return null; +}); + +export const mockJwtValidate = jest.fn(async (token: string): Promise => { + let subject = null; + switch (token) { + case ACCESS_TOKEN: + subject = USER_ID.toHexString(); + break; + case WRITER_ACCESS_TOKEN: + subject = USER_ID_WRITER.toHexString(); + break; + case EDITOR_ACCESS_TOKEN: + subject = USER_ID_EDITOR.toHexString(); + break; + } + if (subject) + return { + iss: tokenInfo.issuer, + aud: tokenInfo.audience, + sub: subject, + iat: 1, + exp: 2, + prm: 'abcdef', + } as JwtPayload; + throw new BadTokenError(); +}); jest.mock('../../../src/database/repository/UserRepo', () => ({ get findById() { diff --git a/tests/routes/v1/blog/index/mock.ts b/tests/routes/v1/blog/index/mock.ts index 5f34eea..e7ab499 100644 --- a/tests/routes/v1/blog/index/mock.ts +++ b/tests/routes/v1/blog/index/mock.ts @@ -6,16 +6,14 @@ jest.unmock('../../../../../src/database/repository/BlogRepo'); export const BLOG_ID = new Types.ObjectId(); export const BLOG_URL = 'abc'; -export const mockBlogFindByUrl = jest.fn( - async (blogUrl: string): Promise => { - if (blogUrl === BLOG_URL) - return { - _id: BLOG_ID, - blogUrl: blogUrl, - } as Blog; - return null; - }, -); +export const mockBlogFindByUrl = jest.fn(async (blogUrl: string): Promise => { + if (blogUrl === BLOG_URL) + return { + _id: BLOG_ID, + blogUrl: blogUrl, + } as Blog; + return null; +}); export const mockFindInfoWithTextById = jest.fn( async (id: Types.ObjectId): Promise => { diff --git a/tests/routes/v1/blog/writer/mock.ts b/tests/routes/v1/blog/writer/mock.ts index c2ab963..2bcacf1 100644 --- a/tests/routes/v1/blog/writer/mock.ts +++ b/tests/routes/v1/blog/writer/mock.ts @@ -8,47 +8,41 @@ export const BLOG_ID = new Types.ObjectId(); export const BLOG_ID_2 = new Types.ObjectId(); export const BLOG_URL = 'abc'; -export const mockBlogFindUrlIfExists = jest.fn( - async (blogUrl: string): Promise => { - if (blogUrl === BLOG_URL) - return { - _id: BLOG_ID, - blogUrl: blogUrl, - } as Blog; - return null; - }, -); +export const mockBlogFindUrlIfExists = jest.fn(async (blogUrl: string): Promise => { + if (blogUrl === BLOG_URL) + return { + _id: BLOG_ID, + blogUrl: blogUrl, + } as Blog; + return null; +}); -export const mockBlogCreate = jest.fn( - async (blog: Blog): Promise => { - blog._id = BLOG_ID; - return blog; - }, -); +export const mockBlogCreate = jest.fn(async (blog: Blog): Promise => { + blog._id = BLOG_ID; + return blog; +}); export const mockBlogUpdate = jest.fn(async (blog: Blog): Promise => blog); -export const mockFindBlogAllDataById = jest.fn( - async (id: Types.ObjectId): Promise => { - if (BLOG_ID.equals(id)) - return { - _id: BLOG_ID, - author: { _id: USER_ID_WRITER }, - isDraft: true, - isSubmitted: false, - isPublished: false, - } as Blog; - if (BLOG_ID_2.equals(id)) - return { - _id: BLOG_ID, - author: { _id: new Types.ObjectId() }, - isDraft: true, - isSubmitted: false, - isPublished: false, - } as Blog; - return null; - }, -); +export const mockFindBlogAllDataById = jest.fn(async (id: Types.ObjectId): Promise => { + if (BLOG_ID.equals(id)) + return { + _id: BLOG_ID, + author: { _id: USER_ID_WRITER }, + isDraft: true, + isSubmitted: false, + isPublished: false, + } as Blog; + if (BLOG_ID_2.equals(id)) + return { + _id: BLOG_ID, + author: { _id: new Types.ObjectId() }, + isDraft: true, + isSubmitted: false, + isPublished: false, + } as Blog; + return null; +}); jest.mock('../../../../../src/database/repository/BlogRepo', () => ({ get findUrlIfExists() { diff --git a/tests/routes/v1/login/mock.ts b/tests/routes/v1/login/mock.ts index 4a85ce9..c4db54f 100644 --- a/tests/routes/v1/login/mock.ts +++ b/tests/routes/v1/login/mock.ts @@ -25,20 +25,18 @@ export const mockKeystoreCreate = jest.fn( }, ); -export const mockUserFindByEmail = jest.fn( - async (email: string): Promise => { - if (email === USER_EMAIL) - return { - _id: USER_ID, - email: USER_EMAIL, - password: USER_PASSWORD_HASH, - name: 'abc', - profilePicUrl: 'abc', - roles: [] as Role[], - } as User; - return null; - }, -); +export const mockUserFindByEmail = jest.fn(async (email: string): Promise => { + if (email === USER_EMAIL) + return { + _id: USER_ID, + email: USER_EMAIL, + password: USER_PASSWORD_HASH, + name: 'abc', + profilePicUrl: 'abc', + roles: [] as Role[], + } as User; + return null; +}); jest.mock('../../../../src/database/repository/KeystoreRepo', () => ({ get create() { From 359101f400a2683d12d2dd49f8d8df9c1355f9c4 Mon Sep 17 00:00:00 2001 From: Janishar Ali Date: Wed, 14 Dec 2022 17:35:49 +0530 Subject: [PATCH 16/33] migrate static class to modules export --- src/database/repository/ApiKeyRepo.ts | 10 +- src/database/repository/BlogRepo.ts | 369 +++++++++++++----------- src/database/repository/KeystoreRepo.ts | 78 ++--- src/database/repository/RoleRepo.ts | 21 +- src/database/repository/UserRepo.ts | 178 ++++++------ 5 files changed, 347 insertions(+), 309 deletions(-) diff --git a/src/database/repository/ApiKeyRepo.ts b/src/database/repository/ApiKeyRepo.ts index c46b69a..3f1a1e8 100755 --- a/src/database/repository/ApiKeyRepo.ts +++ b/src/database/repository/ApiKeyRepo.ts @@ -1,7 +1,9 @@ import ApiKey, { ApiKeyModel } from '../model/ApiKey'; -export default class ApiRepo { - public static findByKey(key: string): Promise { - return ApiKeyModel.findOne({ key: key, status: true }).lean().exec(); - } +async function findByKey(key: string): Promise { + return ApiKeyModel.findOne({ key: key, status: true }).lean().exec(); } + +export default { + findByKey, +}; diff --git a/src/database/repository/BlogRepo.ts b/src/database/repository/BlogRepo.ts index 7d1155e..181481c 100755 --- a/src/database/repository/BlogRepo.ts +++ b/src/database/repository/BlogRepo.ts @@ -2,180 +2,201 @@ import Blog, { BlogModel } from '../model/Blog'; import { Types } from 'mongoose'; import User from '../model/User'; -export default class BlogRepo { - private static AUTHOR_DETAIL = 'name profilePicUrl'; - - public static async create(blog: Blog): Promise { - const now = new Date(); - blog.createdAt = now; - blog.updatedAt = now; - const createdBlog = await BlogModel.create(blog); - return createdBlog.toObject(); - } - - public static update(blog: Blog): Promise { - blog.updatedAt = new Date(); - return BlogModel.findByIdAndUpdate(blog._id, blog, { new: true }).lean().exec(); - } - - public static findInfoById(id: Types.ObjectId): Promise { - return BlogModel.findOne({ _id: id, status: true }) - .populate('author', this.AUTHOR_DETAIL) - .lean() - .exec(); - } - - public static findInfoWithTextById(id: Types.ObjectId): Promise { - return BlogModel.findOne({ _id: id, status: true }) - .select('+text') - .populate('author', this.AUTHOR_DETAIL) - .lean() - .exec(); - } - - public static findInfoWithTextAndDraftTextById(id: Types.ObjectId): Promise { - return BlogModel.findOne({ _id: id, status: true }) - .select('+text +draftText +isSubmitted +isDraft +isPublished +status') - .populate('author', this.AUTHOR_DETAIL) - .lean() - .exec(); - } - - public static findBlogAllDataById(id: Types.ObjectId): Promise { - return BlogModel.findOne({ _id: id, status: true }) - .select('+text +draftText +isSubmitted +isDraft +isPublished +status +createdBy +updatedBy') - .populate('author', this.AUTHOR_DETAIL) - .lean() - .exec(); - } - - public static findByUrl(blogUrl: string): Promise { - return BlogModel.findOne({ blogUrl: blogUrl, status: true }) - .select('+text') - .populate('author', this.AUTHOR_DETAIL) - .lean() - .exec(); - } - - public static findUrlIfExists(blogUrl: string): Promise { - return BlogModel.findOne({ blogUrl: blogUrl }).lean().exec(); - } - - public static findByTagAndPaginated( - tag: string, - pageNumber: number, - limit: number, - ): Promise { - return BlogModel.find({ tags: tag, status: true, isPublished: true }) - .skip(limit * (pageNumber - 1)) - .limit(limit) - .populate('author', this.AUTHOR_DETAIL) - .sort({ updatedAt: -1 }) - .lean() - .exec(); - } - - public static findAllPublishedForAuthor(user: User): Promise { - return BlogModel.find({ author: user, status: true, isPublished: true }) - .populate('author', this.AUTHOR_DETAIL) - .sort({ updatedAt: -1 }) - .lean() - .exec(); - } - - public static findAllDrafts(): Promise { - return this.findDetailedBlogs({ isDraft: true, status: true }); - } - - public static findAllSubmissions(): Promise { - return this.findDetailedBlogs({ isSubmitted: true, status: true }); - } - - public static findAllPublished(): Promise { - return this.findDetailedBlogs({ isPublished: true, status: true }); - } - - public static findAllSubmissionsForWriter(user: User): Promise { - return this.findDetailedBlogs({ author: user, status: true, isSubmitted: true }); - } - - public static findAllPublishedForWriter(user: User): Promise { - return this.findDetailedBlogs({ author: user, status: true, isPublished: true }); - } - - public static findAllDraftsForWriter(user: User): Promise { - return this.findDetailedBlogs({ author: user, status: true, isDraft: true }); - } - - private static findDetailedBlogs(query: Record): Promise { - return BlogModel.find(query) - .select('+isSubmitted +isDraft +isPublished +createdBy +updatedBy') - .populate('author', this.AUTHOR_DETAIL) - .populate('createdBy', this.AUTHOR_DETAIL) - .populate('updatedBy', this.AUTHOR_DETAIL) - .sort({ updatedAt: -1 }) - .lean() - .exec(); - } - - public static findLatestBlogs(pageNumber: number, limit: number): Promise { - return BlogModel.find({ status: true, isPublished: true }) - .skip(limit * (pageNumber - 1)) - .limit(limit) - .populate('author', this.AUTHOR_DETAIL) - .sort({ publishedAt: -1 }) - .lean() - .exec(); - } - - public static searchSimilarBlogs(blog: Blog, limit: number): Promise { - return BlogModel.find( - { - $text: { $search: blog.title, $caseSensitive: false }, - status: true, - isPublished: true, - _id: { $ne: blog._id }, - }, - { - similarity: { $meta: 'textScore' }, - }, - ) - .populate('author', this.AUTHOR_DETAIL) - .sort({ updatedAt: -1 }) - .limit(limit) - .sort({ similarity: { $meta: 'textScore' } }) - .lean() - .exec(); - } - - public static search(query: string, limit: number): Promise { - return BlogModel.find( - { - $text: { $search: query, $caseSensitive: false }, - status: true, - isPublished: true, - }, - { - similarity: { $meta: 'textScore' }, - }, - ) - .select('-status -description') - .limit(limit) - .sort({ similarity: { $meta: 'textScore' } }) - .lean() - .exec(); - } - - public static searchLike(query: string, limit: number): Promise { - return BlogModel.find({ - title: { $regex: `.*${query}.*`, $options: 'i' }, +const AUTHOR_DETAIL = 'name profilePicUrl'; + +async function create(blog: Blog): Promise { + const now = new Date(); + blog.createdAt = now; + blog.updatedAt = now; + const createdBlog = await BlogModel.create(blog); + return createdBlog.toObject(); +} + +async function update(blog: Blog): Promise { + blog.updatedAt = new Date(); + return BlogModel.findByIdAndUpdate(blog._id, blog, { new: true }).lean().exec(); +} + +async function findInfoById(id: Types.ObjectId): Promise { + return BlogModel.findOne({ _id: id, status: true }) + .populate('author', AUTHOR_DETAIL) + .lean() + .exec(); +} + +async function findInfoWithTextById(id: Types.ObjectId): Promise { + return BlogModel.findOne({ _id: id, status: true }) + .select('+text') + .populate('author', AUTHOR_DETAIL) + .lean() + .exec(); +} + +async function findInfoWithTextAndDraftTextById(id: Types.ObjectId): Promise { + return BlogModel.findOne({ _id: id, status: true }) + .select('+text +draftText +isSubmitted +isDraft +isPublished +status') + .populate('author', AUTHOR_DETAIL) + .lean() + .exec(); +} + +async function findBlogAllDataById(id: Types.ObjectId): Promise { + return BlogModel.findOne({ _id: id, status: true }) + .select('+text +draftText +isSubmitted +isDraft +isPublished +status +createdBy +updatedBy') + .populate('author', AUTHOR_DETAIL) + .lean() + .exec(); +} + +async function findByUrl(blogUrl: string): Promise { + return BlogModel.findOne({ blogUrl: blogUrl, status: true }) + .select('+text') + .populate('author', AUTHOR_DETAIL) + .lean() + .exec(); +} + +async function findUrlIfExists(blogUrl: string): Promise { + return BlogModel.findOne({ blogUrl: blogUrl }).lean().exec(); +} + +async function findByTagAndPaginated( + tag: string, + pageNumber: number, + limit: number, +): Promise { + return BlogModel.find({ tags: tag, status: true, isPublished: true }) + .skip(limit * (pageNumber - 1)) + .limit(limit) + .populate('author', AUTHOR_DETAIL) + .sort({ updatedAt: -1 }) + .lean() + .exec(); +} + +async function findAllPublishedForAuthor(user: User): Promise { + return BlogModel.find({ author: user, status: true, isPublished: true }) + .populate('author', AUTHOR_DETAIL) + .sort({ updatedAt: -1 }) + .lean() + .exec(); +} + +async function findAllDrafts(): Promise { + return findDetailedBlogs({ isDraft: true, status: true }); +} + +async function findAllSubmissions(): Promise { + return findDetailedBlogs({ isSubmitted: true, status: true }); +} + +async function findAllPublished(): Promise { + return findDetailedBlogs({ isPublished: true, status: true }); +} + +async function findAllSubmissionsForWriter(user: User): Promise { + return findDetailedBlogs({ author: user, status: true, isSubmitted: true }); +} + +async function findAllPublishedForWriter(user: User): Promise { + return findDetailedBlogs({ author: user, status: true, isPublished: true }); +} + +async function findAllDraftsForWriter(user: User): Promise { + return findDetailedBlogs({ author: user, status: true, isDraft: true }); +} + +async function findDetailedBlogs(query: Record): Promise { + return BlogModel.find(query) + .select('+isSubmitted +isDraft +isPublished +createdBy +updatedBy') + .populate('author', AUTHOR_DETAIL) + .populate('createdBy', AUTHOR_DETAIL) + .populate('updatedBy', AUTHOR_DETAIL) + .sort({ updatedAt: -1 }) + .lean() + .exec(); +} + +async function findLatestBlogs(pageNumber: number, limit: number): Promise { + return BlogModel.find({ status: true, isPublished: true }) + .skip(limit * (pageNumber - 1)) + .limit(limit) + .populate('author', AUTHOR_DETAIL) + .sort({ publishedAt: -1 }) + .lean() + .exec(); +} + +async function searchSimilarBlogs(blog: Blog, limit: number): Promise { + return BlogModel.find( + { + $text: { $search: blog.title, $caseSensitive: false }, + status: true, + isPublished: true, + _id: { $ne: blog._id }, + }, + { + similarity: { $meta: 'textScore' }, + }, + ) + .populate('author', AUTHOR_DETAIL) + .sort({ updatedAt: -1 }) + .limit(limit) + .sort({ similarity: { $meta: 'textScore' } }) + .lean() + .exec(); +} + +async function search(query: string, limit: number): Promise { + return BlogModel.find( + { + $text: { $search: query, $caseSensitive: false }, status: true, isPublished: true, - }) - .select('-status -description') - .limit(limit) - .sort({ score: -1 }) - .lean() - .exec(); - } + }, + { + similarity: { $meta: 'textScore' }, + }, + ) + .select('-status -description') + .limit(limit) + .sort({ similarity: { $meta: 'textScore' } }) + .lean() + .exec(); } + +async function searchLike(query: string, limit: number): Promise { + return BlogModel.find({ + title: { $regex: `.*${query}.*`, $options: 'i' }, + status: true, + isPublished: true, + }) + .select('-status -description') + .limit(limit) + .sort({ score: -1 }) + .lean() + .exec(); +} + +export default { + create, + update, + findInfoById, + findInfoWithTextById, + findInfoWithTextAndDraftTextById, + findBlogAllDataById, + findByUrl, + findUrlIfExists, + findByTagAndPaginated, + findAllPublishedForAuthor, + findAllDrafts, + findAllSubmissions, + findAllPublished, + findAllSubmissionsForWriter, + findAllPublishedForWriter, + findAllDraftsForWriter, + findLatestBlogs, + searchSimilarBlogs, + search, + searchLike, +}; diff --git a/src/database/repository/KeystoreRepo.ts b/src/database/repository/KeystoreRepo.ts index b206968..1c3e027 100755 --- a/src/database/repository/KeystoreRepo.ts +++ b/src/database/repository/KeystoreRepo.ts @@ -2,46 +2,48 @@ import Keystore, { KeystoreModel } from '../model/Keystore'; import { Types } from 'mongoose'; import User from '../model/User'; -export default class KeystoreRepo { - public static findforKey(client: User, key: string): Promise { - return KeystoreModel.findOne({ client: client, primaryKey: key, status: true }).lean().exec(); - } +async function findforKey(client: User, key: string): Promise { + return KeystoreModel.findOne({ client: client, primaryKey: key, status: true }).lean().exec(); +} - public static remove(id: Types.ObjectId): Promise { - return KeystoreModel.findByIdAndRemove(id).lean().exec(); - } +async function remove(id: Types.ObjectId): Promise { + return KeystoreModel.findByIdAndRemove(id).lean().exec(); +} - public static removeAllForClient(client: User) { - return KeystoreModel.deleteMany({ client: client }).exec(); - } +async function removeAllForClient(client: User) { + return KeystoreModel.deleteMany({ client: client }).exec(); +} - public static find( - client: User, - primaryKey: string, - secondaryKey: string, - ): Promise { - return KeystoreModel.findOne({ - client: client, - primaryKey: primaryKey, - secondaryKey: secondaryKey, - }) - .lean() - .exec(); - } +async function find( + client: User, + primaryKey: string, + secondaryKey: string, +): Promise { + return KeystoreModel.findOne({ + client: client, + primaryKey: primaryKey, + secondaryKey: secondaryKey, + }) + .lean() + .exec(); +} - public static async create( - client: User, - primaryKey: string, - secondaryKey: string, - ): Promise { - const now = new Date(); - const keystore = await KeystoreModel.create({ - client: client, - primaryKey: primaryKey, - secondaryKey: secondaryKey, - createdAt: now, - updatedAt: now, - }); - return keystore.toObject(); - } +async function create(client: User, primaryKey: string, secondaryKey: string): Promise { + const now = new Date(); + const keystore = await KeystoreModel.create({ + client: client, + primaryKey: primaryKey, + secondaryKey: secondaryKey, + createdAt: now, + updatedAt: now, + }); + return keystore.toObject(); } + +export default { + findforKey, + remove, + removeAllForClient, + find, + create, +}; diff --git a/src/database/repository/RoleRepo.ts b/src/database/repository/RoleRepo.ts index 9c1f1d1..aa3c354 100755 --- a/src/database/repository/RoleRepo.ts +++ b/src/database/repository/RoleRepo.ts @@ -1,13 +1,16 @@ import Role, { RoleModel } from '../model/Role'; -export default class RoleRepo { - public static findByCode(code: string): Promise { - return RoleModel.findOne({ code: code, status: true }).lean().exec(); - } +async function findByCode(code: string): Promise { + return RoleModel.findOne({ code: code, status: true }).lean().exec(); +} - public static findByCodes(codes: string[]): Promise { - return RoleModel.find({ code: { $in: codes }, status: true }) - .lean() - .exec(); - } +async function findByCodes(codes: string[]): Promise { + return RoleModel.find({ code: { $in: codes }, status: true }) + .lean() + .exec(); } + +export default { + findByCode, + findByCodes, +}; diff --git a/src/database/repository/UserRepo.ts b/src/database/repository/UserRepo.ts index 3c60928..622823a 100755 --- a/src/database/repository/UserRepo.ts +++ b/src/database/repository/UserRepo.ts @@ -5,98 +5,108 @@ import { Types } from 'mongoose'; import KeystoreRepo from './KeystoreRepo'; import Keystore from '../model/Keystore'; -export default class UserRepo { - public static async exists(id: Types.ObjectId): Promise { - const user = await UserModel.exists({ _id: id, status: true }); - return user !== null && user !== undefined; - } +async function exists(id: Types.ObjectId): Promise { + const user = await UserModel.exists({ _id: id, status: true }); + return user !== null && user !== undefined; +} - public static findPrivateProfileById(id: Types.ObjectId): Promise { - return UserModel.findOne({ _id: id, status: true }) - .select('+email') - .populate({ - path: 'roles', - match: { status: true }, - select: { code: 1 }, - }) - .lean() - .exec(); - } +async function findPrivateProfileById(id: Types.ObjectId): Promise { + return UserModel.findOne({ _id: id, status: true }) + .select('+email') + .populate({ + path: 'roles', + match: { status: true }, + select: { code: 1 }, + }) + .lean() + .exec(); +} - // contains critical information of the user - public static findById(id: Types.ObjectId): Promise { - return UserModel.findOne({ _id: id, status: true }) - .select('+email +password +roles') - .populate({ - path: 'roles', - match: { status: true }, - }) - .lean() - .exec(); - } +// contains critical information of the user +async function findById(id: Types.ObjectId): Promise { + return UserModel.findOne({ _id: id, status: true }) + .select('+email +password +roles') + .populate({ + path: 'roles', + match: { status: true }, + }) + .lean() + .exec(); +} - public static findByEmail(email: string): Promise { - return UserModel.findOne({ email: email }) - .select( - '+email +password +roles +gender +dob +grade +country +state +city +school +bio +hobbies', - ) - .populate({ - path: 'roles', - match: { status: true }, - select: { code: 1 }, - }) - .lean() - .exec(); - } +async function findByEmail(email: string): Promise { + return UserModel.findOne({ email: email }) + .select( + '+email +password +roles +gender +dob +grade +country +state +city +school +bio +hobbies', + ) + .populate({ + path: 'roles', + match: { status: true }, + select: { code: 1 }, + }) + .lean() + .exec(); +} - public static findFieldsById(id: Types.ObjectId, ...fields: string[]): Promise { - return UserModel.findOne({ _id: id, status: true }, [...fields]) - .lean() - .exec(); - } +async function findFieldsById(id: Types.ObjectId, ...fields: string[]): Promise { + return UserModel.findOne({ _id: id, status: true }, [...fields]) + .lean() + .exec(); +} - public static findPublicProfileById(id: Types.ObjectId): Promise { - return UserModel.findOne({ _id: id, status: true }).lean().exec(); - } +async function findPublicProfileById(id: Types.ObjectId): Promise { + return UserModel.findOne({ _id: id, status: true }).lean().exec(); +} - public static async create( - user: User, - accessTokenKey: string, - refreshTokenKey: string, - roleCode: string, - ): Promise<{ user: User; keystore: Keystore }> { - const now = new Date(); +async function create( + user: User, + accessTokenKey: string, + refreshTokenKey: string, + roleCode: string, +): Promise<{ user: User; keystore: Keystore }> { + const now = new Date(); - const role = await RoleModel.findOne({ code: roleCode }).select('+code').lean().exec(); - if (!role) throw new InternalError('Role must be defined'); + const role = await RoleModel.findOne({ code: roleCode }).select('+code').lean().exec(); + if (!role) throw new InternalError('Role must be defined'); - user.roles = [role]; - user.createdAt = user.updatedAt = now; - const createdUser = await UserModel.create(user); - const keystore = await KeystoreRepo.create(createdUser, accessTokenKey, refreshTokenKey); - return { - user: { ...createdUser.toObject(), roles: user.roles }, - keystore: keystore, - }; - } + user.roles = [role]; + user.createdAt = user.updatedAt = now; + const createdUser = await UserModel.create(user); + const keystore = await KeystoreRepo.create(createdUser, accessTokenKey, refreshTokenKey); + return { + user: { ...createdUser.toObject(), roles: user.roles }, + keystore: keystore, + }; +} - public static async update( - user: User, - accessTokenKey: string, - refreshTokenKey: string, - ): Promise<{ user: User; keystore: Keystore }> { - user.updatedAt = new Date(); - await UserModel.updateOne({ _id: user._id }, { $set: { ...user } }) - .lean() - .exec(); - const keystore = await KeystoreRepo.create(user, accessTokenKey, refreshTokenKey); - return { user: user, keystore: keystore }; - } +async function update( + user: User, + accessTokenKey: string, + refreshTokenKey: string, +): Promise<{ user: User; keystore: Keystore }> { + user.updatedAt = new Date(); + await UserModel.updateOne({ _id: user._id }, { $set: { ...user } }) + .lean() + .exec(); + const keystore = await KeystoreRepo.create(user, accessTokenKey, refreshTokenKey); + return { user: user, keystore: keystore }; +} - public static updateInfo(user: User): Promise { - user.updatedAt = new Date(); - return UserModel.updateOne({ _id: user._id }, { $set: { ...user } }) - .lean() - .exec(); - } +async function updateInfo(user: User): Promise { + user.updatedAt = new Date(); + return UserModel.updateOne({ _id: user._id }, { $set: { ...user } }) + .lean() + .exec(); } + +export default { + exists, + findPrivateProfileById, + findById, + findByEmail, + findFieldsById, + findPublicProfileById, + create, + update, + updateInfo, +}; From e2378e27d4dae077bf55744ebd535343074c3157 Mon Sep 17 00:00:00 2001 From: Janishar Ali Date: Wed, 14 Dec 2022 17:56:45 +0530 Subject: [PATCH 17/33] convert static class into modules --- src/core/JWT.ts | 98 +++++++++++++++++++++++++------------------------ 1 file changed, 51 insertions(+), 47 deletions(-) diff --git a/src/core/JWT.ts b/src/core/JWT.ts index 21f62cd..ce7ae34 100755 --- a/src/core/JWT.ts +++ b/src/core/JWT.ts @@ -13,53 +13,6 @@ import Logger from './Logger'; * algorithm  — Encryption algorithm to be used to protect the token. */ -export default class JWT { - private static readPublicKey(): Promise { - return promisify(readFile)(path.join(__dirname, '../../keys/public.pem'), 'utf8'); - } - - private static readPrivateKey(): Promise { - return promisify(readFile)(path.join(__dirname, '../../keys/private.pem'), 'utf8'); - } - - public static async encode(payload: JwtPayload): Promise { - const cert = await this.readPrivateKey(); - if (!cert) throw new InternalError('Token generation failure'); - // @ts-ignore - return promisify(sign)({ ...payload }, cert, { algorithm: 'RS256' }); - } - - /** - * This method checks the token and returns the decoded data when token is valid in all respect - */ - public static async validate(token: string): Promise { - const cert = await this.readPublicKey(); - try { - // @ts-ignore - return (await promisify(verify)(token, cert)) as JwtPayload; - } catch (e: any) { - Logger.debug(e); - if (e && e.name === 'TokenExpiredError') throw new TokenExpiredError(); - // throws error if the token has not been encrypted by the private key - throw new BadTokenError(); - } - } - - /** - * Returns the decoded payload if the signature is valid even if it is expired - */ - public static async decode(token: string): Promise { - const cert = await this.readPublicKey(); - try { - // @ts-ignore - return (await promisify(verify)(token, cert, { ignoreExpiration: true })) as JwtPayload; - } catch (e) { - Logger.debug(e); - throw new BadTokenError(); - } - } -} - export class JwtPayload { aud: string; sub: string; @@ -77,3 +30,54 @@ export class JwtPayload { this.prm = param; } } + +async function readPublicKey(): Promise { + return promisify(readFile)(path.join(__dirname, '../../keys/public.pem'), 'utf8'); +} + +async function readPrivateKey(): Promise { + return promisify(readFile)(path.join(__dirname, '../../keys/private.pem'), 'utf8'); +} + +async function encode(payload: JwtPayload): Promise { + const cert = await readPrivateKey(); + if (!cert) throw new InternalError('Token generation failure'); + // @ts-ignore + return promisify(sign)({ ...payload }, cert, { algorithm: 'RS256' }); +} + +/** + * This method checks the token and returns the decoded data when token is valid in all respect + */ +async function validate(token: string): Promise { + const cert = await readPublicKey(); + try { + // @ts-ignore + return (await promisify(verify)(token, cert)) as JwtPayload; + } catch (e: any) { + Logger.debug(e); + if (e && e.name === 'TokenExpiredError') throw new TokenExpiredError(); + // throws error if the token has not been encrypted by the private key + throw new BadTokenError(); + } +} + +/** + * Returns the decoded payload if the signature is valid even if it is expired + */ +async function decode(token: string): Promise { + const cert = await readPublicKey(); + try { + // @ts-ignore + return (await promisify(verify)(token, cert, { ignoreExpiration: true })) as JwtPayload; + } catch (e) { + Logger.debug(e); + throw new BadTokenError(); + } +} + +export default { + encode, + validate, + decode, +}; From 3ea7fb086ce856ebe5cb04c64d9c6ef0c5aafa22 Mon Sep 17 00:00:00 2001 From: Janishar Ali Date: Wed, 14 Dec 2022 17:57:16 +0530 Subject: [PATCH 18/33] convert static class into module --- .env.example | 5 +- .templates/database/repository/SampleRepo.ts | 34 ++-- docker-compose.yml | 4 +- package-lock.json | 146 +++++++++++++++++ package.json | 1 + src/app.ts | 1 + src/cache/index.ts | 24 +++ src/cache/keys.ts | 15 ++ src/cache/query.ts | 157 +++++++++++++++++++ src/cache/repository/BlogCache.ts | 21 +++ src/cache/repository/BlogsCache.ts | 20 +++ src/config.ts | 6 + tests/.env.test.example | 7 +- 13 files changed, 419 insertions(+), 22 deletions(-) create mode 100644 src/cache/index.ts create mode 100644 src/cache/keys.ts create mode 100644 src/cache/query.ts create mode 100644 src/cache/repository/BlogCache.ts create mode 100644 src/cache/repository/BlogsCache.ts diff --git a/.env.example b/.env.example index 64b0eb1..fc04a03 100644 --- a/.env.example +++ b/.env.example @@ -36,8 +36,9 @@ DB_ADMIN=admin DB_ADMIN_PWD=changeit # Redis -REDIS_CACHE_PORT=6379 -REDIS_CACHE_PASSWORD=changeit +REDIS_HOST=redis +REDIS_PORT=6379 +REDIS_PASSWORD=changeit # Log # Example '/home/node/logs' diff --git a/.templates/database/repository/SampleRepo.ts b/.templates/database/repository/SampleRepo.ts index 4166c48..d958a88 100644 --- a/.templates/database/repository/SampleRepo.ts +++ b/.templates/database/repository/SampleRepo.ts @@ -1,21 +1,25 @@ import Sample, { SampleModel } from '../model/Sample'; import { Types } from 'mongoose'; -export default class SampleRepo { - public static findById(id: Types.ObjectId): Promise { - return SampleModel.findOne({ _id: id, status: true }).lean().exec(); - } +async function findById(id: Types.ObjectId): Promise { + return SampleModel.findOne({ _id: id, status: true }).lean().exec(); +} - public static async create(sample: Sample): Promise { - const now = new Date(); - sample.createdAt = now; - sample.updatedAt = now; - const created = await SampleModel.create(sample); - return created.toObject(); - } +async function create(sample: Sample): Promise { + const now = new Date(); + sample.createdAt = now; + sample.updatedAt = now; + const created = await SampleModel.create(sample); + return created.toObject(); +} - public static update(sample: Sample): Promise { - sample.updatedAt = new Date(); - return SampleModel.findByIdAndUpdate(sample._id, sample, { new: true }).lean().exec(); - } +async function update(sample: Sample): Promise { + sample.updatedAt = new Date(); + return SampleModel.findByIdAndUpdate(sample._id, sample, { new: true }).lean().exec(); } + +export default { + findById, + create, + update, +}; diff --git a/docker-compose.yml b/docker-compose.yml index 10be00a..88c6e2d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -55,8 +55,8 @@ services: restart: unless-stopped env_file: .env ports: - - '$REDIS_CACHE_PORT:6379' - command: redis-server --save 20 1 --loglevel warning --requirepass $REDIS_CACHE_PASSWORD + - '$REDIS_PORT:6379' + command: redis-server --save 20 1 --loglevel warning --requirepass $REDIS_PASSWORD volumes: - cache:/data/cache diff --git a/package-lock.json b/package-lock.json index 6d8a742..3d4432d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,6 +22,7 @@ "multer": "^1.4.5-lts.1", "newrelic": "^9.7.2", "qs": "^6.11.0", + "redis": "^4.5.1", "winston": "^3.8.2", "winston-daily-rotate-file": "^4.7.1" }, @@ -2543,6 +2544,59 @@ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" }, + "node_modules/@redis/bloom": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.1.0.tgz", + "integrity": "sha512-9QovlxmpRtvxVbN0UBcv8WfdSMudNZZTFqCsnBszcQXqaZb/TVe30ScgGEO7u1EAIacTPAo7/oCYjYAxiHLanQ==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/client": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.4.2.tgz", + "integrity": "sha512-oUdEjE0I7JS5AyaAjkD3aOXn9NhO7XKyPyXEyrgFDu++VrVBHUPnV6dgEya9TcMuj5nIJRuCzCm8ZP+c9zCHPw==", + "dependencies": { + "cluster-key-slot": "1.1.1", + "generic-pool": "3.9.0", + "yallist": "4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@redis/graph": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.0.tgz", + "integrity": "sha512-16yZWngxyXPd+MJxeSr0dqh2AIOi8j9yXKcKCwVaKDbH3HTuETpDVPcLujhFYVPtYrngSco31BUcSa9TH31Gqg==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/json": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.4.tgz", + "integrity": "sha512-LUZE2Gdrhg0Rx7AN+cZkb1e6HjoSKaeeW8rYnt89Tly13GBI5eP4CwDVr+MY8BAYfCg4/N15OUrtLoona9uSgw==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/search": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.0.tgz", + "integrity": "sha512-NyFZEVnxIJEybpy+YskjgOJRNsfTYqaPbK/Buv6W2kmFNaRk85JiqjJZA5QkRmWvGbyQYwoO5QfDi2wHskKrQQ==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/time-series": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.4.tgz", + "integrity": "sha512-ThUIgo2U/g7cCuZavucQTQzA9g9JbDDY2f64u3AbAoz/8vE2lt2U37LamDUVChhaDA3IRT9R6VvJwqnUfTJzng==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, "node_modules/@sideway/address": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", @@ -3959,6 +4013,14 @@ "wrap-ansi": "^7.0.0" } }, + "node_modules/cluster-key-slot": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.1.tgz", + "integrity": "sha512-rwHwUfXL40Chm1r08yrhU3qpUvdVlgkKNeyeGPOxnW8/SyVDvgRaed/Uz54AqWNaTCAThlj6QAs3TZcKI0xDEw==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -5071,6 +5133,14 @@ "node": ">=10" } }, + "node_modules/generic-pool": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz", + "integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==", + "engines": { + "node": ">= 4" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -7649,6 +7719,19 @@ "node": ">=8.10.0" } }, + "node_modules/redis": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/redis/-/redis-4.5.1.tgz", + "integrity": "sha512-oxXSoIqMJCQVBTfxP6BNTCtDMyh9G6Vi5wjdPdV/sRKkufyZslDqCScSGcOr6XGR/reAWZefz7E4leM31RgdBA==", + "dependencies": { + "@redis/bloom": "1.1.0", + "@redis/client": "1.4.2", + "@redis/graph": "1.1.0", + "@redis/json": "1.0.4", + "@redis/search": "1.1.0", + "@redis/time-series": "1.0.4" + } + }, "node_modules/regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", @@ -10854,6 +10937,46 @@ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" }, + "@redis/bloom": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.1.0.tgz", + "integrity": "sha512-9QovlxmpRtvxVbN0UBcv8WfdSMudNZZTFqCsnBszcQXqaZb/TVe30ScgGEO7u1EAIacTPAo7/oCYjYAxiHLanQ==", + "requires": {} + }, + "@redis/client": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.4.2.tgz", + "integrity": "sha512-oUdEjE0I7JS5AyaAjkD3aOXn9NhO7XKyPyXEyrgFDu++VrVBHUPnV6dgEya9TcMuj5nIJRuCzCm8ZP+c9zCHPw==", + "requires": { + "cluster-key-slot": "1.1.1", + "generic-pool": "3.9.0", + "yallist": "4.0.0" + } + }, + "@redis/graph": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.0.tgz", + "integrity": "sha512-16yZWngxyXPd+MJxeSr0dqh2AIOi8j9yXKcKCwVaKDbH3HTuETpDVPcLujhFYVPtYrngSco31BUcSa9TH31Gqg==", + "requires": {} + }, + "@redis/json": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.4.tgz", + "integrity": "sha512-LUZE2Gdrhg0Rx7AN+cZkb1e6HjoSKaeeW8rYnt89Tly13GBI5eP4CwDVr+MY8BAYfCg4/N15OUrtLoona9uSgw==", + "requires": {} + }, + "@redis/search": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.0.tgz", + "integrity": "sha512-NyFZEVnxIJEybpy+YskjgOJRNsfTYqaPbK/Buv6W2kmFNaRk85JiqjJZA5QkRmWvGbyQYwoO5QfDi2wHskKrQQ==", + "requires": {} + }, + "@redis/time-series": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.4.tgz", + "integrity": "sha512-ThUIgo2U/g7cCuZavucQTQzA9g9JbDDY2f64u3AbAoz/8vE2lt2U37LamDUVChhaDA3IRT9R6VvJwqnUfTJzng==", + "requires": {} + }, "@sideway/address": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", @@ -11959,6 +12082,11 @@ "wrap-ansi": "^7.0.0" } }, + "cluster-key-slot": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.1.tgz", + "integrity": "sha512-rwHwUfXL40Chm1r08yrhU3qpUvdVlgkKNeyeGPOxnW8/SyVDvgRaed/Uz54AqWNaTCAThlj6QAs3TZcKI0xDEw==" + }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -12828,6 +12956,11 @@ "wide-align": "^1.1.2" } }, + "generic-pool": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz", + "integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==" + }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -14765,6 +14898,19 @@ "picomatch": "^2.2.1" } }, + "redis": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/redis/-/redis-4.5.1.tgz", + "integrity": "sha512-oxXSoIqMJCQVBTfxP6BNTCtDMyh9G6Vi5wjdPdV/sRKkufyZslDqCScSGcOr6XGR/reAWZefz7E4leM31RgdBA==", + "requires": { + "@redis/bloom": "1.1.0", + "@redis/client": "1.4.2", + "@redis/graph": "1.1.0", + "@redis/json": "1.0.4", + "@redis/search": "1.1.0", + "@redis/time-series": "1.0.4" + } + }, "regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", diff --git a/package.json b/package.json index 76e95b1..97861f6 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "multer": "^1.4.5-lts.1", "newrelic": "^9.7.2", "qs": "^6.11.0", + "redis": "^4.5.1", "winston": "^3.8.2", "winston-daily-rotate-file": "^4.7.1" }, diff --git a/src/app.ts b/src/app.ts index bd2e964..c0b10db 100644 --- a/src/app.ts +++ b/src/app.ts @@ -3,6 +3,7 @@ import Logger from './core/Logger'; import cors from 'cors'; import { corsUrl, environment } from './config'; import './database'; // initialize database +import './cache'; // initialize cache import { NotFoundError, ApiError, InternalError, ErrorType } from './core/ApiError'; import routesV1 from './routes/v1'; diff --git a/src/cache/index.ts b/src/cache/index.ts new file mode 100644 index 0000000..6c4197f --- /dev/null +++ b/src/cache/index.ts @@ -0,0 +1,24 @@ +import { redis } from '../config'; +import { createClient } from 'redis'; +import Logger from '../core/Logger'; + +const redisURL = `redis://${redis.password}@${redis.host}:${redis.port}`; + +const client = createClient({ url: redisURL }); + +client.on('connect', () => Logger.info('Cache is connecting')); +client.on('ready', () => Logger.info('Cache is ready')); +client.on('end', () => Logger.info('Cache disconnected')); +client.on('reconnecting', () => Logger.info('Cache is reconnecting')); +client.on('error', (e) => Logger.error(e)); + +(async () => { + await client.connect(); +})(); + +// If the Node process ends, close the Cache connection +process.on('SIGINT', async () => { + await client.disconnect(); +}); + +export default client; diff --git a/src/cache/keys.ts b/src/cache/keys.ts new file mode 100644 index 0000000..1a9f38c --- /dev/null +++ b/src/cache/keys.ts @@ -0,0 +1,15 @@ +export enum Key { + BLOGS_LATEST = 'BLOGS_LATEST', +} + +export enum DynamicKey { + BLOGS_TAG = 'BLOGS_TAG', + BLOG = 'BLOG', +} + +export type DynamicKeyType = `${DynamicKey}_${string}`; + +export function getDynamicKey(key: DynamicKey, suffix: string) { + const dynamic: DynamicKeyType = `${key}_${suffix}`; + return dynamic; +} diff --git a/src/cache/query.ts b/src/cache/query.ts new file mode 100644 index 0000000..2fa91c7 --- /dev/null +++ b/src/cache/query.ts @@ -0,0 +1,157 @@ +import cache from '.'; +import { DynamicKeyType, Key } from './keys'; + +export enum TYPES { + LIST = 'list', + STRING = 'string', + HASH = 'hash', + ZSET = 'zset', + SET = 'set', +} + +export async function keyExists(...keys: string[]) { + return (await cache.exists(keys)) ? true : false; +} + +export async function setValue( + key: Key | DynamicKeyType, + value: string | number, + expireAt: Date | null = null, +) { + if (expireAt) return cache.pSetEx(key, expireAt.getTime(), `${value}`); + else return cache.set(key, `${value}`); +} + +export async function getValue(key: Key | DynamicKeyType) { + return cache.get(key); +} + +export async function delByKey(key: Key | DynamicKeyType) { + return cache.del(key); +} + +export async function setJson( + key: Key | DynamicKeyType, + value: Record, + expireAt: Date | null = null, +) { + const json = JSON.stringify(value); + return await setValue(key, json, expireAt); +} + +export async function getJson(key: Key | DynamicKeyType) { + const type = await cache.type(key); + if (type !== TYPES.STRING) return null; + + const json = await getValue(key); + if (json) return JSON.parse(json) as T; + + return null; +} + +export async function setList( + key: Key | DynamicKeyType, + values: any[], + expireAt: Date | null = null, +) { + const multi = cache.multi(); + for (const i in values) { + values[i] = JSON.stringify(values[i]); + } + multi.del(key); + multi.rPush(key, values); + if (expireAt) multi.pExpireAt(key, expireAt.getTime()); + return await multi.exec(); +} + +export async function addToList(key: Key | DynamicKeyType, value: any) { + const type = await cache.type(key); + if (type !== TYPES.LIST) return null; + + const item = JSON.stringify(value); + return await cache.rPushX(key, item); +} + +export async function getListRange(key: Key | DynamicKeyType, start = 0, end = -1) { + const type = await cache.type(key); + if (type !== TYPES.LIST) return null; + + const list = await cache.lRange(key, start, end); + if (!list) return null; + + const data = list.map((entry) => JSON.parse(entry) as T); + return data; +} + +export async function setOrderedSet( + key: Key, + items: Array<{ score: number; value: any }>, + expireAt: Date | null = null, +) { + const multi = cache.multi(); + for (const item of items) { + item.value = JSON.stringify(item.value); + } + multi.del(key); + multi.zAdd(key, items); + if (expireAt) multi.pExpireAt(key, expireAt.getTime()); + return await multi.exec(); +} + +export async function addToOrderedSet(key: Key, items: Array<{ score: number; value: any }>) { + const type = await cache.type(key); + if (type !== TYPES.ZSET) return null; + + for (const item of items) { + item.value = JSON.stringify(item.value); + } + return await cache.zAdd(key, items); +} + +export async function removeFromOrderedSet(key: Key, ...items: any[]) { + const type = await cache.type(key); + if (type !== TYPES.ZSET) return null; + + items = items.map((item) => JSON.stringify(item)); + return await cache.zRem(key, items); +} + +export async function getOrderedSetRange(key: Key, start = 0, end = -1) { + const type = await cache.type(key); + if (type !== TYPES.ZSET) return null; + + const set = await cache.zRangeWithScores(key, start, end); + + const data: { score: number; value: T }[] = set.map((entry) => ({ + score: entry.score, + value: JSON.parse(entry.value), + })); + return data; +} + +export async function getOrderedSetMemberScore(key: Key, member: any) { + const type = await cache.type(key); + if (type !== TYPES.ZSET) return null; + + return await cache.zScore(key, JSON.stringify(member)); +} + +export async function watch(key: Key | DynamicKeyType) { + return await cache.watch(key); +} + +export async function unwatch() { + return await cache.unwatch(); +} + +export async function expire(expireAt: Date, key: Key | DynamicKeyType) { + return await cache.pExpireAt(key, expireAt.getTime()); +} + +export async function expireMany(expireAt: Date, ...keys: string[]) { + let script = ''; + for (const key of keys) { + script += `redis.call('pExpireAt', '${key}',${expireAt.getTime()})`; + } + return await cache.eval(script); +} diff --git a/src/cache/repository/BlogCache.ts b/src/cache/repository/BlogCache.ts new file mode 100644 index 0000000..a3810cf --- /dev/null +++ b/src/cache/repository/BlogCache.ts @@ -0,0 +1,21 @@ +import { getJson, setJson } from '../query'; +import { Types } from 'mongoose'; +import Blog from '../../database/model/Blog'; +import { DynamicKey, getDynamicKey } from '../keys'; + +function getKey(blogId: Types.ObjectId) { + return getDynamicKey(DynamicKey.BLOG, blogId.toHexString()); +} + +async function save(blog: Blog, expireAt: Date) { + return setJson(getKey(blog._id), { ...blog }, expireAt); +} + +async function fetch(blogId: Types.ObjectId) { + return getJson(getKey(blogId)); +} + +export default { + save, + fetch, +}; diff --git a/src/cache/repository/BlogsCache.ts b/src/cache/repository/BlogsCache.ts new file mode 100644 index 0000000..6a05693 --- /dev/null +++ b/src/cache/repository/BlogsCache.ts @@ -0,0 +1,20 @@ +import { getListRange, setList } from '../query'; +import Blog from '../../database/model/Blog'; +import { DynamicKey, getDynamicKey } from '../keys'; + +function getTagKey(tag: string) { + return getDynamicKey(DynamicKey.BLOGS_TAG, tag); +} + +async function saveForTag(tag: string, blogs: Blog[], expireAt: Date) { + return setList(getTagKey(tag), blogs, expireAt); +} + +async function fetch(tag: string) { + return getListRange(getTagKey(tag)); +} + +export default { + saveForTag, + fetch, +}; diff --git a/src/config.ts b/src/config.ts index 7680573..26986e5 100644 --- a/src/config.ts +++ b/src/config.ts @@ -23,3 +23,9 @@ export const tokenInfo = { }; export const logDirectory = process.env.LOG_DIR; + +export const redis = { + host: process.env.REDIS_HOST || '', + port: parseInt(process.env.REDIS_PORT || '0'), + password: process.env.REDIS_USER_PASSWORD || '', +}; diff --git a/tests/.env.test.example b/tests/.env.test.example index a95d13b..caa1f4e 100644 --- a/tests/.env.test.example +++ b/tests/.env.test.example @@ -30,9 +30,10 @@ DB_USER=blogs-test-db-user # YOUR_TEST_MONGO_DB_USER_PWD DB_USER_PWD=changeit -# Redis -REDIS_CACHE_PORT=6379 -REDIS_CACHE_PASSWORD=changeit +# Redis +REDIS_HOST=redis +REDIS_PORT=6379 +REDIS_PASSWORD=changeit # Log # Example '/home/node/logs' From d744b29f165d987599593952e86bc1fabd8c32ba Mon Sep 17 00:00:00 2001 From: Janishar Ali Date: Wed, 14 Dec 2022 22:56:54 +0530 Subject: [PATCH 19/33] implement caching in routes --- .env.example | 3 +++ src/cache/keys.ts | 2 +- src/cache/repository/BlogCache.ts | 27 +++++++++++++++++++++------ src/cache/repository/BlogsCache.ts | 23 +++++++++++++++-------- src/config.ts | 4 ++++ src/database/model/ApiKey.ts | 2 ++ src/database/model/Blog.ts | 9 ++++++++- src/database/model/Keystore.ts | 3 ++- src/database/model/Role.ts | 2 ++ src/database/model/User.ts | 2 +- src/database/repository/BlogRepo.ts | 21 ++++++--------------- src/helpers/utils.ts | 5 +++++ src/routes/v1/blog/index.ts | 25 ++++++++++++++++++++----- src/routes/v1/blogs/index.ts | 16 ++++++++++++---- tests/.env.test.example | 3 +++ tests/routes/v1/blog/index/mock.ts | 2 +- 16 files changed, 106 insertions(+), 43 deletions(-) diff --git a/.env.example b/.env.example index fc04a03..fa657d1 100644 --- a/.env.example +++ b/.env.example @@ -52,3 +52,6 @@ ACCESS_TOKEN_VALIDITY_SEC=172800 REFRESH_TOKEN_VALIDITY_SEC=604800 TOKEN_ISSUER=api.dev.xyz.com TOKEN_AUDIENCE=xyz.com + +# Caching +CONTENT_CACHE_DURATION_MILLIS=600000 \ No newline at end of file diff --git a/src/cache/keys.ts b/src/cache/keys.ts index 1a9f38c..a333b57 100644 --- a/src/cache/keys.ts +++ b/src/cache/keys.ts @@ -3,7 +3,7 @@ export enum Key { } export enum DynamicKey { - BLOGS_TAG = 'BLOGS_TAG', + BLOGS_SIMILAR = 'BLOGS_SIMILAR', BLOG = 'BLOG', } diff --git a/src/cache/repository/BlogCache.ts b/src/cache/repository/BlogCache.ts index a3810cf..eb23366 100644 --- a/src/cache/repository/BlogCache.ts +++ b/src/cache/repository/BlogCache.ts @@ -2,20 +2,35 @@ import { getJson, setJson } from '../query'; import { Types } from 'mongoose'; import Blog from '../../database/model/Blog'; import { DynamicKey, getDynamicKey } from '../keys'; +import { caching } from '../../config'; +import { addMillisToCurrentDate } from '../../helpers/utils'; -function getKey(blogId: Types.ObjectId) { +function getKeyForId(blogId: Types.ObjectId) { return getDynamicKey(DynamicKey.BLOG, blogId.toHexString()); } -async function save(blog: Blog, expireAt: Date) { - return setJson(getKey(blog._id), { ...blog }, expireAt); +function getKeyForUrl(blogUrl: string) { + return getDynamicKey(DynamicKey.BLOG, blogUrl); } -async function fetch(blogId: Types.ObjectId) { - return getJson(getKey(blogId)); +async function save(blog: Blog) { + return setJson( + getKeyForId(blog._id), + { ...blog }, + addMillisToCurrentDate(caching.contentCacheDuration), + ); +} + +async function fetchById(blogId: Types.ObjectId) { + return getJson(getKeyForId(blogId)); +} + +async function fetchByUrl(blogUrl: string) { + return getJson(getKeyForUrl(blogUrl)); } export default { save, - fetch, + fetchById, + fetchByUrl, }; diff --git a/src/cache/repository/BlogsCache.ts b/src/cache/repository/BlogsCache.ts index 6a05693..01e1770 100644 --- a/src/cache/repository/BlogsCache.ts +++ b/src/cache/repository/BlogsCache.ts @@ -1,20 +1,27 @@ import { getListRange, setList } from '../query'; import Blog from '../../database/model/Blog'; import { DynamicKey, getDynamicKey } from '../keys'; +import { addMillisToCurrentDate } from '../../helpers/utils'; +import { caching } from '../../config'; +import { Types } from 'mongoose'; -function getTagKey(tag: string) { - return getDynamicKey(DynamicKey.BLOGS_TAG, tag); +function getKeyForSimilar(blogId: Types.ObjectId) { + return getDynamicKey(DynamicKey.BLOGS_SIMILAR, blogId.toHexString()); } -async function saveForTag(tag: string, blogs: Blog[], expireAt: Date) { - return setList(getTagKey(tag), blogs, expireAt); +async function saveSimilarBlogs(blogId: Types.ObjectId, blogs: Blog[]) { + return setList( + getKeyForSimilar(blogId), + blogs, + addMillisToCurrentDate(caching.contentCacheDuration), + ); } -async function fetch(tag: string) { - return getListRange(getTagKey(tag)); +async function fetchSimilarBlogs(blogId: Types.ObjectId) { + return getListRange(getKeyForSimilar(blogId)); } export default { - saveForTag, - fetch, + saveSimilarBlogs, + fetchSimilarBlogs, }; diff --git a/src/config.ts b/src/config.ts index 26986e5..9d56c62 100644 --- a/src/config.ts +++ b/src/config.ts @@ -29,3 +29,7 @@ export const redis = { port: parseInt(process.env.REDIS_PORT || '0'), password: process.env.REDIS_USER_PASSWORD || '', }; + +export const caching = { + contentCacheDuration: parseInt(process.env.CONTENT_CACHE_DURATION_MILLIS || '600000'), +}; \ No newline at end of file diff --git a/src/database/model/ApiKey.ts b/src/database/model/ApiKey.ts index 5ada427..b2f4260 100755 --- a/src/database/model/ApiKey.ts +++ b/src/database/model/ApiKey.ts @@ -74,4 +74,6 @@ const schema = new Schema( }, ); +schema.index({ key: 1, status: 1 }); + export const ApiKeyModel = model(DOCUMENT_NAME, schema, COLLECTION_NAME); diff --git a/src/database/model/Blog.ts b/src/database/model/Blog.ts index e30925f..acd9a99 100755 --- a/src/database/model/Blog.ts +++ b/src/database/model/Blog.ts @@ -142,9 +142,16 @@ const schema = new Schema( { versionKey: false, }, -).index( +); + +schema.index( { title: 'text', description: 'text' }, { weights: { title: 3, description: 1 }, background: false }, ); +schema.index({ _id: 1, status: 1 }); +schema.index({ blogUrl: 1, status: 1 }); +schema.index({ isPublished: 1, status: 1 }); +schema.index({ _id: 1, isPublished: 1, status: 1 }); +schema.index({ tag: 1, isPublished: 1, status: 1 }); export const BlogModel = model(DOCUMENT_NAME, schema, COLLECTION_NAME); diff --git a/src/database/model/Keystore.ts b/src/database/model/Keystore.ts index 9277ad4..f748a67 100755 --- a/src/database/model/Keystore.ts +++ b/src/database/model/Keystore.ts @@ -51,7 +51,8 @@ const schema = new Schema( }, ); -schema.index({ client: 1, primaryKey: 1 }); +schema.index({ client: 1 }); +schema.index({ client: 1, primaryKey: 1, status: 1 }); schema.index({ client: 1, primaryKey: 1, secondaryKey: 1 }); export const KeystoreModel = model(DOCUMENT_NAME, schema, COLLECTION_NAME); diff --git a/src/database/model/Role.ts b/src/database/model/Role.ts index 818956c..53c4236 100755 --- a/src/database/model/Role.ts +++ b/src/database/model/Role.ts @@ -45,4 +45,6 @@ const schema = new Schema( }, ); +schema.index({ code: 1, status: 1 }); + export const RoleModel = model(DOCUMENT_NAME, schema, COLLECTION_NAME); diff --git a/src/database/model/User.ts b/src/database/model/User.ts index d53a86a..9dbef6e 100755 --- a/src/database/model/User.ts +++ b/src/database/model/User.ts @@ -74,7 +74,7 @@ const schema = new Schema( ); schema.index({ _id: 1, status: 1 }); +schema.index({ email: 1 }); schema.index({ status: 1 }); -schema.index({ email: 1, status: 1 }); export const UserModel = model(DOCUMENT_NAME, schema, COLLECTION_NAME); diff --git a/src/database/repository/BlogRepo.ts b/src/database/repository/BlogRepo.ts index 181481c..c3c8e7c 100755 --- a/src/database/repository/BlogRepo.ts +++ b/src/database/repository/BlogRepo.ts @@ -24,22 +24,14 @@ async function findInfoById(id: Types.ObjectId): Promise { .exec(); } -async function findInfoWithTextById(id: Types.ObjectId): Promise { - return BlogModel.findOne({ _id: id, status: true }) +async function findInfoForPublishedById(id: Types.ObjectId): Promise { + return BlogModel.findOne({ _id: id, isPublished: true, status: true }) .select('+text') .populate('author', AUTHOR_DETAIL) .lean() .exec(); } -async function findInfoWithTextAndDraftTextById(id: Types.ObjectId): Promise { - return BlogModel.findOne({ _id: id, status: true }) - .select('+text +draftText +isSubmitted +isDraft +isPublished +status') - .populate('author', AUTHOR_DETAIL) - .lean() - .exec(); -} - async function findBlogAllDataById(id: Types.ObjectId): Promise { return BlogModel.findOne({ _id: id, status: true }) .select('+text +draftText +isSubmitted +isDraft +isPublished +status +createdBy +updatedBy') @@ -48,8 +40,8 @@ async function findBlogAllDataById(id: Types.ObjectId): Promise { .exec(); } -async function findByUrl(blogUrl: string): Promise { - return BlogModel.findOne({ blogUrl: blogUrl, status: true }) +async function findPublishedByUrl(blogUrl: string): Promise { + return BlogModel.findOne({ blogUrl: blogUrl, isPublished: true, status: true }) .select('+text') .populate('author', AUTHOR_DETAIL) .lean() @@ -182,10 +174,9 @@ export default { create, update, findInfoById, - findInfoWithTextById, - findInfoWithTextAndDraftTextById, + findInfoForPublishedById, findBlogAllDataById, - findByUrl, + findPublishedByUrl, findUrlIfExists, findByTagAndPaginated, findAllPublishedForAuthor, diff --git a/src/helpers/utils.ts b/src/helpers/utils.ts index 461393b..68b9cdc 100644 --- a/src/helpers/utils.ts +++ b/src/helpers/utils.ts @@ -1,4 +1,5 @@ import { Request } from 'express'; +import moment from 'moment'; import Logger from '../core/Logger'; export function findIpAddress(req: Request) { @@ -14,3 +15,7 @@ export function findIpAddress(req: Request) { return undefined; } } + +export function addMillisToCurrentDate(millis: number) { + return moment().add(millis, 'ms').toDate(); +} diff --git a/src/routes/v1/blog/index.ts b/src/routes/v1/blog/index.ts index 3f739b6..210a356 100644 --- a/src/routes/v1/blog/index.ts +++ b/src/routes/v1/blog/index.ts @@ -8,6 +8,7 @@ import BlogRepo from '../../../database/repository/BlogRepo'; import { Types } from 'mongoose'; import writer from './writer'; import editor from './editor'; +import BlogCache from '../../../cache/repository/BlogCache'; const router = express.Router(); @@ -18,9 +19,16 @@ router.get( '/url', validator(schema.blogUrl, ValidationSource.QUERY), asyncHandler(async (req, res) => { - const blog = await BlogRepo.findByUrl(req.query.endpoint as string); - if (!blog) throw new BadRequestError('Blog do not exists'); - new SuccessResponse('success', blog).send(res); + const blogUrl = req.query.endpoint as string; + let blog = await BlogCache.fetchByUrl(blogUrl); + + if (!blog) { + blog = await BlogRepo.findPublishedByUrl(blogUrl); + if (blog) await BlogCache.save(blog); + } + + if (!blog) throw new BadRequestError('Blog not found'); + return new SuccessResponse('success', blog).send(res); }), ); @@ -28,8 +36,15 @@ router.get( '/id/:id', validator(schema.blogId, ValidationSource.PARAM), asyncHandler(async (req, res) => { - const blog = await BlogRepo.findInfoWithTextById(new Types.ObjectId(req.params.id)); - if (!blog) throw new BadRequestError('Blog do not exists'); + const blogId = new Types.ObjectId(req.params.id); + let blog = await BlogCache.fetchById(blogId); + + if (!blog) { + blog = await BlogRepo.findInfoForPublishedById(new Types.ObjectId(req.params.id)); + if (blog) await BlogCache.save(blog); + } + + if (!blog) throw new BadRequestError('Blog not found'); return new SuccessResponse('success', blog).send(res); }), ); diff --git a/src/routes/v1/blogs/index.ts b/src/routes/v1/blogs/index.ts index bf37d03..61c9ef8 100644 --- a/src/routes/v1/blogs/index.ts +++ b/src/routes/v1/blogs/index.ts @@ -7,6 +7,7 @@ import { BadRequestError } from '../../../core/ApiError'; import BlogRepo from '../../../database/repository/BlogRepo'; import { Types } from 'mongoose'; import User from '../../../database/model/User'; +import BlogsCache from '../../../cache/repository/BlogsCache'; const router = express.Router(); @@ -51,11 +52,18 @@ router.get( '/similar/id/:id', validator(schema.blogId, ValidationSource.PARAM), asyncHandler(async (req, res) => { - const blog = await BlogRepo.findBlogAllDataById(new Types.ObjectId(req.params.id)); - if (!blog || !blog.isPublished) throw new BadRequestError('Blog is not available'); + const blogId = new Types.ObjectId(req.params.id); + let blogs = await BlogsCache.fetchSimilarBlogs(blogId); - const blogs = await BlogRepo.searchSimilarBlogs(blog, 6); - return new SuccessResponse('success', blogs).send(res); + if (!blogs) { + const blog = await BlogRepo.findInfoForPublishedById(new Types.ObjectId(req.params.id)); + if (!blog) throw new BadRequestError('Blog is not available'); + blogs = await BlogRepo.searchSimilarBlogs(blog, 6); + + if (blogs && blogs.length > 0) await BlogsCache.saveSimilarBlogs(blogId, blogs); + } + + return new SuccessResponse('success', blogs ? blogs : []).send(res); }), ); diff --git a/tests/.env.test.example b/tests/.env.test.example index caa1f4e..ab8d823 100644 --- a/tests/.env.test.example +++ b/tests/.env.test.example @@ -47,3 +47,6 @@ ACCESS_TOKEN_VALIDITY_SEC=172800 REFRESH_TOKEN_VALIDITY_SEC=604800 TOKEN_ISSUER=api.dev.xyz.com TOKEN_AUDIENCE=xyz.com + +# Caching +CONTENT_CACHE_DURATION_MILLIS=5000 \ No newline at end of file diff --git a/tests/routes/v1/blog/index/mock.ts b/tests/routes/v1/blog/index/mock.ts index e7ab499..23d0f16 100644 --- a/tests/routes/v1/blog/index/mock.ts +++ b/tests/routes/v1/blog/index/mock.ts @@ -30,7 +30,7 @@ jest.mock('../../../../../src/database/repository/BlogRepo', () => ({ get findByUrl() { return mockBlogFindByUrl; }, - get findInfoWithTextById() { + get findInfoForPublishedById() { return mockFindInfoWithTextById; }, })); From 8e72035da963cf4e27d0fc8fd131423d583807bb Mon Sep 17 00:00:00 2001 From: Janishar Ali Date: Thu, 15 Dec 2022 00:16:50 +0530 Subject: [PATCH 20/33] fix seed user --- addons/init-mongo.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/addons/init-mongo.js b/addons/init-mongo.js index b303b78..8a4d070 100644 --- a/addons/init-mongo.js +++ b/addons/init-mongo.js @@ -30,6 +30,13 @@ function seed(dbName, user, password) { name: 'Admin', email: 'admin@xyz.com', password: '$2a$10$psWmSrmtyZYvtIt/FuJL1OLqsK3iR1fZz5.wUYFuSNkkt.EOX9mLa', // hash of password: changeit + roles: db.roles + .find({}) + .toArray() + .map((role) => role._id), + status: true, + createdAt: new Date(), + updatedAt: new Date(), }); } From 72026a24d03a2d39cd89a1bbf40b78af9a3772e9 Mon Sep 17 00:00:00 2001 From: Janishar Ali Date: Thu, 15 Dec 2022 00:54:08 +0530 Subject: [PATCH 21/33] fix redis connection --- .gitignore | 1 + src/cache/index.ts | 2 +- src/config.ts | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index dd5f7d5..47155bd 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,7 @@ coverage # Environment varibles *.env *.env.test +*.env copy #keys keys/* diff --git a/src/cache/index.ts b/src/cache/index.ts index 6c4197f..a8069ce 100644 --- a/src/cache/index.ts +++ b/src/cache/index.ts @@ -2,7 +2,7 @@ import { redis } from '../config'; import { createClient } from 'redis'; import Logger from '../core/Logger'; -const redisURL = `redis://${redis.password}@${redis.host}:${redis.port}`; +const redisURL = `redis://:${redis.password}@${redis.host}:${redis.port}`; const client = createClient({ url: redisURL }); diff --git a/src/config.ts b/src/config.ts index 9d56c62..ca5c52b 100644 --- a/src/config.ts +++ b/src/config.ts @@ -27,7 +27,7 @@ export const logDirectory = process.env.LOG_DIR; export const redis = { host: process.env.REDIS_HOST || '', port: parseInt(process.env.REDIS_PORT || '0'), - password: process.env.REDIS_USER_PASSWORD || '', + password: process.env.REDIS_PASSWORD || '', }; export const caching = { From 10b57170e80feb352b2a191956016aaaee2a3213 Mon Sep 17 00:00:00 2001 From: Janishar Ali Date: Mon, 19 Dec 2022 13:23:43 +0530 Subject: [PATCH 22/33] update apikey unit test --- tests/.env.test.example | 8 +++++--- tests/auth/apikey/mock.ts | 10 ++++++---- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/tests/.env.test.example b/tests/.env.test.example index ab8d823..fe528c2 100644 --- a/tests/.env.test.example +++ b/tests/.env.test.example @@ -7,7 +7,7 @@ NODE_ENV=test TZ=UTC # Server listen to this port -PORT=3000 +PORT=3001 #Cors CORS_URL=* @@ -20,7 +20,8 @@ DB_MAX_POOL_SIZE=5 #localhost or IP of the server # YOUR_TEST_MONGO_DB_HOST_NAME -DB_HOST=mongo +DB_HOST=localhost +# DB_HOST=mongo DB_PORT=27017 @@ -31,7 +32,8 @@ DB_USER=blogs-test-db-user DB_USER_PWD=changeit # Redis -REDIS_HOST=redis +REDIS_HOST=localhost +# REDIS_HOST=redis REDIS_PORT=6379 REDIS_PASSWORD=changeit diff --git a/tests/auth/apikey/mock.ts b/tests/auth/apikey/mock.ts index 8787c20..94bf7ff 100644 --- a/tests/auth/apikey/mock.ts +++ b/tests/auth/apikey/mock.ts @@ -3,12 +3,14 @@ import ApiKey from '../../../src/database/model/ApiKey'; export const API_KEY = 'abc'; export const mockFindApiKey = jest.fn(async (key: string) => { - if (key == API_KEY) return { key: API_KEY } as ApiKey; + if (key == API_KEY) + return { + key: API_KEY, + permissions: ['GENERAL'], + } as ApiKey; else return null; }); jest.mock('../../../src/database/repository/ApiKeyRepo', () => ({ - get findByKey() { - return mockFindApiKey; - }, + findByKey: mockFindApiKey, })); From 7285550ac119e822455ea3f6a08d8ff0495bcc54 Mon Sep 17 00:00:00 2001 From: Janishar Ali Date: Mon, 19 Dec 2022 13:44:19 +0530 Subject: [PATCH 23/33] update mock function --- tests/auth/authentication/mock.ts | 8 ++------ tests/auth/authorization/mock.ts | 10 +++------- tests/routes/v1/blog/index/mock.ts | 8 ++------ tests/routes/v1/blog/writer/mock.ts | 16 ++++------------ tests/routes/v1/login/mock.ts | 8 ++------ tests/routes/v1/signup/mock.ts | 8 ++------ 6 files changed, 15 insertions(+), 43 deletions(-) diff --git a/tests/auth/authentication/mock.ts b/tests/auth/authentication/mock.ts index 6495a18..73ec478 100644 --- a/tests/auth/authentication/mock.ts +++ b/tests/auth/authentication/mock.ts @@ -39,15 +39,11 @@ export const mockKeystoreFindForKey = jest.fn( ); jest.mock('../../../src/database/repository/UserRepo', () => ({ - get findById() { - return mockUserFindById; - }, + findById: mockUserFindById, })); jest.mock('../../../src/database/repository/KeystoreRepo', () => ({ - get findforKey() { - return mockKeystoreFindForKey; - }, + findforKey: mockKeystoreFindForKey, })); JWT.validate = mockJwtValidate; diff --git a/tests/auth/authorization/mock.ts b/tests/auth/authorization/mock.ts index 127dc95..187a93f 100644 --- a/tests/auth/authorization/mock.ts +++ b/tests/auth/authorization/mock.ts @@ -68,7 +68,7 @@ export const mockRoleRepoFindByCode = jest.fn(async (code: string): Promise => { - let subject = null; + let subject: null | string = null; switch (token) { case ACCESS_TOKEN: subject = USER_ID.toHexString(); @@ -93,15 +93,11 @@ export const mockJwtValidate = jest.fn(async (token: string): Promise ({ - get findById() { - return mockUserFindById; - }, + findById: mockUserFindById, })); jest.mock('../../../src/database/repository/RoleRepo', () => ({ - get findByCode() { - return mockRoleRepoFindByCode; - }, + findByCode: mockRoleRepoFindByCode, })); JWT.validate = mockJwtValidate; diff --git a/tests/routes/v1/blog/index/mock.ts b/tests/routes/v1/blog/index/mock.ts index 23d0f16..959fc3d 100644 --- a/tests/routes/v1/blog/index/mock.ts +++ b/tests/routes/v1/blog/index/mock.ts @@ -27,10 +27,6 @@ export const mockFindInfoWithTextById = jest.fn( ); jest.mock('../../../../../src/database/repository/BlogRepo', () => ({ - get findByUrl() { - return mockBlogFindByUrl; - }, - get findInfoForPublishedById() { - return mockFindInfoWithTextById; - }, + findByUrl: mockBlogFindByUrl, + findInfoForPublishedById: mockFindInfoWithTextById, })); diff --git a/tests/routes/v1/blog/writer/mock.ts b/tests/routes/v1/blog/writer/mock.ts index 2bcacf1..f30145d 100644 --- a/tests/routes/v1/blog/writer/mock.ts +++ b/tests/routes/v1/blog/writer/mock.ts @@ -45,16 +45,8 @@ export const mockFindBlogAllDataById = jest.fn(async (id: Types.ObjectId): Promi }); jest.mock('../../../../../src/database/repository/BlogRepo', () => ({ - get findUrlIfExists() { - return mockBlogFindUrlIfExists; - }, - get create() { - return mockBlogCreate; - }, - get update() { - return mockBlogUpdate; - }, - get findBlogAllDataById() { - return mockFindBlogAllDataById; - }, + findUrlIfExists: mockBlogFindUrlIfExists, + create: mockBlogCreate, + update: mockBlogUpdate, + findBlogAllDataById: mockFindBlogAllDataById, })); diff --git a/tests/routes/v1/login/mock.ts b/tests/routes/v1/login/mock.ts index c4db54f..264cd73 100644 --- a/tests/routes/v1/login/mock.ts +++ b/tests/routes/v1/login/mock.ts @@ -39,15 +39,11 @@ export const mockUserFindByEmail = jest.fn(async (email: string): Promise ({ - get create() { - return mockKeystoreCreate; - }, + create: mockKeystoreCreate, })); jest.mock('../../../../src/database/repository/UserRepo', () => ({ - get findByEmail() { - return mockUserFindByEmail; - }, + findByEmail: mockUserFindByEmail, })); jest.unmock('../../../../src/auth/authUtils'); // remove any override made anywhere diff --git a/tests/routes/v1/signup/mock.ts b/tests/routes/v1/signup/mock.ts index 461382f..29a5886 100644 --- a/tests/routes/v1/signup/mock.ts +++ b/tests/routes/v1/signup/mock.ts @@ -32,10 +32,6 @@ export const mockUserCreate = jest.fn( ); jest.mock('../../../../src/database/repository/UserRepo', () => ({ - get findByEmail() { - return mockUserFindByEmail; - }, // utilising already defined mock - get create() { - return mockUserCreate; - }, + findByEmail: mockUserFindByEmail, // utilising already defined mock + create: mockUserCreate, })); From 16a19409552f1b73f525fdb76725b1bb2cb0a4c7 Mon Sep 17 00:00:00 2001 From: Janishar Ali Date: Mon, 19 Dec 2022 16:16:27 +0530 Subject: [PATCH 24/33] migrate authorization tests --- tests/auth/authUtils/unit.test.ts | 6 ++-- tests/auth/authorization/mock.ts | 51 +++++++++++++++------------ tests/auth/authorization/unit.test.ts | 20 +++++------ 3 files changed, 42 insertions(+), 35 deletions(-) diff --git a/tests/auth/authUtils/unit.test.ts b/tests/auth/authUtils/unit.test.ts index 100105d..e7cb260 100644 --- a/tests/auth/authUtils/unit.test.ts +++ b/tests/auth/authUtils/unit.test.ts @@ -17,7 +17,7 @@ describe('authUtils validateTokenData tests', () => { tokenInfo.audience, 'abc', ACCESS_TOKEN_KEY, - tokenInfo.accessTokenValidityDays, + tokenInfo.accessTokenValidity, ); try { @@ -33,7 +33,7 @@ describe('authUtils validateTokenData tests', () => { tokenInfo.audience, new Types.ObjectId().toHexString(), '123', - tokenInfo.accessTokenValidityDays, + tokenInfo.accessTokenValidity, ); try { @@ -49,7 +49,7 @@ describe('authUtils validateTokenData tests', () => { tokenInfo.audience, new Types.ObjectId().toHexString(), // Random Key ACCESS_TOKEN_KEY, - tokenInfo.accessTokenValidityDays, + tokenInfo.accessTokenValidity, ); const validatedPayload = validateTokenData(payload); diff --git a/tests/auth/authorization/mock.ts b/tests/auth/authorization/mock.ts index 187a93f..4c57934 100644 --- a/tests/auth/authorization/mock.ts +++ b/tests/auth/authorization/mock.ts @@ -43,28 +43,35 @@ export const mockUserFindById = jest.fn(async (id: Types.ObjectId) => { else return null; }); -export const mockRoleRepoFindByCode = jest.fn(async (code: string): Promise => { - switch (code) { - case RoleCode.WRITER: - return { - _id: WRITER_ROLE_ID, - code: RoleCode.WRITER, - status: true, - } as Role; - case RoleCode.EDITOR: - return { - _id: EDITOR_ROLE_ID, - code: RoleCode.EDITOR, - status: true, - } as Role; - case RoleCode.LEARNER: - return { - _id: LEARNER_ROLE_ID, - code: RoleCode.LEARNER, - status: true, - } as Role; +export const mockRoleRepoFindByCodes = jest.fn(async (codes: string[]): Promise => { + const results: Role[] = []; + for (const code of codes) { + switch (code) { + case RoleCode.WRITER: + results.push({ + _id: WRITER_ROLE_ID, + code: RoleCode.WRITER, + status: true, + } as Role); + break; + case RoleCode.EDITOR: + results.push({ + _id: EDITOR_ROLE_ID, + code: RoleCode.EDITOR, + status: true, + } as Role); + break; + case RoleCode.LEARNER: + results.push({ + _id: LEARNER_ROLE_ID, + code: RoleCode.LEARNER, + status: true, + } as Role); + break; + } } - return null; + + return results; }); export const mockJwtValidate = jest.fn(async (token: string): Promise => { @@ -97,7 +104,7 @@ jest.mock('../../../src/database/repository/UserRepo', () => ({ })); jest.mock('../../../src/database/repository/RoleRepo', () => ({ - findByCode: mockRoleRepoFindByCode, + findByCodes: mockRoleRepoFindByCodes, })); JWT.validate = mockJwtValidate; diff --git a/tests/auth/authorization/unit.test.ts b/tests/auth/authorization/unit.test.ts index 5321f96..62708ad 100644 --- a/tests/auth/authorization/unit.test.ts +++ b/tests/auth/authorization/unit.test.ts @@ -1,19 +1,19 @@ import { addAuthHeaders } from '../authentication/mock'; // import the mock for the current test after all other mock imports -// this will prevent the different implementations by the other mock -import { mockRoleRepoFindByCode, mockUserFindById, EDITOR_ACCESS_TOKEN } from './mock'; +// this will prevent the different implementations for same function by the other mocks +import { mockRoleRepoFindByCodes, mockUserFindById, EDITOR_ACCESS_TOKEN } from './mock'; import app from '../../../src/app'; import supertest from 'supertest'; import { RoleCode } from '../../../src/database/model/Role'; describe('authentication validation for editor', () => { - const endpoint = '/v1/editor/blog/test'; + const endpoint = '/v1/blog/editor/test'; const request = supertest(app); beforeEach(() => { - mockRoleRepoFindByCode.mockClear(); + mockRoleRepoFindByCodes.mockClear(); mockUserFindById.mockClear(); }); @@ -21,26 +21,26 @@ describe('authentication validation for editor', () => { const response = await addAuthHeaders(request.get(endpoint)); expect(response.status).toBe(401); expect(response.body.message).toMatch(/denied/); - expect(mockRoleRepoFindByCode).toBeCalledTimes(1); + expect(mockRoleRepoFindByCodes).toBeCalledTimes(1); expect(mockUserFindById).toBeCalledTimes(1); - expect(mockRoleRepoFindByCode).toBeCalledWith(RoleCode.EDITOR); + expect(mockRoleRepoFindByCodes).toBeCalledWith([RoleCode.ADMIN, RoleCode.EDITOR]); }); }); describe('authentication validation for writer', () => { - const endpoint = '/v1/writer/blog/test'; + const endpoint = '/v1/blog/writer/test'; const request = supertest(app); beforeEach(() => { - mockRoleRepoFindByCode.mockClear(); + mockRoleRepoFindByCodes.mockClear(); mockUserFindById.mockClear(); }); it('Should response with 404 if user have writer role', async () => { const response = await addAuthHeaders(request.get(endpoint), EDITOR_ACCESS_TOKEN); expect(response.status).toBe(404); - expect(mockRoleRepoFindByCode).toBeCalledTimes(1); + expect(mockRoleRepoFindByCodes).toBeCalledTimes(1); expect(mockUserFindById).toBeCalledTimes(1); - expect(mockRoleRepoFindByCode).toBeCalledWith(RoleCode.WRITER); + expect(mockRoleRepoFindByCodes).toBeCalledWith([RoleCode.WRITER]); }); }); From 08e6e3a36e38a37b0b0c82443f1f9729f13b5665 Mon Sep 17 00:00:00 2001 From: Janishar Ali Date: Mon, 19 Dec 2022 16:20:59 +0530 Subject: [PATCH 25/33] migrate jwt tests --- tests/core/jwt/unit.test.ts | 32 ++++---------------------------- 1 file changed, 4 insertions(+), 28 deletions(-) diff --git a/tests/core/jwt/unit.test.ts b/tests/core/jwt/unit.test.ts index 89ab41b..8a20558 100644 --- a/tests/core/jwt/unit.test.ts +++ b/tests/core/jwt/unit.test.ts @@ -9,11 +9,11 @@ describe('JWT class tests', () => { const param = 'param'; const validity = 1; - it('Should throw error for invalid token in JWT.decode', async () => { - beforeEach(() => { - readFileSpy.mockClear(); - }); + beforeEach(() => { + readFileSpy.mockClear(); + }); + it('Should throw error for invalid token in JWT.decode', async () => { try { await JWT.decode('abc'); } catch (e) { @@ -24,10 +24,6 @@ describe('JWT class tests', () => { }); it('Should generate a token for JWT.encode', async () => { - beforeEach(() => { - readFileSpy.mockClear(); - }); - const payload = new JwtPayload(issuer, audience, subject, param, validity); const token = await JWT.encode(payload); @@ -36,10 +32,6 @@ describe('JWT class tests', () => { }); it('Should decode a valid token for JWT.decode', async () => { - beforeEach(() => { - readFileSpy.mockClear(); - }); - const payload = new JwtPayload(issuer, audience, subject, param, validity); const token = await JWT.encode(payload); const decoded = await JWT.decode(token); @@ -49,10 +41,6 @@ describe('JWT class tests', () => { }); it('Should parse an expired token for JWT.decode', async () => { - beforeEach(() => { - readFileSpy.mockClear(); - }); - const time = Math.floor(Date.now() / 1000); const payload = { @@ -71,10 +59,6 @@ describe('JWT class tests', () => { }); it('Should throw error for invalid token in JWT.validate', async () => { - beforeEach(() => { - readFileSpy.mockClear(); - }); - try { await JWT.validate('abc'); } catch (e) { @@ -85,10 +69,6 @@ describe('JWT class tests', () => { }); it('Should validate a valid token for JWT.validate', async () => { - beforeEach(() => { - readFileSpy.mockClear(); - }); - const payload = new JwtPayload(issuer, audience, subject, param, validity); const token = await JWT.encode(payload); const decoded = await JWT.validate(token); @@ -98,10 +78,6 @@ describe('JWT class tests', () => { }); it('Should validate a token expiry for JWT.validate', async () => { - beforeEach(() => { - readFileSpy.mockClear(); - }); - const time = Math.floor(Date.now() / 1000); const payload = { From 319a4099046fbf1aa42af8b0dd90becbfde66355 Mon Sep 17 00:00:00 2001 From: Janishar Ali Date: Mon, 19 Dec 2022 16:29:55 +0530 Subject: [PATCH 26/33] fix signup test --- src/routes/v1/index.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/routes/v1/index.ts b/src/routes/v1/index.ts index 3be67ba..045ced9 100644 --- a/src/routes/v1/index.ts +++ b/src/routes/v1/index.ts @@ -2,6 +2,7 @@ import express from 'express'; import apikey from '../../auth/apikey'; import permission from '../../helpers/permission'; import { Permission } from '../../database/model/ApiKey'; +import signup from './access/signup'; import login from './access/login'; import logout from './access/logout'; import token from './access/token'; @@ -15,10 +16,10 @@ const router = express.Router(); /*---------------------------------------------------------*/ router.use(apikey); /*---------------------------------------------------------*/ - /*---------------------------------------------------------*/ router.use(permission(Permission.GENERAL)); /*---------------------------------------------------------*/ +router.use('/signup', signup); router.use('/login', login); router.use('/logout', logout); router.use('/token', token); From 10f085b2530fedfe5bd9bf64f0893d504faffe3f Mon Sep 17 00:00:00 2001 From: Janishar Ali Date: Mon, 19 Dec 2022 21:42:49 +0530 Subject: [PATCH 27/33] migrate blog test --- src/routes/v1/blog/index.ts | 10 +-- tests/routes/v1/blog/index/mock.ts | 53 +++++++++++- tests/routes/v1/blog/index/unit.test.ts | 102 +++++++++++++++++++----- 3 files changed, 138 insertions(+), 27 deletions(-) diff --git a/src/routes/v1/blog/index.ts b/src/routes/v1/blog/index.ts index 210a356..f65b455 100644 --- a/src/routes/v1/blog/index.ts +++ b/src/routes/v1/blog/index.ts @@ -3,7 +3,7 @@ import { SuccessResponse } from '../../../core/ApiResponse'; import asyncHandler from '../../../helpers/asyncHandler'; import validator, { ValidationSource } from '../../../helpers/validator'; import schema from './schema'; -import { BadRequestError } from '../../../core/ApiError'; +import { NotFoundError } from '../../../core/ApiError'; import BlogRepo from '../../../database/repository/BlogRepo'; import { Types } from 'mongoose'; import writer from './writer'; @@ -21,13 +21,13 @@ router.get( asyncHandler(async (req, res) => { const blogUrl = req.query.endpoint as string; let blog = await BlogCache.fetchByUrl(blogUrl); - + if (!blog) { blog = await BlogRepo.findPublishedByUrl(blogUrl); if (blog) await BlogCache.save(blog); } - - if (!blog) throw new BadRequestError('Blog not found'); + + if (!blog) throw new NotFoundError('Blog not found'); return new SuccessResponse('success', blog).send(res); }), ); @@ -44,7 +44,7 @@ router.get( if (blog) await BlogCache.save(blog); } - if (!blog) throw new BadRequestError('Blog not found'); + if (!blog) throw new NotFoundError('Blog not found'); return new SuccessResponse('success', blog).send(res); }), ); diff --git a/tests/routes/v1/blog/index/mock.ts b/tests/routes/v1/blog/index/mock.ts index 959fc3d..6a22e14 100644 --- a/tests/routes/v1/blog/index/mock.ts +++ b/tests/routes/v1/blog/index/mock.ts @@ -4,29 +4,74 @@ import { Types } from 'mongoose'; jest.unmock('../../../../../src/database/repository/BlogRepo'); export const BLOG_ID = new Types.ObjectId(); +export const BLOG_2_ID = new Types.ObjectId(); + export const BLOG_URL = 'abc'; +export const BLOG_2_URL = 'abc2'; + +export const mockBlogCacheFetchByUrl = jest.fn(async (blogUrl: string): Promise => { + if (blogUrl === BLOG_URL) + return { + _id: BLOG_ID, + blogUrl: blogUrl, + } as Blog; + return null; +}); + +export const mockBlogCacheFetchById = jest.fn(async (id: Types.ObjectId): Promise => { + if (BLOG_ID.equals(id)) + return { + _id: BLOG_ID, + blogUrl: BLOG_URL, + } as Blog; + return null; +}); + +export const mockBlogCacheSave = jest.fn(async (blog: Blog): Promise => { + return JSON.stringify(blog); +}); -export const mockBlogFindByUrl = jest.fn(async (blogUrl: string): Promise => { +export const mockPublishedBlogFindByUrl = jest.fn(async (blogUrl: string): Promise => { if (blogUrl === BLOG_URL) return { _id: BLOG_ID, blogUrl: blogUrl, } as Blog; + + if (blogUrl === BLOG_2_URL) + return { + _id: BLOG_2_ID, + blogUrl: blogUrl, + } as Blog; + return null; }); -export const mockFindInfoWithTextById = jest.fn( +export const mockPublishedBlogFindById = jest.fn( async (id: Types.ObjectId): Promise => { if (BLOG_ID.equals(id)) return { _id: BLOG_ID, blogUrl: BLOG_URL, } as Blog; + + if (BLOG_2_ID.equals(id)) + return { + _id: BLOG_2_ID, + blogUrl: BLOG_2_URL, + } as Blog; + return null; }, ); +jest.mock('../../../../../src/cache/repository/BlogCache', () => ({ + save: mockBlogCacheSave, + fetchByUrl: mockBlogCacheFetchByUrl, + fetchById: mockBlogCacheFetchById, +})); + jest.mock('../../../../../src/database/repository/BlogRepo', () => ({ - findByUrl: mockBlogFindByUrl, - findInfoForPublishedById: mockFindInfoWithTextById, + findPublishedByUrl: mockPublishedBlogFindByUrl, + findInfoForPublishedById: mockPublishedBlogFindById, })); diff --git a/tests/routes/v1/blog/index/unit.test.ts b/tests/routes/v1/blog/index/unit.test.ts index ce738de..1cf3af0 100644 --- a/tests/routes/v1/blog/index/unit.test.ts +++ b/tests/routes/v1/blog/index/unit.test.ts @@ -1,6 +1,16 @@ import { addHeaders } from '../../../../auth/authentication/mock'; -import { mockBlogFindByUrl, mockFindInfoWithTextById, BLOG_ID, BLOG_URL } from './mock'; +import { + mockBlogCacheFetchById, + mockBlogCacheFetchByUrl, + mockBlogCacheSave, + mockPublishedBlogFindByUrl, + mockPublishedBlogFindById, + BLOG_ID, + BLOG_URL, + BLOG_2_URL, + BLOG_2_ID, +} from './mock'; import supertest from 'supertest'; import app from '../../../../../src/app'; @@ -8,7 +18,9 @@ import { Types } from 'mongoose'; describe('BlogDetail by URL route', () => { beforeEach(() => { - mockBlogFindByUrl.mockClear(); + mockBlogCacheFetchByUrl.mockClear(); + mockBlogCacheSave.mockClear(); + mockPublishedBlogFindByUrl.mockClear(); }); const request = supertest(app); @@ -19,7 +31,7 @@ describe('BlogDetail by URL route', () => { expect(response.status).toBe(400); expect(response.body.message).toMatch(/endpoint/); expect(response.body.message).toMatch(/required/); - expect(mockBlogFindByUrl).not.toBeCalled(); + expect(mockPublishedBlogFindByUrl).not.toBeCalled(); }); it('Should send error when url endpoint is more that 200 chars', async () => { @@ -28,31 +40,60 @@ describe('BlogDetail by URL route', () => { expect(response.status).toBe(400); expect(response.body.message).toMatch(/length must/); expect(response.body.message).toMatch(/200/); - expect(mockBlogFindByUrl).not.toBeCalled(); + expect(mockPublishedBlogFindByUrl).not.toBeCalled(); }); it('Should send error when blog do not exists for url', async () => { const response = await addHeaders(request.get(endpoint).query({ endpoint: 'xyz' })); - expect(response.status).toBe(400); - expect(response.body.message).toMatch(/do not exists/); - expect(mockBlogFindByUrl).toBeCalledTimes(1); - expect(mockBlogFindByUrl).toBeCalledWith('xyz'); + expect(response.status).toBe(404); + expect(response.body.message).toMatch(/not found/); + expect(mockBlogCacheFetchByUrl).toBeCalledTimes(1); + expect(mockBlogCacheFetchByUrl).toBeCalledWith('xyz'); + expect(mockBlogCacheSave).not.toBeCalled(); + expect(mockPublishedBlogFindByUrl).toBeCalledTimes(1); + expect(mockPublishedBlogFindByUrl).toBeCalledWith('xyz'); }); - it('Should send data when blog exists for url', async () => { + it('Should send cache data when blog exists for url in cache', async () => { const response = await addHeaders(request.get(endpoint).query({ endpoint: BLOG_URL })); expect(response.status).toBe(200); expect(response.body.message).toMatch(/success/); expect(response.body.data).toBeDefined(); expect(response.body.data).toHaveProperty('_id'); - expect(mockBlogFindByUrl).toBeCalledTimes(1); - expect(mockBlogFindByUrl).toBeCalledWith(BLOG_URL); + + expect(mockBlogCacheFetchByUrl).toBeCalledTimes(1); + expect(mockBlogCacheFetchByUrl).toBeCalledWith(BLOG_URL); + expect(mockBlogCacheFetchByUrl).toReturnTimes(1); + + expect(mockPublishedBlogFindByUrl).not.toBeCalled(); + expect(mockBlogCacheSave).not.toBeCalled(); + }); + + it('Should send database data when blog dont exists for url in cache', async () => { + const response = await addHeaders(request.get(endpoint).query({ endpoint: BLOG_2_URL })); + expect(response.status).toBe(200); + expect(response.body.message).toMatch(/success/); + expect(response.body.data).toBeDefined(); + expect(response.body.data).toHaveProperty('_id'); + + expect(mockBlogCacheFetchByUrl).toBeCalledTimes(1); + expect(mockBlogCacheFetchByUrl).toBeCalledWith(BLOG_2_URL); + expect(mockBlogCacheFetchByUrl).toReturnTimes(1); + + expect(mockPublishedBlogFindByUrl).toBeCalledTimes(1); + expect(mockPublishedBlogFindByUrl).toBeCalledWith(BLOG_2_URL); + expect(mockPublishedBlogFindByUrl).toReturnTimes(1); + + expect(mockBlogCacheSave).toBeCalledTimes(1); + expect(mockBlogCacheSave).toReturnTimes(1); }); }); describe('BlogDetail by id route', () => { beforeEach(() => { - mockFindInfoWithTextById.mockClear(); + mockBlogCacheFetchById.mockClear(); + mockBlogCacheSave.mockClear(); + mockPublishedBlogFindById.mockClear(); }); const request = supertest(app); @@ -62,22 +103,47 @@ describe('BlogDetail by id route', () => { const response = await addHeaders(request.get(endpoint + 'abc')); expect(response.status).toBe(400); expect(response.body.message).toMatch(/invalid/); - expect(mockFindInfoWithTextById).not.toBeCalled(); + expect(mockPublishedBlogFindById).not.toBeCalled(); }); it('Should send error when blog do not exists for id', async () => { const response = await addHeaders(request.get(endpoint + new Types.ObjectId().toHexString())); - expect(response.status).toBe(400); - expect(response.body.message).toMatch(/do not exists/); - expect(mockFindInfoWithTextById).toBeCalledTimes(1); + expect(response.status).toBe(404); + expect(response.body.message).toMatch(/not found/); + expect(mockPublishedBlogFindById).toBeCalledTimes(1); }); - it('Should send data when blog exists for id', async () => { + it('Should send cache data when blog exists for id in cache', async () => { const response = await addHeaders(request.get(endpoint + BLOG_ID.toHexString())); expect(response.status).toBe(200); expect(response.body.message).toMatch(/success/); expect(response.body.data).toBeDefined(); expect(response.body.data).toHaveProperty('_id'); - expect(mockFindInfoWithTextById).toBeCalledTimes(1); + + expect(mockBlogCacheFetchById).toBeCalledTimes(1); + expect(mockBlogCacheFetchById).toBeCalledWith(BLOG_ID); + expect(mockBlogCacheFetchById).toReturnTimes(1); + + expect(mockPublishedBlogFindById).not.toBeCalled(); + expect(mockBlogCacheSave).not.toBeCalled(); + }); + + it('Should send database data when blog dont exists for url in cache', async () => { + const response = await addHeaders(request.get(endpoint + BLOG_2_ID.toHexString())); + expect(response.status).toBe(200); + expect(response.body.message).toMatch(/success/); + expect(response.body.data).toBeDefined(); + expect(response.body.data).toHaveProperty('_id'); + + expect(mockBlogCacheFetchById).toBeCalledTimes(1); + expect(mockBlogCacheFetchById).toBeCalledWith(BLOG_2_ID); + expect(mockBlogCacheFetchById).toReturnTimes(1); + + expect(mockPublishedBlogFindById).toBeCalledTimes(1); + expect(mockPublishedBlogFindById).toBeCalledWith(BLOG_2_ID); + expect(mockPublishedBlogFindById).toReturnTimes(1); + + expect(mockBlogCacheSave).toBeCalledTimes(1); + expect(mockBlogCacheSave).toReturnTimes(1); }); }); From d9539a9e0a860640cb7b2ed327d6ab9a79eccf56 Mon Sep 17 00:00:00 2001 From: Janishar Ali Date: Mon, 19 Dec 2022 21:45:06 +0530 Subject: [PATCH 28/33] fix writer test --- tests/routes/v1/blog/writer/unit.test.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/routes/v1/blog/writer/unit.test.ts b/tests/routes/v1/blog/writer/unit.test.ts index b3ccdf8..3c63be9 100644 --- a/tests/routes/v1/blog/writer/unit.test.ts +++ b/tests/routes/v1/blog/writer/unit.test.ts @@ -24,7 +24,7 @@ describe('Writer blog create routes', () => { }); const request = supertest(app); - const endpoint = '/v1/writer/blog'; + const endpoint = '/v1/blog/writer'; it('Should send error if the user do have writer role', async () => { const response = await addAuthHeaders(request.post(endpoint)); @@ -212,7 +212,7 @@ describe('Writer blog submit routes', () => { }); const request = supertest(app); - const endpoint = '/v1/writer/blog/submit/'; + const endpoint = '/v1/blog/writer/submit/'; it('Should send error if submit blog id is not valid', async () => { const response = await addAuthHeaders(request.put(endpoint + 'abc'), WRITER_ACCESS_TOKEN); @@ -253,7 +253,7 @@ describe('Writer blog withdraw routes', () => { }); const request = supertest(app); - const endpoint = '/v1/writer/blog/withdraw/'; + const endpoint = '/v1/blog/writer/withdraw/'; it('Should send error if withdraw blog id is not valid', async () => { const response = await addAuthHeaders(request.put(endpoint + 'abc'), WRITER_ACCESS_TOKEN); @@ -294,7 +294,7 @@ describe('Writer blog delete routes', () => { }); const request = supertest(app); - const endpoint = '/v1/writer/blog/id/'; + const endpoint = '/v1/blog/writer/id/'; it('Should send error if deleting blog id is not valid', async () => { const response = await addAuthHeaders(request.delete(endpoint + 'abc'), WRITER_ACCESS_TOKEN); @@ -334,7 +334,7 @@ describe('Writer blog get by id routes', () => { }); const request = supertest(app); - const endpoint = '/v1/writer/blog/id/'; + const endpoint = '/v1/blog/writer/id/'; it('Should send error if fetching blog id is not valid', async () => { const response = await addAuthHeaders(request.get(endpoint + 'abc'), WRITER_ACCESS_TOKEN); From 5fa436a86c6a1486aa1ed0c979f32eb5727e7efe Mon Sep 17 00:00:00 2001 From: Janishar Ali Date: Mon, 19 Dec 2022 22:23:09 +0530 Subject: [PATCH 29/33] add database and cache mock --- src/database/index.ts | 2 ++ tests/auth/apikey/unit.test.ts | 2 ++ tests/auth/authentication/unit.test.ts | 3 +++ tests/auth/authorization/unit.test.ts | 2 ++ tests/cache/mock.ts | 1 + tests/database/mock.ts | 1 + tests/routes/v1/blog/index/unit.test.ts | 2 ++ tests/routes/v1/blog/writer/unit.test.ts | 2 ++ tests/routes/v1/login/integration.test.ts | 4 ++++ tests/routes/v1/login/unit.test.ts | 2 ++ tests/routes/v1/signup/mock.ts | 1 - tests/routes/v1/signup/unit.test.ts | 2 ++ 12 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 tests/cache/mock.ts create mode 100644 tests/database/mock.ts diff --git a/src/database/index.ts b/src/database/index.ts index 18dab75..c3e2362 100644 --- a/src/database/index.ts +++ b/src/database/index.ts @@ -63,3 +63,5 @@ process.on('SIGINT', () => { process.exit(0); }); }); + +export const connection = mongoose.connection; diff --git a/tests/auth/apikey/unit.test.ts b/tests/auth/apikey/unit.test.ts index 326a7dd..3092bd9 100644 --- a/tests/auth/apikey/unit.test.ts +++ b/tests/auth/apikey/unit.test.ts @@ -1,3 +1,5 @@ +import '../../database/mock'; +import '../../cache/mock'; import { API_KEY, mockFindApiKey } from './mock'; // mock should be imported on the top import app from '../../../src/app'; import supertest from 'supertest'; diff --git a/tests/auth/authentication/unit.test.ts b/tests/auth/authentication/unit.test.ts index 7076211..3368b01 100644 --- a/tests/auth/authentication/unit.test.ts +++ b/tests/auth/authentication/unit.test.ts @@ -1,3 +1,6 @@ +import '../../database/mock'; +import '../../cache/mock'; + import { ACCESS_TOKEN, addHeaders, diff --git a/tests/auth/authorization/unit.test.ts b/tests/auth/authorization/unit.test.ts index 62708ad..cb44439 100644 --- a/tests/auth/authorization/unit.test.ts +++ b/tests/auth/authorization/unit.test.ts @@ -1,3 +1,5 @@ +import '../../database/mock'; +import '../../cache/mock'; import { addAuthHeaders } from '../authentication/mock'; // import the mock for the current test after all other mock imports diff --git a/tests/cache/mock.ts b/tests/cache/mock.ts new file mode 100644 index 0000000..86c9274 --- /dev/null +++ b/tests/cache/mock.ts @@ -0,0 +1 @@ +jest.mock('../../src/cache', () => ({})); diff --git a/tests/database/mock.ts b/tests/database/mock.ts new file mode 100644 index 0000000..93200a6 --- /dev/null +++ b/tests/database/mock.ts @@ -0,0 +1 @@ +jest.mock('../../src/database', () => ({})); diff --git a/tests/routes/v1/blog/index/unit.test.ts b/tests/routes/v1/blog/index/unit.test.ts index 1cf3af0..f40df8e 100644 --- a/tests/routes/v1/blog/index/unit.test.ts +++ b/tests/routes/v1/blog/index/unit.test.ts @@ -1,3 +1,5 @@ +import '../../../../database/mock'; +import '../../../../cache/mock'; import { addHeaders } from '../../../../auth/authentication/mock'; import { diff --git a/tests/routes/v1/blog/writer/unit.test.ts b/tests/routes/v1/blog/writer/unit.test.ts index 3c63be9..6b58d4f 100644 --- a/tests/routes/v1/blog/writer/unit.test.ts +++ b/tests/routes/v1/blog/writer/unit.test.ts @@ -1,3 +1,5 @@ +import '../../../../database/mock'; +import '../../../../cache/mock'; import { addAuthHeaders } from '../../../../auth/authentication/mock'; // this import should be below authentication/mock to override for role validation to work diff --git a/tests/routes/v1/login/integration.test.ts b/tests/routes/v1/login/integration.test.ts index 557d1fb..65c0907 100644 --- a/tests/routes/v1/login/integration.test.ts +++ b/tests/routes/v1/login/integration.test.ts @@ -10,6 +10,8 @@ import * as authUtils from '../../../../src/auth/authUtils'; import Role, { RoleCode } from '../../../../src/database/model/Role'; import { Types } from 'mongoose'; import ApiKey, { ApiKeyModel } from '../../../../src/database/model/ApiKey'; +import { connection } from '../../../../src/database'; +import cache from '../../../../src/cache'; export const createTokensSpy = jest.spyOn(authUtils, 'createTokens'); export const bcryptCompareSpy = jest.spyOn(bcrypt, 'compare'); @@ -41,6 +43,8 @@ describe('Login basic route', () => { afterAll(async () => { await UserModel.remove({}); // delete all data from user table + connection.close(); + cache.disconnect(); }); beforeEach(() => { diff --git a/tests/routes/v1/login/unit.test.ts b/tests/routes/v1/login/unit.test.ts index b7b1f34..6449d2d 100644 --- a/tests/routes/v1/login/unit.test.ts +++ b/tests/routes/v1/login/unit.test.ts @@ -1,3 +1,5 @@ +import '../../../../database/mock'; +import '../../../../cache/mock'; import { addHeaders } from '../../../auth/authentication/mock'; // the mock for this class should be below all other mock imports diff --git a/tests/routes/v1/signup/mock.ts b/tests/routes/v1/signup/mock.ts index 29a5886..42c13ff 100644 --- a/tests/routes/v1/signup/mock.ts +++ b/tests/routes/v1/signup/mock.ts @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ import { mockUserFindByEmail } from '../login/mock'; import User from '../../../../src/database/model/User'; import Keystore from '../../../../src/database/model/Keystore'; diff --git a/tests/routes/v1/signup/unit.test.ts b/tests/routes/v1/signup/unit.test.ts index 229a4f9..3c8714c 100644 --- a/tests/routes/v1/signup/unit.test.ts +++ b/tests/routes/v1/signup/unit.test.ts @@ -1,4 +1,6 @@ // importing any mock file let the jest load all the mocks defined in that file +import '../../../../database/mock'; +import '../../../../cache/mock'; import { addHeaders } from '../../../auth/authentication/mock'; import { mockUserFindByEmail, createTokensSpy, USER_EMAIL, USER_PASSWORD } from '../login/mock'; From a7da3227657553c0a447409959e5f43abf54a148 Mon Sep 17 00:00:00 2001 From: Janishar Ali Date: Mon, 19 Dec 2022 22:26:49 +0530 Subject: [PATCH 30/33] restructure test files --- .../v1/{ => access}/login/integration.test.ts | 18 +++++++++--------- tests/routes/v1/{ => access}/login/mock.ts | 16 ++++++++-------- .../routes/v1/{ => access}/login/unit.test.ts | 4 ++-- tests/routes/v1/{ => access}/signup/mock.ts | 6 +++--- .../routes/v1/{ => access}/signup/unit.test.ts | 4 ++-- 5 files changed, 24 insertions(+), 24 deletions(-) rename tests/routes/v1/{ => access}/login/integration.test.ts (91%) rename tests/routes/v1/{ => access}/login/mock.ts (65%) rename tests/routes/v1/{ => access}/login/unit.test.ts (97%) rename tests/routes/v1/{ => access}/signup/mock.ts (80%) rename tests/routes/v1/{ => access}/signup/unit.test.ts (98%) diff --git a/tests/routes/v1/login/integration.test.ts b/tests/routes/v1/access/login/integration.test.ts similarity index 91% rename from tests/routes/v1/login/integration.test.ts rename to tests/routes/v1/access/login/integration.test.ts index 65c0907..06ee1a9 100644 --- a/tests/routes/v1/login/integration.test.ts +++ b/tests/routes/v1/access/login/integration.test.ts @@ -1,17 +1,17 @@ jest.resetAllMocks(); // make sure we do not have any mocks set from unit tests import supertest from 'supertest'; -import app from '../../../../src/app'; -import UserRepo from '../../../../src/database/repository/UserRepo'; -import KeystoreRepo from '../../../../src/database/repository/KeystoreRepo'; -import User, { UserModel } from '../../../../src/database/model/User'; +import app from '../../../../../src/app'; +import UserRepo from '../../../../../src/database/repository/UserRepo'; +import KeystoreRepo from '../../../../../src/database/repository/KeystoreRepo'; +import User, { UserModel } from '../../../../../src/database/model/User'; import bcrypt from 'bcrypt'; -import * as authUtils from '../../../../src/auth/authUtils'; -import Role, { RoleCode } from '../../../../src/database/model/Role'; +import * as authUtils from '../../../../../src/auth/authUtils'; +import Role, { RoleCode } from '../../../../../src/database/model/Role'; import { Types } from 'mongoose'; -import ApiKey, { ApiKeyModel } from '../../../../src/database/model/ApiKey'; -import { connection } from '../../../../src/database'; -import cache from '../../../../src/cache'; +import ApiKey, { ApiKeyModel } from '../../../../../src/database/model/ApiKey'; +import { connection } from '../../../../../src/database'; +import cache from '../../../../../src/cache'; export const createTokensSpy = jest.spyOn(authUtils, 'createTokens'); export const bcryptCompareSpy = jest.spyOn(bcrypt, 'compare'); diff --git a/tests/routes/v1/login/mock.ts b/tests/routes/v1/access/login/mock.ts similarity index 65% rename from tests/routes/v1/login/mock.ts rename to tests/routes/v1/access/login/mock.ts index 264cd73..6a7237a 100644 --- a/tests/routes/v1/login/mock.ts +++ b/tests/routes/v1/access/login/mock.ts @@ -1,10 +1,10 @@ -import { USER_ID } from '../../../auth/authentication/mock'; -import Keystore from '../../../../src/database/model/Keystore'; -import User from '../../../../src/database/model/User'; +import { USER_ID } from '../../../../auth/authentication/mock'; +import Keystore from '../../../../../src/database/model/Keystore'; +import User from '../../../../../src/database/model/User'; import { Types } from 'mongoose'; import bcrypt from 'bcrypt'; -import * as authUtils from '../../../../src/auth/authUtils'; -import Role from '../../../../src/database/model/Role'; +import * as authUtils from '../../../../../src/auth/authUtils'; +import Role from '../../../../../src/database/model/Role'; export const USER_EMAIL = 'random@test.com'; export const USER_PASSWORD = 'abc123'; @@ -38,12 +38,12 @@ export const mockUserFindByEmail = jest.fn(async (email: string): Promise ({ +jest.mock('../../../../../src/database/repository/KeystoreRepo', () => ({ create: mockKeystoreCreate, })); -jest.mock('../../../../src/database/repository/UserRepo', () => ({ +jest.mock('../../../../../src/database/repository/UserRepo', () => ({ findByEmail: mockUserFindByEmail, })); -jest.unmock('../../../../src/auth/authUtils'); // remove any override made anywhere +jest.unmock('../../../../../src/auth/authUtils'); // remove any override made anywhere diff --git a/tests/routes/v1/login/unit.test.ts b/tests/routes/v1/access/login/unit.test.ts similarity index 97% rename from tests/routes/v1/login/unit.test.ts rename to tests/routes/v1/access/login/unit.test.ts index 6449d2d..a27d9c5 100644 --- a/tests/routes/v1/login/unit.test.ts +++ b/tests/routes/v1/access/login/unit.test.ts @@ -1,6 +1,6 @@ import '../../../../database/mock'; import '../../../../cache/mock'; -import { addHeaders } from '../../../auth/authentication/mock'; +import { addHeaders } from '../../../../auth/authentication/mock'; // the mock for this class should be below all other mock imports import { @@ -14,7 +14,7 @@ import { } from './mock'; import supertest from 'supertest'; -import app from '../../../../src/app'; +import app from '../../../../../src/app'; describe('Login basic route', () => { const endpoint = '/v1/login/basic'; diff --git a/tests/routes/v1/signup/mock.ts b/tests/routes/v1/access/signup/mock.ts similarity index 80% rename from tests/routes/v1/signup/mock.ts rename to tests/routes/v1/access/signup/mock.ts index 42c13ff..7a23c05 100644 --- a/tests/routes/v1/signup/mock.ts +++ b/tests/routes/v1/access/signup/mock.ts @@ -1,6 +1,6 @@ import { mockUserFindByEmail } from '../login/mock'; -import User from '../../../../src/database/model/User'; -import Keystore from '../../../../src/database/model/Keystore'; +import User from '../../../../../src/database/model/User'; +import Keystore from '../../../../../src/database/model/Keystore'; import { Types } from 'mongoose'; import bcrypt from 'bcrypt'; @@ -30,7 +30,7 @@ export const mockUserCreate = jest.fn( }, ); -jest.mock('../../../../src/database/repository/UserRepo', () => ({ +jest.mock('../../../../../src/database/repository/UserRepo', () => ({ findByEmail: mockUserFindByEmail, // utilising already defined mock create: mockUserCreate, })); diff --git a/tests/routes/v1/signup/unit.test.ts b/tests/routes/v1/access/signup/unit.test.ts similarity index 98% rename from tests/routes/v1/signup/unit.test.ts rename to tests/routes/v1/access/signup/unit.test.ts index 3c8714c..ee4bc00 100644 --- a/tests/routes/v1/signup/unit.test.ts +++ b/tests/routes/v1/access/signup/unit.test.ts @@ -1,14 +1,14 @@ // importing any mock file let the jest load all the mocks defined in that file import '../../../../database/mock'; import '../../../../cache/mock'; -import { addHeaders } from '../../../auth/authentication/mock'; +import { addHeaders } from '../../../../auth/authentication/mock'; import { mockUserFindByEmail, createTokensSpy, USER_EMAIL, USER_PASSWORD } from '../login/mock'; // import the mock for this file below all mock imports import { mockUserCreate, bcryptHashSpy, USER_NAME, USER_PROFILE_PIC } from './mock'; import supertest from 'supertest'; -import app from '../../../../src/app'; +import app from '../../../../../src/app'; describe('Signup basic route', () => { const endpoint = '/v1/signup/basic'; From 25aff39bb21afcdb88ec12e21e8db4dc6bef5149 Mon Sep 17 00:00:00 2001 From: Janishar Ali Date: Mon, 19 Dec 2022 22:40:55 +0530 Subject: [PATCH 31/33] remove unused eslint libs --- .eslintrc | 6 ++-- package-lock.json | 84 ----------------------------------------------- package.json | 2 -- 3 files changed, 2 insertions(+), 90 deletions(-) diff --git a/.eslintrc b/.eslintrc index efe11f2..0799ddd 100644 --- a/.eslintrc +++ b/.eslintrc @@ -7,13 +7,11 @@ "@typescript-eslint/explicit-module-boundary-types": "off" }, "extends": [ - "plugin:@typescript-eslint/recommended", // Uses the recommended rules from the @typescript-eslint/eslint-plugin - "prettier/@typescript-eslint", // Uses eslint-config-prettier to disable ESLint rules from @typescript-eslint/eslint-plugin that would conflict with prettier - "plugin:prettier/recommended" // Enables eslint-plugin-prettier and eslint-config-prettier. This will display prettier errors as ESLint errors. Make sure this is always the last configuration in the extends array. + "plugin:@typescript-eslint/recommended" // Uses the recommended rules from the @typescript-eslint/eslint-plugin ], "parser": "@typescript-eslint/parser", "parserOptions": { - "ecmaVersion": 2020, // Allows for the parsing of modern ECMAScript features + "ecmaVersion": "latest", // Allows for the parsing of modern ECMAScript features "sourceType": "module" // Allows for the use of imports }, diff --git a/package-lock.json b/package-lock.json index 3d4432d..9e9de97 100644 --- a/package-lock.json +++ b/package-lock.json @@ -46,8 +46,6 @@ "colors": "^1.4.0", "dotenv": "^16.0.3", "eslint": "^8.29.0", - "eslint-config-prettier": "^8.5.0", - "eslint-plugin-prettier": "^4.2.1", "jest": "^29.3.1", "nodemon": "^2.0.20", "prettier": "^2.8.1", @@ -4537,39 +4535,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-config-prettier": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", - "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-prettier": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", - "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", - "dev": true, - "dependencies": { - "prettier-linter-helpers": "^1.0.0" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "eslint": ">=7.28.0", - "prettier": ">=2.0.0" - }, - "peerDependenciesMeta": { - "eslint-config-prettier": { - "optional": true - } - } - }, "node_modules/eslint-scope": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", @@ -4825,12 +4790,6 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, - "node_modules/fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, "node_modules/fast-glob": { "version": "3.2.12", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", @@ -7517,18 +7476,6 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/pretty-format": { "version": "29.3.1", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", @@ -12529,22 +12476,6 @@ } } }, - "eslint-config-prettier": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", - "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", - "dev": true, - "requires": {} - }, - "eslint-plugin-prettier": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", - "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", - "dev": true, - "requires": { - "prettier-linter-helpers": "^1.0.0" - } - }, "eslint-scope": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", @@ -12717,12 +12648,6 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, - "fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, "fast-glob": { "version": "3.2.12", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", @@ -14749,15 +14674,6 @@ "integrity": "sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==", "dev": true }, - "prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "requires": { - "fast-diff": "^1.1.2" - } - }, "pretty-format": { "version": "29.3.1", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", diff --git a/package.json b/package.json index 97861f6..5758fb4 100644 --- a/package.json +++ b/package.json @@ -60,8 +60,6 @@ "colors": "^1.4.0", "dotenv": "^16.0.3", "eslint": "^8.29.0", - "eslint-config-prettier": "^8.5.0", - "eslint-plugin-prettier": "^4.2.1", "jest": "^29.3.1", "nodemon": "^2.0.20", "prettier": "^2.8.1", From a9f367da17245eb098ff82143db2d93dad4b2100 Mon Sep 17 00:00:00 2001 From: Janishar Ali Date: Mon, 19 Dec 2022 22:46:06 +0530 Subject: [PATCH 32/33] format file with prettier rules --- .prettierrc | 2 +- .templates/database/model/Sample.ts | 6 +- .templates/database/repository/SampleRepo.ts | 4 +- addons/init-mongo.js | 28 ++++- src/app.ts | 19 ++- src/auth/authUtils.ts | 3 +- src/auth/authentication.ts | 6 +- src/cache/query.ts | 11 +- src/config.ts | 6 +- src/core/ApiResponse.ts | 17 ++- src/core/JWT.ts | 22 +++- src/database/index.ts | 10 +- src/database/model/ApiKey.ts | 6 +- src/database/model/Keystore.ts | 6 +- src/database/repository/BlogRepo.ts | 27 ++++- src/database/repository/KeystoreRepo.ts | 14 ++- src/database/repository/UserRepo.ts | 26 ++++- src/helpers/asyncHandler.ts | 13 ++- src/helpers/permission.ts | 24 ++-- src/helpers/validator.ts | 9 +- src/routes/v1/access/credential.ts | 5 +- src/routes/v1/access/signup.ts | 6 +- src/routes/v1/access/token.ts | 22 +++- src/routes/v1/blog/editor.ts | 25 +++- src/routes/v1/blog/index.ts | 4 +- src/routes/v1/blog/writer.ts | 20 +++- src/routes/v1/blogs/index.ts | 7 +- tests/auth/apikey/unit.test.ts | 10 +- tests/auth/authUtils/unit.test.ts | 6 +- tests/auth/authentication/mock.ts | 31 ++--- tests/auth/authentication/unit.test.ts | 10 +- tests/auth/authorization/mock.ts | 108 +++++++++--------- tests/auth/authorization/unit.test.ts | 16 ++- .../v1/access/login/integration.test.ts | 15 ++- tests/routes/v1/access/login/mock.ts | 32 +++--- tests/routes/v1/access/login/unit.test.ts | 12 +- tests/routes/v1/access/signup/mock.ts | 7 +- tests/routes/v1/access/signup/unit.test.ts | 14 ++- tests/routes/v1/blog/index/mock.ts | 72 ++++++------ tests/routes/v1/blog/index/unit.test.ts | 28 +++-- tests/routes/v1/blog/writer/mock.ts | 62 +++++----- tests/routes/v1/blog/writer/unit.test.ts | 20 +++- 42 files changed, 541 insertions(+), 250 deletions(-) diff --git a/.prettierrc b/.prettierrc index 551554b..12edd1b 100644 --- a/.prettierrc +++ b/.prettierrc @@ -3,6 +3,6 @@ "semi": true, "trailingComma": "all", "singleQuote": true, - "printWidth": 100, + "printWidth": 80, "tabWidth": 2 } diff --git a/.templates/database/model/Sample.ts b/.templates/database/model/Sample.ts index 5130a34..ee2cd9e 100644 --- a/.templates/database/model/Sample.ts +++ b/.templates/database/model/Sample.ts @@ -43,4 +43,8 @@ const schema = new Schema( }, ); -export const SampleModel = model(DOCUMENT_NAME, schema, COLLECTION_NAME); +export const SampleModel = model( + DOCUMENT_NAME, + schema, + COLLECTION_NAME, +); diff --git a/.templates/database/repository/SampleRepo.ts b/.templates/database/repository/SampleRepo.ts index d958a88..6adf769 100644 --- a/.templates/database/repository/SampleRepo.ts +++ b/.templates/database/repository/SampleRepo.ts @@ -15,7 +15,9 @@ async function create(sample: Sample): Promise { async function update(sample: Sample): Promise { sample.updatedAt = new Date(); - return SampleModel.findByIdAndUpdate(sample._id, sample, { new: true }).lean().exec(); + return SampleModel.findByIdAndUpdate(sample._id, sample, { new: true }) + .lean() + .exec(); } export default { diff --git a/addons/init-mongo.js b/addons/init-mongo.js index 8a4d070..5181b37 100644 --- a/addons/init-mongo.js +++ b/addons/init-mongo.js @@ -20,10 +20,30 @@ function seed(dbName, user, password) { }); db.roles.insertMany([ - { code: 'LEARNER', status: true, createdAt: new Date(), updatedAt: new Date() }, - { code: 'WRITER', status: true, createdAt: new Date(), updatedAt: new Date() }, - { code: 'EDITOR', status: true, createdAt: new Date(), updatedAt: new Date() }, - { code: 'ADMIN', status: true, createdAt: new Date(), updatedAt: new Date() }, + { + code: 'LEARNER', + status: true, + createdAt: new Date(), + updatedAt: new Date(), + }, + { + code: 'WRITER', + status: true, + createdAt: new Date(), + updatedAt: new Date(), + }, + { + code: 'EDITOR', + status: true, + createdAt: new Date(), + updatedAt: new Date(), + }, + { + code: 'ADMIN', + status: true, + createdAt: new Date(), + updatedAt: new Date(), + }, ]); db.users.insert({ diff --git a/src/app.ts b/src/app.ts index c0b10db..6efe133 100644 --- a/src/app.ts +++ b/src/app.ts @@ -4,7 +4,12 @@ import cors from 'cors'; import { corsUrl, environment } from './config'; import './database'; // initialize database import './cache'; // initialize cache -import { NotFoundError, ApiError, InternalError, ErrorType } from './core/ApiError'; +import { + NotFoundError, + ApiError, + InternalError, + ErrorType, +} from './core/ApiError'; import routesV1 from './routes/v1'; process.on('uncaughtException', (e) => { @@ -14,7 +19,9 @@ process.on('uncaughtException', (e) => { const app = express(); app.use(express.json({ limit: '10mb' })); -app.use(express.urlencoded({ limit: '10mb', extended: true, parameterLimit: 50000 })); +app.use( + express.urlencoded({ limit: '10mb', extended: true, parameterLimit: 50000 }), +); app.use(cors({ origin: corsUrl, optionsSuccessStatus: 200 })); // Routes @@ -29,9 +36,13 @@ app.use((err: Error, req: Request, res: Response, next: NextFunction) => { if (err instanceof ApiError) { ApiError.handle(err, res); if (err.type === ErrorType.INTERNAL) - Logger.error(`500 - ${err.message} - ${req.originalUrl} - ${req.method} - ${req.ip}`); + Logger.error( + `500 - ${err.message} - ${req.originalUrl} - ${req.method} - ${req.ip}`, + ); } else { - Logger.error(`500 - ${err.message} - ${req.originalUrl} - ${req.method} - ${req.ip}`); + Logger.error( + `500 - ${err.message} - ${req.originalUrl} - ${req.method} - ${req.ip}`, + ); Logger.error(err); if (environment === 'development') { return res.status(500).send(err); diff --git a/src/auth/authUtils.ts b/src/auth/authUtils.ts index 2dc98a0..46344c0 100755 --- a/src/auth/authUtils.ts +++ b/src/auth/authUtils.ts @@ -7,7 +7,8 @@ import { tokenInfo } from '../config'; export const getAccessToken = (authorization?: string) => { if (!authorization) throw new AuthFailureError('Invalid Authorization'); - if (!authorization.startsWith('Bearer ')) throw new AuthFailureError('Invalid Authorization'); + if (!authorization.startsWith('Bearer ')) + throw new AuthFailureError('Invalid Authorization'); return authorization.split(' ')[1]; }; diff --git a/src/auth/authentication.ts b/src/auth/authentication.ts index 2e3abe0..d428bbe 100755 --- a/src/auth/authentication.ts +++ b/src/auth/authentication.ts @@ -1,7 +1,11 @@ import express from 'express'; import { ProtectedRequest } from 'app-request'; import UserRepo from '../database/repository/UserRepo'; -import { AuthFailureError, AccessTokenError, TokenExpiredError } from '../core/ApiError'; +import { + AuthFailureError, + AccessTokenError, + TokenExpiredError, +} from '../core/ApiError'; import JWT from '../core/JWT'; import KeystoreRepo from '../database/repository/KeystoreRepo'; import { Types } from 'mongoose'; diff --git a/src/cache/query.ts b/src/cache/query.ts index 2fa91c7..ce5907b 100644 --- a/src/cache/query.ts +++ b/src/cache/query.ts @@ -72,7 +72,11 @@ export async function addToList(key: Key | DynamicKeyType, value: any) { return await cache.rPushX(key, item); } -export async function getListRange(key: Key | DynamicKeyType, start = 0, end = -1) { +export async function getListRange( + key: Key | DynamicKeyType, + start = 0, + end = -1, +) { const type = await cache.type(key); if (type !== TYPES.LIST) return null; @@ -98,7 +102,10 @@ export async function setOrderedSet( return await multi.exec(); } -export async function addToOrderedSet(key: Key, items: Array<{ score: number; value: any }>) { +export async function addToOrderedSet( + key: Key, + items: Array<{ score: number; value: any }>, +) { const type = await cache.type(key); if (type !== TYPES.ZSET) return null; diff --git a/src/config.ts b/src/config.ts index ca5c52b..276730b 100644 --- a/src/config.ts +++ b/src/config.ts @@ -31,5 +31,7 @@ export const redis = { }; export const caching = { - contentCacheDuration: parseInt(process.env.CONTENT_CACHE_DURATION_MILLIS || '600000'), -}; \ No newline at end of file + contentCacheDuration: parseInt( + process.env.CONTENT_CACHE_DURATION_MILLIS || '600000', + ), +}; diff --git a/src/core/ApiResponse.ts b/src/core/ApiResponse.ts index 3c7a984..bb17df1 100644 --- a/src/core/ApiResponse.ts +++ b/src/core/ApiResponse.ts @@ -33,7 +33,10 @@ abstract class ApiResponse { return res.status(this.status).json(ApiResponse.sanitize(response)); } - public send(res: Response, headers: { [key: string]: string } = {}): Response { + public send( + res: Response, + headers: { [key: string]: string } = {}, + ): Response { return this.prepare(res, this, headers); } @@ -107,7 +110,11 @@ export class AccessTokenErrorResponse extends ApiResponse { private instruction = 'refresh_token'; constructor(message = 'Access token invalid') { - super(StatusCode.INVALID_ACCESS_TOKEN, ResponseStatus.UNAUTHORIZED, message); + super( + StatusCode.INVALID_ACCESS_TOKEN, + ResponseStatus.UNAUTHORIZED, + message, + ); } send(res: Response, headers: { [key: string]: string } = {}): Response { @@ -117,7 +124,11 @@ export class AccessTokenErrorResponse extends ApiResponse { } export class TokenRefreshResponse extends ApiResponse { - constructor(message: string, private accessToken: string, private refreshToken: string) { + constructor( + message: string, + private accessToken: string, + private refreshToken: string, + ) { super(StatusCode.SUCCESS, ResponseStatus.SUCCESS, message); } diff --git a/src/core/JWT.ts b/src/core/JWT.ts index ce7ae34..e3c8f79 100755 --- a/src/core/JWT.ts +++ b/src/core/JWT.ts @@ -21,7 +21,13 @@ export class JwtPayload { exp: number; prm: string; - constructor(issuer: string, audience: string, subject: string, param: string, validity: number) { + constructor( + issuer: string, + audience: string, + subject: string, + param: string, + validity: number, + ) { this.iss = issuer; this.aud = audience; this.sub = subject; @@ -32,11 +38,17 @@ export class JwtPayload { } async function readPublicKey(): Promise { - return promisify(readFile)(path.join(__dirname, '../../keys/public.pem'), 'utf8'); + return promisify(readFile)( + path.join(__dirname, '../../keys/public.pem'), + 'utf8', + ); } async function readPrivateKey(): Promise { - return promisify(readFile)(path.join(__dirname, '../../keys/private.pem'), 'utf8'); + return promisify(readFile)( + path.join(__dirname, '../../keys/private.pem'), + 'utf8', + ); } async function encode(payload: JwtPayload): Promise { @@ -69,7 +81,9 @@ async function decode(token: string): Promise { const cert = await readPublicKey(); try { // @ts-ignore - return (await promisify(verify)(token, cert, { ignoreExpiration: true })) as JwtPayload; + return (await promisify(verify)(token, cert, { + ignoreExpiration: true, + })) as JwtPayload; } catch (e) { Logger.debug(e); throw new BadTokenError(); diff --git a/src/database/index.ts b/src/database/index.ts index c3e2362..bb6bed1 100644 --- a/src/database/index.ts +++ b/src/database/index.ts @@ -3,9 +3,9 @@ import Logger from '../core/Logger'; import { db } from '../config'; // Build the connection string -const dbURI = `mongodb://${db.user}:${encodeURIComponent(db.password)}@${db.host}:${db.port}/${ - db.name -}`; +const dbURI = `mongodb://${db.user}:${encodeURIComponent(db.password)}@${ + db.host +}:${db.port}/${db.name}`; const options = { autoIndex: true, @@ -59,7 +59,9 @@ mongoose.connection.on('disconnected', () => { // If the Node process ends, close the Mongoose connection process.on('SIGINT', () => { mongoose.connection.close(() => { - Logger.info('Mongoose default connection disconnected through app termination'); + Logger.info( + 'Mongoose default connection disconnected through app termination', + ); process.exit(0); }); }); diff --git a/src/database/model/ApiKey.ts b/src/database/model/ApiKey.ts index b2f4260..8118856 100755 --- a/src/database/model/ApiKey.ts +++ b/src/database/model/ApiKey.ts @@ -76,4 +76,8 @@ const schema = new Schema( schema.index({ key: 1, status: 1 }); -export const ApiKeyModel = model(DOCUMENT_NAME, schema, COLLECTION_NAME); +export const ApiKeyModel = model( + DOCUMENT_NAME, + schema, + COLLECTION_NAME, +); diff --git a/src/database/model/Keystore.ts b/src/database/model/Keystore.ts index f748a67..07e497f 100755 --- a/src/database/model/Keystore.ts +++ b/src/database/model/Keystore.ts @@ -55,4 +55,8 @@ schema.index({ client: 1 }); schema.index({ client: 1, primaryKey: 1, status: 1 }); schema.index({ client: 1, primaryKey: 1, secondaryKey: 1 }); -export const KeystoreModel = model(DOCUMENT_NAME, schema, COLLECTION_NAME); +export const KeystoreModel = model( + DOCUMENT_NAME, + schema, + COLLECTION_NAME, +); diff --git a/src/database/repository/BlogRepo.ts b/src/database/repository/BlogRepo.ts index c3c8e7c..12a9455 100755 --- a/src/database/repository/BlogRepo.ts +++ b/src/database/repository/BlogRepo.ts @@ -14,7 +14,9 @@ async function create(blog: Blog): Promise { async function update(blog: Blog): Promise { blog.updatedAt = new Date(); - return BlogModel.findByIdAndUpdate(blog._id, blog, { new: true }).lean().exec(); + return BlogModel.findByIdAndUpdate(blog._id, blog, { new: true }) + .lean() + .exec(); } async function findInfoById(id: Types.ObjectId): Promise { @@ -24,7 +26,9 @@ async function findInfoById(id: Types.ObjectId): Promise { .exec(); } -async function findInfoForPublishedById(id: Types.ObjectId): Promise { +async function findInfoForPublishedById( + id: Types.ObjectId, +): Promise { return BlogModel.findOne({ _id: id, isPublished: true, status: true }) .select('+text') .populate('author', AUTHOR_DETAIL) @@ -34,14 +38,20 @@ async function findInfoForPublishedById(id: Types.ObjectId): Promise { return BlogModel.findOne({ _id: id, status: true }) - .select('+text +draftText +isSubmitted +isDraft +isPublished +status +createdBy +updatedBy') + .select( + '+text +draftText +isSubmitted +isDraft +isPublished +status +createdBy +updatedBy', + ) .populate('author', AUTHOR_DETAIL) .lean() .exec(); } async function findPublishedByUrl(blogUrl: string): Promise { - return BlogModel.findOne({ blogUrl: blogUrl, isPublished: true, status: true }) + return BlogModel.findOne({ + blogUrl: blogUrl, + isPublished: true, + status: true, + }) .select('+text') .populate('author', AUTHOR_DETAIL) .lean() @@ -98,7 +108,9 @@ async function findAllDraftsForWriter(user: User): Promise { return findDetailedBlogs({ author: user, status: true, isDraft: true }); } -async function findDetailedBlogs(query: Record): Promise { +async function findDetailedBlogs( + query: Record, +): Promise { return BlogModel.find(query) .select('+isSubmitted +isDraft +isPublished +createdBy +updatedBy') .populate('author', AUTHOR_DETAIL) @@ -109,7 +121,10 @@ async function findDetailedBlogs(query: Record): Promise { +async function findLatestBlogs( + pageNumber: number, + limit: number, +): Promise { return BlogModel.find({ status: true, isPublished: true }) .skip(limit * (pageNumber - 1)) .limit(limit) diff --git a/src/database/repository/KeystoreRepo.ts b/src/database/repository/KeystoreRepo.ts index 1c3e027..87b57c5 100755 --- a/src/database/repository/KeystoreRepo.ts +++ b/src/database/repository/KeystoreRepo.ts @@ -3,7 +3,13 @@ import { Types } from 'mongoose'; import User from '../model/User'; async function findforKey(client: User, key: string): Promise { - return KeystoreModel.findOne({ client: client, primaryKey: key, status: true }).lean().exec(); + return KeystoreModel.findOne({ + client: client, + primaryKey: key, + status: true, + }) + .lean() + .exec(); } async function remove(id: Types.ObjectId): Promise { @@ -28,7 +34,11 @@ async function find( .exec(); } -async function create(client: User, primaryKey: string, secondaryKey: string): Promise { +async function create( + client: User, + primaryKey: string, + secondaryKey: string, +): Promise { const now = new Date(); const keystore = await KeystoreModel.create({ client: client, diff --git a/src/database/repository/UserRepo.ts b/src/database/repository/UserRepo.ts index 622823a..6f2a65a 100755 --- a/src/database/repository/UserRepo.ts +++ b/src/database/repository/UserRepo.ts @@ -10,7 +10,9 @@ async function exists(id: Types.ObjectId): Promise { return user !== null && user !== undefined; } -async function findPrivateProfileById(id: Types.ObjectId): Promise { +async function findPrivateProfileById( + id: Types.ObjectId, +): Promise { return UserModel.findOne({ _id: id, status: true }) .select('+email') .populate({ @@ -48,7 +50,10 @@ async function findByEmail(email: string): Promise { .exec(); } -async function findFieldsById(id: Types.ObjectId, ...fields: string[]): Promise { +async function findFieldsById( + id: Types.ObjectId, + ...fields: string[] +): Promise { return UserModel.findOne({ _id: id, status: true }, [...fields]) .lean() .exec(); @@ -66,13 +71,20 @@ async function create( ): Promise<{ user: User; keystore: Keystore }> { const now = new Date(); - const role = await RoleModel.findOne({ code: roleCode }).select('+code').lean().exec(); + const role = await RoleModel.findOne({ code: roleCode }) + .select('+code') + .lean() + .exec(); if (!role) throw new InternalError('Role must be defined'); user.roles = [role]; user.createdAt = user.updatedAt = now; const createdUser = await UserModel.create(user); - const keystore = await KeystoreRepo.create(createdUser, accessTokenKey, refreshTokenKey); + const keystore = await KeystoreRepo.create( + createdUser, + accessTokenKey, + refreshTokenKey, + ); return { user: { ...createdUser.toObject(), roles: user.roles }, keystore: keystore, @@ -88,7 +100,11 @@ async function update( await UserModel.updateOne({ _id: user._id }, { $set: { ...user } }) .lean() .exec(); - const keystore = await KeystoreRepo.create(user, accessTokenKey, refreshTokenKey); + const keystore = await KeystoreRepo.create( + user, + accessTokenKey, + refreshTokenKey, + ); return { user: user, keystore: keystore }; } diff --git a/src/helpers/asyncHandler.ts b/src/helpers/asyncHandler.ts index 2843632..920e756 100644 --- a/src/helpers/asyncHandler.ts +++ b/src/helpers/asyncHandler.ts @@ -1,7 +1,12 @@ import { Request, Response, NextFunction } from 'express'; -type AsyncFunction = (req: Request, res: Response, next: NextFunction) => Promise; +type AsyncFunction = ( + req: Request, + res: Response, + next: NextFunction, +) => Promise; -export default (execution: AsyncFunction) => (req: Request, res: Response, next: NextFunction) => { - execution(req, res, next).catch(next); -}; +export default (execution: AsyncFunction) => + (req: Request, res: Response, next: NextFunction) => { + execution(req, res, next).catch(next); + }; diff --git a/src/helpers/permission.ts b/src/helpers/permission.ts index 4d39dbe..0635897 100644 --- a/src/helpers/permission.ts +++ b/src/helpers/permission.ts @@ -2,15 +2,19 @@ import { Response, NextFunction } from 'express'; import { ForbiddenError } from '../core/ApiError'; import { PublicRequest } from '../types/app-request'; -export default (permission: string) => (req: PublicRequest, res: Response, next: NextFunction) => { - try { - if (!req.apiKey?.permissions) return next(new ForbiddenError('Permission Denied')); +export default (permission: string) => + (req: PublicRequest, res: Response, next: NextFunction) => { + try { + if (!req.apiKey?.permissions) + return next(new ForbiddenError('Permission Denied')); - const exists = req.apiKey.permissions.find((entry) => entry === permission); - if (!exists) return next(new ForbiddenError('Permission Denied')); + const exists = req.apiKey.permissions.find( + (entry) => entry === permission, + ); + if (!exists) return next(new ForbiddenError('Permission Denied')); - next(); - } catch (error) { - next(error); - } -}; + next(); + } catch (error) { + next(error); + } + }; diff --git a/src/helpers/validator.ts b/src/helpers/validator.ts index 935af15..2210208 100644 --- a/src/helpers/validator.ts +++ b/src/helpers/validator.ts @@ -30,7 +30,10 @@ export const JoiAuthBearer = () => return value; }, 'Authorization Header Validation'); -export default (schema: Joi.AnySchema, source: ValidationSource = ValidationSource.BODY) => +export default ( + schema: Joi.AnySchema, + source: ValidationSource = ValidationSource.BODY, + ) => (req: Request, res: Response, next: NextFunction) => { try { const { error } = schema.validate(req[source]); @@ -38,7 +41,9 @@ export default (schema: Joi.AnySchema, source: ValidationSource = ValidationSour if (!error) return next(); const { details } = error; - const message = details.map((i) => i.message.replace(/['"]+/g, '')).join(','); + const message = details + .map((i) => i.message.replace(/['"]+/g, '')) + .join(','); Logger.error(message); next(new BadRequestError(message)); diff --git a/src/routes/v1/access/credential.ts b/src/routes/v1/access/credential.ts index 4313904..268ea29 100644 --- a/src/routes/v1/access/credential.ts +++ b/src/routes/v1/access/credential.ts @@ -37,7 +37,10 @@ router.post( await KeystoreRepo.removeAllForClient(user); - new SuccessResponse('User password updated', _.pick(user, ['_id', 'name', 'email'])).send(res); + new SuccessResponse( + 'User password updated', + _.pick(user, ['_id', 'name', 'email']), + ).send(res); }), ); diff --git a/src/routes/v1/access/signup.ts b/src/routes/v1/access/signup.ts index fb16378..9209645 100644 --- a/src/routes/v1/access/signup.ts +++ b/src/routes/v1/access/signup.ts @@ -38,7 +38,11 @@ router.post( RoleCode.LEARNER, ); - const tokens = await createTokens(createdUser, keystore.primaryKey, keystore.secondaryKey); + const tokens = await createTokens( + createdUser, + keystore.primaryKey, + keystore.secondaryKey, + ); const userData = await getUserData(createdUser); new SuccessResponse('Signup Successful', { diff --git a/src/routes/v1/access/token.ts b/src/routes/v1/access/token.ts index 27e4ba6..0388636 100644 --- a/src/routes/v1/access/token.ts +++ b/src/routes/v1/access/token.ts @@ -7,7 +7,11 @@ import { AuthFailureError } from '../../../core/ApiError'; import JWT from '../../../core/JWT'; import KeystoreRepo from '../../../database/repository/KeystoreRepo'; import crypto from 'crypto'; -import { validateTokenData, createTokens, getAccessToken } from '../../../auth/authUtils'; +import { + validateTokenData, + createTokens, + getAccessToken, +} from '../../../auth/authUtils'; import validator, { ValidationSource } from '../../../helpers/validator'; import schema from './schema'; import asyncHandler from '../../../helpers/asyncHandler'; @@ -24,7 +28,9 @@ router.post( const accessTokenPayload = await JWT.decode(req.accessToken); validateTokenData(accessTokenPayload); - const user = await UserRepo.findById(new Types.ObjectId(accessTokenPayload.sub)); + const user = await UserRepo.findById( + new Types.ObjectId(accessTokenPayload.sub), + ); if (!user) throw new AuthFailureError('User not registered'); req.user = user; @@ -47,9 +53,17 @@ router.post( const refreshTokenKey = crypto.randomBytes(64).toString('hex'); await KeystoreRepo.create(req.user, accessTokenKey, refreshTokenKey); - const tokens = await createTokens(req.user, accessTokenKey, refreshTokenKey); + const tokens = await createTokens( + req.user, + accessTokenKey, + refreshTokenKey, + ); - new TokenRefreshResponse('Token Issued', tokens.accessToken, tokens.refreshToken).send(res); + new TokenRefreshResponse( + 'Token Issued', + tokens.accessToken, + tokens.refreshToken, + ).send(res); }), ); diff --git a/src/routes/v1/blog/editor.ts b/src/routes/v1/blog/editor.ts index acf31b8..b428a2f 100755 --- a/src/routes/v1/blog/editor.ts +++ b/src/routes/v1/blog/editor.ts @@ -15,14 +15,20 @@ import role from '../../../helpers/role'; const router = express.Router(); /*-------------------------------------------------------------------------*/ -router.use(authentication, role(RoleCode.ADMIN, RoleCode.EDITOR), authorization); +router.use( + authentication, + role(RoleCode.ADMIN, RoleCode.EDITOR), + authorization, +); /*-------------------------------------------------------------------------*/ router.put( '/publish/:id', validator(schema.blogId, ValidationSource.PARAM), asyncHandler(async (req: ProtectedRequest, res) => { - const blog = await BlogRepo.findBlogAllDataById(new Types.ObjectId(req.params.id)); + const blog = await BlogRepo.findBlogAllDataById( + new Types.ObjectId(req.params.id), + ); if (!blog) throw new BadRequestError('Blog does not exists'); blog.isDraft = false; @@ -40,7 +46,9 @@ router.put( '/unpublish/:id', validator(schema.blogId, ValidationSource.PARAM), asyncHandler(async (req: ProtectedRequest, res) => { - const blog = await BlogRepo.findBlogAllDataById(new Types.ObjectId(req.params.id)); + const blog = await BlogRepo.findBlogAllDataById( + new Types.ObjectId(req.params.id), + ); if (!blog) throw new BadRequestError('Blog does not exists'); blog.isDraft = true; @@ -56,7 +64,9 @@ router.delete( '/id/:id', validator(schema.blogId, ValidationSource.PARAM), asyncHandler(async (req: ProtectedRequest, res) => { - const blog = await BlogRepo.findBlogAllDataById(new Types.ObjectId(req.params.id)); + const blog = await BlogRepo.findBlogAllDataById( + new Types.ObjectId(req.params.id), + ); if (!blog) throw new BadRequestError('Blog does not exists'); blog.status = false; @@ -94,10 +104,13 @@ router.get( '/id/:id', validator(schema.blogId, ValidationSource.PARAM), asyncHandler(async (req: ProtectedRequest, res) => { - const blog = await BlogRepo.findBlogAllDataById(new Types.ObjectId(req.params.id)); + const blog = await BlogRepo.findBlogAllDataById( + new Types.ObjectId(req.params.id), + ); if (!blog) throw new BadRequestError('Blog does not exists'); - if (!blog.isSubmitted && !blog.isPublished) throw new ForbiddenError('This blog is private'); + if (!blog.isSubmitted && !blog.isPublished) + throw new ForbiddenError('This blog is private'); new SuccessResponse('success', blog).send(res); }), diff --git a/src/routes/v1/blog/index.ts b/src/routes/v1/blog/index.ts index f65b455..5edadf6 100644 --- a/src/routes/v1/blog/index.ts +++ b/src/routes/v1/blog/index.ts @@ -40,7 +40,9 @@ router.get( let blog = await BlogCache.fetchById(blogId); if (!blog) { - blog = await BlogRepo.findInfoForPublishedById(new Types.ObjectId(req.params.id)); + blog = await BlogRepo.findInfoForPublishedById( + new Types.ObjectId(req.params.id), + ); if (blog) await BlogCache.save(blog); } diff --git a/src/routes/v1/blog/writer.ts b/src/routes/v1/blog/writer.ts index 88bb41f..1442467 100755 --- a/src/routes/v1/blog/writer.ts +++ b/src/routes/v1/blog/writer.ts @@ -53,7 +53,9 @@ router.put( validator(schema.blogId, ValidationSource.PARAM), validator(schema.blogUpdate), asyncHandler(async (req: ProtectedRequest, res) => { - const blog = await BlogRepo.findBlogAllDataById(new Types.ObjectId(req.params.id)); + const blog = await BlogRepo.findBlogAllDataById( + new Types.ObjectId(req.params.id), + ); if (blog == null) throw new BadRequestError('Blog does not exists'); if (!blog.author._id.equals(req.user._id)) throw new ForbiddenError("You don't have necessary permissions"); @@ -81,7 +83,9 @@ router.put( '/submit/:id', validator(schema.blogId, ValidationSource.PARAM), asyncHandler(async (req: ProtectedRequest, res) => { - const blog = await BlogRepo.findBlogAllDataById(new Types.ObjectId(req.params.id)); + const blog = await BlogRepo.findBlogAllDataById( + new Types.ObjectId(req.params.id), + ); if (!blog) throw new BadRequestError('Blog does not exists'); if (!blog.author._id.equals(req.user._id)) throw new ForbiddenError("You don't have necessary permissions"); @@ -98,7 +102,9 @@ router.put( '/withdraw/:id', validator(schema.blogId, ValidationSource.PARAM), asyncHandler(async (req: ProtectedRequest, res) => { - const blog = await BlogRepo.findBlogAllDataById(new Types.ObjectId(req.params.id)); + const blog = await BlogRepo.findBlogAllDataById( + new Types.ObjectId(req.params.id), + ); if (!blog) throw new BadRequestError('Blog does not exists'); if (!blog.author._id.equals(req.user._id)) throw new ForbiddenError("You don't have necessary permissions"); @@ -115,7 +121,9 @@ router.delete( '/id/:id', validator(schema.blogId, ValidationSource.PARAM), asyncHandler(async (req: ProtectedRequest, res) => { - const blog = await BlogRepo.findBlogAllDataById(new Types.ObjectId(req.params.id)); + const blog = await BlogRepo.findBlogAllDataById( + new Types.ObjectId(req.params.id), + ); if (!blog) throw new BadRequestError('Blog does not exists'); if (!blog.author._id.equals(req.user._id)) throw new ForbiddenError("You don't have necessary permissions"); @@ -161,7 +169,9 @@ router.get( '/id/:id', validator(schema.blogId, ValidationSource.PARAM), asyncHandler(async (req: ProtectedRequest, res) => { - const blog = await BlogRepo.findBlogAllDataById(new Types.ObjectId(req.params.id)); + const blog = await BlogRepo.findBlogAllDataById( + new Types.ObjectId(req.params.id), + ); if (!blog) throw new BadRequestError('Blog does not exists'); if (!blog.author._id.equals(req.user._id)) throw new ForbiddenError("You don't have necessary permissions"); diff --git a/src/routes/v1/blogs/index.ts b/src/routes/v1/blogs/index.ts index 61c9ef8..5f96ba0 100644 --- a/src/routes/v1/blogs/index.ts +++ b/src/routes/v1/blogs/index.ts @@ -56,11 +56,14 @@ router.get( let blogs = await BlogsCache.fetchSimilarBlogs(blogId); if (!blogs) { - const blog = await BlogRepo.findInfoForPublishedById(new Types.ObjectId(req.params.id)); + const blog = await BlogRepo.findInfoForPublishedById( + new Types.ObjectId(req.params.id), + ); if (!blog) throw new BadRequestError('Blog is not available'); blogs = await BlogRepo.searchSimilarBlogs(blog, 6); - if (blogs && blogs.length > 0) await BlogsCache.saveSimilarBlogs(blogId, blogs); + if (blogs && blogs.length > 0) + await BlogsCache.saveSimilarBlogs(blogId, blogs); } return new SuccessResponse('success', blogs ? blogs : []).send(res); diff --git a/tests/auth/apikey/unit.test.ts b/tests/auth/apikey/unit.test.ts index 3092bd9..428edec 100644 --- a/tests/auth/apikey/unit.test.ts +++ b/tests/auth/apikey/unit.test.ts @@ -20,14 +20,20 @@ describe('apikey validation', () => { it('Should response with 403 if wrong x-api-key header is passed', async () => { const wrongApiKey = '123'; - const response = await request.get(endpoint).set('x-api-key', wrongApiKey).timeout(2000); + const response = await request + .get(endpoint) + .set('x-api-key', wrongApiKey) + .timeout(2000); expect(response.status).toBe(403); expect(mockFindApiKey).toBeCalledTimes(1); expect(mockFindApiKey).toBeCalledWith(wrongApiKey); }); it('Should response with 404 if correct x-api-key header is passed and when route is not handelled', async () => { - const response = await request.get(endpoint).set('x-api-key', API_KEY).timeout(2000); + const response = await request + .get(endpoint) + .set('x-api-key', API_KEY) + .timeout(2000); expect(response.status).toBe(404); expect(mockFindApiKey).toBeCalledTimes(1); expect(mockFindApiKey).toBeCalledWith(API_KEY); diff --git a/tests/auth/authUtils/unit.test.ts b/tests/auth/authUtils/unit.test.ts index e7cb260..fecc33f 100644 --- a/tests/auth/authUtils/unit.test.ts +++ b/tests/auth/authUtils/unit.test.ts @@ -66,7 +66,11 @@ describe('authUtils createTokens function', () => { it('Should process and return accessToken and refreshToken', async () => { const userId = new Types.ObjectId(); // Random Key - const tokens = await createTokens({ _id: userId } as User, ACCESS_TOKEN_KEY, REFRESH_TOKEN_KEY); + const tokens = await createTokens( + { _id: userId } as User, + ACCESS_TOKEN_KEY, + REFRESH_TOKEN_KEY, + ); expect(tokens).toHaveProperty('accessToken'); expect(tokens).toHaveProperty('refreshToken'); diff --git a/tests/auth/authentication/mock.ts b/tests/auth/authentication/mock.ts index 73ec478..1075d26 100644 --- a/tests/auth/authentication/mock.ts +++ b/tests/auth/authentication/mock.ts @@ -20,18 +20,20 @@ export const mockUserFindById = jest.fn(async (id: Types.ObjectId) => { else return null; }); -export const mockJwtValidate = jest.fn(async (token: string): Promise => { - if (token === ACCESS_TOKEN) - return { - iss: tokenInfo.issuer, - aud: tokenInfo.audience, - sub: USER_ID.toHexString(), - iat: 1, - exp: 2, - prm: 'abcdef', - } as JwtPayload; - throw new BadTokenError(); -}); +export const mockJwtValidate = jest.fn( + async (token: string): Promise => { + if (token === ACCESS_TOKEN) + return { + iss: tokenInfo.issuer, + aud: tokenInfo.audience, + sub: USER_ID.toHexString(), + iat: 1, + exp: 2, + prm: 'abcdef', + } as JwtPayload; + throw new BadTokenError(); + }, +); export const mockKeystoreFindForKey = jest.fn( async (client: User, key: string): Promise => @@ -49,7 +51,10 @@ jest.mock('../../../src/database/repository/KeystoreRepo', () => ({ JWT.validate = mockJwtValidate; export const addHeaders = (request: any) => - request.set('Content-Type', 'application/json').set('x-api-key', API_KEY).timeout(2000); + request + .set('Content-Type', 'application/json') + .set('x-api-key', API_KEY) + .timeout(2000); export const addAuthHeaders = (request: any, accessToken = ACCESS_TOKEN) => request diff --git a/tests/auth/authentication/unit.test.ts b/tests/auth/authentication/unit.test.ts index 3368b01..0a73054 100644 --- a/tests/auth/authentication/unit.test.ts +++ b/tests/auth/authentication/unit.test.ts @@ -33,14 +33,20 @@ describe('authentication validation', () => { }); it('Should response with 400 if Authorization header do not have Bearer', async () => { - const response = await addHeaders(request.get(endpoint)).set('Authorization', '123'); + const response = await addHeaders(request.get(endpoint)).set( + 'Authorization', + '123', + ); expect(response.status).toBe(400); expect(response.body.message).toMatch(/authorization/); expect(getAccessTokenSpy).not.toBeCalled(); }); it('Should response with 401 if wrong Authorization header is provided', async () => { - const response = await addHeaders(request.get(endpoint)).set('Authorization', 'Bearer 123'); + const response = await addHeaders(request.get(endpoint)).set( + 'Authorization', + 'Bearer 123', + ); expect(response.status).toBe(401); expect(response.body.message).toMatch(/token/i); expect(getAccessTokenSpy).toBeCalledTimes(1); diff --git a/tests/auth/authorization/mock.ts b/tests/auth/authorization/mock.ts index 4c57934..e2f5d6a 100644 --- a/tests/auth/authorization/mock.ts +++ b/tests/auth/authorization/mock.ts @@ -43,61 +43,65 @@ export const mockUserFindById = jest.fn(async (id: Types.ObjectId) => { else return null; }); -export const mockRoleRepoFindByCodes = jest.fn(async (codes: string[]): Promise => { - const results: Role[] = []; - for (const code of codes) { - switch (code) { - case RoleCode.WRITER: - results.push({ - _id: WRITER_ROLE_ID, - code: RoleCode.WRITER, - status: true, - } as Role); - break; - case RoleCode.EDITOR: - results.push({ - _id: EDITOR_ROLE_ID, - code: RoleCode.EDITOR, - status: true, - } as Role); - break; - case RoleCode.LEARNER: - results.push({ - _id: LEARNER_ROLE_ID, - code: RoleCode.LEARNER, - status: true, - } as Role); - break; +export const mockRoleRepoFindByCodes = jest.fn( + async (codes: string[]): Promise => { + const results: Role[] = []; + for (const code of codes) { + switch (code) { + case RoleCode.WRITER: + results.push({ + _id: WRITER_ROLE_ID, + code: RoleCode.WRITER, + status: true, + } as Role); + break; + case RoleCode.EDITOR: + results.push({ + _id: EDITOR_ROLE_ID, + code: RoleCode.EDITOR, + status: true, + } as Role); + break; + case RoleCode.LEARNER: + results.push({ + _id: LEARNER_ROLE_ID, + code: RoleCode.LEARNER, + status: true, + } as Role); + break; + } } - } - return results; -}); + return results; + }, +); -export const mockJwtValidate = jest.fn(async (token: string): Promise => { - let subject: null | string = null; - switch (token) { - case ACCESS_TOKEN: - subject = USER_ID.toHexString(); - break; - case WRITER_ACCESS_TOKEN: - subject = USER_ID_WRITER.toHexString(); - break; - case EDITOR_ACCESS_TOKEN: - subject = USER_ID_EDITOR.toHexString(); - break; - } - if (subject) - return { - iss: tokenInfo.issuer, - aud: tokenInfo.audience, - sub: subject, - iat: 1, - exp: 2, - prm: 'abcdef', - } as JwtPayload; - throw new BadTokenError(); -}); +export const mockJwtValidate = jest.fn( + async (token: string): Promise => { + let subject: null | string = null; + switch (token) { + case ACCESS_TOKEN: + subject = USER_ID.toHexString(); + break; + case WRITER_ACCESS_TOKEN: + subject = USER_ID_WRITER.toHexString(); + break; + case EDITOR_ACCESS_TOKEN: + subject = USER_ID_EDITOR.toHexString(); + break; + } + if (subject) + return { + iss: tokenInfo.issuer, + aud: tokenInfo.audience, + sub: subject, + iat: 1, + exp: 2, + prm: 'abcdef', + } as JwtPayload; + throw new BadTokenError(); + }, +); jest.mock('../../../src/database/repository/UserRepo', () => ({ findById: mockUserFindById, diff --git a/tests/auth/authorization/unit.test.ts b/tests/auth/authorization/unit.test.ts index cb44439..75b35c7 100644 --- a/tests/auth/authorization/unit.test.ts +++ b/tests/auth/authorization/unit.test.ts @@ -4,7 +4,11 @@ import { addAuthHeaders } from '../authentication/mock'; // import the mock for the current test after all other mock imports // this will prevent the different implementations for same function by the other mocks -import { mockRoleRepoFindByCodes, mockUserFindById, EDITOR_ACCESS_TOKEN } from './mock'; +import { + mockRoleRepoFindByCodes, + mockUserFindById, + EDITOR_ACCESS_TOKEN, +} from './mock'; import app from '../../../src/app'; import supertest from 'supertest'; @@ -25,7 +29,10 @@ describe('authentication validation for editor', () => { expect(response.body.message).toMatch(/denied/); expect(mockRoleRepoFindByCodes).toBeCalledTimes(1); expect(mockUserFindById).toBeCalledTimes(1); - expect(mockRoleRepoFindByCodes).toBeCalledWith([RoleCode.ADMIN, RoleCode.EDITOR]); + expect(mockRoleRepoFindByCodes).toBeCalledWith([ + RoleCode.ADMIN, + RoleCode.EDITOR, + ]); }); }); @@ -39,7 +46,10 @@ describe('authentication validation for writer', () => { }); it('Should response with 404 if user have writer role', async () => { - const response = await addAuthHeaders(request.get(endpoint), EDITOR_ACCESS_TOKEN); + const response = await addAuthHeaders( + request.get(endpoint), + EDITOR_ACCESS_TOKEN, + ); expect(response.status).toBe(404); expect(mockRoleRepoFindByCodes).toBeCalledTimes(1); expect(mockUserFindById).toBeCalledTimes(1); diff --git a/tests/routes/v1/access/login/integration.test.ts b/tests/routes/v1/access/login/integration.test.ts index 06ee1a9..e3295c3 100644 --- a/tests/routes/v1/access/login/integration.test.ts +++ b/tests/routes/v1/access/login/integration.test.ts @@ -64,7 +64,10 @@ describe('Login basic route', () => { }); it('Should send error when email is only sent', async () => { - const response = await addHeaders(request.post(endpoint).send({ email: user.email }), apikey); + const response = await addHeaders( + request.post(endpoint).send({ email: user.email }), + apikey, + ); expect(response.status).toBe(400); expect(response.body.message).toMatch(/password/); expect(userFindByEmailSpy).not.toBeCalled(); @@ -74,7 +77,10 @@ describe('Login basic route', () => { }); it('Should send error when password is only sent', async () => { - const response = await addHeaders(request.post(endpoint).send({ password: password }), apikey); + const response = await addHeaders( + request.post(endpoint).send({ password: password }), + apikey, + ); expect(response.status).toBe(400); expect(response.body.message).toMatch(/email/); expect(userFindByEmailSpy).not.toBeCalled(); @@ -84,7 +90,10 @@ describe('Login basic route', () => { }); it('Should send error when email is not valid format', async () => { - const response = await addHeaders(request.post(endpoint).send({ email: '123' }), apikey); + const response = await addHeaders( + request.post(endpoint).send({ email: '123' }), + apikey, + ); expect(response.status).toBe(400); expect(response.body.message).toMatch(/valid email/); expect(userFindByEmailSpy).not.toBeCalled(); diff --git a/tests/routes/v1/access/login/mock.ts b/tests/routes/v1/access/login/mock.ts index 6a7237a..b4a56ef 100644 --- a/tests/routes/v1/access/login/mock.ts +++ b/tests/routes/v1/access/login/mock.ts @@ -15,7 +15,11 @@ export const createTokensSpy = jest.spyOn(authUtils, 'createTokens'); export const bcryptCompareSpy = jest.spyOn(bcrypt, 'compare'); export const mockKeystoreCreate = jest.fn( - async (client: User, primaryKey: string, secondaryKey: string): Promise => { + async ( + client: User, + primaryKey: string, + secondaryKey: string, + ): Promise => { return { _id: new Types.ObjectId(), client: client, @@ -25,18 +29,20 @@ export const mockKeystoreCreate = jest.fn( }, ); -export const mockUserFindByEmail = jest.fn(async (email: string): Promise => { - if (email === USER_EMAIL) - return { - _id: USER_ID, - email: USER_EMAIL, - password: USER_PASSWORD_HASH, - name: 'abc', - profilePicUrl: 'abc', - roles: [] as Role[], - } as User; - return null; -}); +export const mockUserFindByEmail = jest.fn( + async (email: string): Promise => { + if (email === USER_EMAIL) + return { + _id: USER_ID, + email: USER_EMAIL, + password: USER_PASSWORD_HASH, + name: 'abc', + profilePicUrl: 'abc', + roles: [] as Role[], + } as User; + return null; + }, +); jest.mock('../../../../../src/database/repository/KeystoreRepo', () => ({ create: mockKeystoreCreate, diff --git a/tests/routes/v1/access/login/unit.test.ts b/tests/routes/v1/access/login/unit.test.ts index a27d9c5..1d7d674 100644 --- a/tests/routes/v1/access/login/unit.test.ts +++ b/tests/routes/v1/access/login/unit.test.ts @@ -37,7 +37,9 @@ describe('Login basic route', () => { }); it('Should send error when email is only sent', async () => { - const response = await addHeaders(request.post(endpoint).send({ email: USER_EMAIL })); + const response = await addHeaders( + request.post(endpoint).send({ email: USER_EMAIL }), + ); expect(response.status).toBe(400); expect(response.body.message).toMatch(/password/); expect(mockUserFindByEmail).not.toBeCalled(); @@ -47,7 +49,9 @@ describe('Login basic route', () => { }); it('Should send error when password is only sent', async () => { - const response = await addHeaders(request.post(endpoint).send({ password: USER_PASSWORD })); + const response = await addHeaders( + request.post(endpoint).send({ password: USER_PASSWORD }), + ); expect(response.status).toBe(400); expect(response.body.message).toMatch(/email/); expect(mockUserFindByEmail).not.toBeCalled(); @@ -57,7 +61,9 @@ describe('Login basic route', () => { }); it('Should send error when email is not valid format', async () => { - const response = await addHeaders(request.post(endpoint).send({ email: '123' })); + const response = await addHeaders( + request.post(endpoint).send({ email: '123' }), + ); expect(response.status).toBe(400); expect(response.body.message).toMatch(/valid email/); expect(mockUserFindByEmail).not.toBeCalled(); diff --git a/tests/routes/v1/access/signup/mock.ts b/tests/routes/v1/access/signup/mock.ts index 7a23c05..2d7505f 100644 --- a/tests/routes/v1/access/signup/mock.ts +++ b/tests/routes/v1/access/signup/mock.ts @@ -10,12 +10,7 @@ export const USER_PROFILE_PIC = 'https://abc.com/xyz'; export const bcryptHashSpy = jest.spyOn(bcrypt, 'hash'); export const mockUserCreate = jest.fn( - async ( - user: User, - accessTokenKey: string, - refreshTokenKey: string, - roleCode: string, - ): Promise<{ user: User; keystore: Keystore }> => { + async (user: User): Promise<{ user: User; keystore: Keystore }> => { user._id = new Types.ObjectId(); user.roles = []; return { diff --git a/tests/routes/v1/access/signup/unit.test.ts b/tests/routes/v1/access/signup/unit.test.ts index ee4bc00..b5a9f71 100644 --- a/tests/routes/v1/access/signup/unit.test.ts +++ b/tests/routes/v1/access/signup/unit.test.ts @@ -2,10 +2,20 @@ import '../../../../database/mock'; import '../../../../cache/mock'; import { addHeaders } from '../../../../auth/authentication/mock'; -import { mockUserFindByEmail, createTokensSpy, USER_EMAIL, USER_PASSWORD } from '../login/mock'; +import { + mockUserFindByEmail, + createTokensSpy, + USER_EMAIL, + USER_PASSWORD, +} from '../login/mock'; // import the mock for this file below all mock imports -import { mockUserCreate, bcryptHashSpy, USER_NAME, USER_PROFILE_PIC } from './mock'; +import { + mockUserCreate, + bcryptHashSpy, + USER_NAME, + USER_PROFILE_PIC, +} from './mock'; import supertest from 'supertest'; import app from '../../../../../src/app'; diff --git a/tests/routes/v1/blog/index/mock.ts b/tests/routes/v1/blog/index/mock.ts index 6a22e14..d57c71e 100644 --- a/tests/routes/v1/blog/index/mock.ts +++ b/tests/routes/v1/blog/index/mock.ts @@ -9,43 +9,51 @@ export const BLOG_2_ID = new Types.ObjectId(); export const BLOG_URL = 'abc'; export const BLOG_2_URL = 'abc2'; -export const mockBlogCacheFetchByUrl = jest.fn(async (blogUrl: string): Promise => { - if (blogUrl === BLOG_URL) - return { - _id: BLOG_ID, - blogUrl: blogUrl, - } as Blog; - return null; -}); +export const mockBlogCacheFetchByUrl = jest.fn( + async (blogUrl: string): Promise => { + if (blogUrl === BLOG_URL) + return { + _id: BLOG_ID, + blogUrl: blogUrl, + } as Blog; + return null; + }, +); -export const mockBlogCacheFetchById = jest.fn(async (id: Types.ObjectId): Promise => { - if (BLOG_ID.equals(id)) - return { - _id: BLOG_ID, - blogUrl: BLOG_URL, - } as Blog; - return null; -}); +export const mockBlogCacheFetchById = jest.fn( + async (id: Types.ObjectId): Promise => { + if (BLOG_ID.equals(id)) + return { + _id: BLOG_ID, + blogUrl: BLOG_URL, + } as Blog; + return null; + }, +); -export const mockBlogCacheSave = jest.fn(async (blog: Blog): Promise => { - return JSON.stringify(blog); -}); +export const mockBlogCacheSave = jest.fn( + async (blog: Blog): Promise => { + return JSON.stringify(blog); + }, +); -export const mockPublishedBlogFindByUrl = jest.fn(async (blogUrl: string): Promise => { - if (blogUrl === BLOG_URL) - return { - _id: BLOG_ID, - blogUrl: blogUrl, - } as Blog; +export const mockPublishedBlogFindByUrl = jest.fn( + async (blogUrl: string): Promise => { + if (blogUrl === BLOG_URL) + return { + _id: BLOG_ID, + blogUrl: blogUrl, + } as Blog; - if (blogUrl === BLOG_2_URL) - return { - _id: BLOG_2_ID, - blogUrl: blogUrl, - } as Blog; + if (blogUrl === BLOG_2_URL) + return { + _id: BLOG_2_ID, + blogUrl: blogUrl, + } as Blog; - return null; -}); + return null; + }, +); export const mockPublishedBlogFindById = jest.fn( async (id: Types.ObjectId): Promise => { diff --git a/tests/routes/v1/blog/index/unit.test.ts b/tests/routes/v1/blog/index/unit.test.ts index f40df8e..23c554f 100644 --- a/tests/routes/v1/blog/index/unit.test.ts +++ b/tests/routes/v1/blog/index/unit.test.ts @@ -38,7 +38,9 @@ describe('BlogDetail by URL route', () => { it('Should send error when url endpoint is more that 200 chars', async () => { const param = new Array(201).fill('a').join(''); - const response = await addHeaders(request.get(endpoint).query({ endpoint: param })); + const response = await addHeaders( + request.get(endpoint).query({ endpoint: param }), + ); expect(response.status).toBe(400); expect(response.body.message).toMatch(/length must/); expect(response.body.message).toMatch(/200/); @@ -46,7 +48,9 @@ describe('BlogDetail by URL route', () => { }); it('Should send error when blog do not exists for url', async () => { - const response = await addHeaders(request.get(endpoint).query({ endpoint: 'xyz' })); + const response = await addHeaders( + request.get(endpoint).query({ endpoint: 'xyz' }), + ); expect(response.status).toBe(404); expect(response.body.message).toMatch(/not found/); expect(mockBlogCacheFetchByUrl).toBeCalledTimes(1); @@ -57,7 +61,9 @@ describe('BlogDetail by URL route', () => { }); it('Should send cache data when blog exists for url in cache', async () => { - const response = await addHeaders(request.get(endpoint).query({ endpoint: BLOG_URL })); + const response = await addHeaders( + request.get(endpoint).query({ endpoint: BLOG_URL }), + ); expect(response.status).toBe(200); expect(response.body.message).toMatch(/success/); expect(response.body.data).toBeDefined(); @@ -72,7 +78,9 @@ describe('BlogDetail by URL route', () => { }); it('Should send database data when blog dont exists for url in cache', async () => { - const response = await addHeaders(request.get(endpoint).query({ endpoint: BLOG_2_URL })); + const response = await addHeaders( + request.get(endpoint).query({ endpoint: BLOG_2_URL }), + ); expect(response.status).toBe(200); expect(response.body.message).toMatch(/success/); expect(response.body.data).toBeDefined(); @@ -109,14 +117,18 @@ describe('BlogDetail by id route', () => { }); it('Should send error when blog do not exists for id', async () => { - const response = await addHeaders(request.get(endpoint + new Types.ObjectId().toHexString())); + const response = await addHeaders( + request.get(endpoint + new Types.ObjectId().toHexString()), + ); expect(response.status).toBe(404); expect(response.body.message).toMatch(/not found/); expect(mockPublishedBlogFindById).toBeCalledTimes(1); }); it('Should send cache data when blog exists for id in cache', async () => { - const response = await addHeaders(request.get(endpoint + BLOG_ID.toHexString())); + const response = await addHeaders( + request.get(endpoint + BLOG_ID.toHexString()), + ); expect(response.status).toBe(200); expect(response.body.message).toMatch(/success/); expect(response.body.data).toBeDefined(); @@ -131,7 +143,9 @@ describe('BlogDetail by id route', () => { }); it('Should send database data when blog dont exists for url in cache', async () => { - const response = await addHeaders(request.get(endpoint + BLOG_2_ID.toHexString())); + const response = await addHeaders( + request.get(endpoint + BLOG_2_ID.toHexString()), + ); expect(response.status).toBe(200); expect(response.body.message).toMatch(/success/); expect(response.body.data).toBeDefined(); diff --git a/tests/routes/v1/blog/writer/mock.ts b/tests/routes/v1/blog/writer/mock.ts index f30145d..1b864dc 100644 --- a/tests/routes/v1/blog/writer/mock.ts +++ b/tests/routes/v1/blog/writer/mock.ts @@ -8,41 +8,47 @@ export const BLOG_ID = new Types.ObjectId(); export const BLOG_ID_2 = new Types.ObjectId(); export const BLOG_URL = 'abc'; -export const mockBlogFindUrlIfExists = jest.fn(async (blogUrl: string): Promise => { - if (blogUrl === BLOG_URL) - return { - _id: BLOG_ID, - blogUrl: blogUrl, - } as Blog; - return null; -}); +export const mockBlogFindUrlIfExists = jest.fn( + async (blogUrl: string): Promise => { + if (blogUrl === BLOG_URL) + return { + _id: BLOG_ID, + blogUrl: blogUrl, + } as Blog; + return null; + }, +); export const mockBlogCreate = jest.fn(async (blog: Blog): Promise => { blog._id = BLOG_ID; return blog; }); -export const mockBlogUpdate = jest.fn(async (blog: Blog): Promise => blog); +export const mockBlogUpdate = jest.fn( + async (blog: Blog): Promise => blog, +); -export const mockFindBlogAllDataById = jest.fn(async (id: Types.ObjectId): Promise => { - if (BLOG_ID.equals(id)) - return { - _id: BLOG_ID, - author: { _id: USER_ID_WRITER }, - isDraft: true, - isSubmitted: false, - isPublished: false, - } as Blog; - if (BLOG_ID_2.equals(id)) - return { - _id: BLOG_ID, - author: { _id: new Types.ObjectId() }, - isDraft: true, - isSubmitted: false, - isPublished: false, - } as Blog; - return null; -}); +export const mockFindBlogAllDataById = jest.fn( + async (id: Types.ObjectId): Promise => { + if (BLOG_ID.equals(id)) + return { + _id: BLOG_ID, + author: { _id: USER_ID_WRITER }, + isDraft: true, + isSubmitted: false, + isPublished: false, + } as Blog; + if (BLOG_ID_2.equals(id)) + return { + _id: BLOG_ID, + author: { _id: new Types.ObjectId() }, + isDraft: true, + isSubmitted: false, + isPublished: false, + } as Blog; + return null; + }, +); jest.mock('../../../../../src/database/repository/BlogRepo', () => ({ findUrlIfExists: mockBlogFindUrlIfExists, diff --git a/tests/routes/v1/blog/writer/unit.test.ts b/tests/routes/v1/blog/writer/unit.test.ts index 6b58d4f..71da445 100644 --- a/tests/routes/v1/blog/writer/unit.test.ts +++ b/tests/routes/v1/blog/writer/unit.test.ts @@ -217,7 +217,10 @@ describe('Writer blog submit routes', () => { const endpoint = '/v1/blog/writer/submit/'; it('Should send error if submit blog id is not valid', async () => { - const response = await addAuthHeaders(request.put(endpoint + 'abc'), WRITER_ACCESS_TOKEN); + const response = await addAuthHeaders( + request.put(endpoint + 'abc'), + WRITER_ACCESS_TOKEN, + ); expect(response.status).toBe(400); expect(response.body.message).toMatch(/id/i); expect(response.body.message).toMatch(/invalid/i); @@ -258,7 +261,10 @@ describe('Writer blog withdraw routes', () => { const endpoint = '/v1/blog/writer/withdraw/'; it('Should send error if withdraw blog id is not valid', async () => { - const response = await addAuthHeaders(request.put(endpoint + 'abc'), WRITER_ACCESS_TOKEN); + const response = await addAuthHeaders( + request.put(endpoint + 'abc'), + WRITER_ACCESS_TOKEN, + ); expect(response.status).toBe(400); expect(response.body.message).toMatch(/id/i); expect(response.body.message).toMatch(/invalid/i); @@ -299,7 +305,10 @@ describe('Writer blog delete routes', () => { const endpoint = '/v1/blog/writer/id/'; it('Should send error if deleting blog id is not valid', async () => { - const response = await addAuthHeaders(request.delete(endpoint + 'abc'), WRITER_ACCESS_TOKEN); + const response = await addAuthHeaders( + request.delete(endpoint + 'abc'), + WRITER_ACCESS_TOKEN, + ); expect(response.status).toBe(400); expect(response.body.message).toMatch(/id/i); expect(response.body.message).toMatch(/invalid/i); @@ -339,7 +348,10 @@ describe('Writer blog get by id routes', () => { const endpoint = '/v1/blog/writer/id/'; it('Should send error if fetching blog id is not valid', async () => { - const response = await addAuthHeaders(request.get(endpoint + 'abc'), WRITER_ACCESS_TOKEN); + const response = await addAuthHeaders( + request.get(endpoint + 'abc'), + WRITER_ACCESS_TOKEN, + ); expect(response.status).toBe(400); expect(response.body.message).toMatch(/id/i); expect(response.body.message).toMatch(/invalid/i); From caefa096d12fc9d6852568ae9a7fabfc409edf6c Mon Sep 17 00:00:00 2001 From: Janishar Ali Date: Mon, 19 Dec 2022 23:57:27 +0530 Subject: [PATCH 33/33] update readme --- README.md | 106 +++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 77 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index a10878f..5146089 100644 --- a/README.md +++ b/README.md @@ -1,31 +1,56 @@ # Node.js Backend Architecture Typescript Project -Learn to build a Blogging platform like Medium, MindOrks, and FreeCodeCamp - Open-Source Project By Janishar Ali +A complete project to build a blogging platform like Medium, and FreeCodeCamp + +> Note: This is the **latest (version 2)** of the project. If you are using **version 1** then checkout the branch [**version-1**](https://github.com/janishar/nodejs-backend-architecture-typescript/tree/version-1)


    -## About this Open Source Project -This open-source project is for you(community). I (https://janisharali.com) have taken this initiative to promote Backend Learning in the best possible way. I am determined to provide quality content for everyone. Let's do it together by learning from this project. +# Project Highlights +1. Node.js +2. Express.js +3. Typescript +4. Mongoose +5. Redis +6. Mongodb +7. Joi +8. Unit Tests & Integration Tests +9. Docker +10. JWT + +# About The Project +This project is designed to be used in a production ready environment. It will handle the scale and complexity of very demanding applications. This project is used by companies like Mindorks, AfterAcademy, and CuriousJr, having 10+ million usebase. + +It can be used to serve websites, mobile apps, and other API services. + +# About The Author +I, [Janishar Ali](https://janisharali.com) have created this project using my 10 years of experience in developing software for top tech companies. I enjoy sharing my learnings with the community. You can connect with me here: +* [Twitter](https://twitter.com/janisharali) +* [LinkedIn](https://www.linkedin.com/in/janishar-ali) +* [Instagram](https://www.instagram.com/janisharali) -## We will learn and build the backend application for a blogging platform. -The main focus will be to create a maintainable and highly testable architecture. +[Learn from My YouTube Channel](https://www.youtube.com/@janisharali) + +# Project Instructions +We will learn and build the backend application for a blogging platform. The main focus will be to create a maintainable and highly testable architecture.
    Following are the features of this project: * **This backend is written in Typescript**: The type safety at build time and having intellisense for it in the IDE like vscode is unparalleled to productivity. We have found production bug reduced to a significant amount since most of the code vulnerabilities are identified during the build phase itself. -* **Separation of concern principle is applied**: Each component has been given a particular role. The role of the components is mutually exclusive. This makes the project easy to be unit tested. -* **Feature encapsulation is adopted**: The files or components that are related to a particular feature have been grouped unless those components are required in multiple features. This enhances the ability to share code across projects. -* **Centralised Error handling is done**: We have created a framework where all the errors are handled centrally. This reduces the ambiguity in the development when the project grows larger. -* **Centralised Response handling is done**: Similar to Error handling we have a response handling framework. This makes it very convenient to apply a common API response pattern. +* **Separation of concern principle**: Each component has been given a particular role. The role of the components is mutually exclusive. This makes the project easy to be unit tested. +* **Feature encapsulation**: The files or components that are related to a particular feature have been grouped unless those components are required in multiple features. This enhances the ability to share code across projects. +* **Centralised Error handling**: We have created a framework where all the errors are handled centrally. This reduces the ambiguity in the development when the project grows larger. +* **Centralised Response handling**: Similar to Error handling we have a response handling framework. This makes it very convenient to apply a common API response pattern. * **Mongodb is used through Mongoose**: Mongodb fits very well to the node.js application. Being NoSQL, fast, and scalable makes it ideal for modern web applications. -* **Async execution is adopted**: We have used async/await for the promises and made sure to use the non-blocking version of all the functions with few exceptions. +* **Redis Memcache**: We have used the redis server for caching the items which does not change frequently. It will boost the performance of our system. +* **Async execution**: We have used async/await for the promises and made sure to use the non-blocking version of all the functions with few exceptions. * **Docker compose has been configured**: We have created the Dockerfile to provide the easy deployability without any setup and configurations. * **Unit test is favored**: The tests have been written to test the functions and routes without the need of the database server. Integration tests has also been done but the unit test is favored. * **A pure backend project**: We have experienced that when a backend is developed clubbed with a frontend then in the future it becomes really difficult to scale. We would want to create a separate backend project that servers many websites and mobile apps. -## We have also open source a complete blogging website working on this backend project: [Goto Repository](https://github.com/janishar/react-app-architecture) -> In the above repository [**React.js Isomorphic Web Application Architecture**] we will learn and build a React web application for a blogging platform using this project as its API server. [Visit demo website](https://demo.react-app-architecture.afteracademy.com) +> We have also open source a complete blogging website working on this backend project: [Goto Repository](https://github.com/janishar/react-app-architecture) +The repository [**React.js Isomorphic Web Application Architecture**] has a complete React.js web application implemented for a blogging platform which is using this project as its API server. ## 3RE Architecture: Router, RouteHandler, ResponseHandler, ErrorHandler

    @@ -51,7 +76,7 @@ Following are the features of this project: * [Implement JSON Web Token (JWT) Authentication using AccessToken and RefreshToken](https://janisharali.com/blog/implement-json-web-token-jwt-authentication-using-access-token-and-refresh-token) * [TypeScript Tutorial For Beginners](https://afteracademy.com/blog/typescript-tutorial-for-beginners) * [From JavaScript to TypeScript](https://afteracademy.com/blog/from-javascript-to-typescript) -* [Authentication vs Authorization](https://afteracademy.com/blog/authentication-vs-authorization) + ## You can find the complete API documentation [here](https://documenter.getpostman.com/view/1552895/SzYUZg52?version=latest) @@ -92,6 +117,11 @@ Following are the features of this project: ## Project Directory Structure ``` +├── .vscode +│ ├── settings.json +│ ├── tasks.json +│ └── launch.json +├── .templates ├── src │ ├── server.ts │ ├── app.ts @@ -106,7 +136,15 @@ Following are the features of this project: │ │ ├── ApiError.ts │ │ ├── ApiResponse.ts │ │ ├── JWT.ts -│ │ └── Logger.ts +│ │ ├── Logger.ts +│ │ └── utils.ts +│ ├── cache +│ │   ├── index.ts +│ │   ├── keys.ts +│ │   ├── query.ts +│ │   └── repository +│ │   ├── BlogCache.ts +│ │   └── BlogsCache.ts │ ├── database │ │ ├── index.ts │ │ ├── model @@ -123,22 +161,29 @@ Following are the features of this project: │ │ └── UserRepo.ts │ ├── helpers │ │ ├── asyncHandler.ts +│ │ ├── permission.ts │ │ ├── role.ts +│ │ ├── security.ts +│ │ ├── utils.ts │ │ └── validator.ts │ ├── routes │ │ └── v1 │ │ ├── access +│ │ │ ├── credential.ts │ │ │ ├── login.ts │ │ │ ├── logout.ts │ │ │ ├── schema.ts │ │ │ ├── signup.ts -│ │ │ └── token.ts +│ │ │ ├── token.ts +│ │ │ └── utils.ts │ │ ├── blog -│ │ │ ├── blogDetail.ts -│ │ │ ├── blogList.ts │ │ │ ├── editor.ts +│ │ │ ├── index.ts │ │ │ ├── schema.ts │ │ │ └── writer.ts +│ │   ├── blogs +│ │   │   ├── index.ts +│ │   │   └── schema.ts │ │ ├── index.ts │ │ └── profile │ │ ├── schema.ts @@ -163,22 +208,27 @@ Following are the features of this project: │ │ └── jwt │ │ ├── mock.ts │ │ └── unit.test.ts +│ ├── cache +│ │ └── mock.ts +│ ├── database +│ │ └── mock.ts │ ├── routes │ │ └── v1 -│ │ ├── blog -│ │ │ ├── blogDetail +│ │ ├── access +│ │ │ ├── login +│ │ │ │ ├── integration.test.ts │ │ │ │ ├── mock.ts │ │ │ │ └── unit.test.ts -│ │ │ └── writer +│ │ │ └── signup │ │ │ ├── mock.ts │ │ │ └── unit.test.ts -│ │ ├── login -│ │ │ ├── integration.test.ts -│ │ │ ├── mock.ts -│ │ │ └── unit.test.ts -│ │ └── signup -│ │ ├── mock.ts -│ │ └── unit.test.ts +│ │ └── blog +│ │ ├── index +│ │ │ ├── mock.ts +│ │ │ └── unit.test.ts +│ │ └── writer +│ │ ├── mock.ts +│ │ └── unit.test.ts │ ├── .env.test │ └── setup.ts ├── addons @@ -194,8 +244,6 @@ Following are the features of this project: ├── .prettierrc ├── .prettierignore ├── .travis.yml -├── .vscode -│ └── launch.json ├── Dockerfile ├── docker-compose.yml ├── package-lock.json