diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index ec26c7836..000000000 --- a/.eslintrc.js +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Eslint config file. - */ -module.exports = { - env: { - commonjs: true, - es2021: true, - node: true, - mocha: true, - }, - extends: ["standard", "plugin:mocha/recommended", "plugin:security/recommended", "plugin:prettier/recommended"], - plugins: ["mocha", "security", "prettier"], - parserOptions: { - ecmaVersion: 13, - }, - globals: { - config: "readonly", - logger: "readonly", - }, - rules: { - // Custom eslint rules - "no-trailing-spaces": "error", - "consistent-return": "error", - "no-console": "error", - - // Custom mocha rules - "mocha/no-skipped-tests": "error", - "mocha/no-exclusive-tests": "error", - - // Prettier for formatting - "prettier/prettier": "error", - }, - ignorePatterns: ["public/*", "dist/*"], -}; diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 000000000..5952e5c02 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,33 @@ +{ + "env": { + "es2021": true, + "node": true, + "mocha": true + }, + "extends": [ + "standard", + "plugin:mocha/recommended", + "plugin:security/recommended", + "plugin:prettier/recommended" + ], + "plugins": ["mocha", "security", "prettier"], + "parserOptions": { + "ecmaVersion": 13, + "sourceType": "module" + }, + "globals": { + "config": "readonly", + "logger": "readonly" + }, + "rules": { + "no-trailing-spaces": "error", + "consistent-return": "error", + "no-console": "error", + "import/extensions": ["error", "always"], + "import/no-commonjs": "error", + "mocha/no-skipped-tests": "error", + "mocha/no-exclusive-tests": "error", + "prettier/prettier": "error" + }, + "ignorePatterns": ["public/*", "dist/*"] +} \ No newline at end of file diff --git a/.gitignore b/.gitignore index 90018a6eb..286347f5c 100644 --- a/.gitignore +++ b/.gitignore @@ -124,5 +124,6 @@ dist # Local config file config/local.js +config/local.cjs -package-lock.json \ No newline at end of file +package-lock.json diff --git a/.mocharc.js b/.mocharc.js index 77bfc2401..c6ee4e84d 100644 --- a/.mocharc.js +++ b/.mocharc.js @@ -2,7 +2,7 @@ * Mocha configuration file * Info: https://mochajs.org/#configuring-mocha-nodejs */ -module.exports = { +export default { timeout: "5000", extension: ["ts", "js"], require: "ts-node/register", diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 31ac0844a..88ad541c6 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -74,7 +74,7 @@ The following project structure should be followed: | | |-- services | |-- utils // Utility functions to be used while testing |-- utils // Files containing utility functions - | |-- logger.js + | |-- logger |-- .github | |-- workflows | |-- // Github actions files diff --git a/app.js b/app.js deleted file mode 100644 index 383086921..000000000 --- a/app.js +++ /dev/null @@ -1,35 +0,0 @@ -const createError = require("http-errors"); -const express = require("express"); -const { isMulterError, multerErrorHandling } = require("./utils/multer"); - -// Attach response headers -const responseHeaders = require("./middlewares/responseHeaders"); - -// import app middlewares -const AppMiddlewares = require("./middlewares"); - -// import routes -const indexRouter = require("./routes/index"); - -const app = express(); - -// Add Middlewares, routes -AppMiddlewares(app); -app.use("/", responseHeaders, indexRouter); - -// catch 404 and forward to error handler -app.use(function (req, res, next) { - next(createError(404)); -}); - -// error handler -app.use(function (err, req, res, _next) { - if (isMulterError(err)) { - return multerErrorHandling(err, req, res); - } - return res.boom.boomify(err, { - statusCode: err.statusCode, - }); -}); - -module.exports = app; diff --git a/app.ts b/app.ts new file mode 100644 index 000000000..2e1944efb --- /dev/null +++ b/app.ts @@ -0,0 +1,37 @@ +import createError from "http-errors"; +import express from "express"; +import { isMulterError, multerErrorHandling } from "./utils/multer.js"; + +// Attach response headers +import { responseHeaders } from "./middlewares/responseHeaders.js"; + +// import app middlewares +import { middleware } from "./middlewares/index.js"; + +// import routes +import { appRoutes } from "./routes/index.js"; +import logger from "./utils/logger.js"; + +const app = express(); + +// Add Middlewares, routes +middleware(app); +app.use("/", responseHeaders, appRoutes); + +// catch 404 and forward to error handler +app.use(function (req, res, next) { + next(createError(404)); +}); + +// error handler +app.use(function (err, req, res, next) { + if (isMulterError(err)) { + return multerErrorHandling(err, req, res, next); + } + console.error(err); // TODO: add logger here + return res.boom.boomify(err, { + statusCode: err.statusCode, + }); +}); + +export default app; diff --git a/config/custom-environment-variables.js b/config/custom-environment-variables.cjs similarity index 97% rename from config/custom-environment-variables.js rename to config/custom-environment-variables.cjs index a17419a73..eee5bd791 100644 --- a/config/custom-environment-variables.js +++ b/config/custom-environment-variables.cjs @@ -5,6 +5,8 @@ * * Documentation: https://github.com/lorenwest/node-config/wiki/Environment-Variables */ +// @ts-ignore +// eslint-disable-next-line import/no-commonjs module.exports = { port: { __name: "PORT", diff --git a/config/default.js b/config/default.cjs similarity index 98% rename from config/default.js rename to config/default.cjs index 4b7dc2b83..bccbc3979 100644 --- a/config/default.js +++ b/config/default.cjs @@ -7,6 +7,8 @@ */ const NODE_ENV = process.env.NODE_ENV; +// @ts-ignore +// eslint-disable-next-line import/no-commonjs module.exports = { port: 3000, enableFileLogs: true, diff --git a/config/development.js b/config/development.cjs similarity index 97% rename from config/development.js rename to config/development.cjs index 0e4d3bd44..7d745b882 100644 --- a/config/development.js +++ b/config/development.cjs @@ -6,6 +6,8 @@ const port = 3000; const localUrl = `http://localhost:${port}`; +// @ts-ignore +// eslint-disable-next-line import/no-commonjs module.exports = { port: port, enableFileLogs: false, diff --git a/config/production.js b/config/production.cjs similarity index 89% rename from config/production.js rename to config/production.cjs index b1d870cbf..81a253c4d 100644 --- a/config/production.js +++ b/config/production.cjs @@ -2,6 +2,8 @@ * Set the environment specific config in this file. * Defaults set from default.js */ +// @ts-ignore +// eslint-disable-next-line import/no-commonjs module.exports = { discordUnverifiedRoleId: "1103047289330745386", discordDeveloperRoleId: "915490782939582485", diff --git a/config/staging.js b/config/staging.cjs similarity index 92% rename from config/staging.js rename to config/staging.cjs index 5e26e7fbe..3908f0f25 100644 --- a/config/staging.js +++ b/config/staging.cjs @@ -2,6 +2,8 @@ * Set the environment specific config in this file. * Defaults set from default.js */ +// @ts-ignore +// eslint-disable-next-line import/no-commonjs module.exports = { discordUnverifiedRoleId: "1120875993771544687", discordDeveloperRoleId: "1121445071213056071", diff --git a/constants/answers.ts b/constants/answers.ts index 01f8ad573..649bc6776 100644 --- a/constants/answers.ts +++ b/constants/answers.ts @@ -4,4 +4,4 @@ const ANSWER_STATUS = { REJECTED: "REJECTED", } -module.exports = { ANSWER_STATUS } \ No newline at end of file +export { ANSWER_STATUS }; \ No newline at end of file diff --git a/constants/application.ts b/constants/application.ts index 1c830ffa2..b944690f3 100644 --- a/constants/application.ts +++ b/constants/application.ts @@ -4,4 +4,4 @@ const API_RESPONSE_MESSAGES = { APPLICATION_RETURN_SUCCESS: "Applications returned successfully", }; -module.exports = { APPLICATION_STATUS_TYPES, API_RESPONSE_MESSAGES }; +export { APPLICATION_STATUS_TYPES, API_RESPONSE_MESSAGES }; diff --git a/constants/authorities.ts b/constants/authorities.ts index 095004b96..bea40f5ba 100644 --- a/constants/authorities.ts +++ b/constants/authorities.ts @@ -1,7 +1,5 @@ -const AUTHORITIES = { +export const AUTHORITIES = { SUPERUSER: "super_user", MEMBER: "member", USER: "user", }; - -module.exports = { AUTHORITIES }; diff --git a/constants/badges.ts b/constants/badges.ts index f66aaa362..7ab4a5f58 100644 --- a/constants/badges.ts +++ b/constants/badges.ts @@ -39,7 +39,4 @@ const SUCCESS_MESSAGES = { }, }; -module.exports = { - ERROR_MESSAGES, - SUCCESS_MESSAGES, -}; +export { ERROR_MESSAGES, SUCCESS_MESSAGES }; diff --git a/constants/bot.ts b/constants/bot.ts index bc8a01534..702c92b9f 100644 --- a/constants/bot.ts +++ b/constants/bot.ts @@ -7,4 +7,4 @@ const Services = { CRON_JOB_HANDLER: CRON_JOB_HANDLER, }; -module.exports = { CLOUDFLARE_WORKER, BAD_TOKEN, CRON_JOB_HANDLER, Services }; +export { CLOUDFLARE_WORKER, BAD_TOKEN, CRON_JOB_HANDLER, Services }; diff --git a/constants/cacheKeys.ts b/constants/cacheKeys.ts index 08be43e61..666b8706b 100644 --- a/constants/cacheKeys.ts +++ b/constants/cacheKeys.ts @@ -1,3 +1,3 @@ const ALL_TASKS = "cache:ALL-TASKS"; -module.exports = { ALL_TASKS }; +export { ALL_TASKS }; diff --git a/constants/cloudflareCache.ts b/constants/cloudflareCache.ts index 725c10001..e752ba13e 100644 --- a/constants/cloudflareCache.ts +++ b/constants/cloudflareCache.ts @@ -1,5 +1,5 @@ -const MAX_CACHE_PURGE_COUNT = 3; -const CLOUDFLARE_ZONE_ID = config.get("cloudflare.CLOUDFLARE_ZONE_ID"); -const CLOUDFLARE_PURGE_CACHE_API = `https://api.cloudflare.com/client/v4/zones/${CLOUDFLARE_ZONE_ID}/purge_cache`; +import config from 'config'; -module.exports = { MAX_CACHE_PURGE_COUNT, CLOUDFLARE_PURGE_CACHE_API }; +export const MAX_CACHE_PURGE_COUNT = 3; +export const CLOUDFLARE_ZONE_ID = config.get("cloudflare.CLOUDFLARE_ZONE_ID"); +export const CLOUDFLARE_PURGE_CACHE_API = `https://api.cloudflare.com/client/v4/zones/${CLOUDFLARE_ZONE_ID}/purge_cache`; diff --git a/constants/cloudinary.ts b/constants/cloudinary.ts index 94e19f78b..bddd3a9b2 100644 --- a/constants/cloudinary.ts +++ b/constants/cloudinary.ts @@ -1,4 +1,4 @@ -module.exports = { +export default { PROFILE: { FOLDER: "/profile/", TAGS: ["profile", "user"], diff --git a/constants/constants.ts b/constants/constants.ts index 43d54183b..f3f666571 100644 --- a/constants/constants.ts +++ b/constants/constants.ts @@ -16,8 +16,4 @@ const HEADERS_FOR_SSE = { "Cache-Control": "no-cache", }; -module.exports = { - DOCUMENT_WRITE_SIZE, - daysOfWeek, - HEADERS_FOR_SSE, -}; +export { DOCUMENT_WRITE_SIZE, daysOfWeek, HEADERS_FOR_SSE }; diff --git a/constants/errorMessages.ts b/constants/errorMessages.ts index 66a2477d0..3ff2e52af 100644 --- a/constants/errorMessages.ts +++ b/constants/errorMessages.ts @@ -1,12 +1,10 @@ -module.exports = { - INTERNAL_SERVER_ERROR: "An internal server error occurred", - SOMETHING_WENT_WRONG: "Something went wrong. Please try again or contact admin", - ONLY_IMAGE_SUPPORTED: "Only image/jpeg, image/png supported", - ONLY_ONE_FILE_ALLOWED: "Only one file allowed", - DATA_ADDED_SUCCESSFULLY: "User Device Info added successfully!", - USER_DATA_ALREADY_PRESENT: "The authentication document has already been created", - BAD_REQUEST: "BAD_REQUEST", - INVALID_QUERY_PARAM: "Invalid Query Parameters Passed", - FILE_TOO_LARGE: (size) => `File too large, max accepted size is ${size} MB`, - USER_DOES_NOT_EXIST_ERROR: "User does not exist!", -}; +export const INTERNAL_SERVER_ERROR = "An internal server error occurred"; +export const SOMETHING_WENT_WRONG = "Something went wrong. Please try again or contact admin"; +export const ONLY_IMAGE_SUPPORTED = "Only image/jpeg, image/png supported"; +export const ONLY_ONE_FILE_ALLOWED = "Only one file allowed"; +export const DATA_ADDED_SUCCESSFULLY = "User Device Info added successfully!"; +export const USER_DATA_ALREADY_PRESENT = "The authentication document has already been created"; +export const BAD_REQUEST = "BAD_REQUEST"; +export const INVALID_QUERY_PARAM = "Invalid Query Parameters Passed"; +export const FILE_TOO_LARGE = (size: number) => `File too large, max accepted size is ${size} MB`; +export const USER_DOES_NOT_EXIST_ERROR = "User does not exist!"; diff --git a/constants/events.ts b/constants/events.ts index 3a4e91cac..187c6814e 100644 --- a/constants/events.ts +++ b/constants/events.ts @@ -16,4 +16,4 @@ const EVENT_ROLES = { GUEST: "guest", }; -module.exports = { API_100MS_BASE_URL, GET_ALL_EVENTS_LIMIT_MIN, UNWANTED_PROPERTIES_FROM_100MS, EVENT_ROLES }; +export { API_100MS_BASE_URL, GET_ALL_EVENTS_LIMIT_MIN, UNWANTED_PROPERTIES_FROM_100MS, EVENT_ROLES }; diff --git a/constants/extensionRequests.ts b/constants/extensionRequests.ts index 89b5582d2..c2d973b6f 100644 --- a/constants/extensionRequests.ts +++ b/constants/extensionRequests.ts @@ -4,6 +4,4 @@ const EXTENSION_REQUEST_STATUS = { DENIED: "DENIED", }; -module.exports = { - EXTENSION_REQUEST_STATUS, -}; +export { EXTENSION_REQUEST_STATUS }; diff --git a/constants/external-accounts.ts b/constants/external-accounts.ts index 8524e63ef..94ff683fc 100644 --- a/constants/external-accounts.ts +++ b/constants/external-accounts.ts @@ -2,6 +2,4 @@ const EXTERNAL_ACCOUNTS_POST_ACTIONS = { DISCORD_USERS_SYNC: "discord-users-sync", }; -module.exports = { - EXTERNAL_ACCOUNTS_POST_ACTIONS, -}; +export { EXTERNAL_ACCOUNTS_POST_ACTIONS }; diff --git a/constants/firebase.ts b/constants/firebase.ts index 1d8e7ae63..68170c716 100644 --- a/constants/firebase.ts +++ b/constants/firebase.ts @@ -1,5 +1,3 @@ const BATCH_SIZE_IN_CLAUSE = 30; // since only 30 comparision values are allowed in 'in' clause -module.exports = { - BATCH_SIZE_IN_CLAUSE, -}; +export { BATCH_SIZE_IN_CLAUSE }; diff --git a/constants/imageVerificationTypes.ts b/constants/imageVerificationTypes.ts index 6d0c55579..9c5c9c678 100644 --- a/constants/imageVerificationTypes.ts +++ b/constants/imageVerificationTypes.ts @@ -1,3 +1,3 @@ const IMAGE_VERIFICATION_TYPES = ["profile", "discord"]; -module.exports = { IMAGE_VERIFICATION_TYPES }; +export { IMAGE_VERIFICATION_TYPES }; diff --git a/constants/items.ts b/constants/items.ts index cd2c04c54..b74911d43 100644 --- a/constants/items.ts +++ b/constants/items.ts @@ -1,3 +1 @@ -module.exports = { - TYPES: ["TASK", "USER"], -}; +export const TYPES = ["TASK", "USER"]; diff --git a/constants/logs.ts b/constants/logs.ts index 3ebfdf790..acccff415 100644 --- a/constants/logs.ts +++ b/constants/logs.ts @@ -1,4 +1,4 @@ -import { REQUEST_LOG_TYPE } from "./requests"; +import { REQUEST_LOG_TYPE } from "./requests.js"; export const logType = { PROFILE_DIFF_APPROVED: "PROFILE_DIFF_APPROVED", diff --git a/constants/monitor.ts b/constants/monitor.ts index 314e6242b..56adacb3a 100644 --- a/constants/monitor.ts +++ b/constants/monitor.ts @@ -12,4 +12,4 @@ const RESPONSE_MESSAGES = { RESOURCE_ALREADY_TRACKED, }; -module.exports = { RESPONSE_MESSAGES }; +export { RESPONSE_MESSAGES }; diff --git a/constants/multer.ts b/constants/multer.ts index 8685ae814..193222b05 100644 --- a/constants/multer.ts +++ b/constants/multer.ts @@ -1,4 +1,2 @@ -module.exports = { - FILE_SIZE_1MB: 1_000_000, // in bytes, 1000000 bytes = 1MB - PROFILE_FILE_SIZE: 2_000_000, // Limiting profile upload size to 2MB -}; +export const FILE_SIZE_1MB = 1_000_000; // in bytes, 1000000 bytes = 1MB +export const PROFILE_FILE_SIZE = 2_000_000; // Limiting profile upload size to 2MB diff --git a/constants/profileDiff.ts b/constants/profileDiff.ts index c83650360..6d435aa91 100644 --- a/constants/profileDiff.ts +++ b/constants/profileDiff.ts @@ -4,4 +4,4 @@ const profileDiffStatus = { PENDING: "PENDING", }; -module.exports = { profileDiffStatus }; +export { profileDiffStatus }; diff --git a/constants/progresses.ts b/constants/progresses.ts index 12fc8c6f7..1df896eac 100644 --- a/constants/progresses.ts +++ b/constants/progresses.ts @@ -1,37 +1,22 @@ -const PROGRESS_DOCUMENT_CREATED_SUCCEEDED = "Progress document created successfully."; -const PROGRESS_DOCUMENT_RETRIEVAL_SUCCEEDED = "Progress document retrieved successfully."; -const PROGRESS_DOCUMENT_NOT_FOUND = "No progress records found."; -const PROGRESS_ALREADY_CREATED = "Progress for the day has already been created."; -const MILLISECONDS_IN_DAY = 24 * 60 * 60 * 1000; -const INTERNAL_SERVER_ERROR_MESSAGE = +export const PROGRESS_DOCUMENT_CREATED_SUCCEEDED = "Progress document created successfully."; +export const PROGRESS_DOCUMENT_RETRIEVAL_SUCCEEDED = "Progress document retrieved successfully."; +export const PROGRESS_DOCUMENT_NOT_FOUND = "No progress records found."; +export const PROGRESS_ALREADY_CREATED = "Progress for the day has already been created."; +export const MILLISECONDS_IN_DAY = 24 * 60 * 60 * 1000; +export const INTERNAL_SERVER_ERROR_MESSAGE = "The server has encountered an unexpected error. Please contact the administrator for more information."; -const PROGRESSES_RESPONSE_MESSAGES = { +export const PROGRESSES_RESPONSE_MESSAGES = { PROGRESS_DOCUMENT_CREATED_SUCCEEDED, PROGRESS_DOCUMENT_RETRIEVAL_SUCCEEDED, PROGRESS_DOCUMENT_NOT_FOUND, PROGRESS_ALREADY_CREATED, }; -const TYPE_MAP = { - user: "userId", - task: "taskId", -}; -const PROGRESS_VALID_SORT_FIELDS = ["date", "-date"]; -const PROGRESSES_SIZE = 20; -const PROGRESSES_PAGE_SIZE = 0; -const VALID_PROGRESS_TYPES = ["task", "user"]; - -const UNAUTHORIZED_WRITE = "Unauthorized to write progress of task"; +export const TYPE_MAP = { user: "userId", task: "taskId" }; +export const PROGRESS_VALID_SORT_FIELDS = ["date", "-date"]; +export const PROGRESSES_SIZE = 20; +export const PROGRESSES_PAGE_SIZE = 0; +export const VALID_PROGRESS_TYPES = ["task", "user"]; -module.exports = { - PROGRESSES_RESPONSE_MESSAGES, - MILLISECONDS_IN_DAY, - INTERNAL_SERVER_ERROR_MESSAGE, - TYPE_MAP, - VALID_PROGRESS_TYPES, - PROGRESS_VALID_SORT_FIELDS, - PROGRESSES_SIZE, - PROGRESSES_PAGE_SIZE, - UNAUTHORIZED_WRITE, -}; +export const UNAUTHORIZED_WRITE = "Unauthorized to write progress of task"; diff --git a/constants/rateLimiting.ts b/constants/rateLimiting.ts index cd208e1bc..5012ff9df 100644 --- a/constants/rateLimiting.ts +++ b/constants/rateLimiting.ts @@ -3,6 +3,4 @@ const TOO_MANY_REQUESTS = { STATUS_CODE: 429, }; -module.exports = { - TOO_MANY_REQUESTS, -}; +export { TOO_MANY_REQUESTS }; diff --git a/constants/roles.ts b/constants/roles.ts index d28e484a0..c640a9037 100644 --- a/constants/roles.ts +++ b/constants/roles.ts @@ -1,5 +1,5 @@ // Use Roles with authorizeRoles middleware -const ROLES = { +export const ROLES = { SUPERUSER: "super_user", APPOWNER: "app_owner", MEMBER: "member", @@ -7,4 +7,3 @@ const ROLES = { INDISCORD: "in_discord", }; -module.exports = ROLES; diff --git a/constants/tags.ts b/constants/tags.ts index 7d71c0434..978c4b802 100644 --- a/constants/tags.ts +++ b/constants/tags.ts @@ -1,3 +1 @@ -module.exports = { - TYPES: ["TASK", "USER", "SKILL"], -}; +export const TYPES = ["TASK", "USER", "SKILL"]; diff --git a/constants/taskRequests.ts b/constants/taskRequests.ts index 4b1a222c3..aa665b276 100644 --- a/constants/taskRequests.ts +++ b/constants/taskRequests.ts @@ -13,7 +13,7 @@ const TASK_REQUEST_ERROR_MESSAGE = { INVALID_PREV: "Invalid 'prev' value", INVALID_NEXT: "Invalid 'next' value", }; -export const TASK_REQUEST_TYPE = { +const TASK_REQUEST_TYPE = { ASSIGNMENT: "ASSIGNMENT", CREATION: "CREATION", }; @@ -42,7 +42,7 @@ const MIGRATION_TYPE = { ADD_COUNT_CREATED: "add-count-created-time" }; -module.exports = { +export { TASK_REQUEST_STATUS, TASK_REQUEST_TYPE, TASK_REQUEST_FILTER_KEYS, diff --git a/constants/tasks.ts b/constants/tasks.ts index 48328fa1f..d0319c07a 100644 --- a/constants/tasks.ts +++ b/constants/tasks.ts @@ -49,7 +49,7 @@ const tasksUsersStatus = { MISSED_UPDATES: "missed-updates", }; -module.exports = { +export { TASK_TYPE, TASK_STATUS, TASK_STATUS_OLD, diff --git a/constants/urls.ts b/constants/urls.ts index 2943a1463..626d6fb59 100644 --- a/constants/urls.ts +++ b/constants/urls.ts @@ -1,7 +1,2 @@ export const GITHUB_URL = "https://github.com"; export const PROFILE_SVC_GITHUB_URL = "https://github.com/Real-Dev-Squad/sample-profile-service"; - -module.exports = { - GITHUB_URL, - PROFILE_SVC_GITHUB_URL, -}; diff --git a/constants/userDataLevels.ts b/constants/userDataLevels.ts index 88c792dec..391e4387f 100644 --- a/constants/userDataLevels.ts +++ b/constants/userDataLevels.ts @@ -1,21 +1,20 @@ -const ACCESS_LEVEL = { +export const ACCESS_LEVEL = { PUBLIC: "public", INTERNAL: "internal", PRIVATE: "private", CONFIDENTIAL: "confidential", }; -const ROLE_LEVEL = { +export const ROLE_LEVEL = { private: ["super_user"], internal: ["super_user", "cloudfare_worker"], confidential: ["super_user"], }; -const KEYS_NOT_ALLOWED = { +export const KEYS_NOT_ALLOWED = { public: ["email", "phone", "chaincode"], internal: ["phone", "chaincode"], private: ["chaincode"], confidential: [], }; -module.exports = { ACCESS_LEVEL, KEYS_NOT_ALLOWED, ROLE_LEVEL }; diff --git a/constants/users.ts b/constants/users.ts index ec2aab59a..dc40932e0 100644 --- a/constants/users.ts +++ b/constants/users.ts @@ -50,7 +50,7 @@ const SIMULTANEOUS_WORKER_CALLS = 4; const MAX_USERNAME_LENGTH = 32; -module.exports = { +export { profileStatus, USER_STATUS, ALLOWED_FILTER_PARAMS, diff --git a/constants/wallets.ts b/constants/wallets.ts index a8f9d971c..380b7adef 100644 --- a/constants/wallets.ts +++ b/constants/wallets.ts @@ -1,7 +1,5 @@ -module.exports = { - DINERO: "dinero", - NEELAM: "neelam", - INITIAL_WALLET: { - dinero: 1000, - }, +export const DINERO = "dinero"; +export const NEELAM = "neelam"; +export const INITIAL_WALLET = { + dinero: 1000, }; diff --git a/controllers/answers.ts b/controllers/answers.ts index b44efb3fb..bf11f5ab6 100644 --- a/controllers/answers.ts +++ b/controllers/answers.ts @@ -1,14 +1,15 @@ import { Request } from "express"; -const crypto = require("crypto"); +import crypto from "crypto"; -import { Answer, AnswerClient, AnswerFieldsToUpdate, AnswerStatus } from "../typeDefinitions/answers"; -import { CustomRequest, CustomResponse } from "../typeDefinitions/global"; +import { Answer, AnswerClient, AnswerFieldsToUpdate, AnswerStatus } from "../typeDefinitions/answers.js"; +import { CustomRequest, CustomResponse } from "../typeDefinitions/global.js"; -const answerQuery = require("../models/answers"); +import * as answerQuery from "../models/answers.js"; -const { ANSWER_STATUS } = require("../constants/answers"); -const { HEADERS_FOR_SSE } = require("../constants/constants"); -const { INTERNAL_SERVER_ERROR } = require("../constants/errorMessages"); +import { ANSWER_STATUS } from "../constants/answers.js"; +import { HEADERS_FOR_SSE } from "../constants/constants.js"; +import { INTERNAL_SERVER_ERROR } from "../constants/errorMessages.js"; +import logger from "../utils/logger.js"; /* Refer to limitation of this clients array here(in the limitations section of doc) - https://github.com/Real-Dev-Squad/website-www/wiki/%5BFeature%5D-%E2%80%90-Realtime-Word-Cloud-Questions-Answers-Feature*/ let clients: AnswerClient[] = []; @@ -16,7 +17,7 @@ let clients: AnswerClient[] = []; async function sendAnswerToAll(newAnswer: Answer, res: CustomResponse, method: "POST" | "PATCH") { const questionId: string = newAnswer.question_id; - const allAnswers = await answerQuery.getAnswers({ questionId }); + const allAnswers = await answerQuery.getAnswers({ question_id: questionId }); if (method === "POST") { clients.forEach((client) => { if (client.status !== ANSWER_STATUS.APPROVED) { @@ -30,7 +31,7 @@ async function sendAnswerToAll(newAnswer: Answer, res: CustomResponse, method: " } if (method === "PATCH") { - const answers = await answerQuery.getAnswers({ questionId, status: ANSWER_STATUS.APPROVED }); + const answers = await answerQuery.getAnswers({ question_id: questionId, status: ANSWER_STATUS.APPROVED }); clients.forEach((client) => { if (client.status === ANSWER_STATUS.APPROVED) { client.res.write(`data: ${JSON.stringify(answers)}\n\n`); @@ -46,8 +47,7 @@ async function sendAnswerToAll(newAnswer: Answer, res: CustomResponse, method: " const createAnswer = async (req: Request, res: CustomResponse) => { try { const answerId = crypto.randomUUID({ disableEntropyCache: true }); - const answer = await answerQuery.createAnswer({ ...req.body, id: answerId }); - + const answer = await answerQuery.createAnswer({ ...req.body, id: answerId }) as Answer; sendAnswerToAll(answer, res, "POST"); } catch (error) { logger.error(`Error while creating answer: ${error}`); @@ -62,7 +62,7 @@ const updateAnswer = async (req: CustomRequest, res: CustomResponse) => { try { const fieldsToUpdate: AnswerFieldsToUpdate = { status, reviewed_by: req.userData.id }; - const answer = await answerQuery.updateAnswer(id, fieldsToUpdate); + const answer = await answerQuery.updateAnswer(id, fieldsToUpdate) as Answer; sendAnswerToAll(answer, res, "PATCH"); } catch (error) { logger.error(`Error while updating answer: ${error}`); @@ -99,4 +99,4 @@ const getAnswers = async (req: CustomRequest, res: CustomResponse) => { return res.boom.badImplementation(INTERNAL_SERVER_ERROR); } }; -module.exports = { createAnswer, updateAnswer, getAnswers }; +export default { createAnswer, updateAnswer, getAnswers }; diff --git a/controllers/applications.ts b/controllers/applications.ts index 74a973b96..432438f67 100644 --- a/controllers/applications.ts +++ b/controllers/applications.ts @@ -1,157 +1,115 @@ -import { addLog } from "../models/logs"; -const { logType } = require("../constants/logs"); -import { CustomRequest, CustomResponse } from "../types/global"; -const { INTERNAL_SERVER_ERROR } = require("../constants/errorMessages"); -const ApplicationModel = require("../models/applications"); -const { API_RESPONSE_MESSAGES } = require("../constants/application"); -const { getUserApplicationObject } = require("../utils/application"); -const admin = require("firebase-admin"); - -const getAllOrUserApplication = async (req: CustomRequest, res: CustomResponse): Promise => { +import type { Request, Response } from "express"; +import admin from "firebase-admin"; + +import { logType } from "../constants/logs.js"; +import { INTERNAL_SERVER_ERROR } from "../constants/errorMessages.js"; +import { + getAllApplications, + getUserApplications, + addApplication, + updateApplication, + getApplicationsBasedOnStatus, + getApplicationById +} from "../models/applications.js"; +import { API_RESPONSE_MESSAGES } from "../constants/application.js"; +import logger from "../utils/logger.js"; +import { addLog } from "../services/logService.js"; + +interface CustomRequest extends Request { + user?: { + uid: string; + }; +} + +interface CustomResponse extends Response {} + +const getAllOrUserApplication = async (req: CustomRequest, res: CustomResponse) => { try { - const { userId, status, next, size, dev } = req.query; - const limit = Number(size) || 25; - let nextPageUrl = null; - const isDevMode = dev === "true"; - - if (userId) { - const applications = await ApplicationModel.getUserApplications(userId); - - return res.json({ - message: "User applications returned successfully!", - applications, - }); - } + const { limit = 10, lastDocId, status } = req.query; + const userId = req.user?.uid; if (status) { - const { applications, lastDocId, totalCount } = await ApplicationModel.getApplicationsBasedOnStatus( - status, - limit, - next + const { applications, lastDocId: lastApplicationId, totalCount } = await getApplicationsBasedOnStatus( + status as string, + Number(limit), + lastDocId as string | undefined, + userId ); - if (applications.length === limit) { - nextPageUrl = `/applications?next=${lastDocId}&size=${limit}&status=${status}`; - } - - const response = { + return res.status(200).json({ message: API_RESPONSE_MESSAGES.APPLICATION_RETURN_SUCCESS, applications, - next: nextPageUrl, - }; - if (isDevMode) { - response["totalCount"] = totalCount; - } - - return res.json(response); + lastDocId: lastApplicationId, + totalCount, + }); } - const { applications, lastDocId } = await ApplicationModel.getAllApplications(limit, next); + const { applications, lastDocId: lastApplicationId } = await getAllApplications(Number(limit), lastDocId as string); - if (applications.length === limit) { - nextPageUrl = `/applications?next=${lastDocId}&size=${limit}`; - } - - return res.json({ + return res.status(200).json({ message: API_RESPONSE_MESSAGES.APPLICATION_RETURN_SUCCESS, applications, - next: nextPageUrl, + lastDocId: lastApplicationId, }); } catch (err) { - logger.error(`Error in fetching application: ${err}`); - return res.boom.badImplementation(INTERNAL_SERVER_ERROR); + logger.error("Error while fetching applications", err); + return res.status(500).json({ message: INTERNAL_SERVER_ERROR }); } }; -const addApplication = async (req: CustomRequest, res: CustomResponse) => { +const addNewApplication = async (req: CustomRequest, res: CustomResponse) => { try { - const rawData = req.body; - const { applications } = await ApplicationModel.getApplicationsBasedOnStatus("pending", 1, "", req.userData.id); - if (applications.length) { - return res.status(409).json({ - message: "User application is already present!", - }); - } - const createdAt = new Date().toISOString(); - const data = getUserApplicationObject(rawData, req.userData.id, createdAt); - - const applicationLog = { - type: logType.APPLICATION_ADDED, - meta: { - username: req.userData.username, - userId: req.userData.id, - }, - body: data, + const { uid: userId } = req.user!; + const applicationData = { + ...req.body, + userId, + status: "PENDING", + createdAt: admin.firestore.Timestamp.now(), }; - const promises = [ - ApplicationModel.addApplication(data), - addLog(applicationLog.type, applicationLog.meta, applicationLog.body), - ]; + const applicationId = await addApplication(applicationData); - await Promise.all(promises); + await addLog( + logType.APPLICATION_ADDED, + { applicationId, userId }, + applicationData + ); return res.status(201).json({ - message: "User application added.", + message: API_RESPONSE_MESSAGES.APPLICATION_RETURN_SUCCESS, + applicationId, }); } catch (err) { - logger.error(`Error while adding application: ${err}`); - return res.boom.badImplementation(INTERNAL_SERVER_ERROR); + logger.error("Error while adding application", err); + return res.status(500).json({ message: INTERNAL_SERVER_ERROR }); } }; -const updateApplication = async (req: CustomRequest, res: CustomResponse) => { +const updateApplicationStatus = async (req: CustomRequest, res: CustomResponse) => { try { const { applicationId } = req.params; - const rawBody = req.body; - - const applicationLog = { - type: logType.APPLICATION_UPDATED, - meta: { - applicationId, - username: req.userData.username, - userId: req.userData.id, - }, - body: rawBody, - }; - - const promises = [ - ApplicationModel.updateApplication(rawBody, applicationId), - addLog(applicationLog.type, applicationLog.meta, applicationLog.body), - ]; - - await Promise.all(promises); - return res.json({ - message: "Application updated successfully!", - }); - } catch (err) { - logger.error(`Error while updating the application: ${err}`); - return res.boom.badImplementation(INTERNAL_SERVER_ERROR); - } -}; + const { status } = req.body; + const { uid: userId } = req.user!; -const getApplicationById = async (req: CustomRequest, res: CustomResponse) => { - try { - const { applicationId } = req.params; - const application = await ApplicationModel.getApplicationById(applicationId); + await updateApplication({ status }, applicationId); - if (application.notFound) { - return res.boom.notFound("Application not found"); - } + await addLog( + logType.APPLICATION_UPDATED, + { applicationId, status, userId }, + { status } + ); - return res.json({ - message: "Application returned successfully", - application, + return res.status(200).json({ + message: API_RESPONSE_MESSAGES.APPLICATION_RETURN_SUCCESS, }); } catch (err) { - logger.error(`Error in getting application by id: ${err}`); - return res.boom.badImplementation(INTERNAL_SERVER_ERROR); + logger.error("Error while updating application", err); + return res.status(500).json({ message: INTERNAL_SERVER_ERROR }); } }; -module.exports = { +export { getAllOrUserApplication, - addApplication, - updateApplication, - getApplicationById, + addNewApplication, + updateApplicationStatus, }; diff --git a/controllers/arts.js b/controllers/arts.js index 0b2fede85..f615bf5d5 100644 --- a/controllers/arts.js +++ b/controllers/arts.js @@ -1,5 +1,7 @@ -const artsQuery = require("../models/arts"); -const { SOMETHING_WENT_WRONG, INTERNAL_SERVER_ERROR } = require("../constants/errorMessages"); +import { SOMETHING_WENT_WRONG } from "../constants/errorMessages.js"; +import artsQuery from "../models/arts.js"; +import logger from "../utils/logger.js"; + /** * Adds art * @@ -7,17 +9,14 @@ const { SOMETHING_WENT_WRONG, INTERNAL_SERVER_ERROR } = require("../constants/er * @param res {Object} - Express response object */ -const addArt = async (req, res) => { +export const addArt = async (req, res, next) => { try { - const artId = await artsQuery.addArt(req.body, req.userData.id); - - return res.json({ - message: "Art successfully added!", - id: artId, - }); + const artData = req.body; + const art = await artsQuery.addArt(artData); + return res.json(art); } catch (error) { - logger.error(`Error adding art: ${error}`); - return res.boom.serverUnavailable(SOMETHING_WENT_WRONG); + logger.error("Error in addArt: ", error); + return next(SOMETHING_WENT_WRONG); } }; @@ -27,16 +26,13 @@ const addArt = async (req, res) => { * @param req {Object} - Express request object * @param res {Object} - Express response object */ -const fetchArts = async (req, res) => { +export const getArts = async (req, res, next) => { try { - const allArt = await artsQuery.fetchArts(); - return res.json({ - message: allArt.length > 0 ? "Arts returned successfully!" : "No arts found", - arts: allArt.length > 0 ? allArt : [], - }); - } catch (err) { - logger.error(`Error while fetching arts ${err}`); - return res.boom.badImplementation(INTERNAL_SERVER_ERROR); + const arts = await artsQuery.fetchArts(); + return res.json(arts); + } catch (error) { + logger.error("Error in getArts: ", error); + return next(SOMETHING_WENT_WRONG); } }; @@ -46,46 +42,12 @@ const fetchArts = async (req, res) => { * @param req {Object} - Express request object * @param res {Object} - Express response object */ -const getSelfArts = async (req, res) => { - try { - const { id } = req.userData; - const arts = await artsQuery.fetchUserArts(id); - res.set( - "X-Deprecation-Warning", - "WARNING: This endpoint is deprecated and will be removed in the future. Please use /arts/:userId to get the art details." - ); - return res.json({ - message: "User arts returned successfully!", - arts, - }); - } catch (err) { - logger.error(`Error while getting user arts ${err}`); - return res.boom.badImplementation(INTERNAL_SERVER_ERROR); - } -}; - -const getUserArts = async (req, res) => { +export const getUserArts = async (req, res, next) => { try { - const userId = req.params.userId; - const arts = await artsQuery.fetchUserArts(userId); - - if (!arts || arts.length === 0) { - return res.status(204).send(); - } - - return res.json({ - message: `User Arts of userId ${userId} returned successfully`, - arts, - }); - } catch (err) { - logger.error(`Error while getting user arts ${err}`); - return res.boom.badImplementation(INTERNAL_SERVER_ERROR); + const arts = await artsQuery.fetchUserArts(req.userData.id); + return res.json(arts); + } catch (error) { + logger.error("Error in getUserArts: ", error); + return next(SOMETHING_WENT_WRONG); } }; - -module.exports = { - addArt, - fetchArts, - getSelfArts, - getUserArts, -}; diff --git a/controllers/auction.js b/controllers/auction.js index 9a4c6f08f..a566210ef 100644 --- a/controllers/auction.js +++ b/controllers/auction.js @@ -1,6 +1,7 @@ -const auctions = require("../models/auctions"); -const wallet = require("../models/wallets"); -const { INTERNAL_SERVER_ERROR } = require("../constants/errorMessages"); +import auctions from "../models/auctions.js"; +import { fetchWallet } from "../models/wallets.js"; +import { INTERNAL_SERVER_ERROR } from "../constants/errorMessages.js"; +import logger from "../utils/logger.js"; /** * Fetches all the active (ongoing) auctions @@ -52,7 +53,7 @@ const createNewAuction = async (req, res) => { const { id: seller } = req.userData; const { initial_price: initialPrice, item_type: itemType, end_time: endTime, quantity } = req.body; - const { currencies } = await wallet.fetchWallet(seller); + const { currencies } = await fetchWallet(seller); const itemQuantity = parseInt(currencies[`${itemType}`]); if (!itemQuantity || itemQuantity < quantity) return res.boom.forbidden(`You do not have enough of ${itemType}s!`); @@ -89,7 +90,7 @@ const makeNewBid = async (req, res) => { } }; -module.exports = { +export default { fetchAuctionById, fetchAvailableAuctions, createNewAuction, diff --git a/controllers/auth.js b/controllers/auth.js index 6b1bf4cd6..4dc554e03 100644 --- a/controllers/auth.js +++ b/controllers/auth.js @@ -1,13 +1,11 @@ -const passport = require("passport"); -const users = require("../models/users"); -const QrCodeAuthModel = require("../models/qrCodeAuth"); -const authService = require("../services/authService"); -const dataAccess = require("../services/dataAccessLayer"); -const { - SOMETHING_WENT_WRONG, - DATA_ADDED_SUCCESSFULLY, - USER_DOES_NOT_EXIST_ERROR, -} = require("../constants/errorMessages"); +import config from "config"; +import passport from "passport"; + +import { DATA_ADDED_SUCCESSFULLY, SOMETHING_WENT_WRONG } from "../constants/errorMessages.js"; +import QrCodeAuthModel from "../models/qrCodeAuth.js"; +import { addOrUpdate, fetchUser } from "../models/users.js"; +import { generateAuthToken } from "../services/authService.js"; +import logger from "../utils/logger.js"; const googleAuthLogin = (req, res, next) => { const { redirectURL } = req.query; @@ -83,7 +81,7 @@ async function handleGoogleLogin(req, res, user, authRedirectionUrl) { updated_at: null, }; - const userDataFromDB = await users.fetchUser({ email: userData.email }); + const userDataFromDB = await fetchUser({ email: userData.email }); if (userDataFromDB.userExists) { if (userDataFromDB.user.roles?.developer) { @@ -93,9 +91,9 @@ async function handleGoogleLogin(req, res, user, authRedirectionUrl) { } } - const { userId, incompleteUserDetails } = await users.addOrUpdate(userData); + const { userId, incompleteUserDetails } = await addOrUpdate(userData); - const token = authService.generateAuthToken({ userId }); + const token = generateAuthToken({ userId }); const cookieOptions = getAuthCookieOptions(); @@ -187,9 +185,9 @@ const githubAuthCallback = (req, res, next) => { } } - const { userId, incompleteUserDetails, role } = await users.addOrUpdate(userData); + const { userId, incompleteUserDetails, role } = await addOrUpdate(userData); - const token = authService.generateAuthToken({ userId }); + const token = generateAuthToken({ userId }); const cookieOptions = getAuthCookieOptions(); // respond with a cookie @@ -197,7 +195,7 @@ const githubAuthCallback = (req, res, next) => { /* redirectUrl woud be like https://realdevsquad.com?v2=true */ if (isV2FlagPresent) { - const tokenV2 = authService.generateAuthToken({ userId, role }); + const tokenV2 = generateAuthToken({ userId, role }); res.cookie(config.get("userToken.cookieV2Name"), tokenV2, cookieOptions); } @@ -248,23 +246,15 @@ const storeUserDeviceInfo = async (req, res) => { const userJson = { user_id: req.body.user_id, device_info: req.body.device_info, - device_id: req.body.device_id, - authorization_status: "NOT_INIT", }; - const userInfoData = await dataAccess.retrieveUsers({ id: userJson.user_id }); - - if (!userInfoData.userExists) { - return res.boom.notFound(USER_DOES_NOT_EXIST_ERROR); - } - const userInfo = await QrCodeAuthModel.storeUserDeviceInfo(userJson); - - return res.status(201).json({ - ...userInfo, + const { id } = await QrCodeAuthModel.addUserDeviceInfo(userJson); + return res.json({ message: DATA_ADDED_SUCCESSFULLY, + id, }); } catch (err) { - logger.error(`Error while storing user device info : ${err}`); + logger.error(`Error while storing user device info: ${err}`); return res.boom.badImplementation(SOMETHING_WENT_WRONG); } }; @@ -275,7 +265,7 @@ const updateAuthStatus = async (req, res) => { const authStatus = req.params.authorization_status; let token; if (authStatus === "AUTHORIZED") { - token = authService.generateAuthToken({ userId }); + token = generateAuthToken({ userId }); } const result = await QrCodeAuthModel.updateStatus(userId, authStatus, token); @@ -327,14 +317,14 @@ const fetchDeviceDetails = async (req, res) => { } }; -module.exports = { - githubAuthLogin, +export { + fetchDeviceDetails, + fetchUserDeviceInfo, githubAuthCallback, - googleAuthLogin, + githubAuthLogin, googleAuthCallback, + googleAuthLogin, signout, storeUserDeviceInfo, updateAuthStatus, - fetchUserDeviceInfo, - fetchDeviceDetails, }; diff --git a/controllers/awsAccess.ts b/controllers/awsAccess.ts index 82b229c82..e81446fba 100644 --- a/controllers/awsAccess.ts +++ b/controllers/awsAccess.ts @@ -1,7 +1,9 @@ -import { PROFILE_SVC_GITHUB_URL } from "../constants/urls"; -import {addUserToGroup, createUser, fetchAwsUserIdByUsername} from "../utils/awsFunctions"; -const dataAccess = require("../services/dataAccessLayer"); -const userDataLevels = require('../constants/userDataLevels'); +import { PROFILE_SVC_GITHUB_URL } from "../constants/urls.js"; +import logger from "../utils/logger.js"; +import {addUserToGroup, createUser, fetchAwsUserIdByUsername} from "../utils/awsFunctions.js"; + +import * as dataAccess from "../services/dataAccessLayer.js"; +import * as userDataLevels from '../constants/userDataLevels.js'; export const addUserToAWSGroup = async (req, res) => { const { groupId, userId } = req.body; @@ -13,15 +15,15 @@ export const addUserToAWSGroup = async (req, res) => { } else if(!userInfoData.user.email) { return res.status(400).json({ error: `User email is required to create an AWS user. Please update your email by setting up Profile service, url : ${PROFILE_SVC_GITHUB_URL}` }); } - + let awsUserId = await fetchAwsUserIdByUsername(userInfoData.user.username); - + let userCreationResponse = null; - + if (awsUserId === null){ // We need to create the user in AWS before and then fetch its Id userCreationResponse = await createUser(userInfoData.user.username, userInfoData.user.email); - + if (userCreationResponse.conflict){ return res.status(400).json({ error: `Username or Email is already being used, please use another email / username for creating account in AWS` diff --git a/controllers/badges.js b/controllers/badges.ts similarity index 52% rename from controllers/badges.js rename to controllers/badges.ts index 486a1d7c4..9d7bb7977 100644 --- a/controllers/badges.js +++ b/controllers/badges.ts @@ -1,9 +1,8 @@ -const { ERROR_MESSAGES, SUCCESS_MESSAGES } = require("../constants/badges"); -const { CONTROLLERS: CONTROLLERS_ERROR_MESSAGES } = ERROR_MESSAGES; -const { CONTROLLERS: CONTROLLERS_SUCCESS_MESSAGES } = SUCCESS_MESSAGES; -const badgeQuery = require("../models/badges"); -const dataAccess = require("../services/dataAccessLayer"); -const imageService = require("../services/imageService"); +import { ERROR_MESSAGES, SUCCESS_MESSAGES } from "../constants/badges.js"; +import * as badgeQuery from "../models/badges.js"; +import * as dataAccess from "../services/dataAccessLayer.js"; +import * as imageService from "../services/imageService.js"; +import logger from "../utils/logger.js"; /** * Get badges data @@ -11,16 +10,13 @@ const imageService = require("../services/imageService"); * @param res {Object} - Express response object * @returns {Object}: , message: string> - Returns badges */ -const getBadges = async (req, res) => { +export const getBadges = async (req, res, next) => { try { - const allBadges = await badgeQuery.fetchBadges(req.query); - return res.json({ - message: CONTROLLERS_SUCCESS_MESSAGES.GET_BADGES, - badges: allBadges, - }); + const badges = await badgeQuery.fetchBadges({ size: 100, page: 0 }); + return res.json(badges); } catch (error) { - logger.error(`${CONTROLLERS_ERROR_MESSAGES.GET_BADGES}: ${error}`); - return res.boom.badRequest(CONTROLLERS_ERROR_MESSAGES.GET_BADGES); + logger.error("Error in getBadges: ", error); + return next(error); } }; @@ -30,14 +26,14 @@ const getBadges = async (req, res) => { * @param res {Object} - Express response object * @returns {Object}: , message: string> - Return user badges */ -async function getUserBadges(req, res) { +export async function getUserBadges(req, res) { try { const userId = req.params.id; const { badges } = await badgeQuery.fetchUserBadges(userId); - return res.json({ message: CONTROLLERS_SUCCESS_MESSAGES.GET_USER_BADGES, badges }); + return res.json({ message: SUCCESS_MESSAGES.CONTROLLERS.GET_USER_BADGES, badges }); } catch (error) { - logger.error(`${CONTROLLERS_ERROR_MESSAGES.GET_USER_BADGES}: ${error}`); - return res.boom.badRequest(`${CONTROLLERS_ERROR_MESSAGES.GET_USER_BADGES}: ${error?.message}`); + logger.error(`${ERROR_MESSAGES.CONTROLLERS.GET_USER_BADGES}: ${error}`); + return res.boom.badRequest(`${ERROR_MESSAGES.CONTROLLERS.GET_USER_BADGES}: ${error?.message}`); } } @@ -56,12 +52,12 @@ async function postBadge(req, res) { imageUrl, }); return res.json({ - message: CONTROLLERS_SUCCESS_MESSAGES.POST_BADGE, + message: SUCCESS_MESSAGES.CONTROLLERS.POST_BADGE, badge, }); } catch (error) { - logger.error(`${CONTROLLERS_ERROR_MESSAGES.POST_BADGE}: ${error}`); - return res.boom.badRequest(`${CONTROLLERS_ERROR_MESSAGES.POST_BADGE}: ${error?.message}`); + logger.error(`${ERROR_MESSAGES.CONTROLLERS.POST_BADGE}: ${error}`); + return res.boom.badRequest(`${ERROR_MESSAGES.CONTROLLERS.POST_BADGE}: ${error?.message}`); } } @@ -82,11 +78,11 @@ async function postUserBadges(req, res) { } await badgeQuery.assignBadges({ userId, badgeIds }); return res.json({ - message: CONTROLLERS_SUCCESS_MESSAGES.POST_USER_BADGES, + message: SUCCESS_MESSAGES.CONTROLLERS.POST_USER_BADGES, }); } catch (error) { - logger.error(`${CONTROLLERS_ERROR_MESSAGES.POST_USER_BADGES}: ${error}`); - return res.boom.badRequest(`${CONTROLLERS_ERROR_MESSAGES.POST_USER_BADGES}: ${error?.message}`); + logger.error(`${ERROR_MESSAGES.CONTROLLERS.POST_USER_BADGES}: ${error}`); + return res.boom.badRequest(`${ERROR_MESSAGES.CONTROLLERS.POST_USER_BADGES}: ${error?.message}`); } } @@ -101,18 +97,43 @@ async function deleteUserBadges(req, res) { const { badgeIds, userId } = req.body; await badgeQuery.removeBadges({ userId, badgeIds }); return res.json({ - message: CONTROLLERS_SUCCESS_MESSAGES.DELETE_USER_BADGES, + message: SUCCESS_MESSAGES.CONTROLLERS.DELETE_USER_BADGES, }); } catch (error) { - logger.error(`${CONTROLLERS_ERROR_MESSAGES.DELETE_USER_BADGES}: ${error}`); - return res.boom.badRequest(`${CONTROLLERS_ERROR_MESSAGES.DELETE_USER_BADGES}: ${error?.message}`); + logger.error(`${ERROR_MESSAGES.CONTROLLERS.DELETE_USER_BADGES}: ${error}`); + return res.boom.badRequest(`${ERROR_MESSAGES.CONTROLLERS.DELETE_USER_BADGES}: ${error?.message}`); } } -module.exports = { - getBadges, - getUserBadges, - postBadge, - postUserBadges, - deleteUserBadges, +export const getBadgeById = async (req, res, next) => { + try { + const { id } = req.params; + const badge = await badgeQuery.fetchBadges({ id }); + return res.json(badge); + } catch (error) { + logger.error("Error in getBadgeById: ", error); + return next(error); + } +}; + +export const createBadge = async (req, res, next) => { + try { + const badgeData = req.body; + const badge = await badgeQuery.createBadge(badgeData); + return res.json(badge); + } catch (error) { + logger.error("Error in createBadge: ", error); + return next(error); + } +}; + +export const deleteBadge = async (req, res, next) => { + try { + const { id } = req.params; + await badgeQuery.removeBadges(id); + return res.json({ message: SUCCESS_MESSAGES.CONTROLLERS.DELETE_USER_BADGES }); + } catch (error) { + logger.error("Error in deleteBadge: ", error); + return next(error); + } }; diff --git a/controllers/challenge.js b/controllers/challenge.js index 5e42d1492..ad107b543 100644 --- a/controllers/challenge.js +++ b/controllers/challenge.js @@ -1,5 +1,6 @@ -const challengeQuery = require("../models/challenges"); -const { SOMETHING_WENT_WRONG } = require("../constants/errorMessages"); +import challengeQuery from "../models/challenges.js"; +import { SOMETHING_WENT_WRONG } from "../constants/errorMessages.js"; +import logger from "../utils/logger.js"; /** * Get the challenges @@ -82,8 +83,4 @@ const subscribeToChallenge = async (req, res) => { } }; -module.exports = { - fetchChallenges, - createChallenge, - subscribeToChallenge, -}; +export { fetchChallenges, createChallenge, subscribeToChallenge }; diff --git a/controllers/cloudflareCache.js b/controllers/cloudflareCache.js index cd7e10adb..17a716f3b 100644 --- a/controllers/cloudflareCache.js +++ b/controllers/cloudflareCache.js @@ -1,9 +1,10 @@ -const logsQuery = require("../models/logs"); -const cloudflare = require("../services/cloudflareService"); -const { logType } = require("../constants/logs"); -const { MAX_CACHE_PURGE_COUNT } = require("../constants/cloudflareCache"); -const { SOMETHING_WENT_WRONG } = require("../constants/errorMessages"); -const dataAccess = require("../services/dataAccessLayer"); +import { fetchCacheLogs, addLog, fetchLastAddedCacheLog } from "../models/logs.js"; +import { purgeCache as purgeCacheService } from "../services/cloudflareService.js"; +import { logType } from "../constants/logs.js"; +import { MAX_CACHE_PURGE_COUNT } from "../constants/cloudflareCache.js"; +import { SOMETHING_WENT_WRONG } from "../constants/errorMessages.js"; +import { retrieveUsers } from "../services/dataAccessLayer.js"; +import logger from "../utils/logger.js"; /** * Purges the Cache of Members Profile Page @@ -14,14 +15,14 @@ const dataAccess = require("../services/dataAccessLayer"); const purgeCache = async (req, res) => { try { const { id, username, roles } = req.userData; - const logs = await logsQuery.fetchCacheLogs(id); + const logs = await fetchCacheLogs(id); const logsCount = logs.length; // Cache purged by a superuser without rate limits if (req.body.user) { if (roles.super_user) { const { user } = req.body; - const userDetails = await dataAccess.retrieveUsers({ username: user }); + const userDetails = await retrieveUsers({ username: user }); if (!userDetails.userExists) { return res.boom.badRequest(); } @@ -47,16 +48,16 @@ const purgeCache = async (req, res) => { const purge = async (res, id, username, isSuperUser, userDetails) => { try { const files = [`https://members.realdevsquad.com/${username}`]; - const response = await cloudflare.purgeCache(files); + const response = await purgeCacheService(files); if (response.status === 200) { if (isSuperUser) { - await logsQuery.addLog( + await addLog( logType.CLOUDFLARE_CACHE_PURGED, { userId: id, purgedFor: userDetails.user.id }, { message: "Cache Purged" } ); } else { - await logsQuery.addLog(logType.CLOUDFLARE_CACHE_PURGED, { userId: id }, { message: "Cache Purged" }); + await addLog(logType.CLOUDFLARE_CACHE_PURGED, { userId: id }, { message: "Cache Purged" }); } } return res.json({ message: "Cache purged successfully", ...response.data }); @@ -75,7 +76,7 @@ const purge = async (res, id, username, isSuperUser, userDetails) => { const fetchPurgedCacheMetadata = async (req, res) => { try { const { id } = req.userData; - const logs = await logsQuery.fetchCacheLogs(id); + const logs = await fetchCacheLogs(id); if (logs.length !== 0) { const latestCacheMetadata = logs[logs.length - 1]; const { timestamp } = latestCacheMetadata; @@ -84,8 +85,8 @@ const fetchPurgedCacheMetadata = async (req, res) => { remainingCount: MAX_CACHE_PURGE_COUNT - logs.length, timeLastCleared: timestamp._seconds, }); - } else if ((await logsQuery.fetchLastAddedCacheLog(id)).length !== 0) { - const lastLog = await logsQuery.fetchLastAddedCacheLog(id); + } else if ((await fetchLastAddedCacheLog(id)).length !== 0) { + const lastLog = await fetchLastAddedCacheLog(id); const { timestamp } = lastLog[0]; return res.json({ message: "Purged cache metadata returned successfully!", @@ -104,7 +105,7 @@ const fetchPurgedCacheMetadata = async (req, res) => { } }; -module.exports = { +export default { purgeCache, fetchPurgedCacheMetadata, }; diff --git a/controllers/contributions.js b/controllers/contributions.js index 975aff939..64f7cfbde 100644 --- a/controllers/contributions.js +++ b/controllers/contributions.js @@ -1,16 +1,18 @@ -const contributionsService = require("../services/contributions"); -const { SOMETHING_WENT_WRONG } = require("../constants/errorMessages"); -const dataAccess = require("../services/dataAccessLayer"); +import contributionsService from "../services/contributions.js"; +import { SOMETHING_WENT_WRONG } from "../constants/errorMessages.js"; +import { retrieveUsers } from "../services/dataAccessLayer.js"; +import logger from "../utils/logger.js"; + /** * Get the contributions of the user * @param {Object} req - Express request object * @param {Object} res - Express response object */ -const getUserContributions = async (req, res) => { +export const getUserContributions = async (req, res) => { try { const { username } = req.params; - const result = await dataAccess.retrieveUsers({ username: req.params.username }); + const result = await retrieveUsers({ username: req.params.username }); if (result.userExists) { const contributions = await contributionsService.getUserContributions(username); return res.json(contributions); @@ -21,7 +23,3 @@ const getUserContributions = async (req, res) => { return res.boom.badImplementation(SOMETHING_WENT_WRONG); } }; - -module.exports = { - getUserContributions, -}; diff --git a/controllers/discordactions.js b/controllers/discordactions.js index f77758b00..c25065141 100644 --- a/controllers/discordactions.js +++ b/controllers/discordactions.js @@ -1,17 +1,43 @@ -const { INTERNAL_SERVER_ERROR } = require("../constants/errorMessages"); -const admin = require("firebase-admin"); -const config = require("config"); -const jwt = require("jsonwebtoken"); -const discordRolesModel = require("../models/discordactions"); -const discordServices = require("../services/discordService"); -const { fetchAllUsers, fetchUser } = require("../models/users"); -const { generateCloudFlareHeaders } = require("../utils/discord-actions"); -const { addLog } = require("../models/logs"); +import { INTERNAL_SERVER_ERROR } from "../constants/errorMessages.js"; +import admin from "firebase-admin"; +import config from "config"; +import jwt from "jsonwebtoken"; +import { + isGroupRoleExists, + deleteGroupRole as deleteGroupRoleQuery, + getPaginatedGroupRolesByPage, + enrichGroupDataWithMembershipInfo, + getAllGroupRoles, + getGroupRolesForUser, + addGroupRoleToMember as addGroupRoleToMemberQuery, + groupUpdateLastJoinDate, + removeMemberGroup, + updateDiscordImageForVerification as updateDiscordImageForVerificationQuery, + updateIdleUsersOnDiscord, + updateIdle7dUsersOnDiscord, + updateUsersNicknameStatus as updateUsersNicknameStatusQuery, + getGroupRoleByName, + updateGroupRole, + createNewRole, + updateUsersWith31DaysPlusOnboarding, + addInviteToInviteModel, + getUserDiscordInvite as getUserDiscordInviteQuery, +} from "../models/discordactions.js"; +import { + setUserDiscordNickname, + getDiscordMembers, + deleteGroupRoleFromDiscord, + getDiscordRoles, + removeRoleFromUser, +} from "../services/discordService.js"; +import { fetchAllUsers, fetchUser } from "../models/users.js"; +import { generateCloudFlareHeaders } from "../utils/discord-actions.js"; +import { addLog } from "../models/logs.js"; +import logger from "../utils/logger.js"; + const discordDeveloperRoleId = config.get("discordDeveloperRoleId"); const discordMavenRoleId = config.get("discordMavenRoleId"); -const { setUserDiscordNickname, getDiscordMembers } = discordServices; - /** * Creates a role * @@ -25,7 +51,7 @@ const createGroupRole = async (req, res) => { try { const rolename = `group-${req.body.rolename}`; - const { roleExists } = await discordRolesModel.isGroupRoleExists({ rolename }); + const { roleExists } = await isGroupRoleExists({ rolename }); if (roleExists) { return res.status(400).json({ @@ -53,7 +79,7 @@ const createGroupRole = async (req, res) => { groupRoleData.roleid = responseForCreatedRole.id; - const { id } = await discordRolesModel.createNewRole(groupRoleData); + const { id } = await createNewRole(groupRoleData); return res.status(201).json({ message: "Role created successfully!", id, @@ -75,7 +101,7 @@ const deleteGroupRole = async (req, res) => { const { groupId } = req.params; try { - const { roleExists, existingRoles } = await discordRolesModel.isGroupRoleExists({ groupId }); + const { roleExists, existingRoles } = await isGroupRoleExists({ groupId }); if (!roleExists) { return res.boom.notFound("Group role not found"); @@ -83,13 +109,13 @@ const deleteGroupRole = async (req, res) => { const roleData = existingRoles.data(); - const discordDeletion = await discordServices.deleteGroupRoleFromDiscord(roleData.roleid); + const discordDeletion = await deleteGroupRoleFromDiscord(roleData.roleid); if (!discordDeletion.success) { return res.boom.badImplementation(discordDeletion.message); } - const { isSuccess } = await discordRolesModel.deleteGroupRole(groupId, req.userData.id); + const { isSuccess } = await deleteGroupRoleQuery(groupId, req.userData.id); if (!isSuccess) { logger.error(`Role deleted from Discord but failed to delete from database for groupId: ${groupId}`); @@ -136,8 +162,8 @@ const getPaginatedAllGroupRoles = async (req, res) => { const discordId = req.userData?.discordId; if (dev === "true") { - const { roles, total } = await discordRolesModel.getPaginatedGroupRolesByPage({ offset, limit }); - const groupsWithMembershipInfo = await discordRolesModel.enrichGroupDataWithMembershipInfo(discordId, roles); + const { roles, total } = await getPaginatedGroupRolesByPage({ offset, limit }); + const groupsWithMembershipInfo = await enrichGroupDataWithMembershipInfo(discordId, roles); const nextPage = offset + limit < total ? parseInt(page, 10) + 1 : null; const prevPage = page > 0 ? parseInt(page, 10) - 1 : null; @@ -153,8 +179,8 @@ const getPaginatedAllGroupRoles = async (req, res) => { }); } - const { groups } = await discordRolesModel.getAllGroupRoles(); - const groupsWithMembershipInfo = await discordRolesModel.enrichGroupDataWithMembershipInfo(discordId, groups); + const { groups } = await getAllGroupRoles(); + const groupsWithMembershipInfo = await enrichGroupDataWithMembershipInfo(discordId, groups); return res.json({ message: "Roles fetched successfully!", @@ -168,7 +194,7 @@ const getPaginatedAllGroupRoles = async (req, res) => { const getGroupsRoleId = async (req, res) => { try { const { discordId } = req.userData; - const userGroupRoles = await discordRolesModel.getGroupRolesForUser(discordId); + const userGroupRoles = await getGroupRolesForUser(discordId); return res.json({ message: "User group roles Id fetched successfully!", ...userGroupRoles, @@ -190,7 +216,7 @@ const addGroupRoleToMember = async (req, res) => { ...req.body, date: admin.firestore.Timestamp.fromDate(new Date()), }; - const roleExistsPromise = discordRolesModel.isGroupRoleExists({ + const roleExistsPromise = isGroupRoleExists({ roleid: memberGroupRole.roleid, }); const userDataPromise = fetchUser({ discordId: memberGroupRole.userid }); @@ -207,7 +233,7 @@ const addGroupRoleToMember = async (req, res) => { } } - const { roleData, wasSuccess } = await discordRolesModel.addGroupRoleToMember(memberGroupRole); + const { roleData, wasSuccess } = await addGroupRoleToMemberQuery(memberGroupRole); if (!wasSuccess) { return res.status(400).json({ @@ -227,7 +253,7 @@ const addGroupRoleToMember = async (req, res) => { body: JSON.stringify(dataForDiscord), headers, }); - const discordLastJoinedDateUpdate = discordRolesModel.groupUpdateLastJoinDate({ + const discordLastJoinedDateUpdate = groupUpdateLastJoinDate({ id: existingRoles.docs[0].id, }); await Promise.all([apiCallToDiscord, discordLastJoinedDateUpdate]); @@ -245,7 +271,7 @@ const deleteRole = async (req, res) => { try { const { roleid, userid } = req.body; - const roleExistsPromise = discordRolesModel.isGroupRoleExists({ + const roleExistsPromise = isGroupRoleExists({ roleid, }); const userDataPromise = fetchUser({ discordId: userid }); @@ -254,9 +280,9 @@ const deleteRole = async (req, res) => { if (!roleExists || req.userData.id !== userData.user.id) { return res.boom.forbidden("Permission denied. Cannot delete the role."); } - await discordServices.removeRoleFromUser(roleid, userid, req.userData); + await removeRoleFromUser(roleid, userid, req.userData); - const { wasSuccess } = await discordRolesModel.removeMemberGroup(roleid, userid); + const { wasSuccess } = await removeMemberGroup(roleid, userid); if (wasSuccess) { return res.status(200).json({ message: "Role deleted successfully" }); } else { @@ -276,7 +302,7 @@ const deleteRole = async (req, res) => { const updateDiscordImageForVerification = async (req, res) => { try { const { id: userDiscordId } = req.params; - const discordAvatarUrl = await discordRolesModel.updateDiscordImageForVerification(userDiscordId); + const discordAvatarUrl = await updateDiscordImageForVerificationQuery(userDiscordId); return res.json({ message: "Discord avatar URL updated successfully!", discordAvatarUrl, @@ -295,7 +321,7 @@ const updateDiscordImageForVerification = async (req, res) => { const setRoleIdleToIdleUsers = async (req, res) => { try { const { dev } = req.query; - const result = await discordRolesModel.updateIdleUsersOnDiscord(dev); + const result = await updateIdleUsersOnDiscord(dev); return res.status(201).json({ message: "All Idle Users updated successfully.", ...result, @@ -314,7 +340,7 @@ const setRoleIdleToIdleUsers = async (req, res) => { const setRoleIdle7DToIdleUsers = async (req, res) => { try { const { dev } = req.query; - const result = await discordRolesModel.updateIdle7dUsersOnDiscord(dev); + const result = await updateIdle7dUsersOnDiscord(dev); return res.status(201).json({ message: "All Idle 7d+ Users updated successfully.", ...result, @@ -413,7 +439,7 @@ const updateDiscordNicknames = async (req, res) => { const updateUsersNicknameStatus = async (req, res) => { try { const { lastNicknameUpdate = 0 } = req.body; - const data = await discordRolesModel.updateUsersNicknameStatus(lastNicknameUpdate); + const data = await updateUsersNicknameStatusQuery(lastNicknameUpdate); return res.json({ message: "Updated discord users nickname based on status", data, @@ -426,12 +452,12 @@ const updateUsersNicknameStatus = async (req, res) => { const syncDiscordGroupRolesInFirestore = async (req, res) => { try { - const discordRoles = await discordServices.getDiscordRoles(); + const discordRoles = await getDiscordRoles(); if (discordRoles.status === 500) { return res.boom.badImplementation(INTERNAL_SERVER_ERROR); } const batch = discordRoles.roles.map(async (role) => { - const data = await discordRolesModel.getGroupRoleByName(role.name); + const data = await getGroupRoleByName(role.name); if (!data.data.empty) { const roleInFirestore = { @@ -439,7 +465,7 @@ const syncDiscordGroupRolesInFirestore = async (req, res) => { ...data.data.docs[0].data(), }; if (roleInFirestore.roleid !== role.id) { - await discordRolesModel.updateGroupRole( + await updateGroupRole( { roleid: role.id, }, @@ -447,7 +473,7 @@ const syncDiscordGroupRolesInFirestore = async (req, res) => { ); } } else { - await discordRolesModel.createNewRole({ + await createNewRole({ createdBy: req.userData.id, rolename: role.name, roleid: role.id, @@ -457,7 +483,7 @@ const syncDiscordGroupRolesInFirestore = async (req, res) => { }); await Promise.all(batch); - const allRolesInFirestore = await discordRolesModel.getAllGroupRoles(); + const allRolesInFirestore = await getAllGroupRoles(); return res.json({ response: allRolesInFirestore.groups, @@ -477,7 +503,7 @@ const syncDiscordGroupRolesInFirestore = async (req, res) => { */ const setRoleToUsersWith31DaysPlusOnboarding = async (req, res) => { try { - const result = await discordRolesModel.updateUsersWith31DaysPlusOnboarding(); + const result = await updateUsersWith31DaysPlusOnboarding(); return res.status(201).json({ message: "All Users with 31 Days Plus Onboarding are updated successfully.", ...result, @@ -493,7 +519,7 @@ const generateInviteForUser = async (req, res) => { const { userId } = req.query; const userIdForInvite = userId || req.userData.id; - const modelResponse = await discordRolesModel.getUserDiscordInvite(userIdForInvite); + const modelResponse = await getUserDiscordInviteQuery(userIdForInvite); if (!modelResponse.notFound) { return res.status(409).json({ @@ -520,7 +546,7 @@ const generateInviteForUser = async (req, res) => { const inviteCode = discordInviteResponse.data.code; const inviteLink = `discord.gg/${inviteCode}`; - await discordRolesModel.addInviteToInviteModel({ userId: userIdForInvite, inviteLink }); + await addInviteToInviteModel({ userId: userIdForInvite, inviteLink }); return res.status(201).json({ message: "invite generated successfully", @@ -541,7 +567,7 @@ const getUserDiscordInvite = async (req, res) => { const userIdForInvite = userId || req.userData.id; - const invite = await discordRolesModel.getUserDiscordInvite(userIdForInvite); + const invite = await getUserDiscordInviteQuery(userIdForInvite); if (invite.notFound) { return res.boom.notFound("User invite doesn't exist"); @@ -557,10 +583,11 @@ const getUserDiscordInvite = async (req, res) => { } }; -module.exports = { - getGroupsRoleId, +export { createGroupRole, + deleteGroupRole, getPaginatedAllGroupRoles, + getGroupsRoleId, addGroupRoleToMember, deleteRole, updateDiscordImageForVerification, @@ -570,7 +597,6 @@ module.exports = { updateUsersNicknameStatus, syncDiscordGroupRolesInFirestore, setRoleToUsersWith31DaysPlusOnboarding, - getUserDiscordInvite, generateInviteForUser, - deleteGroupRole, + getUserDiscordInvite, }; diff --git a/controllers/events.js b/controllers/events.js index 852f2635f..8155cddf2 100644 --- a/controllers/events.js +++ b/controllers/events.js @@ -1,14 +1,12 @@ -const { GET_ALL_EVENTS_LIMIT_MIN, UNWANTED_PROPERTIES_FROM_100MS, EVENT_ROLES } = require("../constants/events"); -const { INTERNAL_SERVER_ERROR } = require("../constants/errorMessages"); -const { EventTokenService, EventAPIService } = require("../services"); -const eventQuery = require("../models/events"); - -const logger = require("../utils/logger"); -const { removeUnwantedProperties } = require("../utils/events"); - -const crypto = require("crypto"); -const { addLog } = require("../models/logs"); -const { logType } = require("../constants/logs"); +import logger from "../utils/logger.js"; +import { GET_ALL_EVENTS_LIMIT_MIN, UNWANTED_PROPERTIES_FROM_100MS, EVENT_ROLES } from "../constants/events.js"; +import { INTERNAL_SERVER_ERROR } from "../constants/errorMessages.js"; +import { EventTokenService, EventAPIService } from "../services/index.js"; +import { createEvent as createEventQuery, getEventCodes as getEventCodesQuery } from "../models/events.js"; +import { removeUnwantedProperties } from "../utils/events.js"; +import crypto from "crypto"; +import { addLog } from "../models/logs.js"; +import { logType } from "../constants/logs.js"; const tokenService = new EventTokenService(); const apiService = new EventAPIService(tokenService); @@ -28,7 +26,7 @@ const createEvent = async (req, res) => { try { const eventData = await apiService.post("/rooms", payload); const event = removeUnwantedProperties(UNWANTED_PROPERTIES_FROM_100MS, eventData); - const eventDataFromDB = await eventQuery.createEvent({ room_id: eventData.id, created_by: userId, ...event }); + const eventDataFromDB = await createEventQuery({ room_id: eventData.id, created_by: userId, ...event }); return res.status(201).json(eventDataFromDB); } catch (error) { logger.error({ error }); @@ -99,7 +97,7 @@ const joinEvent = async (req, res) => { try { if (role === EVENT_ROLES.MAVEN) { - const eventCodes = await eventQuery.getEventCodes({ id: roomId }); + const eventCodes = await getEventCodesQuery({ id: roomId }); const allEventCodesArray = eventCodes.map((eventCode) => { return eventCode.code; }); @@ -203,7 +201,7 @@ const updateEvent = async (req, res) => { }; try { const eventData = await apiService.post(`/rooms/${req.body.id}`, payload); - await eventQuery.updateEvent(eventData); + await createEventQuery.updateEvent(eventData); const event = removeUnwantedProperties(UNWANTED_PROPERTIES_FROM_100MS, eventData); return res.status(200).json({ data: { room_id: event.id, ...event }, @@ -235,7 +233,7 @@ const endActiveEvent = async (req, res) => { }; try { await apiService.post(`/active-rooms/${req.body.id}/end-room`, payload); - await eventQuery.endActiveEvent({ id: req.body.id, ...payload }); + await createEventQuery.endActiveEvent({ id: req.body.id, ...payload }); return res.status(200).json({ message: `Event ended successfully.` }); } catch (error) { logger.error({ error }); @@ -258,7 +256,7 @@ const endActiveEvent = async (req, res) => { */ const addPeerToEvent = async (req, res) => { try { - const data = await eventQuery.addPeerToEvent({ + const data = await createEventQuery.addPeerToEvent({ peerId: req.body.peerId, name: req.body.name, role: req.body.role, @@ -296,9 +294,9 @@ const kickoutPeer = async (req, res) => { }; try { - const peer = await eventQuery.getPeerById(payload.peer_id); + const peer = await createEventQuery.getPeerById(payload.peer_id); await apiService.post(`/active-rooms/${id}/remove-peers`, payload); - await eventQuery.kickoutPeer({ eventId: id, peerId: payload.peer_id, reason: req.body.reason }); + await createEventQuery.kickoutPeer({ eventId: id, peerId: payload.peer_id, reason: req.body.reason }); addLog( logType.EVENTS_REMOVE_PEER, { removed_by_id: req.userData.id, removed_by_username: req.userData.username }, @@ -330,7 +328,7 @@ const generateEventCode = async (req, res) => { } try { - const allEventCodeObjectFromDB = await eventQuery.createEventCode({ + const allEventCodeObjectFromDB = await createEventQuery.createEventCode({ id: eventCodeUuid, event_id: id, code: eventCode, @@ -360,7 +358,7 @@ const getEventCodes = async (req, res) => { const { id } = req.params; try { - const eventCodes = await eventQuery.getEventCodes({ id }); + const eventCodes = await getEventCodesQuery({ id }); return res.status(200).json({ message: "Event codes is successfully fetched for the event!", @@ -375,7 +373,7 @@ const getEventCodes = async (req, res) => { } }; -module.exports = { +export default { createEvent, getAllEvents, joinEvent, @@ -383,7 +381,7 @@ module.exports = { updateEvent, endActiveEvent, addPeerToEvent, + getEventCodes, kickoutPeer, generateEventCode, - getEventCodes, }; diff --git a/controllers/extensionRequests.js b/controllers/extensionRequests.js index a86057a4c..7e715d076 100644 --- a/controllers/extensionRequests.js +++ b/controllers/extensionRequests.js @@ -1,13 +1,20 @@ -const extensionRequestsQuery = require("../models/extensionRequests"); -const { addLog } = require("../models/logs"); -const tasks = require("../models/tasks"); -const { getUsername, getUsernameElseUndefined, getUserIdElseUndefined } = require("../utils/users"); -const { EXTENSION_REQUEST_STATUS } = require("../constants/extensionRequests"); -const { INTERNAL_SERVER_ERROR } = require("../constants/errorMessages"); -const { transformQuery } = require("../utils/extensionRequests"); -const { parseQueryParams } = require("../utils/queryParser"); -const logsQuery = require("../models/logs"); -const { getFullName } = require("../utils/users"); +import { + fetchLatestExtensionRequest, + createExtensionRequest, + fetchPaginatedExtensionRequests, + fetchExtensionRequest, + fetchLatestExtensionRequest as fetchLatestExtensionRequestQuery, + fetchExtensionRequests as fetchExtensionRequestsQuery, + updateExtensionRequest as updateExtensionRequestQuery, +} from "../models/extensionRequests.js"; +import { addLog, fetchLogs } from "../models/logs.js"; +import tasks from "../models/tasks.js"; +import { getUsername, getUsernameElseUndefined, getUserIdElseUndefined, getFullName } from "../utils/users.js"; +import { EXTENSION_REQUEST_STATUS } from "../constants/extensionRequests.js"; +import { INTERNAL_SERVER_ERROR } from "../constants/errorMessages.js"; +import { transformQuery } from "../utils/extensionRequests.js"; +import { parseQueryParams } from "../utils/queryParser.js"; +import logger from "../utils/logger.js"; /** * Create ETA extension Request @@ -49,7 +56,7 @@ const createTaskExtensionRequest = async (req, res) => { extensionBody.oldEndsOn = task.endsOn; } - const latestExtensionRequest = await extensionRequestsQuery.fetchLatestExtensionRequest({ + const latestExtensionRequest = await fetchLatestExtensionRequest({ taskId: extensionBody.taskId, }); @@ -69,7 +76,7 @@ const createTaskExtensionRequest = async (req, res) => { extensionBody = { ...extensionBody, requestNumber: 1 }; } - const extensionRequest = await extensionRequestsQuery.createExtensionRequest(extensionBody); + const extensionRequest = await createExtensionRequest(extensionBody); const extensionLog = { type: "extensionRequests", meta: { @@ -109,7 +116,7 @@ const fetchExtensionRequests = async (req, res) => { const { status, taskId, assignee } = parseQueryParams(req._parsedUrl.search); const { transformedSize, transformedStatus } = transformQuery(size, status); - const allExtensionRequests = await extensionRequestsQuery.fetchPaginatedExtensionRequests( + const allExtensionRequests = await fetchPaginatedExtensionRequests( { taskId, status: transformedStatus, assignee }, { cursor, order, size: transformedSize } ); @@ -126,7 +133,7 @@ const fetchExtensionRequests = async (req, res) => { const getExtensionRequest = async (req, res) => { try { const extensionRequestId = req.params.id; - const { extensionRequestData } = await extensionRequestsQuery.fetchExtensionRequest(extensionRequestId); + const { extensionRequestData } = await fetchExtensionRequest(extensionRequestId); if (!extensionRequestData) { return res.boom.notFound("Extension Request not found"); @@ -152,7 +159,7 @@ const getSelfExtensionRequests = async (req, res) => { if (userId) { let allExtensionRequests; if (taskId) { - const latestExtensionRequest = await extensionRequestsQuery.fetchLatestExtensionRequest({ + const latestExtensionRequest = await fetchLatestExtensionRequestQuery({ taskId, }); @@ -161,7 +168,7 @@ const getSelfExtensionRequests = async (req, res) => { } else { // Add reviewer's name if status is not PENDING if (latestExtensionRequest.status === "APPROVED" || latestExtensionRequest.status === "DENIED") { - const logs = await logsQuery.fetchLogs( + const logs = await fetchLogs( { "meta.extensionRequestId": latestExtensionRequest.id, limit: 1 }, "extensionRequests" ); @@ -180,7 +187,7 @@ const getSelfExtensionRequests = async (req, res) => { allExtensionRequests = [latestExtensionRequest]; } } else { - allExtensionRequests = await extensionRequestsQuery.fetchExtensionRequests({ + allExtensionRequests = await fetchExtensionRequestsQuery({ assignee: userId, status: status || undefined, }); @@ -206,7 +213,7 @@ const updateExtensionRequest = async (req, res) => { const isDev = dev === "true"; const isSuperUser = req.userData?.roles.super_user; try { - const extensionRequest = await extensionRequestsQuery.fetchExtensionRequest(req.params.id); + const extensionRequest = await fetchExtensionRequest(req.params.id); if (!extensionRequest.extensionRequestData) { return res.boom.notFound("Extension Request not found"); } @@ -226,7 +233,7 @@ const updateExtensionRequest = async (req, res) => { } } - const promises = [extensionRequestsQuery.updateExtensionRequest(req.body, req.params.id)]; + const promises = [updateExtensionRequestQuery(req.body, req.params.id)]; // If flag is present, then only create log for change in ETA/reason by SU let body = {}; // Check if reason has been changed @@ -272,7 +279,7 @@ const updateExtensionRequest = async (req, res) => { */ const updateExtensionRequestStatus = async (req, res) => { try { - const extensionRequest = await extensionRequestsQuery.fetchExtensionRequest(req.params.id); + const extensionRequest = await fetchExtensionRequest(req.params.id); if (!extensionRequest.extensionRequestData) { return res.boom.notFound("Extension Request not found"); } @@ -292,7 +299,7 @@ const updateExtensionRequestStatus = async (req, res) => { }; const promises = [ - extensionRequestsQuery.updateExtensionRequest(req.body, req.params.id), + updateExtensionRequestQuery(req.body, req.params.id), addLog(extensionLog.type, extensionLog.meta, extensionLog.body), ]; @@ -330,7 +337,7 @@ const updateExtensionRequestStatus = async (req, res) => { } }; -module.exports = { +export { createTaskExtensionRequest, fetchExtensionRequests, getExtensionRequest, diff --git a/controllers/extensionRequestsv2.ts b/controllers/extensionRequestsv2.ts index edde8482e..ec13ea4d7 100644 --- a/controllers/extensionRequestsv2.ts +++ b/controllers/extensionRequestsv2.ts @@ -1,4 +1,4 @@ -import { getRequestByKeyValues, updateRequest } from "../models/requests"; +import { getRequestByKeyValues, updateRequest } from "../models/requests.js"; import { ERROR_WHILE_CREATING_REQUEST, ERROR_WHILE_UPDATING_REQUEST, @@ -8,13 +8,14 @@ import { REQUEST_REJECTED_SUCCESSFULLY, REQUEST_STATE, REQUEST_TYPE, -} from "../constants/requests"; -import { addLog } from "../models/logs"; -import { createRequest } from "../models/requests"; -import { fetchTask } from "../models/tasks"; -import { CustomResponse } from "../typeDefinitions/global"; -import { ExtensionRequest, ExtensionRequestCreateBody, ExtensionRequestRequest } from "../types/extensionRequests"; -import { getUsernameElseUndefined } from "../utils/users"; +} from "../constants/requests.js"; +import { addLog } from "../models/logs.js"; +import { createRequest } from "../models/requests.js"; +import taskModel from "../models/tasks.js"; +import { CustomResponse } from "../typeDefinitions/global.js"; +import { ExtensionRequest, ExtensionRequestCreateBody, ExtensionRequestRequest } from "../types/extensionRequests.js"; +import { getUsernameElseUndefined } from "../utils/users.js"; +import logger from "../utils/logger.js"; export const createTaskExtensionRequest = async (req: ExtensionRequestRequest, res: CustomResponse) => { try { @@ -30,7 +31,7 @@ export const createTaskExtensionRequest = async (req: ExtensionRequestRequest, r let extensionBody: ExtensionRequestCreateBody = { ...body, requestedBy }; let assignee: string | undefined = undefined; - const { taskData: task } = await fetchTask(taskId); + const { taskData: task } = await taskModel.fetchTask(taskId); if (!task) { return res.boom.badRequest("Task Not Found"); } @@ -112,7 +113,7 @@ export const updateTaskExtensionRequest = async (req: any, res: any) => { } try { - const requestResult = await updateRequest(requestId, requestBody, userId,REQUEST_TYPE.EXTENSION) + const requestResult = await updateRequest(requestId, requestBody, userId, REQUEST_TYPE.EXTENSION); if ("error" in requestResult) { return res.boom.badRequest(requestResult.error); } diff --git a/controllers/external-accounts.js b/controllers/external-accounts.js index f17e74b15..94a9f2c58 100644 --- a/controllers/external-accounts.js +++ b/controllers/external-accounts.js @@ -1,13 +1,16 @@ -const externalAccountsModel = require("../models/external-accounts"); -const { SOMETHING_WENT_WRONG, INTERNAL_SERVER_ERROR } = require("../constants/errorMessages"); -const { getDiscordMembers } = require("../services/discordService"); -const { addOrUpdate, getUsersByRole, updateUsersInBatch } = require("../models/users"); -const { retrieveDiscordUsers, fetchUsersForKeyValues } = require("../services/dataAccessLayer"); -const { EXTERNAL_ACCOUNTS_POST_ACTIONS } = require("../constants/external-accounts"); -const removeDiscordRoleUtils = require("../utils/removeDiscordRoleFromUser"); -const config = require("config"); -const logger = require("../utils/logger"); -const { markUnDoneTasksOfArchivedUsersBacklog } = require("../models/tasks"); +import config from "config"; +import { + fetchExternalAccountData, + addExternalAccountData as _addExternalAccountData, +} from "../models/external-accounts.js"; +import { SOMETHING_WENT_WRONG, INTERNAL_SERVER_ERROR } from "../constants/errorMessages.js"; +import { getDiscordMembers } from "../services/discordService.js"; +import { addOrUpdate, getUsersByRole, updateUsersInBatch } from "../models/users.js"; +import { retrieveDiscordUsers, fetchUsersForKeyValues } from "../services/dataAccessLayer.js"; +import { EXTERNAL_ACCOUNTS_POST_ACTIONS } from "../constants/external-accounts.js"; +import { removeDiscordRoleFromUser } from "../utils/removeDiscordRoleFromUser.js"; +import logger from "../utils/logger.js"; +import taskModel from "../models/tasks.js"; const addExternalAccountData = async (req, res) => { const createdOn = Date.now(); @@ -16,23 +19,23 @@ const addExternalAccountData = async (req, res) => { const data = { ...req.body, createdOn }; // Check if token already exists - const dataFound = await externalAccountsModel.fetchExternalAccountData("", data.token); + const dataFound = await fetchExternalAccountData("", data.token); if (dataFound.token && dataFound.token === data.token) { return res.boom.conflict("Token already exists"); } - await externalAccountsModel.addExternalAccountData(data); + await _addExternalAccountData(data); return res.status(201).json({ message: "Added external account data successfully" }); } catch (error) { - logger.error(`Error adding data: ${error}`); + logger(`Error adding data: ${error}`); return res.boom.serverUnavailable(SOMETHING_WENT_WRONG); } }; const getExternalAccountData = async (req, res) => { try { - const externalAccountData = await externalAccountsModel.fetchExternalAccountData(req.query, req.params.token); + const externalAccountData = await fetchExternalAccountData(req.query, req.params.token); if (!externalAccountData.id) { return res.boom.notFound("No data found"); } @@ -44,7 +47,7 @@ const getExternalAccountData = async (req, res) => { return res.status(200).json({ message: "Data returned successfully", attributes: attributes }); } catch (error) { - logger.error(`Error getting external account data: ${error}`); + logger(`Error getting external account data: ${error}`); return res.boom.serverUnavailable(SOMETHING_WENT_WRONG); } }; @@ -52,7 +55,7 @@ const linkExternalAccount = async (req, res) => { try { const { id: userId, roles } = req.userData; - const externalAccountData = await externalAccountsModel.fetchExternalAccountData(req.query, req.params.token); + const externalAccountData = await fetchExternalAccountData(req.query, req.params.token); if (!externalAccountData.id) { return res.boom.notFound("No data found"); } @@ -72,7 +75,7 @@ const linkExternalAccount = async (req, res) => { ); const unverifiedRoleId = config.get("discordUnverifiedRoleId"); - const unverifiedRoleRemovalResponse = await removeDiscordRoleUtils.removeDiscordRoleFromUser( + const unverifiedRoleRemovalResponse = await removeDiscordRoleFromUser( req.userData, attributes.discordId, unverifiedRoleId @@ -85,7 +88,7 @@ const linkExternalAccount = async (req, res) => { return res.status(204).json({ message: "Your discord profile has been linked successfully" }); } catch (error) { - logger.error(`Error getting external account data: ${error}`); + logger(`Error getting external account data: ${error}`); return res.boom.serverUnavailable(SOMETHING_WENT_WRONG); } }; @@ -160,7 +163,7 @@ const syncExternalAccountData = async (req, res) => { message: "Data Sync Complete", }); } catch (err) { - logger.error("Error in syncing users discord joined at", err); + logger("Error in syncing users discord joined at", err); return res.status(500).json({ message: INTERNAL_SERVER_ERROR }); } }; @@ -232,7 +235,7 @@ const newSyncExternalAccountData = async (req, res) => { } const unArchiveUsersInBatchPromise = updateUsersInBatch(updateUserList); // Mark un done tasks assigned to archived users BACKLOG - const markTasksBacklogPromise = markUnDoneTasksOfArchivedUsersBacklog(archiveUserList); + const markTasksBacklogPromise = taskModel.markUnDoneTasksOfArchivedUsersBacklog(archiveUserList); const archivedUsersInDiscordList = await fetchUsersForKeyValues("discordId", [...discordUserIdSet]); totalUsersProcessed += archivedUsersInDiscordList.length; @@ -267,12 +270,12 @@ const newSyncExternalAccountData = async (req, res) => { backlogTasksCount: backlogTasksCount, }); } catch (err) { - logger.error("Error in syncing users discord joined at"); + logger("Error in syncing users discord joined at"); return res.status(500).json({ message: INTERNAL_SERVER_ERROR }); } }; -module.exports = { +export default { addExternalAccountData, getExternalAccountData, linkExternalAccount, diff --git a/controllers/fcmToken.js b/controllers/fcmToken.js index a60521ab5..724b23517 100644 --- a/controllers/fcmToken.js +++ b/controllers/fcmToken.js @@ -1,5 +1,6 @@ -const { saveFcmToken } = require("../models/fcmToken"); -const { Conflict } = require("http-errors"); +import { saveFcmToken } from "../models/fcmToken.js"; +import httpError from "http-errors"; +import logger from "../utils/logger.js"; /** * Route used to get the health status of teh server @@ -7,23 +8,20 @@ const { Conflict } = require("http-errors"); * @param req {Object} - Express request object * @param res {Object} - Express response object */ -const fcmTokenController = async (req, res) => { +export const fcmTokenController = async (req, res, next) => { try { const { fcmToken } = req.body; + const { id } = req.userData; - const fcmTokenId = await saveFcmToken({ userId: req.userData.id, fcmToken }); - if (fcmTokenId) res.status(200).json({ status: 200, message: "Device registered successfully" }); + await saveFcmToken(id, fcmToken); + return res.json({ + message: "FCM token saved successfully", + }); } catch (error) { - if (error instanceof Conflict) { - return res.status(409).json({ - message: error.message, - }); + if (error instanceof httpError.Conflict) { + return next(error); } - res.status(500).send("Something went wrong, please contact admin"); + logger.error("Error in fcmTokenController: ", error); + return next(error); } - return res.status(500).send("Internal server error"); -}; - -module.exports = { - fcmTokenController, }; diff --git a/controllers/goals.js b/controllers/goals.js index 29078fda9..1954e3471 100644 --- a/controllers/goals.js +++ b/controllers/goals.js @@ -1,11 +1,11 @@ -const { SOMETHING_WENT_WRONG } = require("../constants/errorMessages"); -const goals = require("../services/goalService"); +import { SOMETHING_WENT_WRONG } from "../constants/errorMessages.js"; +import { getOrCreateGoalUser } from "../services/goalService.js"; -const getGoalSiteToken = async (req, res) => { +export const getGoalSiteToken = async (req, res) => { try { const { roles, id: userId } = req.userData; - const goalApiResponse = await goals.getOrCreateGoalUser({ userId, roles }); + const goalApiResponse = await getOrCreateGoalUser({ userId, roles }); if (goalApiResponse.status === 201) { let goalApiData = await goalApiResponse.json(); @@ -18,7 +18,3 @@ const getGoalSiteToken = async (req, res) => { return res.boom.badImplementation(SOMETHING_WENT_WRONG); } }; - -module.exports = { - getGoalSiteToken, -}; diff --git a/controllers/health.js b/controllers/health.js index 9a50d8aca..952981723 100644 --- a/controllers/health.js +++ b/controllers/health.js @@ -4,12 +4,8 @@ * @param req {Object} - Express request object * @param res {Object} - Express response object */ -const healthCheck = (req, res) => { +export const healthCheck = (req, res) => { return res.json({ uptime: process.uptime(), }); }; - -module.exports = { - healthCheck, -}; diff --git a/controllers/invites.ts b/controllers/invites.ts index 5419c3ee1..e29007414 100644 --- a/controllers/invites.ts +++ b/controllers/invites.ts @@ -1,9 +1,10 @@ -import { addInviteToInviteModel, getUserDiscordInvite } from "../models/discordactions"; -import { InviteBodyRequest } from "../types/invites"; -import {CustomResponse} from "../types/global"; -import { addLog } from "../models/logs"; -import { generateDiscordInviteLink } from "../utils/discord-actions"; -const { logType } = require("../constants/logs"); +import { addInviteToInviteModel, getUserDiscordInvite } from "../models/discordactions.js"; +import { InviteBodyRequest } from "../types/invites.js"; +import {CustomResponse} from "../types/global.js"; +import { addLog } from "../models/logs.js"; +import { generateDiscordInviteLink } from "../utils/discord-actions.js"; +import { logType } from "../constants/logs.js"; +import logger from "../utils/logger.js"; export const createInviteLink = async (req: InviteBodyRequest, res: CustomResponse) => { try { diff --git a/controllers/issues.js b/controllers/issues.js index 2bc6c23ed..8227f3439 100644 --- a/controllers/issues.js +++ b/controllers/issues.js @@ -1,7 +1,9 @@ -const issuesService = require("../services/issuesService"); -const tasks = require("../models/tasks"); -const { SOMETHING_WENT_WRONG } = require("../constants/errorMessages"); -const githubService = require("../services/githubService"); +import { searchOrgIssues, getOrgIssues } from "../services/issuesService.js"; +import tasks from "../models/tasks.js"; +import { SOMETHING_WENT_WRONG } from "../constants/errorMessages.js"; +import { fetchIssuesById } from "../services/githubService.js"; +import config from "config"; +import logger from "../utils/logger.js"; /** * Get the issues of the repo @@ -9,7 +11,7 @@ const githubService = require("../services/githubService"); * @param {Object} res - Express response object */ -const getIssues = async (req, res) => { +export const getIssues = async (req, res) => { try { const { q: queryString } = req.query; let issues = {}; @@ -21,12 +23,12 @@ const getIssues = async (req, res) => { const issueUrlPaths = url.pathname.split("/"); const repositoryName = issueUrlPaths[2]; const issueNumber = issueUrlPaths[4]; - issues.data = [await githubService.fetchIssuesById(repositoryName, issueNumber)]; + issues.data = [await fetchIssuesById(repositoryName, issueNumber)]; } else if (queryString) { - const searchedIssues = await issuesService.searchOrgIssues(queryString); + const searchedIssues = await searchOrgIssues(queryString); issues.data = searchedIssues?.data?.items ?? []; } else { - issues = await issuesService.getOrgIssues(); + issues = await getOrgIssues(); } let issuesData = issues.data.length > 0 ? issues.data : []; @@ -56,7 +58,7 @@ const getIssues = async (req, res) => { * @param {Object} req - Express request object * @param {Object} res - Express response object */ -const issueUpdates = async (req, res) => { +export const issueUpdates = async (req, res) => { try { const response = req.body; if ("issue" in response) { @@ -108,8 +110,3 @@ const issueUpdates = async (req, res) => { return res.boom.badImplementation(SOMETHING_WENT_WRONG); } }; - -module.exports = { - getIssues, - issueUpdates, -}; diff --git a/controllers/items.js b/controllers/items.js index 72da07522..2c0ae021a 100644 --- a/controllers/items.js +++ b/controllers/items.js @@ -1,5 +1,6 @@ -const ItemTagsModel = require("../models/items"); -const { INTERNAL_SERVER_ERROR } = require("../constants/errorMessages"); +import ItemTagsModel from "../models/items.js"; +import { INTERNAL_SERVER_ERROR } from "../constants/errorMessages.js"; +import logger from "../utils/logger.js"; /** * Adds a tag to an item with its corresponding a level @@ -65,8 +66,4 @@ const getItemBasedOnFilter = async (req, res) => { } }; -module.exports = { - addTagsToItem, - removeTagsFromItem, - getItemBasedOnFilter, -}; +export { addTagsToItem, removeTagsFromItem, getItemBasedOnFilter }; diff --git a/controllers/levels.js b/controllers/levels.js index e7f9d94d8..660dd2e7b 100644 --- a/controllers/levels.js +++ b/controllers/levels.js @@ -1,6 +1,7 @@ -const LevelModel = require("../models/levels"); -const admin = require("firebase-admin"); -const { INTERNAL_SERVER_ERROR } = require("../constants/errorMessages"); +import LevelModel from "../models/levels.js"; +import admin from "firebase-admin"; +import { INTERNAL_SERVER_ERROR } from "../constants/errorMessages.js"; +import logger from "../utils/logger.js"; /** * Creates a level @@ -67,8 +68,4 @@ const getAllLevels = async (req, res) => { } }; -module.exports = { - addLevel, - deleteLevel, - getAllLevels, -}; +export { addLevel, deleteLevel, getAllLevels }; diff --git a/controllers/logs.js b/controllers/logs.js index d2758380c..682e7a7ba 100644 --- a/controllers/logs.js +++ b/controllers/logs.js @@ -1,7 +1,12 @@ -import { getPaginatedLink } from "../utils/helper"; -import { ALL_LOGS_FETCHED_SUCCESSFULLY, ERROR_WHILE_FETCHING_LOGS, LOGS_FETCHED_SUCCESSFULLY } from "../constants/logs"; -const logsQuery = require("../models/logs"); -const { SOMETHING_WENT_WRONG } = require("../constants/errorMessages"); +import { getPaginatedLink } from "../utils/helper.js"; +import { + ALL_LOGS_FETCHED_SUCCESSFULLY, + ERROR_WHILE_FETCHING_LOGS, + LOGS_FETCHED_SUCCESSFULLY, +} from "../constants/logs.js"; +import { fetchAllLogs as getAllLogs, fetchLogs as getLogs, updateLogs as updateLogsModel } from "../models/logs.js"; +import { SOMETHING_WENT_WRONG } from "../constants/errorMessages.js"; +import logger from "../utils/logger.js"; /** * Fetches logs @@ -11,7 +16,7 @@ const { SOMETHING_WENT_WRONG } = require("../constants/errorMessages"); */ const fetchLogs = async (req, res) => { try { - const logs = await logsQuery.fetchLogs(req.query, req.params.type); + const logs = await getLogs(req.query, req.params.type); return res.json({ message: LOGS_FETCHED_SUCCESSFULLY, logs, @@ -25,7 +30,7 @@ const fetchLogs = async (req, res) => { const fetchAllLogs = async (req, res) => { const { query } = req; try { - const logs = await logsQuery.fetchAllLogs(query); + const logs = await getAllLogs(query); if (logs.length === 0) { return res.status(204).send(); } @@ -77,7 +82,7 @@ const fetchAllLogs = async (req, res) => { const updateLogs = async (req, res) => { try { - const response = await logsQuery.updateLogs(); + const response = await updateLogsModel(); return res.json({ response, }); @@ -86,8 +91,4 @@ const updateLogs = async (req, res) => { } }; -module.exports = { - fetchLogs, - fetchAllLogs, - updateLogs, -}; +export { fetchLogs, fetchAllLogs, updateLogs }; diff --git a/controllers/members.js b/controllers/members.js index 1ece7d3bc..7c095b24a 100644 --- a/controllers/members.js +++ b/controllers/members.js @@ -1,9 +1,11 @@ -const ROLES = require("../constants/roles"); -const members = require("../models/members"); -const tasks = require("../models/tasks"); -const { SOMETHING_WENT_WRONG, INTERNAL_SERVER_ERROR } = require("../constants/errorMessages"); -const dataAccess = require("../services/dataAccessLayer"); -const { addLog } = require("../models/logs"); +import { ROLES } from "../constants/roles.js"; +import * as members from "../models/members.js"; +import * as tasks from "../models/tasks.js"; +import { SOMETHING_WENT_WRONG, INTERNAL_SERVER_ERROR } from "../constants/errorMessages.js"; +import { retrieveMembers, retrieveUsersWithRole, retrieveUsers } from "../services/dataAccessLayer.js"; +import { addLog } from "../models/logs.js"; +import logger from "../utils/logger.js"; + /** * Fetches the data about our members * @@ -13,7 +15,7 @@ const { addLog } = require("../models/logs"); const getMembers = async (req, res) => { try { - const allUsers = await dataAccess.retrieveMembers(req.query); + const allUsers = await retrieveMembers(req.query); return res.json({ message: allUsers.length ? "Members returned successfully!" : "No member found", members: allUsers, @@ -33,7 +35,7 @@ const getMembers = async (req, res) => { const getIdleMembers = async (req, res) => { try { - const onlyMembers = await dataAccess.retrieveUsersWithRole(ROLES.MEMBER); + const onlyMembers = await retrieveUsersWithRole(ROLES.MEMBER); const taskParticipants = await tasks.fetchActiveTaskMembers(); const idleMembers = onlyMembers?.filter(({ id }) => !taskParticipants.has(id)); const idleMemberUserNames = idleMembers?.map((member) => member.username); @@ -58,7 +60,7 @@ const getIdleMembers = async (req, res) => { const moveToMembers = async (req, res) => { try { const { username } = req.params; - const result = await dataAccess.retrieveUsers({ username }); + const result = await retrieveUsers({ username }); if (result.userExists) { const successObject = await members.moveToMembers(result.user.id); if (successObject.isAlreadyMember) { @@ -83,7 +85,7 @@ const moveToMembers = async (req, res) => { const archiveMembers = async (req, res) => { try { const { username } = req.params; - const user = await dataAccess.retrieveUsers({ username }); + const user = await retrieveUsers({ username }); const superUserId = req.userData.id; const { reason } = req.body; const roles = req?.userData?.roles; @@ -114,7 +116,7 @@ const archiveMembers = async (req, res) => { } }; -module.exports = { +export default { archiveMembers, getMembers, getIdleMembers, diff --git a/controllers/monitor.js b/controllers/monitor.js index 2d9fa2c13..bf02e1075 100644 --- a/controllers/monitor.js +++ b/controllers/monitor.js @@ -1,11 +1,12 @@ -const { Conflict, NotFound } = require("http-errors"); -const { INTERNAL_SERVER_ERROR_MESSAGE } = require("../constants/progresses"); -const { +import httpError from "http-errors"; +import { INTERNAL_SERVER_ERROR_MESSAGE } from "../constants/progresses.js"; +import { createTrackedProgressDocument, updateTrackedProgressDocument, getTrackedProgressDocuments, -} = require("../models/monitor"); -const { RESPONSE_MESSAGES } = require("../constants/monitor"); +} from "../models/monitor.js"; +import { RESPONSE_MESSAGES } from "../constants/monitor.js"; + const { RESOURCE_CREATED_SUCCESSFULLY, RESOURCE_UPDATED_SUCCESSFULLY, RESOURCE_RETRIEVED_SUCCESSFULLY } = RESPONSE_MESSAGES; /** @@ -51,11 +52,11 @@ const createTrackedProgressController = async (req, res) => { data, }); } catch (error) { - if (error instanceof Conflict) { + if (error instanceof httpError.Conflict) { return res.status(409).json({ message: error.message, }); - } else if (error instanceof NotFound) { + } else if (error instanceof httpError.NotFound) { return res.status(404).json({ message: error.message, }); @@ -113,7 +114,7 @@ const updateTrackedProgressController = async (req, res) => { message: RESOURCE_UPDATED_SUCCESSFULLY, }); } catch (error) { - if (error instanceof NotFound) { + if (error instanceof httpError.NotFound) { return res.status(404).json({ message: error.message, }); @@ -166,7 +167,7 @@ const getTrackedProgressController = async (req, res) => { data, }); } catch (error) { - if (error instanceof NotFound) { + if (error instanceof httpError.NotFound) { const response = { message: error.message, }; @@ -181,8 +182,4 @@ const getTrackedProgressController = async (req, res) => { } }; -module.exports = { - createTrackedProgressController, - updateTrackedProgressController, - getTrackedProgressController, -}; +export { createTrackedProgressController, updateTrackedProgressController, getTrackedProgressController }; diff --git a/controllers/notify.js b/controllers/notify.js index 0cb9b55a9..84479284f 100644 --- a/controllers/notify.js +++ b/controllers/notify.js @@ -1,6 +1,7 @@ -const { getMessaging } = require("firebase-admin/messaging"); -const { getFcmTokenFromUserId } = require("../services/getFcmTokenFromUserId"); -const { getUserIdsFromRoleId } = require("../services/getUserIdsFromRoleId"); +import firebaseAdmin from "firebase-admin"; +import { getFcmTokenFromUserId } from "../services/getFcmTokenFromUserId.js"; +import { getUserIdsFromRoleId } from "../services/getUserIdsFromRoleId.js"; +import logger from "../utils/logger.js"; /** * Route used to get the health status of teh server @@ -70,7 +71,8 @@ const notifyController = async (req, res) => { res.error(401).send("Message length exceeds"); } - getMessaging() + firebaseAdmin + .getMessaging() .sendEachForMulticast(message) .then(() => res.status(200).json({ status: 200, message: "User notified successfully" })) .catch((error) => { @@ -79,6 +81,4 @@ const notifyController = async (req, res) => { }); }; -module.exports = { - notifyController, -}; +export { notifyController }; diff --git a/controllers/onboardingExtension.ts b/controllers/onboardingExtension.ts index d72a3c26e..db9167217 100644 --- a/controllers/onboardingExtension.ts +++ b/controllers/onboardingExtension.ts @@ -1,143 +1,146 @@ import { - ERROR_WHILE_CREATING_REQUEST, - ERROR_WHILE_UPDATING_REQUEST, - LOG_ACTION, - ONBOARDING_REQUEST_CREATED_SUCCESSFULLY, - REQUEST_ALREADY_PENDING, - REQUEST_APPROVED_SUCCESSFULLY, - REQUEST_DOES_NOT_EXIST, - REQUEST_LOG_TYPE, - REQUEST_REJECTED_SUCCESSFULLY, - REQUEST_STATE, - REQUEST_TYPE, - REQUEST_UPDATED_SUCCESSFULLY, - UNAUTHORIZED_TO_CREATE_ONBOARDING_EXTENSION_REQUEST, - UNAUTHORIZED_TO_UPDATE_REQUEST, -} from "../constants/requests"; -import { userState } from "../constants/userStatus"; -import { addLog } from "../services/logService"; -import { createRequest, getRequestByKeyValues, updateRequest } from "../models/requests"; -import { fetchUser } from "../models/users"; -import { getUserStatus } from "../models/userStatus"; -import { User } from "../typeDefinitions/users"; -import { - CreateOnboardingExtensionBody, - OnboardingExtension, - OnboardingExtensionCreateRequest, - OnboardingExtensionResponse, - UpdateOnboardingExtensionStateRequest, - UpdateOnboardingExtensionStateRequestBody, - UpdateOnboardingExtensionRequest, - UpdateOnboardingExtensionRequestBody -} from "../types/onboardingExtension"; -import { convertDateStringToMilliseconds, getNewDeadline } from "../utils/requests"; -import { convertDaysToMilliseconds } from "../utils/time"; -import firestore from "../utils/firestore"; -import { updateOnboardingExtensionRequest, validateOnboardingExtensionUpdateRequest } from "../services/onboardingExtension"; + ERROR_WHILE_CREATING_REQUEST, + ERROR_WHILE_UPDATING_REQUEST, + LOG_ACTION, + ONBOARDING_REQUEST_CREATED_SUCCESSFULLY, + REQUEST_ALREADY_PENDING, + REQUEST_APPROVED_SUCCESSFULLY, + REQUEST_DOES_NOT_EXIST, + REQUEST_LOG_TYPE, + REQUEST_REJECTED_SUCCESSFULLY, + REQUEST_STATE, + REQUEST_TYPE, + REQUEST_UPDATED_SUCCESSFULLY, + UNAUTHORIZED_TO_CREATE_ONBOARDING_EXTENSION_REQUEST, + UNAUTHORIZED_TO_UPDATE_REQUEST, +} from "../constants/requests.js"; +import { userState } from "../constants/userStatus.js"; +import { addLog } from "../services/logService.js"; +import { createRequest, getRequestByKeyValues, updateRequest } from "../models/requests.js"; +import { fetchUser } from "../models/users.js"; +import { getUserStatus } from "../models/userStatus.js"; +import { User } from "../typeDefinitions/users.js"; +import { + CreateOnboardingExtensionBody, + OnboardingExtension, + OnboardingExtensionCreateRequest, + OnboardingExtensionResponse, + UpdateOnboardingExtensionStateRequest, + UpdateOnboardingExtensionStateRequestBody, + UpdateOnboardingExtensionRequest, + UpdateOnboardingExtensionRequestBody, +} from "../types/onboardingExtension.js"; +import { convertDateStringToMilliseconds, getNewDeadline } from "../utils/requests.js"; +import { convertDaysToMilliseconds } from "../utils/time.js"; +import firestore from "../utils/firestore.js"; +import { + updateOnboardingExtensionRequest, + validateOnboardingExtensionUpdateRequest, +} from "../services/onboardingExtension.js"; +import logger from "../utils/logger.js"; + const requestModel = firestore.collection("requests"); /** -* Controller to handle the creation of onboarding extension requests. -* -* This function processes the request to create an extension for the onboarding period, -* validates the user status, checks existing requests, calculates new deadlines, -* and stores the new request in the database with logging. -* -* @param {OnboardingExtensionCreateRequest} req - The Express request object containing the body with extension details. -* @param {OnboardingExtensionResponse} res - The Express response object used to send back the response. -* @returns {Promise} Resolves to a response with the status and data or an error message. -*/ + * Controller to handle the creation of onboarding extension requests. + * + * This function processes the request to create an extension for the onboarding period, + * validates the user status, checks existing requests, calculates new deadlines, + * and stores the new request in the database with logging. + * + * @param {OnboardingExtensionCreateRequest} req - The Express request object containing the body with extension details. + * @param {OnboardingExtensionResponse} res - The Express response object used to send back the response. + * @returns {Promise} Resolves to a response with the status and data or an error message. + */ export const createOnboardingExtensionRequestController = async ( - req: OnboardingExtensionCreateRequest, - res: OnboardingExtensionResponse ) - : Promise => { + req: OnboardingExtensionCreateRequest, + res: OnboardingExtensionResponse +): Promise => { + try { + const data = req.body as CreateOnboardingExtensionBody; + const { user, userExists } = await fetchUser({ discordId: data.userId }); - try { + if (!userExists) { + return res.boom.notFound("User not found"); + } - const data = req.body as CreateOnboardingExtensionBody; - const {user, userExists} = await fetchUser({discordId: data.userId}); - - if(!userExists) { - return res.boom.notFound("User not found"); - } + const { id: userId, discordJoinedAt, username } = user as User; + const { data: userStatus } = await getUserStatus(userId); - const { id: userId, discordJoinedAt, username} = user as User; - const { data: userStatus } = await getUserStatus(userId); + if (!userStatus || userStatus.currentStatus.state != userState.ONBOARDING) { + return res.boom.forbidden(UNAUTHORIZED_TO_CREATE_ONBOARDING_EXTENSION_REQUEST); + } - if(!userStatus || userStatus.currentStatus.state != userState.ONBOARDING){ - return res.boom.forbidden(UNAUTHORIZED_TO_CREATE_ONBOARDING_EXTENSION_REQUEST); - } + const latestExtensionRequest: OnboardingExtension = await getRequestByKeyValues({ + userId: userId, + type: REQUEST_TYPE.ONBOARDING, + }); - const latestExtensionRequest: OnboardingExtension = await getRequestByKeyValues({ - userId: userId, - type: REQUEST_TYPE.ONBOARDING - }); + if (latestExtensionRequest && latestExtensionRequest.state === REQUEST_STATE.PENDING) { + return res.boom.conflict(REQUEST_ALREADY_PENDING); + } - if(latestExtensionRequest && latestExtensionRequest.state === REQUEST_STATE.PENDING){ - return res.boom.conflict(REQUEST_ALREADY_PENDING); - } - - const millisecondsInThirtyOneDays = convertDaysToMilliseconds(31); - const numberOfDaysInMillisecond = convertDaysToMilliseconds(data.numberOfDays); - const { isDate, milliseconds: discordJoinedDateInMillisecond } = convertDateStringToMilliseconds(discordJoinedAt); + const millisecondsInThirtyOneDays = convertDaysToMilliseconds(31); + const numberOfDaysInMillisecond = convertDaysToMilliseconds(data.numberOfDays); + const { isDate, milliseconds: discordJoinedDateInMillisecond } = convertDateStringToMilliseconds(discordJoinedAt); - if(!isDate){ - logger.error(ERROR_WHILE_CREATING_REQUEST, "Invalid date"); - return res.boom.badImplementation(ERROR_WHILE_CREATING_REQUEST); - } + if (!isDate) { + logger.error(ERROR_WHILE_CREATING_REQUEST, "Invalid date"); + return res.boom.badImplementation(ERROR_WHILE_CREATING_REQUEST); + } - let requestNumber: number; - let oldEndsOn: number; - const currentDate = Date.now(); + let requestNumber: number; + let oldEndsOn: number; + const currentDate = Date.now(); - if(!latestExtensionRequest){ - requestNumber = 1; - oldEndsOn = discordJoinedDateInMillisecond + millisecondsInThirtyOneDays; - }else if(latestExtensionRequest.state === REQUEST_STATE.REJECTED) { - requestNumber = latestExtensionRequest.requestNumber + 1; - oldEndsOn = latestExtensionRequest.oldEndsOn; - }else{ - requestNumber = latestExtensionRequest.requestNumber + 1; - oldEndsOn = latestExtensionRequest.newEndsOn; - } - - const newEndsOn = getNewDeadline(currentDate, oldEndsOn, numberOfDaysInMillisecond); - - const onboardingExtension = await createRequest({ - type: REQUEST_TYPE.ONBOARDING, - state: REQUEST_STATE.PENDING, - userId: userId, - requestedBy: username, - oldEndsOn: oldEndsOn, - newEndsOn: newEndsOn, - reason: data.reason, - requestNumber: requestNumber, - }); + if (!latestExtensionRequest) { + requestNumber = 1; + oldEndsOn = discordJoinedDateInMillisecond + millisecondsInThirtyOneDays; + } else if (latestExtensionRequest.state === REQUEST_STATE.REJECTED) { + requestNumber = latestExtensionRequest.requestNumber + 1; + oldEndsOn = latestExtensionRequest.oldEndsOn; + } else { + requestNumber = latestExtensionRequest.requestNumber + 1; + oldEndsOn = latestExtensionRequest.newEndsOn; + } - const onboardingExtensionLog = { - type: REQUEST_LOG_TYPE.REQUEST_CREATED, - meta: { - requestId: onboardingExtension.id, - action: LOG_ACTION.CREATE, - userId: userId, - createdAt: Date.now(), - }, - body: onboardingExtension, - }; + const newEndsOn = getNewDeadline(currentDate, oldEndsOn, numberOfDaysInMillisecond); - await addLog(onboardingExtensionLog.type, onboardingExtensionLog.meta, onboardingExtensionLog.body); + const onboardingExtension = await createRequest({ + type: REQUEST_TYPE.ONBOARDING, + state: REQUEST_STATE.PENDING, + userId: userId, + requestedBy: username, + oldEndsOn: oldEndsOn, + newEndsOn: newEndsOn, + reason: data.reason, + requestNumber: requestNumber, + }); - return res.status(201).json({ - message: ONBOARDING_REQUEST_CREATED_SUCCESSFULLY, - data: { - id: onboardingExtension.id, - ...onboardingExtension, - } - }); - }catch (err) { - logger.error(ERROR_WHILE_CREATING_REQUEST, err); - return res.boom.badImplementation(ERROR_WHILE_CREATING_REQUEST); - } + const onboardingExtensionLog = { + type: REQUEST_LOG_TYPE.REQUEST_CREATED, + meta: { + requestId: onboardingExtension.id, + action: LOG_ACTION.CREATE, + userId: userId, + createdAt: Date.now(), + }, + body: onboardingExtension, + }; + + await addLog(onboardingExtensionLog.type, onboardingExtensionLog.meta, onboardingExtensionLog.body); + + return res.status(201).json({ + message: ONBOARDING_REQUEST_CREATED_SUCCESSFULLY, + data: { + id: onboardingExtension.id, + ...onboardingExtension, + }, + }); + } catch (err) { + logger.error(ERROR_WHILE_CREATING_REQUEST, err); + return res.boom.badImplementation(ERROR_WHILE_CREATING_REQUEST); + } }; /** @@ -148,114 +151,109 @@ export const createOnboardingExtensionRequestController = async ( * @returns {Promise} Sends the response with the result of the update operation. */ export const updateOnboardingExtensionRequestState = async ( - req: UpdateOnboardingExtensionStateRequest, - res: OnboardingExtensionResponse ) - : Promise => { + req: UpdateOnboardingExtensionStateRequest, + res: OnboardingExtensionResponse +): Promise => { + const body = req.body as UpdateOnboardingExtensionStateRequestBody; + const lastModifiedBy = req?.userData?.id; + const extensionId = req.params.id; - const body = req.body as UpdateOnboardingExtensionStateRequestBody; - const lastModifiedBy = req?.userData?.id; - const extensionId = req.params.id; + let requestBody: UpdateOnboardingExtensionStateRequestBody = { + state: body.state, + type: body.type, + }; - let requestBody: UpdateOnboardingExtensionStateRequestBody = { - state: body.state, - type: body.type, - } + if (body.message) { + requestBody = { ...requestBody, message: body.message }; + } - if(body.message){ - requestBody = { ...requestBody, message: body.message }; + try { + const response = await updateRequest(extensionId, requestBody, lastModifiedBy, REQUEST_TYPE.ONBOARDING); + + if ("error" in response) { + if (response.error === REQUEST_DOES_NOT_EXIST) { + return res.boom.notFound(response.error); + } + return res.boom.badRequest(response.error); } - - try { - const response = await updateRequest(extensionId, requestBody, lastModifiedBy, REQUEST_TYPE.ONBOARDING); - if ("error" in response) { - if (response.error === REQUEST_DOES_NOT_EXIST) { - return res.boom.notFound(response.error); - } - return res.boom.badRequest(response.error); - } + const [logType, returnMessage] = + response.state === REQUEST_STATE.APPROVED + ? [REQUEST_LOG_TYPE.REQUEST_APPROVED, REQUEST_APPROVED_SUCCESSFULLY] + : [REQUEST_LOG_TYPE.REQUEST_REJECTED, REQUEST_REJECTED_SUCCESSFULLY]; - const [logType, returnMessage] = response.state === REQUEST_STATE.APPROVED - ? [REQUEST_LOG_TYPE.REQUEST_APPROVED, REQUEST_APPROVED_SUCCESSFULLY] - : [REQUEST_LOG_TYPE.REQUEST_REJECTED, REQUEST_REJECTED_SUCCESSFULLY]; + const requestLog = { + type: logType, + meta: { + requestId: extensionId, + action: LOG_ACTION.UPDATE, + createdBy: lastModifiedBy, + }, + body: response, + }; - const requestLog = { - type: logType, - meta: { - requestId: extensionId, - action: LOG_ACTION.UPDATE, - createdBy: lastModifiedBy, - }, - body: response, - }; + await addLog(requestLog.type, requestLog.meta, requestLog.body); - await addLog(requestLog.type, requestLog.meta, requestLog.body); - - return res.status(200).json({ - message: returnMessage, - data: { - id: response.id, - ...response, - }, - }); - }catch(error){ - logger.error(ERROR_WHILE_UPDATING_REQUEST, error); - return res.boom.badImplementation(ERROR_WHILE_UPDATING_REQUEST); - } -} + return res.status(200).json({ + message: returnMessage, + data: { + id: response.id, + ...response, + }, + }); + } catch (error) { + logger.error(ERROR_WHILE_UPDATING_REQUEST, error); + return res.boom.badImplementation(ERROR_WHILE_UPDATING_REQUEST); + } +}; /** * Updates an onboarding extension request. - * + * * @param {UpdateOnboardingExtensionRequest} req - The request object. * @param {OnboardingExtensionResponse} res - The response object. * @returns {Promise} Resolves with success or failure. */ export const updateOnboardingExtensionRequestController = async ( - req: UpdateOnboardingExtensionRequest, - res: OnboardingExtensionResponse): Promise => -{ - - const body = req.body as UpdateOnboardingExtensionRequestBody; - const id = req.params.id; - const lastModifiedBy = req?.userData?.id; - const isSuperuser = req?.userData?.roles?.super_user === true; - - try{ - const extensionRequestDoc = await requestModel.doc(id).get(); - const validationResponse = await validateOnboardingExtensionUpdateRequest( - extensionRequestDoc, - id, - isSuperuser, - lastModifiedBy, - body.newEndsOn, - ) + req: UpdateOnboardingExtensionRequest, + res: OnboardingExtensionResponse +): Promise => { + const body = req.body as UpdateOnboardingExtensionRequestBody; + const id = req.params.id; + const lastModifiedBy = req?.userData?.id; + const isSuperuser = req?.userData?.roles?.super_user === true; - if (validationResponse){ - if(validationResponse.error === REQUEST_DOES_NOT_EXIST){ - return res.boom.notFound(validationResponse.error); - } - if(validationResponse.error === UNAUTHORIZED_TO_UPDATE_REQUEST){ - return res.boom.forbidden(UNAUTHORIZED_TO_UPDATE_REQUEST); - } - return res.boom.badRequest(validationResponse.error); - } - - const requestBody = await updateOnboardingExtensionRequest( - id, - body, - lastModifiedBy, - ) + try { + const extensionRequestDoc = await requestModel.doc(id).get(); + const validationResponse = await validateOnboardingExtensionUpdateRequest( + extensionRequestDoc, + id, + isSuperuser, + lastModifiedBy, + body.newEndsOn + ); - return res.status(200).json({ - message: REQUEST_UPDATED_SUCCESSFULLY, - data: { - id: extensionRequestDoc.id, - ...requestBody - } - }) - }catch(error){ - logger.error(ERROR_WHILE_UPDATING_REQUEST, error); - return res.boom.badImplementation(ERROR_WHILE_UPDATING_REQUEST); + if (validationResponse) { + if (validationResponse.error === REQUEST_DOES_NOT_EXIST) { + return res.boom.notFound(validationResponse.error); + } + if (validationResponse.error === UNAUTHORIZED_TO_UPDATE_REQUEST) { + return res.boom.forbidden(UNAUTHORIZED_TO_UPDATE_REQUEST); + } + return res.boom.badRequest(validationResponse.error); } -} + + const requestBody = await updateOnboardingExtensionRequest(id, body, lastModifiedBy); + + return res.status(200).json({ + message: REQUEST_UPDATED_SUCCESSFULLY, + data: { + id: extensionRequestDoc.id, + ...requestBody, + }, + }); + } catch (error) { + logger.error(ERROR_WHILE_UPDATING_REQUEST, error); + return res.boom.badImplementation(ERROR_WHILE_UPDATING_REQUEST); + } +}; diff --git a/controllers/oooRequests.ts b/controllers/oooRequests.ts index 36d2baeab..ede8f92aa 100644 --- a/controllers/oooRequests.ts +++ b/controllers/oooRequests.ts @@ -1,28 +1,29 @@ +import { logType } from "../constants/logs.js"; import { - REQUEST_LOG_TYPE, - LOG_ACTION, - REQUEST_CREATED_SUCCESSFULLY, ERROR_WHILE_CREATING_REQUEST, - REQUEST_STATE, - REQUEST_TYPE, ERROR_WHILE_UPDATING_REQUEST, + LOG_ACTION, + OOO_STATUS_ALREADY_EXIST, + REQUEST_ALREADY_PENDING, REQUEST_APPROVED_SUCCESSFULLY, + REQUEST_CREATED_SUCCESSFULLY, + REQUEST_LOG_TYPE, REQUEST_REJECTED_SUCCESSFULLY, + REQUEST_STATE, + REQUEST_TYPE, UNAUTHORIZED_TO_CREATE_OOO_REQUEST, - REQUEST_ALREADY_PENDING, USER_STATUS_NOT_FOUND, - OOO_STATUS_ALREADY_EXIST, -} from "../constants/requests"; -import { statusState } from "../constants/userStatus"; -import { logType } from "../constants/logs"; -import { addLog } from "../models/logs"; -import { getRequestByKeyValues, getRequests, updateRequest } from "../models/requests"; -import { createUserFutureStatus } from "../models/userFutureStatus"; -import { getUserStatus, addFutureStatus } from "../models/userStatus"; -import { createOooRequest, validateUserStatus } from "../services/oooRequest"; -import { CustomResponse } from "../typeDefinitions/global"; -import { OooRequestCreateRequest, OooRequestResponse, OooStatusRequest } from "../types/oooRequest"; -import { UpdateRequest } from "../types/requests"; +} from "../constants/requests.js"; +import { statusState } from "../constants/userStatus.js"; +import { addLog } from "../models/logs.js"; +import { getRequestByKeyValues, getRequests, updateRequest } from "../models/requests.js"; +import { createUserFutureStatus } from "../models/userFutureStatus.js"; +import { addFutureStatus, getUserStatus } from "../models/userStatus.js"; +import { createOooRequest, validateUserStatus } from "../services/oooRequest.js"; +import { CustomResponse } from "../typeDefinitions/global.js"; +import { OooRequestCreateRequest, OooRequestResponse, OooStatusRequest } from "../types/oooRequest.js"; +import { UpdateRequest } from "../types/requests.js"; +import logger from "../utils/logger.js"; /** * Controller to handle the creation of OOO requests. diff --git a/controllers/profileDiffs.js b/controllers/profileDiffs.js index e1a9a09a9..431f51c0a 100644 --- a/controllers/profileDiffs.js +++ b/controllers/profileDiffs.js @@ -1,5 +1,6 @@ -const profileDiffsQuery = require("../models/profileDiffs"); -const { SOMETHING_WENT_WRONG } = require("../constants/errorMessages"); +import profileDiffsQuery from "../models/profileDiffs.js"; +import { SOMETHING_WENT_WRONG } from "../constants/errorMessages.js"; +import logger from "../utils/logger.js"; /** * Fetches the pending profile diffs @@ -56,7 +57,4 @@ const getProfileDiff = async (req, res) => { } }; -module.exports = { - getProfileDiffs, - getProfileDiff, -}; +export { getProfileDiffs, getProfileDiff }; diff --git a/controllers/progresses.js b/controllers/progresses.js index 5a0e8f84b..8aa2b56dc 100644 --- a/controllers/progresses.js +++ b/controllers/progresses.js @@ -1,14 +1,13 @@ -const { Conflict, NotFound } = require("http-errors"); -const progressesModel = require("../models/progresses"); -const { - PROGRESSES_RESPONSE_MESSAGES, +import httpError from "http-errors"; +import * as progressesModel from "../models/progresses.js"; +import { INTERNAL_SERVER_ERROR_MESSAGE, - PROGRESSES_SIZE, PROGRESSES_PAGE_SIZE, + PROGRESSES_SIZE, UNAUTHORIZED_WRITE, -} = require("../constants/progresses"); -const { sendTaskUpdate } = require("../utils/sendTaskUpdate"); -const { PROGRESS_DOCUMENT_RETRIEVAL_SUCCEEDED, PROGRESS_DOCUMENT_CREATED_SUCCEEDED } = PROGRESSES_RESPONSE_MESSAGES; +} from "../constants/progresses.js"; +import { sendTaskUpdate } from "../utils/sendTaskUpdate.js"; +import logger from "../utils/logger.js"; /** * @typedef {Object} ProgressRequestBody @@ -45,7 +44,7 @@ const { PROGRESS_DOCUMENT_RETRIEVAL_SUCCEEDED, PROGRESS_DOCUMENT_CREATED_SUCCEED * @returns {Promise} A Promise that resolves when the response is sent. */ -const createProgress = async (req, res) => { +export const createProgress = async (req, res) => { if (req.userData.roles.archived) { return res.boom.forbidden(UNAUTHORIZED_WRITE); } @@ -58,14 +57,14 @@ const createProgress = async (req, res) => { await sendTaskUpdate(completed, blockers, planned, req.userData.username, taskId, taskTitle); return res.status(201).json({ data, - message: `${type.charAt(0).toUpperCase() + type.slice(1)} ${PROGRESS_DOCUMENT_CREATED_SUCCEEDED}`, + message: `${type.charAt(0).toUpperCase() + type.slice(1)} ${progressesModel.PROGRESS_DOCUMENT_CREATED_SUCCEEDED}`, }); } catch (error) { - if (error instanceof Conflict) { + if (error instanceof httpError.Conflict) { return res.status(409).json({ message: error.message, }); - } else if (error instanceof NotFound) { + } else if (error instanceof httpError.NotFound) { return res.status(404).json({ message: error.message, }); @@ -111,7 +110,7 @@ const createProgress = async (req, res) => { * @returns {Promise} A Promise that resolves when the response is sent. */ -const getProgress = async (req, res) => { +export const getProgress = async (req, res) => { const { dev, page = PROGRESSES_PAGE_SIZE, size = PROGRESSES_SIZE, type, userId, taskId } = req.query; try { if (dev === "true") { @@ -131,7 +130,7 @@ const getProgress = async (req, res) => { const nextLink = nextPage !== null ? `${baseUrl}&page=${nextPage}&size=${size}&dev=${dev}` : null; const prevLink = prevPage !== null ? `${baseUrl}&page=${prevPage}&size=${size}&dev=${dev}` : null; return res.json({ - message: PROGRESS_DOCUMENT_RETRIEVAL_SUCCEEDED, + message: progressesModel.PROGRESS_DOCUMENT_RETRIEVAL_SUCCEEDED, count: progressDocs.length, data: progressDocs, links: { @@ -142,12 +141,12 @@ const getProgress = async (req, res) => { } const data = await progressesModel.getProgressDocument(req.query); return res.json({ - message: PROGRESS_DOCUMENT_RETRIEVAL_SUCCEEDED, + message: progressesModel.PROGRESS_DOCUMENT_RETRIEVAL_SUCCEEDED, count: data.length, data, }); } catch (error) { - if (error instanceof NotFound) { + if (error instanceof httpError.NotFound) { return res.status(404).json({ message: error.message, }); @@ -193,15 +192,15 @@ const getProgress = async (req, res) => { * @returns {Promise} A Promise that resolves when the response is sent. */ -const getProgressRangeData = async (req, res) => { +export const getProgressRangeData = async (req, res) => { try { const data = await progressesModel.getRangeProgressData(req.query); return res.json({ - message: PROGRESS_DOCUMENT_RETRIEVAL_SUCCEEDED, + message: progressesModel.PROGRESS_DOCUMENT_RETRIEVAL_SUCCEEDED, data, }); } catch (error) { - if (error instanceof NotFound) { + if (error instanceof httpError.httpError.NotFound) { return res.status(404).json({ message: error.message, }); @@ -247,15 +246,15 @@ const getProgressRangeData = async (req, res) => { * @returns {Promise} A Promise that resolves when the response is sent. */ -const getProgressBydDateController = async (req, res) => { +export const getProgressBydDateController = async (req, res) => { try { const data = await progressesModel.getProgressByDate(req.params, req.query); return res.json({ - message: PROGRESS_DOCUMENT_RETRIEVAL_SUCCEEDED, + message: progressesModel.PROGRESS_DOCUMENT_RETRIEVAL_SUCCEEDED, data, }); } catch (error) { - if (error instanceof NotFound) { + if (error instanceof httpError.NotFound) { return res.status(404).json({ message: error.message, }); @@ -266,5 +265,3 @@ const getProgressBydDateController = async (req, res) => { }); } }; - -module.exports = { createProgress, getProgress, getProgressRangeData, getProgressBydDateController }; diff --git a/controllers/pullRequests.js b/controllers/pullRequests.js index 116c434cb..df344ff14 100644 --- a/controllers/pullRequests.js +++ b/controllers/pullRequests.js @@ -1,6 +1,7 @@ -const githubService = require("../services/githubService"); -const { SOMETHING_WENT_WRONG } = require("../constants/errorMessages"); -const { ORDER_TYPE } = require("../utils/pullRequests"); +import { fetchPRsByUser, extractPRdetails, fetchOpenPRs } from "../services/githubService.js"; +import { SOMETHING_WENT_WRONG } from "../constants/errorMessages.js"; +import { ORDER_TYPE } from "../utils/pullRequests.js"; +import logger from "../utils/logger.js"; /** * Collects all pull requests and sends only required data for each pull request @@ -9,12 +10,12 @@ const { ORDER_TYPE } = require("../utils/pullRequests"); * @param res {Object} - Express response object */ -const getUserPRs = async (req, res) => { +export const getUserPRs = async (req, res) => { try { - const { data } = await githubService.fetchPRsByUser(req.params.username); + const { data } = await fetchPRsByUser(req.params.username); if (data.total_count) { - const allPRs = githubService.extractPRdetails(data); + const allPRs = extractPRdetails(data); return res.json({ message: "Pull requests returned successfully!", pullRequests: allPRs, @@ -37,14 +38,14 @@ const getUserPRs = async (req, res) => { * @param {Object} res * @todo create cache for RDS usernames <> github usernames */ -const getStalePRs = async (req, res) => { +export const getStalePRs = async (req, res) => { try { const order = ORDER_TYPE.ASC; const { size, page } = req.query; - const { data } = await githubService.fetchOpenPRs({ perPage: size, page, resultOptions: { order } }); + const { data } = await fetchOpenPRs({ perPage: size, page, resultOptions: { order } }); if (data.total_count) { - const allPRs = githubService.extractPRdetails(data); + const allPRs = extractPRdetails(data); return res.json({ message: "Stale PRs", pullRequests: allPRs, @@ -67,14 +68,14 @@ const getStalePRs = async (req, res) => { * @param {Object} res * @todo create cache for RDS usernames <> github usernames */ -const getOpenPRs = async (req, res) => { +export const getOpenPRs = async (req, res) => { try { const order = ORDER_TYPE.DESC; const { size, page } = req.query; - const { data } = await githubService.fetchOpenPRs({ perPage: size, page, resultOptions: { order } }); + const { data } = await fetchOpenPRs({ perPage: size, page, resultOptions: { order } }); if (data.total_count) { - const allPRs = githubService.extractPRdetails(data); + const allPRs = extractPRdetails(data); return res.json({ message: "Open PRs", pullRequests: allPRs, @@ -89,9 +90,3 @@ const getOpenPRs = async (req, res) => { return res.boom.badImplementation(SOMETHING_WENT_WRONG); } }; - -module.exports = { - getUserPRs, - getStalePRs, - getOpenPRs, -}; diff --git a/controllers/questions.ts b/controllers/questions.ts index f0141b5a9..f7f67840b 100644 --- a/controllers/questions.ts +++ b/controllers/questions.ts @@ -1,13 +1,14 @@ -const crypto = require("crypto"); +import crypto from "crypto"; import { Request } from "express"; -import { Client, Question } from "../types/questions"; -import { CustomRequest, CustomResponse } from "../types/global"; +import { Client, Question } from "../types/questions.js"; +import { CustomRequest, CustomResponse } from "../types/global.js"; +import logger from "../utils/logger.js"; -const { HEADERS_FOR_SSE } = require("../constants/constants"); -const { INTERNAL_SERVER_ERROR } = require("../constants/errorMessages"); +import { HEADERS_FOR_SSE } from "../constants/constants.js"; +import { INTERNAL_SERVER_ERROR } from "../constants/errorMessages.js"; -const questionQuery = require("../models/questions"); +import { createQuestion as modelCreateQuestion } from "../models/questions.js"; /* Refer to limitation of this clients array here(in the limitations section of doc) - https://github.com/Real-Dev-Squad/website-www/wiki/%5BFeature%5D-%E2%80%90-Realtime-Word-Cloud-Questions-Answers-Feature*/ let clients: Client[] = []; @@ -24,7 +25,7 @@ function sendQuestionToAll(newQuestion: Question, res: CustomResponse) { const createQuestion = async (req: CustomRequest, res: CustomResponse) => { try { const questionId = crypto.randomUUID({ disableEntropyCache: true }); - const question = await questionQuery.createQuestion({ ...req.body, id: questionId }); + const question = await modelCreateQuestion({ ...req.body, id: questionId }); return sendQuestionToAll(question, res); } catch (error) { logger.error(`Error while creating question: ${error}`); @@ -60,4 +61,4 @@ const getQuestions = async (req: Request, res: CustomResponse) => { } }; -module.exports = { createQuestion, getQuestions }; +export default { createQuestion, getQuestions }; diff --git a/controllers/recruiters.js b/controllers/recruiters.js index b363b31b1..9d5a70f60 100644 --- a/controllers/recruiters.js +++ b/controllers/recruiters.js @@ -1,5 +1,5 @@ -const recruiterQuery = require("../models/recruiters"); -const { INTERNAL_SERVER_ERROR, SOMETHING_WENT_WRONG } = require("../constants/errorMessages"); +import * as recruiterQuery from "../models/recruiters.js"; +import { INTERNAL_SERVER_ERROR, SOMETHING_WENT_WRONG } from "../constants/errorMessages.js"; /** * Posts the data about the recruiter @@ -43,7 +43,7 @@ const fetchRecruitersInfo = async (req, res) => { } }; -module.exports = { +export default { addRecruiter, fetchRecruitersInfo, }; diff --git a/controllers/requests.ts b/controllers/requests.ts index fd8974ea0..b412ff22b 100644 --- a/controllers/requests.ts +++ b/controllers/requests.ts @@ -1,23 +1,23 @@ +import { Request } from "express"; import { ERROR_WHILE_FETCHING_REQUEST, REQUEST_FETCHED_SUCCESSFULLY, REQUEST_TYPE, -} from "../constants/requests"; -import { getRequests } from "../models/requests"; -import { getPaginatedLink } from "../utils/helper"; -import { createOooRequestController, updateOooRequestController } from "./oooRequests"; -import { OooRequestCreateRequest, OooRequestResponse } from "../types/oooRequest"; -import { CustomResponse } from "../typeDefinitions/global"; -import { ExtensionRequestRequest, ExtensionRequestResponse } from "../types/extensionRequests"; -import { createTaskExtensionRequest, updateTaskExtensionRequest } from "./extensionRequestsv2"; -import { UpdateRequest } from "../types/requests"; -import { TaskRequestRequest } from "../types/taskRequests"; -import { createTaskRequestController } from "./taskRequestsv2"; -import { OnboardingExtensionCreateRequest, OnboardingExtensionResponse, UpdateOnboardingExtensionStateRequest } from "../types/onboardingExtension"; -import { createOnboardingExtensionRequestController, updateOnboardingExtensionRequestController, updateOnboardingExtensionRequestState } from "./onboardingExtension"; -import { UpdateOnboardingExtensionRequest } from "../types/onboardingExtension"; - -import { Request } from "express"; +} from "../constants/requests.js"; +import { getRequests } from "../models/requests.js"; +import { getPaginatedLink } from "../utils/helper.js"; +import { createOooRequestController, updateOooRequestController } from "./oooRequests.js"; +import { OooRequestCreateRequest, OooRequestResponse } from "../types/oooRequest.js"; +import { CustomResponse } from "../typeDefinitions/global.js"; +import { ExtensionRequestRequest, ExtensionRequestResponse } from "../types/extensionRequests.js"; +import { createTaskExtensionRequest, updateTaskExtensionRequest } from "./extensionRequestsv2.js"; +import { UpdateRequest } from "../types/requests.js"; +import { TaskRequestRequest } from "../types/taskRequests.js"; +import { createTaskRequestController } from "./taskRequestsv2.js"; +import { OnboardingExtensionCreateRequest, OnboardingExtensionResponse, UpdateOnboardingExtensionStateRequest } from "../types/onboardingExtension.js"; +import { createOnboardingExtensionRequestController, updateOnboardingExtensionRequestController, updateOnboardingExtensionRequestState } from "./onboardingExtension.js"; +import { UpdateOnboardingExtensionRequest } from "../types/onboardingExtension.js"; +import logger from "../utils/logger.js"; export const createRequestController = async ( req: OooRequestCreateRequest | ExtensionRequestRequest | TaskRequestRequest | OnboardingExtensionCreateRequest, @@ -116,7 +116,7 @@ export const getRequestsController = async (req: any, res: any) => { /** * Processes update requests before acknowledgment based on type. - * + * * @param {Request} req - The request object. * @param {CustomResponse} res - The response object. * @returns {Promise} Resolves or sends an error for invalid types. @@ -130,4 +130,4 @@ export const updateRequestBeforeAcknowledgedController = async (req: Request, re default: return res.boom.badRequest("Invalid request"); } -} \ No newline at end of file +} diff --git a/controllers/staging.js b/controllers/staging.js index f87b5f896..9a5841dd8 100644 --- a/controllers/staging.js +++ b/controllers/staging.js @@ -1,4 +1,4 @@ -const { addOrUpdate, getUsersByRole } = require("../models/users"); +import * as usersModel from "../models/users.js"; const updateRoles = async (req, res) => { try { @@ -9,7 +9,7 @@ const updateRoles = async (req, res) => { }); } const userId = req.userData.id; - await addOrUpdate( + await usersModel.addOrUpdate( { roles: { ...userData.roles, @@ -38,12 +38,12 @@ const removePrivileges = async (req, res) => { } try { const updateUserPromises = []; - const members = await getUsersByRole("member"); - const superUsers = await getUsersByRole("super_user"); + const members = await usersModel.getUsersByRole("member"); + const superUsers = await usersModel.getUsersByRole("super_user"); members.forEach((member) => { updateUserPromises.push( - addOrUpdate( + usersModel.addOrUpdate( { roles: { ...member.roles, @@ -57,7 +57,7 @@ const removePrivileges = async (req, res) => { }); superUsers.forEach((superUser) => { updateUserPromises.push( - addOrUpdate( + usersModel.addOrUpdate( { roles: { ...superUser.roles, @@ -83,7 +83,4 @@ const removePrivileges = async (req, res) => { } }; -module.exports = { - updateRoles, - removePrivileges, -}; +export { updateRoles, removePrivileges }; diff --git a/controllers/stocks.js b/controllers/stocks.js index 5913af001..ff719e38e 100644 --- a/controllers/stocks.js +++ b/controllers/stocks.js @@ -1,5 +1,7 @@ -const stocks = require("../models/stocks"); -const { INTERNAL_SERVER_ERROR } = require("../constants/errorMessages"); +import { addStock, fetchStocks as fetchStockModel, fetchUserStocks } from "../models/stocks.js"; +import { INTERNAL_SERVER_ERROR } from "../constants/errorMessages.js"; +import logger from "../utils/logger.js"; + /** * Creates new stock * @@ -9,7 +11,7 @@ const { INTERNAL_SERVER_ERROR } = require("../constants/errorMessages"); */ const addNewStock = async (req, res) => { try { - const { id, stockData } = await stocks.addStock(req.body); + const { id, stockData } = await addStock(req.body); return res.json({ message: "Stock created successfully!", stock: stockData, @@ -20,6 +22,7 @@ const addNewStock = async (req, res) => { return res.boom.badImplementation(INTERNAL_SERVER_ERROR); } }; + /** * Fetches all the stocks * @@ -28,7 +31,7 @@ const addNewStock = async (req, res) => { */ const fetchStocks = async (req, res) => { try { - const allStock = await stocks.fetchStocks(); + const allStock = await fetchStockModel(); return res.json({ message: allStock.length > 0 ? "Stocks returned successfully!" : "No stocks found", stock: allStock.length > 0 ? allStock : [], @@ -38,6 +41,7 @@ const fetchStocks = async (req, res) => { return res.boom.badImplementation(INTERNAL_SERVER_ERROR); } }; + /** * Fetches all the stocks of the user * @@ -54,7 +58,7 @@ const fetchStocks = async (req, res) => { const getSelfStocks = async (req, res) => { try { const { id: userId } = req.userData; - const userStocks = await stocks.fetchUserStocks(userId); + const userStocks = await fetchUserStocks(userId); res.set( "X-Deprecation-Warning", @@ -78,7 +82,7 @@ const getSelfStocks = async (req, res) => { */ const getUserStocks = async (req, res) => { try { - const userStocks = await stocks.fetchUserStocks(req.params.userId); + const userStocks = await fetchUserStocks(req.params.userId); return res.json({ message: userStocks.length > 0 ? "User stocks returned successfully!" : "No stocks found", @@ -90,9 +94,4 @@ const getUserStocks = async (req, res) => { } }; -module.exports = { - addNewStock, - fetchStocks, - getSelfStocks, - getUserStocks, -}; +export { addNewStock, fetchStocks, getSelfStocks, getUserStocks }; diff --git a/controllers/subscription.ts b/controllers/subscription.ts index 1212de47e..8c9118723 100644 --- a/controllers/subscription.ts +++ b/controllers/subscription.ts @@ -1,21 +1,23 @@ -import { CustomRequest, CustomResponse } from "../types/global"; -const { addOrUpdate } = require("../models/users"); -const { INTERNAL_SERVER_ERROR } = require("../constants/errorMessages"); -const nodemailer = require("nodemailer"); -const config = require("config"); +import config from "config"; +import nodemailer from "nodemailer"; +import { CustomRequest, CustomResponse } from "../types/global.js"; +import logger from "../utils/logger.js"; +import { addOrUpdate } from "../models/users.js"; +import { INTERNAL_SERVER_ERROR } from "../constants/errorMessages.js"; + const emailServiceConfig = config.get("emailServiceConfig"); export const subscribe = async (req: CustomRequest, res: CustomResponse) => { - const { email } = req.body; - const phone = req.body.phone || null; - const userId = req.userData.id; - const data = { email, isSubscribed: true, phone }; - const userAlreadySubscribed = req.userData.isSubscribed; + const { email } = req.body; + const phone = req.body.phone || null; + const userId = req.userData.id; + const data = { email, isSubscribed: true, phone }; + const userAlreadySubscribed = req.userData.isSubscribed; try { if (userAlreadySubscribed) { return res.boom.badRequest("User already subscribed"); } - await addOrUpdate(data, userId); + await addOrUpdate(data, userId, false); return res.status(201).json("User subscribed successfully"); } catch (error) { logger.error(`Error occurred while subscribing: ${error.message}`); @@ -24,8 +26,8 @@ export const subscribe = async (req: CustomRequest, res: CustomResponse) => { }; export const unsubscribe = async (req: CustomRequest, res: CustomResponse) => { - const userId = req.userData.id; - const userAlreadySubscribed = req.userData.isSubscribed; + const userId = req.userData.id; + const userAlreadySubscribed = req.userData.isSubscribed; try { if (!userAlreadySubscribed) { return res.boom.badRequest("User is already unsubscribed"); @@ -34,7 +36,8 @@ export const unsubscribe = async (req: CustomRequest, res: CustomResponse) => { { isSubscribed: false, }, - userId + userId, + false ); return res.status(200).json("User unsubscribed successfully"); } catch (error) { @@ -46,19 +49,24 @@ export const unsubscribe = async (req: CustomRequest, res: CustomResponse) => { // TODO: currently we are sending test email to a user only (i.e., Tejas sir as decided) // later we need to make service which send email to all subscribed user export const sendEmail = async (req: CustomRequest, res: CustomResponse) => { - try { + try { const transporter = nodemailer.createTransport({ + // @ts-ignore host: emailServiceConfig.host, - port: emailServiceConfig.port, + // @ts-ignore + port: emailServiceConfig.port, secure: false, auth: { + // @ts-ignore user: emailServiceConfig.email, + // @ts-ignore pass: emailServiceConfig.password, }, }); const info = await transporter.sendMail({ + // @ts-ignore from: `"Real Dev Squad" <${emailServiceConfig.email}>`, to: "tejasatrds@gmail.com", subject: "Hello local, Testing in progress.", diff --git a/controllers/tags.js b/controllers/tags.js index 738c9b7b4..69d01e349 100644 --- a/controllers/tags.js +++ b/controllers/tags.js @@ -1,6 +1,7 @@ -const TagModel = require("../models/tags"); -const admin = require("firebase-admin"); -const { INTERNAL_SERVER_ERROR } = require("../constants/errorMessages"); +import * as TagModel from "../models/tags.js"; +import admin from "firebase-admin"; + +import { INTERNAL_SERVER_ERROR } from "../constants/errorMessages.js"; /** * Creates a new tag @@ -86,9 +87,4 @@ const getTagsByType = async (req, res) => { } }; -module.exports = { - addTag, - deleteTag, - getAllTags, - getTagsByType, -}; +export { addTag, deleteTag, getAllTags, getTagsByType }; diff --git a/controllers/taskRequestsv2.ts b/controllers/taskRequestsv2.ts index 327c56bc1..75a5a8fe0 100644 --- a/controllers/taskRequestsv2.ts +++ b/controllers/taskRequestsv2.ts @@ -1,13 +1,14 @@ -import { REQUEST_STATE, TASK_REQUEST_MESSAGES } from "../constants/requests"; -import { TASK_REQUEST_TYPE } from "../constants/taskRequests"; -import { addLog } from "../models/logs"; -import { createRequest, getRequestByKeyValues } from "../models/requests"; -import { fetchTask } from "../models/tasks"; -import { fetchUser } from "../models/users"; -import { fetchIssuesById } from "../services/githubService"; -import { CustomResponse } from "../typeDefinitions/global"; -import { userData } from "../types/global"; -import { TaskRequestRequest } from "../types/taskRequests"; +import { REQUEST_STATE, TASK_REQUEST_MESSAGES } from "../constants/requests.js"; +import { TASK_REQUEST_TYPE } from "../constants/taskRequests.js"; +import { addLog } from "../models/logs.js"; +import { createRequest, getRequestByKeyValues } from "../models/requests.js"; +import taskModel from "../models/tasks.js"; +import { fetchUser } from "../models/users.js"; +import { fetchIssuesById } from "../services/githubService.js"; +import { CustomResponse } from "../typeDefinitions/global.js"; +import { userData } from "../types/global.js"; +import { TaskRequestRequest } from "../types/taskRequests.js"; +import logger from "../utils/logger.js"; export const createTaskRequestController = async (req: TaskRequestRequest, res: CustomResponse) => { const taskRequestData = req.body; @@ -32,7 +33,7 @@ export const createTaskRequestController = async (req: TaskRequestRequest, res: if (!req.userData.roles?.super_user) { return res.boom.unauthorized(TASK_REQUEST_MESSAGES.NOT_AUTHORIZED_TO_CREATE_REQUEST); } - const { taskData } = await fetchTask(taskRequestData.taskId); + const { taskData } = await taskModel.fetchTask(taskRequestData.taskId); if (!taskData) { return res.boom.badRequest(TASK_REQUEST_MESSAGES.TASK_NOT_EXIST); } diff --git a/controllers/tasks.js b/controllers/tasks.js index 39ef4a3d2..6376cf7bf 100644 --- a/controllers/tasks.js +++ b/controllers/tasks.js @@ -1,22 +1,18 @@ -const tasks = require("../models/tasks"); -const { TASK_STATUS, TASK_STATUS_OLD, tasksUsersStatus } = require("../constants/tasks"); -const { addLog } = require("../models/logs"); -const { USER_STATUS } = require("../constants/users"); -const { addOrUpdate, getRdsUserInfoByGitHubUsername } = require("../models/users"); -const { OLD_ACTIVE, OLD_BLOCKED, OLD_PENDING } = TASK_STATUS_OLD; -const { IN_PROGRESS, BLOCKED, SMOKE_TESTING, ASSIGNED } = TASK_STATUS; -const { INTERNAL_SERVER_ERROR, SOMETHING_WENT_WRONG } = require("../constants/errorMessages"); -const dependencyModel = require("../models/tasks"); -const { transformQuery, transformTasksUsersQuery } = require("../utils/tasks"); -const { getPaginatedLink } = require("../utils/helper"); -const { updateUserStatusOnTaskUpdate, updateStatusOnTaskCompletion } = require("../models/userStatus"); -const dataAccess = require("../services/dataAccessLayer"); -const { parseSearchQuery } = require("../utils/tasks"); -const { addTaskCreatedAtAndUpdatedAtFields } = require("../services/tasks"); -const tasksService = require("../services/tasks"); -const { RQLQueryParser } = require("../utils/RQLParser"); -const { getMissedProgressUpdatesUsers } = require("../models/discordactions"); -const { logType } = require("../constants/logs"); +import { INTERNAL_SERVER_ERROR, SOMETHING_WENT_WRONG } from "../constants/errorMessages.js"; +import { logType } from "../constants/logs.js"; +import { TASK_STATUS, tasksUsersStatus } from "../constants/tasks.js"; +import { USER_STATUS } from "../constants/users.js"; +import { getMissedProgressUpdatesUsers } from "../models/discordactions.js"; +import { addLog } from "../models/logs.js"; +import * as tasksModel from "../models/tasks.js"; +import { addOrUpdate, getRdsUserInfoByGitHubUsername } from "../models/users.js"; +import { updateStatusOnTaskCompletion, updateUserStatusOnTaskUpdate } from "../models/userStatus.js"; +import { retrieveUsers } from "../services/dataAccessLayer.js"; +import { addTaskCreatedAtAndUpdatedAtFields, fetchOrphanedTasks } from "../services/tasks.js"; +import { getPaginatedLink } from "../utils/helper.js"; +import logger from "../utils/logger.js"; +import { RQLQueryParser } from "../utils/RQLParser.js"; +import { parseSearchQuery, transformQuery, transformTasksUsersQuery } from "../utils/tasks.js"; /** * Creates new task @@ -38,12 +34,12 @@ const addNewTask = async (req, res) => { updatedAt: timeStamp, }; delete body.dependsOn; - const { taskId, taskDetails } = await tasks.updateTask(body); + const { taskId, taskDetails } = await tasksModel.updateTask(body); const data = { taskId, dependsOn, }; - const taskDependency = dependsOn && (await dependencyModel.addDependency(data)); + const taskDependency = dependsOn && (await tasksModel.addDependency(data)); if (req.body.assignee) { userStatusUpdate = await updateUserStatusOnTaskUpdate(req.body.assignee); } @@ -61,6 +57,7 @@ const addNewTask = async (req, res) => { return res.boom.badImplementation(INTERNAL_SERVER_ERROR); } }; + /** * Fetches all the tasks * @@ -96,7 +93,7 @@ const fetchTasksWithRdsAssigneeInfo = async (allTasks) => { const fetchPaginatedTasks = async (query) => { try { - const tasksData = await tasks.fetchPaginatedTasks(query); + const tasksData = await tasksModel.fetchPaginatedTasks(query); const { allTasks, next, prev } = tasksData; const tasksWithRdsAssigneeInfo = await fetchTasksWithRdsAssigneeInfo(allTasks); @@ -158,7 +155,7 @@ const fetchTasks = async (req, res) => { tasks: [], }); } - const filterTasks = await tasks.fetchTasks(searchParams.searchTerm); + const filterTasks = await tasksModel.fetchTasks(searchParams.searchTerm); const tasksWithRdsAssigneeInfo = await fetchTasksWithRdsAssigneeInfo(filterTasks); if (tasksWithRdsAssigneeInfo.length === 0) { return res.status(404).json({ @@ -179,7 +176,7 @@ const fetchTasks = async (req, res) => { return res.boom.notFound("Route not found"); } try { - const orphanedTasks = await tasksService.fetchOrphanedTasks(); + const orphanedTasks = await fetchOrphanedTasks(); if (!orphanedTasks || orphanedTasks.length === 0) { return res.sendStatus(204); } @@ -222,13 +219,20 @@ const getUserTasks = async (req, res) => { } if (status) { - if (status === OLD_ACTIVE) { - status = [OLD_ACTIVE, OLD_BLOCKED, OLD_PENDING, IN_PROGRESS, BLOCKED, SMOKE_TESTING]; + if (status === TASK_STATUS.ACTIVE) { + status = [ + TASK_STATUS.ACTIVE, + TASK_STATUS.BLOCKED, + TASK_STATUS.PENDING, + TASK_STATUS.IN_PROGRESS, + TASK_STATUS.BLOCKED, + TASK_STATUS.SMOKE_TESTING, + ]; } else { status = [status]; } } - allTasks = await tasks.fetchUserTasks(username, status || []); + allTasks = await tasksModel.fetchUserTasks(username, status || []); if (allTasks.userNotFound) { return res.boom.notFound("User doesn't exist"); @@ -269,8 +273,8 @@ const getSelfTasks = async (req, res) => { } const tasksData = req.query.completed - ? await tasks.fetchUserCompletedTasks(username) - : await tasks.fetchSelfTasks(username); + ? await tasksModel.fetchUserCompletedTasks(username) + : await tasksModel.fetchSelfTasks(username); res.set( "X-Deprecation-Warning", @@ -286,7 +290,7 @@ const getSelfTasks = async (req, res) => { const getTask = async (req, res) => { try { const taskId = req.params.id; - const { taskData, dependencyDocReference } = await tasks.fetchTask(taskId); + const { taskData, dependencyDocReference } = await tasksModel.fetchTask(taskId); if (!taskData) { return res.boom.notFound("Task not found"); } @@ -306,13 +310,13 @@ const getTask = async (req, res) => { */ const updateTask = async (req, res) => { try { - const task = await tasks.fetchTask(req.params.id); + const task = await tasksModel.fetchTask(req.params.id); if (!task.taskData) { return res.boom.notFound("Task not found"); } const requestData = { ...req.body, updatedAt: Math.round(Date.now() / 1000) }; if (requestData?.assignee) { - const user = await dataAccess.retrieveUsers({ username: requestData.assignee }); + const user = await retrieveUsers({ username: requestData.assignee }); if (!user.userExists) { return res.boom.notFound("User doesn't exist"); } @@ -321,7 +325,7 @@ const updateTask = async (req, res) => { } } - await tasks.updateTask(requestData, req.params.id); + await tasksModel.updateTask(requestData, req.params.id); if (requestData.assignee) { // New Assignee Status Update await updateUserStatusOnTaskUpdate(requestData.assignee); @@ -356,7 +360,7 @@ const updateTaskStatus = async (req, res, next) => { const { userStatusFlag } = req.query; const status = req.body?.status; const { id: userId, username } = req.userData; - const task = await tasks.fetchSelfTask(taskId, userId); + const task = await tasksModel.fetchSelfTask(taskId, userId); if (task.taskNotFound) return res.boom.notFound("Task doesn't exist"); if (task.notAssignedToYou) return res.boom.forbidden("This task is not assigned to you"); @@ -441,7 +445,7 @@ const updateTaskStatus = async (req, res, next) => { } const [, taskLogResult] = await Promise.all([ - tasks.updateTask(req.body, taskId), + tasksModel.updateTask(req.body, taskId), addLog(taskLog.type, taskLog.meta, taskLog.body), ]); taskLog.id = taskLogResult.id; @@ -468,12 +472,12 @@ const updateTaskStatus = async (req, res, next) => { */ const overdueTasks = async (req, res) => { try { - const allTasks = await tasks.fetchTasks(); + const allTasks = await tasksModel.fetchTasks(); const now = Math.floor(Date.now() / 1000); const overDueTasks = allTasks.filter( - (task) => (task.status === ASSIGNED || task.status === IN_PROGRESS) && task.endsOn < now + (task) => (task.status === TASK_STATUS.ASSIGNED || task.status === TASK_STATUS.IN_PROGRESS) && task.endsOn < now ); - const newAvailableTasks = await tasks.overdueTasks(overDueTasks); + const newAvailableTasks = await tasksModel.overdueTasks(overDueTasks); return res.json({ message: newAvailableTasks.length ? "Overdue Tasks returned successfully!" : "No overdue tasks found", newAvailableTasks, @@ -492,10 +496,10 @@ const assignTask = async (req, res) => { return res.json({ message: "Task cannot be assigned to users with active or OOO status" }); } - const { task } = await tasks.fetchSkillLevelTask(userId); + const { task } = await tasksModel.fetchSkillLevelTask(userId); if (!task) return res.json({ message: "Task not found" }); - const { taskId } = await tasks.updateTask({ assignee: username, status: TASK_STATUS.ASSIGNED }, task.itemId); + const { taskId } = await tasksModel.updateTask({ assignee: username, status: TASK_STATUS.ASSIGNED }, task.itemId); if (taskId) { // this will change once we start storing status in different collection await addOrUpdate({ status: "active" }, userId); @@ -513,7 +517,7 @@ const updateStatus = async (req, res) => { const updateStats = await addTaskCreatedAtAndUpdatedAtFields(); return res.json(updateStats); } - const response = await tasks.updateTaskStatus(); + const response = await tasksModel.updateTaskStatus(); return res.status(200).json(response); } catch (error) { logger.error("Error in migration scripts", error); @@ -523,7 +527,7 @@ const updateStatus = async (req, res) => { const orphanTasks = async (req, res) => { try { - const updatedTasksData = await tasks.updateOrphanTasksStatus(); + const updatedTasksData = await tasksModel.updateOrphanTasksStatus(); return res.status(200).json({ message: "Orphan tasks filtered successfully", updatedTasksData }); } catch (error) { @@ -579,17 +583,17 @@ const getUsersHandler = async (req, res) => { } }; -module.exports = { +export { addNewTask, + assignTask, fetchTasks, - updateTask, getSelfTasks, - getUserTasks, getTask, - updateTaskStatus, - overdueTasks, - assignTask, - updateStatus, getUsersHandler, + getUserTasks, orphanTasks, + overdueTasks, + updateStatus, + updateTask, + updateTaskStatus, }; diff --git a/controllers/tasksRequests.js b/controllers/tasksRequests.js index 1b4487334..2e90ceadb 100644 --- a/controllers/tasksRequests.js +++ b/controllers/tasksRequests.js @@ -1,11 +1,12 @@ -const { INTERNAL_SERVER_ERROR, SOMETHING_WENT_WRONG } = require("../constants/errorMessages"); -const { TASK_REQUEST_TYPE, MIGRATION_TYPE, TASK_REQUEST_ACTIONS } = require("../constants/taskRequests"); -const { addLog } = require("../models/logs"); -const taskRequestsModel = require("../models/taskRequests"); -const tasksModel = require("../models/tasks.js"); -const { updateUserStatusOnTaskUpdate } = require("../models/userStatus"); -const githubService = require("../services/githubService"); -const usersUtils = require("../utils/users"); +import { INTERNAL_SERVER_ERROR, SOMETHING_WENT_WRONG } from "../constants/errorMessages.js"; +import { TASK_REQUEST_TYPE, MIGRATION_TYPE, TASK_REQUEST_ACTIONS } from "../constants/taskRequests.js"; +import { addLog } from "../models/logs.js"; +import taskRequestsModel from "../models/taskRequests.js"; +import tasksModel from "../models/tasks.js"; +import { updateUserStatusOnTaskUpdate } from "../models/userStatus.js"; +import { fetchIssuesById } from "../services/githubService.js"; +import { getUsername } from "../utils/users.js"; +import logger from "../utils/logger.js"; const fetchTaskRequests = async (_, res) => { try { @@ -47,7 +48,7 @@ const fetchTaskRequestById = async (req, res) => { const addTaskRequests = async (req, res) => { try { const taskRequestData = req.body; - const usernamePromise = usersUtils.getUsername(taskRequestData.userId); + const usernamePromise = getUsername(taskRequestData.userId); if (req.userData.id !== taskRequestData.userId && !req.userData.roles?.super_user) { return res.boom.forbidden("Not authorized to create the request"); } @@ -75,7 +76,7 @@ const addTaskRequests = async (req, res) => { const issueUrlPaths = url.pathname.split("/"); const repositoryName = issueUrlPaths[3]; const issueNumber = issueUrlPaths[5]; - issuePromise = githubService.fetchIssuesById(repositoryName, issueNumber); + issuePromise = fetchIssuesById(repositoryName, issueNumber); } catch (error) { return res.boom.badRequest("External issue url is not valid"); } @@ -248,11 +249,12 @@ const migrateTaskRequests = async (req, res) => { } return res.json({ message: "Task requests migration successful", ...responseData }); } catch (err) { - logger.error("Error in migration scripts", err); + logger.error("Error while migrating task requests", err); return res.boom.badImplementation(INTERNAL_SERVER_ERROR); } }; -module.exports = { + +export { updateTaskRequests, addOrUpdate, fetchTaskRequests, diff --git a/controllers/trading.js b/controllers/trading.js index 0ba09f8f4..1ec900aec 100644 --- a/controllers/trading.js +++ b/controllers/trading.js @@ -1,5 +1,7 @@ -const tradeService = require("../services/tradingService"); -const { INTERNAL_SERVER_ERROR } = require("../constants/errorMessages"); +import { trade as tradeService } from "../services/tradingService.js"; +import { INTERNAL_SERVER_ERROR } from "../constants/errorMessages.js"; +import logger from "../utils/logger.js"; + /** * New Trading Request * @@ -14,7 +16,7 @@ const trade = async (req, res) => { username, userId, }; - const { canUserTrade, errorMessage, userBalance } = await tradeService.trade(tradeStockData); + const { canUserTrade, errorMessage, userBalance } = await tradeService(tradeStockData); if (!canUserTrade) { return res.boom.forbidden(errorMessage); @@ -26,6 +28,4 @@ const trade = async (req, res) => { } }; -module.exports = { - trade, -}; +export { trade }; diff --git a/controllers/userStatus.js b/controllers/userStatus.js index 60320f3c0..08682e394 100644 --- a/controllers/userStatus.js +++ b/controllers/userStatus.js @@ -1,11 +1,22 @@ -const { Forbidden, NotFound } = require("http-errors"); -const { getUserIdBasedOnRoute } = require("../utils/userStatus"); -const { INTERNAL_SERVER_ERROR } = require("../constants/errorMessages"); -const dataAccess = require("../services/dataAccessLayer"); -const userStatusModel = require("../models/userStatus"); -const { userState, CANCEL_OOO } = require("../constants/userStatus"); -const ROLES = require("../constants/roles"); -const firestore = require("../utils/firestore"); +import httpError from "http-errors"; +import { getUserIdBasedOnRoute } from "../utils/userStatus.js"; +import { INTERNAL_SERVER_ERROR } from "../constants/errorMessages.js"; +import { retrieveUsers } from "../services/dataAccessLayer.js"; +import { + deleteUserStatus as deleteUserStatusModel, + getUserStatus as getUserStatusModel, + getAllUserStatus as getAllUserStatusModel, + updateUserStatus as updateUserStatusModel, + updateAllUserStatus as updateAllUserStatusModel, + getTaskBasedUsersStatus as getTaskBasedUsersStatusModel, + batchUpdateUsersStatus as batchUpdateUsersStatusModel, + cancelOooStatus as cancelOooStatusModel, +} from "../models/userStatus.js"; +import { userState, CANCEL_OOO } from "../constants/userStatus.js"; +import { ROLES } from "../constants/roles.js"; +import firestore from "../utils/firestore.js"; +import logger from "../utils/logger.js"; + const usersCollection = firestore.collection("users"); /** @@ -19,7 +30,7 @@ const usersCollection = firestore.collection("users"); const deleteUserStatus = async (req, res) => { try { const { userId } = req.params; - const deletedUserStatus = await userStatusModel.deleteUserStatus(userId); + const deletedUserStatus = await deleteUserStatusModel(userId); const responseObj = { id: deletedUserStatus.id, userId }; let statusCode; if (deletedUserStatus.userStatusExisted) { @@ -46,7 +57,7 @@ const getUserStatus = async (req, res) => { try { const userId = getUserIdBasedOnRoute(req); if (userId) { - const userData = await userStatusModel.getUserStatus(userId); + const userData = await getUserStatusModel(userId); const { userStatusExists, id, data } = userData; const responseObject = { id, userId, data: null, message: "" }; if (data) responseObject.data = data; @@ -75,12 +86,12 @@ const getUserStatus = async (req, res) => { */ const getAllUserStatus = async (req, res) => { try { - const { allUserStatus } = await userStatusModel.getAllUserStatus(req.query); + const { allUserStatus } = await getAllUserStatusModel(req.query); const activeUsers = []; if (allUserStatus) { const allUsersStatusFetchPromises = allUserStatus.map(async (status) => { // fetching users from users collection with the help of userID in userStatus collection - const result = await dataAccess.retrieveUsers({ id: status.userId }); + const result = await retrieveUsers({ id: status.userId }); if (!result.user?.roles?.archived) { status.full_name = `${result.user.first_name} ${result.user.last_name}`; status.picture = result.user.picture; @@ -117,7 +128,7 @@ const updateUserStatus = async (req, res) => { if (userId) { const dataToUpdate = req.body; - const updateStatus = await userStatusModel.updateUserStatus(userId, dataToUpdate); + const updateStatus = await updateUserStatusModel(userId, dataToUpdate); const { userStatusExists, id, data } = updateStatus; const responseObject = { id, userId, data: null, message: "" }; let statusCode; @@ -146,7 +157,7 @@ const updateUserStatus = async (req, res) => { */ const updateAllUserStatus = async (req, res) => { try { - const data = await userStatusModel.updateAllUserStatus(); + const data = await updateAllUserStatusModel(); return res.status(200).json({ message: "All User Status updated successfully.", data, @@ -165,7 +176,7 @@ const updateAllUserStatus = async (req, res) => { const getTaskBasedUsersStatus = async (req, res) => { try { - const data = await userStatusModel.getTaskBasedUsersStatus(); + const data = await getTaskBasedUsersStatusModel(); return res.json({ message: "All users based on tasks found successfully.", data, @@ -194,7 +205,7 @@ const getUserStatusControllers = async (req, res, next) => { */ const batchUpdateUsersStatus = async (req, res) => { try { - const data = await userStatusModel.batchUpdateUsersStatus(req.body.users); + const data = await batchUpdateUsersStatusModel(req.body.users); return res.json({ message: "users status updated successfully.", data, @@ -210,20 +221,20 @@ const batchUpdateUsersStatus = async (req, res) => { const cancelOOOStatus = async (req, res) => { const userId = req.userData.id; try { - const responseObject = await userStatusModel.cancelOooStatus(userId); + const responseObject = await cancelOooStatusModel(userId); return res.status(200).json(responseObject); } catch (error) { logger.error(`Error while cancelling the ${userState.OOO} Status : ${error}`); - if (error instanceof Forbidden) { + if (error instanceof httpError.Forbidden) { return res.status(403).json({ statusCode: 403, - error: "Forbidden", + error: "httpErrpr.Forbidden", message: error.message, }); - } else if (error instanceof NotFound) { + } else if (error instanceof httpError.NotFound) { return res.status(404).json({ statusCode: 404, - error: "NotFound", + error: "httpErrpr.NotFound", message: error.message, }); } @@ -268,7 +279,7 @@ const updateUserStatuses = async (req, res, next) => { } }; -module.exports = { +export { deleteUserStatus, getUserStatus, getAllUserStatus, diff --git a/controllers/users.js b/controllers/users.js index 6cbebe7b4..38d278e28 100644 --- a/controllers/users.js +++ b/controllers/users.js @@ -1,40 +1,62 @@ -const chaincodeQuery = require("../models/chaincodes"); -const userQuery = require("../models/users"); -const profileDiffsQuery = require("../models/profileDiffs"); -const firestore = require("../utils/firestore"); -const memberRoleModel = firestore.collection("member-group-roles"); -const logsModel = firestore.collection("logs"); -const admin = require("firebase-admin"); -const logsQuery = require("../models/logs"); -const imageService = require("../services/imageService"); -const { profileDiffStatus } = require("../constants/profileDiff"); -const { logType } = require("../constants/logs"); -const ROLES = require("../constants/roles"); -const dataAccess = require("../services/dataAccessLayer"); -const { isLastPRMergedWithinDays } = require("../services/githubService"); -const logger = require("../utils/logger"); -const { SOMETHING_WENT_WRONG, INTERNAL_SERVER_ERROR } = require("../constants/errorMessages"); -const { OVERDUE_TASKS } = require("../constants/users"); -const { getPaginationLink, getUsernamesFromPRs, getRoleToUpdate } = require("../utils/users"); -const { setInDiscordFalseScript, setUserDiscordNickname } = require("../services/discordService"); -const { generateDiscordProfileImageUrl } = require("../utils/discord-actions"); -const { addRoleToUser, getDiscordMembers } = require("../services/discordService"); -const { fetchAllUsers } = require("../models/users"); -const { getOverdueTasks } = require("../models/tasks"); -const { getQualifiers } = require("../utils/helper"); -const { parseSearchQuery } = require("../utils/users"); -const { getFilteredPRsOrIssues } = require("../utils/pullRequests"); -const { getFilteredPaginationLink } = require("../utils/userStatus"); -const { +import config from "config"; +import admin from "firebase-admin"; + +import { USERS_PATCH_HANDLER_ACTIONS, USERS_PATCH_HANDLER_ERROR_MESSAGES, USERS_PATCH_HANDLER_SUCCESS_MESSAGES, -} = require("../constants/users"); -const { addLog } = require("../models/logs"); -const { getUserStatus } = require("../models/userStatus"); -const config = require("config"); -const { generateUniqueUsername } = require("../services/users"); -const userService = require("../services/users"); + OVERDUE_TASKS, +} from "../constants/users.js"; +import logger from "../utils/logger.js"; +import { storeChaincode } from "../models/chaincodes.js"; +import { + fetchAllUsers, + fetchUserSkills, + addOrUpdate, + getSuggestedUsers as getSuggestedUsersModel, + setIncompleteUserDetails, + initializeUser, + addForVerification, + markAsVerified, + getUserImageForVerification as getUserImageForVerificationModel, + getJoinData, + addJoinData, + archiveUserIfNotInDiscord as archiveUserIfNotInDiscordModel, + updateUsersWithNewUsernames, + fetchUserForKeyValue, +} from "../models/users.js"; +import profileDiffsQuery from "../models/profileDiffs.js"; +import firestore from "../utils/firestore.js"; +import { addLog } from "../models/logs.js"; +import { uploadProfilePicture } from "../services/imageService.js"; +import { profileDiffStatus } from "../constants/profileDiff.js"; +import { logType } from "../constants/logs.js"; +import { ROLES } from "../constants/roles.js"; +import { + retrieveDiscordUsers, + retrieveUsers, + retreiveFilteredUsers, + retrieveUsersWithRole, +} from "../services/dataAccessLayer.js"; +import { isLastPRMergedWithinDays } from "../services/githubService.js"; +import { SOMETHING_WENT_WRONG, INTERNAL_SERVER_ERROR } from "../constants/errorMessages.js"; +import { getPaginationLink, getUsernamesFromPRs, getRoleToUpdate, parseSearchQuery } from "../utils/users.js"; +import { + setInDiscordFalseScript, + setUserDiscordNickname, + addRoleToUser, + getDiscordMembers, +} from "../services/discordService.js"; +import { generateDiscordProfileImageUrl } from "../utils/discord-actions.js"; +import taskModel from "../models/tasks.js"; +import { getQualifiers } from "../utils/helper.js"; +import { getFilteredPRsOrIssues } from "../utils/pullRequests.js"; +import { getFilteredPaginationLink } from "../utils/userStatus.js"; +import { getUserStatus } from "../models/userStatus.js"; +import { generateUniqueUsername, getUsersWithIncompleteTasks } from "../services/users.js"; + +const memberRoleModel = firestore.collection("member-group-roles"); +const logsModel = firestore.collection("logs"); const discordDeveloperRoleId = config.get("discordDeveloperRoleId"); const usersCollection = firestore.collection("users"); @@ -45,7 +67,7 @@ const verifyUser = async (req, res) => { if (!req.userData?.profileURL) { return res.boom.serverUnavailable("ProfileURL is Missing"); } - await userQuery.addOrUpdate({ profileStatus: "PENDING" }, userId, devFeatureFlag); + await addOrUpdate({ profileStatus: "PENDING" }, userId, devFeatureFlag); } catch (error) { logger.error(`Error while verifying user: ${error}`); return res.boom.serverUnavailable(SOMETHING_WENT_WRONG); @@ -63,7 +85,7 @@ const verifyUser = async (req, res) => { const getUserById = async (req, res) => { let result, user; try { - result = await dataAccess.retrieveUsers({ id: req.params.userId }); + result = await retrieveUsers({ id: req.params.userId }); user = result.user; } catch (error) { logger.error(`Error while fetching user: ${error}`); @@ -105,7 +127,7 @@ const getUsers = async (req, res) => { const id = req.query.id; let result, user; try { - result = await dataAccess.retrieveUsers({ id: id }); + result = await retrieveUsers({ id: id }); user = result.user; } catch (error) { logger.error(`Error while fetching user: ${error}`); @@ -128,7 +150,7 @@ const getUsers = async (req, res) => { } try { - const result = await dataAccess.retrieveUsers({ id: req.userData.id }); + const result = await retrieveUsers({ id: req.userData.id }); return res.send(result.user); } catch (error) { logger.error(`Error while fetching user: ${error}`); @@ -143,7 +165,7 @@ const getUsers = async (req, res) => { const { filterBy, days } = transformedQuery; if (filterBy === "unmerged_prs" && days) { try { - const inDiscordUser = await dataAccess.retrieveUsersWithRole(ROLES.INDISCORD); + const inDiscordUser = await retrieveUsersWithRole(ROLES.INDISCORD); const users = []; for (const user of inDiscordUser) { @@ -172,7 +194,7 @@ const getUsers = async (req, res) => { if (dev) { let result, user; try { - result = await dataAccess.retrieveUsers({ discordId }); + result = await retrieveUsers({ discordId }); user = result.user; if (!result.userExists) { return res.json({ @@ -205,8 +227,8 @@ const getUsers = async (req, res) => { return res.boom.notFound("Route not found"); } try { - const result = await dataAccess.retrieveUsers({ query: req.query }); - const departedUsers = await userService.getUsersWithIncompleteTasks(result.users); + const result = await retrieveUsers({ query: req.query }); + const departedUsers = await getUsersWithIncompleteTasks(result.users); if (departedUsers.length === 0) return res.status(204).send(); return res.json({ message: "Users with abandoned tasks fetched successfully", @@ -224,7 +246,7 @@ const getUsers = async (req, res) => { if (transformedQuery?.filterBy === OVERDUE_TASKS) { try { - const tasksData = await getOverdueTasks(days); + const tasksData = await taskModel.getOverdueTasks(days); if (!tasksData.length) { return res.json({ message: "No users found", @@ -240,7 +262,7 @@ const getUsers = async (req, res) => { } }); - const userInfo = await dataAccess.retrieveUsers({ userIds: Array.from(userIds) }); + const userInfo = await retrieveUsers({ userIds: Array.from(userIds) }); userInfo.forEach((user) => { if (!user.roles.archived) { const userTasks = tasksData.filter((task) => task.assignee === user.id); @@ -271,14 +293,14 @@ const getUsers = async (req, res) => { if (qualifiers?.filterBy) { const allPRs = await getFilteredPRsOrIssues(qualifiers); const usernames = getUsernamesFromPRs(allPRs); - const users = await dataAccess.retrieveUsers({ usernames: usernames }); + const users = await retrieveUsers({ usernames: usernames }); return res.json({ message: "Users returned successfully!", users, }); } - const data = await dataAccess.retrieveUsers({ query: req.query }); + const data = await retrieveUsers({ query: req.query }); return res.json({ message: "Users returned successfully!", @@ -323,7 +345,7 @@ const isDeveloper = async (req, res) => { const getUser = async (req, res) => { try { - const result = await dataAccess.retrieveUsers({ username: req.params.username }); + const result = await retrieveUsers({ username: req.params.username }); const user = result.user; if (result.userExists) { return res.json({ @@ -342,7 +364,7 @@ const getUser = async (req, res) => { const getUserSkills = async (req, res) => { try { const { id } = req.params; - const { skills } = await userQuery.fetchUserSkills(id); + const { skills } = await fetchUserSkills(id); return res.json({ message: "Skills returned successfully", @@ -363,7 +385,7 @@ const getUserSkills = async (req, res) => { const getSuggestedUsers = async (req, res) => { try { - const { users } = await userQuery.getSuggestedUsers(req.params.skillId); + const { users } = await getSuggestedUsersModel(req.params.skillId); return res.json({ message: "Users returned successfully!", @@ -384,7 +406,7 @@ const getSuggestedUsers = async (req, res) => { const getUsernameAvailabilty = async (req, res) => { try { - const result = await dataAccess.retrieveUsers({ username: req.params.username }); + const result = await retrieveUsers({ username: req.params.username }); return res.json({ isUsernameAvailable: !result.userExists, }); @@ -430,7 +452,7 @@ const generateUsername = async (req, res) => { const getSelfDetails = async (req, res) => { try { if (req.userData) { - const user = await dataAccess.retrieveUsers({ + const user = await retrieveUsers({ userdata: req.userData, }); @@ -459,14 +481,14 @@ const updateSelf = async (req, res) => { try { const { id: userId, roles: userRoles, discordId } = req.userData; const devFeatureFlag = req.query.dev === "true"; - const { user } = await dataAccess.retrieveUsers({ id: userId }); + const { user } = await retrieveUsers({ id: userId }); let rolesToDisable = []; if (req.body.username) { if (!user.incompleteUserDetails) { return res.boom.forbidden("Cannot update username again"); } - await userQuery.setIncompleteUserDetails(userId); + await setIncompleteUserDetails(userId); } if (req.body.roles) { @@ -502,7 +524,7 @@ const updateSelf = async (req, res) => { const { roles } = discordMember; if (roles && roles.includes(discordDeveloperRoleId)) { if (req.body.disabledRoles && devFeatureFlag) { - const updatedUser = await userQuery.addOrUpdate({ disabled_roles: rolesToDisable }, userId, devFeatureFlag); + const updatedUser = await addOrUpdate({ disabled_roles: rolesToDisable }, userId, devFeatureFlag); if (updatedUser) { return res .status(200) @@ -516,11 +538,11 @@ const updateSelf = async (req, res) => { } } - const updatedUser = await userQuery.addOrUpdate(req.body, userId, devFeatureFlag); + const updatedUser = await addOrUpdate(req.body, userId, devFeatureFlag); if (!updatedUser.isNewUser) { // Success criteria, user finished the sign-up process. - userQuery.initializeUser(userId); + initializeUser(userId); return res.status(204).send(); } @@ -552,13 +574,13 @@ const postUserPicture = async (req, res) => { } try { const coordinatesObject = coordinates && JSON.parse(coordinates); - imageData = await imageService.uploadProfilePicture({ file, userId, coordinates: coordinatesObject }); + imageData = await uploadProfilePicture({ file, userId, coordinates: coordinatesObject }); } catch (error) { logger.error(`Error while adding profile picture of user: ${error}`); return res.boom.badImplementation(INTERNAL_SERVER_ERROR); } try { - verificationResult = await userQuery.addForVerification(userId, discordId, imageData.url, discordAvatarUrl); + verificationResult = await addForVerification(userId, discordId, imageData.url, discordAvatarUrl); } catch (error) { logger.error(`Error while adding profile picture of user: ${error}`); return res.boom.badImplementation(INTERNAL_SERVER_ERROR); @@ -580,7 +602,7 @@ const verifyUserImage = async (req, res) => { try { const { type: imageType } = req.query; const { id: userId } = req.params; - await userQuery.markAsVerified(userId, imageType); + await markAsVerified(userId, imageType); return res.json({ message: `${imageType} image was verified successfully!`, }); @@ -600,7 +622,7 @@ const verifyUserImage = async (req, res) => { const updateDiscordUserNickname = async (req, res) => { const { userId } = req.params; try { - const userToBeUpdated = await dataAccess.retrieveUsers({ id: userId }); + const userToBeUpdated = await retrieveUsers({ id: userId }); const { discordId, username } = userToBeUpdated.user; if (!discordId) { throw new Error("user not verified"); @@ -693,7 +715,7 @@ const markUnverified = async (req, res) => { const getUserImageForVerification = async (req, res) => { try { const { id: userId } = req.params; - const userImageVerificationData = await userQuery.getUserImageForVerification(userId); + const userImageVerificationData = await getUserImageForVerificationModel(userId); return res.json({ message: "User image verification record fetched successfully!", data: userImageVerificationData, @@ -731,19 +753,19 @@ const updateUser = async (req, res) => { const { approval, timestamp, userId, ...profileDiff } = profileDiffData; - const user = await dataAccess.retrieveUsers({ id: userId }); + const user = await retrieveUsers({ id: userId }); if (!user.userExists) return res.boom.notFound("User doesn't exist"); await profileDiffsQuery.updateProfileDiff({ approval: profileDiffStatus.APPROVED }, profileDiffId); - await userQuery.addOrUpdate(profileDiff, userId, devFeatureFlag); + await addOrUpdate(profileDiff, userId, devFeatureFlag); const meta = { approvedBy: req.userData.id, userId: userId, }; - await logsQuery.addLog(logType.PROFILE_DIFF_APPROVED, meta, { profileDiffId, message }); + await addLog(logType.PROFILE_DIFF_APPROVED, meta, { profileDiffId, message }); return res.json({ message: "Updated user's data successfully!", @@ -758,8 +780,8 @@ const generateChaincode = async (req, res) => { try { const { id } = req.userData; const devFeatureFlag = req.query.dev === "true"; - const chaincode = await chaincodeQuery.storeChaincode(id); - await userQuery.addOrUpdate({ chaincode }, id, devFeatureFlag); + const chaincode = await storeChaincode(id); + await addOrUpdate({ chaincode }, id, devFeatureFlag); return res.json({ chaincode, message: "Chaincode returned successfully", @@ -775,7 +797,7 @@ const profileURL = async (req, res) => { const userId = req.userData.id; const { profileURL } = req.body; const devFeatureFlag = req.query.dev === "true"; - await userQuery.addOrUpdate({ profileURL }, userId, devFeatureFlag); + await addOrUpdate({ profileURL }, userId, devFeatureFlag); return res.json({ message: "updated profile URL!!", }); @@ -800,7 +822,7 @@ const rejectProfileDiff = async (req, res) => { userId: profileResponse.userId, }; - await logsQuery.addLog(logType.PROFILE_DIFF_REJECTED, meta, { profileDiffId, message }); + await addLog(logType.PROFILE_DIFF_REJECTED, meta, { profileDiffId, message }); return res.json({ message: "Profile Diff Rejected successfully!", @@ -814,7 +836,7 @@ const rejectProfileDiff = async (req, res) => { const addUserIntro = async (req, res) => { try { const rawData = req.body; - const joinData = await userQuery.getJoinData(req.userData.id); + const joinData = await getJoinData(req.userData.id); if (joinData.length === 1) { return res.status(409).json({ @@ -846,7 +868,7 @@ const addUserIntro = async (req, res) => { }, foundFrom: rawData.foundFrom, }; - await userQuery.addJoinData(data); + await addJoinData(data); return res.status(201).json({ message: "User join data and newstatus data added and updated successfully", @@ -859,7 +881,7 @@ const addUserIntro = async (req, res) => { const getUserIntro = async (req, res) => { try { - const data = await userQuery.getJoinData(req.params.userId); + const data = await getJoinData(req.params.userId); if (data.length) { return res.json({ message: "User data returned", @@ -876,26 +898,6 @@ const getUserIntro = async (req, res) => { } }; -/** - * Returns the lists of usernames where default archived role was added - * - * @param req {Object} - Express request object - * @param res {Object} - Express response object - */ - -const addDefaultArchivedRole = async (req, res) => { - try { - const addedDefaultArchivedRoleData = await userQuery.addDefaultArchivedRole(); - return res.json({ - message: "Users default archived role added successfully!", - ...addedDefaultArchivedRoleData, - }); - } catch (error) { - logger.error(`Error adding default archived role: ${error}`); - return res.boom.badImplementation(SOMETHING_WENT_WRONG); - } -}; - /** * Returns the lists of users who match the specified query params * @@ -920,7 +922,7 @@ const filterUsers = async (req, res) => { } const dev = req.query.dev; if (dev !== "true") { - const users = await dataAccess.retreiveFilteredUsers(req.query); + const users = await retreiveFilteredUsers(req.query); return res.json({ message: users.length ? "Users found successfully!" : "No users found", users: users, @@ -932,7 +934,7 @@ const filterUsers = async (req, res) => { const limitNumber = parseInt(size) || 100; const skip = (pageNumber - 1) * limitNumber; - const users = await dataAccess.retreiveFilteredUsers(req.query, skip, limitNumber); + const users = await retreiveFilteredUsers(req.query, skip, limitNumber); const totalCount = users.length; const totalPages = Math.ceil(totalCount / limitNumber); @@ -951,7 +953,7 @@ const filterUsers = async (req, res) => { }; const nonVerifiedDiscordUsers = async () => { - const data = await dataAccess.retrieveDiscordUsers(); + const data = await retrieveDiscordUsers(); return data; }; @@ -966,7 +968,7 @@ const setInDiscordScript = async (req, res) => { const updateRoles = async (req, res) => { try { - const result = await dataAccess.retrieveUsers({ id: req.params.id }); + const result = await retrieveUsers({ id: req.params.id }); const devFeatureFlag = req.query.dev === "true"; if (result?.userExists) { const dataToUpdate = req.body; @@ -976,7 +978,7 @@ const updateRoles = async (req, res) => { const response = await getRoleToUpdate(result.user, dataToUpdate); if (response.updateRole) { - await userQuery.addOrUpdate(response.newUserRoles, result.user.id, devFeatureFlag); + await addOrUpdate(response.newUserRoles, result.user.id, devFeatureFlag); if (dataToUpdate?.archived) { const body = { reason: reason || "", @@ -1008,7 +1010,7 @@ const updateRoles = async (req, res) => { const archiveUserIfNotInDiscord = async () => { try { - const data = await userQuery.archiveUserIfNotInDiscord(); + const data = await archiveUserIfNotInDiscordModel(); if (data.totalUsers === 0) { return { @@ -1059,8 +1061,8 @@ async function usersPatchHandler(req, res) { } const getIdentityStats = async (req, res) => { - const verifiedUsers = await userQuery.fetchUserForKeyValue("profileStatus", "VERIFIED"); - const blockedUsers = await userQuery.fetchUserForKeyValue("profileStatus", "BLOCKED"); + const verifiedUsers = await fetchUserForKeyValue("profileStatus", "VERIFIED"); + const blockedUsers = await fetchUserForKeyValue("profileStatus", "BLOCKED"); let developers = []; const membersInDiscord = await getDiscordMembers(); if (membersInDiscord) { @@ -1095,7 +1097,7 @@ const getIdentityStats = async (req, res) => { const updateUsernames = async (req, res) => { try { - const response = await userQuery.updateUsersWithNewUsernames(); + const response = await updateUsersWithNewUsernames(); return res.status(200).json(response); } catch (error) { logger.error("Error in username update script", error); @@ -1123,7 +1125,7 @@ const updateProfile = async (req, res) => { } }; -module.exports = { +export default { verifyUser, generateChaincode, updateSelf, @@ -1140,7 +1142,6 @@ module.exports = { profileURL, addUserIntro, getUserIntro, - addDefaultArchivedRole, getUserSkills, filterUsers, verifyUserImage, diff --git a/controllers/wallets.js b/controllers/wallets.js index e288905a5..294bad7a6 100644 --- a/controllers/wallets.js +++ b/controllers/wallets.js @@ -1,7 +1,8 @@ -const { fetchWallet, createWallet } = require("../models/wallets"); -const userUtils = require("../utils/users"); -const walletConstants = require("../constants/wallets"); -const { SOMETHING_WENT_WRONG } = require("../constants/errorMessages"); +import { fetchWallet, createWallet } from "../models/wallets.js"; +import { getUserId } from "../utils/users.js"; +import { INITIAL_WALLET } from "../constants/wallets.js"; +import { SOMETHING_WENT_WRONG } from "../constants/errorMessages.js"; +import logger from "../utils/logger.js"; /** * Get the wallet for userId, or create default one for @@ -14,7 +15,7 @@ const getWallet = async (userId) => { if (!wallet) { // #TODO Log which users didn't have a wallet - wallet = await createWallet(userId, walletConstants.INITIAL_WALLET); + wallet = await createWallet(userId, INITIAL_WALLET); logger.info("Created new wallet for user"); } return wallet; @@ -52,7 +53,7 @@ const getOwnWallet = async (req, res) => { */ const getUserWallet = async (req, res) => { const { params: { username } = {} } = req; - const userId = await userUtils.getUserId(username); + const userId = await getUserId(username); try { const wallet = await getWallet(userId); @@ -67,7 +68,7 @@ const getUserWallet = async (req, res) => { } }; -module.exports = { +export default { getOwnWallet, getUserWallet, }; diff --git a/docs/backendFlow.md b/docs/backendFlow.md index 8aaba3edc..0a22137b0 100644 --- a/docs/backendFlow.md +++ b/docs/backendFlow.md @@ -91,7 +91,7 @@ router.get('/', authenticate, usersController.getUsers) `authenticate middleware` ```JS -module.exports = async (req, res, next) => { +export default async (req, res, next) => { try { let token = req.cookies[config.get('userToken.cookieName')] diff --git a/middlewares/assignTask.js b/middlewares/assignTask.js index 796d1c13c..dae4a76ab 100644 --- a/middlewares/assignTask.js +++ b/middlewares/assignTask.js @@ -1,11 +1,12 @@ -const { fetchSkillLevelTask } = require("../models/tasks"); -const firestore = require("../utils/firestore"); +import taskModel from "../models/tasks.js"; +import firestore from "../utils/firestore.js"; + const tasks = firestore.collection("tasks"); const assignTask = async function (req, res) { try { // this hardcoded value will be removed once we have user skill - const { task } = await fetchSkillLevelTask("FRONTEND", 1); + const { task } = await taskModel.fetchSkillLevelTask("FRONTEND", 1); if (!task) return res.json({ message: "Task updated but another task not found" }); const docId = task.id; @@ -17,4 +18,4 @@ const assignTask = async function (req, res) { } }; -module.exports = assignTask; +export default assignTask; diff --git a/middlewares/authenticate.js b/middlewares/authenticate.js index 667d41b32..be1a7664d 100644 --- a/middlewares/authenticate.js +++ b/middlewares/authenticate.js @@ -1,5 +1,7 @@ -const authService = require("../services/authService"); -const dataAccess = require("../services/dataAccessLayer"); +import config from "config"; +import logger from "../utils/logger.js"; +import { decodeAuthToken, generateAuthToken, verifyAuthToken } from "../services/authService.js"; +import { retrieveUsers } from "../services/dataAccessLayer.js"; /** * Middleware to check if the user has been restricted. If user is restricted, @@ -39,7 +41,7 @@ const checkRestricted = async (req, res, next) => { * @param next {Function} - Express middleware function * @return {Object} - Returns unauthenticated object if token is invalid */ -module.exports = async (req, res, next) => { +export default async (req, res, next) => { try { let token = req.cookies[config.get("userToken.cookieName")]; @@ -51,10 +53,10 @@ module.exports = async (req, res, next) => { token = req.headers.authorization.split(" ")[1]; } - const { userId } = authService.verifyAuthToken(token); + const { userId } = verifyAuthToken(token); // add user data to `req.userData` for further use - const userData = await dataAccess.retrieveUsers({ id: userId }); + const userData = await retrieveUsers({ id: userId }); req.userData = userData.user; return checkRestricted(req, res, next); @@ -64,8 +66,8 @@ module.exports = async (req, res, next) => { if (err.name === "TokenExpiredError") { const refreshTtl = config.get("userToken.refreshTtl"); const token = req.cookies[config.get("userToken.cookieName")]; - const { userId, iat } = authService.decodeAuthToken(token); - const newToken = authService.generateAuthToken({ userId }); + const { userId, iat } = decodeAuthToken(token); + const newToken = generateAuthToken({ userId }); const rdsUiUrl = new URL(config.get("services.rdsUi.baseUrl")); // add new JWT to the response if it satisfies the refreshTtl time @@ -79,7 +81,7 @@ module.exports = async (req, res, next) => { }); // add user data to `req.userData` for further use - req.userData = await dataAccess.retrieveUsers({ id: userId }); + req.userData = await retrieveUsers({ id: userId }); return checkRestricted(req, res, next); } else { return res.boom.unauthorized("Unauthenticated User"); diff --git a/middlewares/authenticateProfile.js b/middlewares/authenticateProfile.js index fa0b5d21b..6261885b6 100644 --- a/middlewares/authenticateProfile.js +++ b/middlewares/authenticateProfile.js @@ -7,4 +7,4 @@ const authenticateProfile = (authenticate) => { }; }; -module.exports = authenticateProfile; +export default authenticateProfile; diff --git a/middlewares/authinticateServiceRequest.ts b/middlewares/authinticateServiceRequest.ts index c66bbe788..7eb3b5181 100644 --- a/middlewares/authinticateServiceRequest.ts +++ b/middlewares/authinticateServiceRequest.ts @@ -1,7 +1,8 @@ -import { verifyAuthToken } from "../utils/verifyAuthToken"; -import { CustomResponse } from "../types/global"; import { NextFunction } from "express"; -import { InviteBodyRequest } from "../types/invites"; +import { verifyAuthToken } from "../utils/verifyAuthToken.js"; +import { CustomResponse } from "../types/global.js"; +import { InviteBodyRequest } from "../types/invites.js"; +import logger from "../utils/logger.js"; const authinticateServiceRequest = async (req: InviteBodyRequest, res: CustomResponse, next: NextFunction) => { try { diff --git a/middlewares/authorization.js b/middlewares/authorization.js index c6c79a651..719409eae 100644 --- a/middlewares/authorization.js +++ b/middlewares/authorization.js @@ -48,7 +48,7 @@ const authorizeUser = (requiredRole) => { }; }; -module.exports = { +export default { authorizeUser, userHasPermission, }; diff --git a/middlewares/authorizeBot.js b/middlewares/authorizeBot.js index f03ab5491..788965103 100644 --- a/middlewares/authorizeBot.js +++ b/middlewares/authorizeBot.js @@ -1,10 +1,13 @@ -const botVerifcation = require("../services/botVerificationService"); -const { CLOUDFLARE_WORKER, CRON_JOB_HANDLER } = require("../constants/bot"); +import { + verifyCronJob as verifyCronJobService, + verifyToken as verifyTokenService, +} from "../services/botVerificationService.js"; +import { CLOUDFLARE_WORKER, CRON_JOB_HANDLER } from "../constants/bot.js"; -const verifyCronJob = async (req, res, next) => { +export const verifyCronJob = async (req, res, next) => { try { const token = req.headers.authorization.split(" ")[1]; - const data = botVerifcation.verifyCronJob(token); + const data = verifyCronJobService(token); if (data.name !== CRON_JOB_HANDLER) { return res.boom.unauthorized("Cron job not verified"); } @@ -15,10 +18,10 @@ const verifyCronJob = async (req, res, next) => { } }; -const verifyDiscordBot = async (req, res, next) => { +export const verifyDiscordBot = async (req, res, next) => { try { const token = req.headers.authorization.split(" ")[1]; - const data = botVerifcation.verifyToken(token); + const data = verifyTokenService(token); if (data.name !== CLOUDFLARE_WORKER) { return res.boom.unauthorized("Unauthorized Bot"); @@ -32,5 +35,3 @@ const verifyDiscordBot = async (req, res, next) => { return res.boom.badRequest("Invalid Request"); } }; - -module.exports = { verifyDiscordBot, verifyCronJob }; diff --git a/middlewares/authorizeOwnOrSuperUser.ts b/middlewares/authorizeOwnOrSuperUser.ts index 66a271ecb..7f39bbf5e 100644 --- a/middlewares/authorizeOwnOrSuperUser.ts +++ b/middlewares/authorizeOwnOrSuperUser.ts @@ -1,3 +1,7 @@ +import { NextFunction } from "express"; +import { CustomRequest, CustomResponse } from "../types/global.js"; +import logger from "../utils/logger.js"; + /** * This middleware authorizes if the requested resource belongs to that user or the user is a superuser * for that route. @@ -8,10 +12,6 @@ * @return {Object} - Returns unauthorized user if the role is not assigned * **/ - -import { NextFunction } from "express"; -import { CustomRequest, CustomResponse } from "../types/global"; - const authorizeOwnOrSuperUser = (req: CustomRequest, res: CustomResponse, next: NextFunction) => { try { const isSuperUser = req.userData.roles.super_user; diff --git a/middlewares/authorizeOwner.js b/middlewares/authorizeOwner.js index b29ea7068..b1416f399 100644 --- a/middlewares/authorizeOwner.js +++ b/middlewares/authorizeOwner.js @@ -1,4 +1,4 @@ -const users = require("../controllers/users"); +import users from "../controllers/users.js"; /** * Middleware to validate the authorized routes to be able to create & Update tasks * 1] Verifies the user's role as Application owner @@ -14,7 +14,7 @@ const users = require("../controllers/users"); * @param next {Function} - Express middleware function * @return {Object} - Returns unauthorized user if the role is not assigned */ -module.exports = async (req, res, next) => { +export default async (req, res, next) => { try { // get user data from `req.userData` for further use const accountOwners = await users.getAccountOwners(); diff --git a/middlewares/authorizeRoles.js b/middlewares/authorizeRoles.ts similarity index 87% rename from middlewares/authorizeRoles.js rename to middlewares/authorizeRoles.ts index 3090b0145..4ef1bed43 100644 --- a/middlewares/authorizeRoles.js +++ b/middlewares/authorizeRoles.ts @@ -1,4 +1,4 @@ -const ROLES = require("../constants/roles"); +import { ROLES } from "../constants/roles.js"; /** * Create an authorization middleware for a route based on the required role needed @@ -7,7 +7,7 @@ const ROLES = require("../constants/roles"); * @param {Array.} allowedRoles - Roles allowed for a route. * @returns {Function} - A middleware function that authorizes given role. */ -const authorizeRoles = (allowedRoles) => { +export const authorizeRoles = (allowedRoles) => { return (req, res, next) => { const { roles = {} } = req.userData; @@ -25,4 +25,3 @@ const authorizeRoles = (allowedRoles) => { }; }; -module.exports = authorizeRoles; diff --git a/middlewares/authorizeUsersAndService.ts b/middlewares/authorizeUsersAndService.ts index fa519360f..723b3573b 100644 --- a/middlewares/authorizeUsersAndService.ts +++ b/middlewares/authorizeUsersAndService.ts @@ -1,12 +1,13 @@ import jwt, { JwtPayload } from "jsonwebtoken"; -import { verifyCronJob, verifyDiscordBot } from "./authorizeBot"; -import { CustomRequest, CustomResponse } from "../types/global"; import { NextFunction } from "express"; -import authenticate from "./authenticate"; -import authorizeRoles from "./authorizeRoles"; -const { Services } = require("../constants/bot"); -const ROLES = require("../constants/roles"); -const { INTERNAL_SERVER_ERROR_MESSAGE } = require("../constants/progresses"); +import { verifyCronJob, verifyDiscordBot } from "./authorizeBot.js"; +import { CustomRequest, CustomResponse } from "../types/global.js"; +import authenticate from "./authenticate.js"; +import { authorizeRoles } from "./authorizeRoles.js"; +import logger from "../utils/logger.js"; +import { Services } from "../constants/bot.js"; +import { ROLES } from "../constants/roles.js"; +import { INTERNAL_SERVER_ERROR_MESSAGE } from "../constants/progresses.js"; export const authorizeAndAuthenticate = (allowedRoles: string[], allowedServices: string[]) => { const isRolesValid = allowedRoles.every((role) => Object.values(ROLES).includes(role)); diff --git a/middlewares/checkCanGenerateDiscordLink.ts b/middlewares/checkCanGenerateDiscordLink.ts index 5f1693943..6fcae52f1 100644 --- a/middlewares/checkCanGenerateDiscordLink.ts +++ b/middlewares/checkCanGenerateDiscordLink.ts @@ -1,8 +1,8 @@ import { NextFunction } from "express"; -import { CustomRequest, CustomResponse } from "../types/global"; -const ApplicationModel = require("../models/applications"); +import { CustomRequest, CustomResponse } from "../types/global.js"; +import { getUserApplications } from "../models/applications.js"; -const checkCanGenerateDiscordLink = async (req: CustomRequest, res: CustomResponse, next: NextFunction) => { +export const checkCanGenerateDiscordLink = async (req: CustomRequest, res: CustomResponse, next: NextFunction) => { const { id: userId, roles } = req.userData; const isSuperUser = roles.super_user; const userIdInQuery = req.query.userId; @@ -16,14 +16,16 @@ const checkCanGenerateDiscordLink = async (req: CustomRequest, res: CustomRespon } try { - const applications = await ApplicationModel.getUserApplications(userId); - + const applications = await getUserApplications(userId); + if (!applications || applications.length === 0) { return res.boom.forbidden("No applications found."); } - const approvedApplication = applications.find((application: { status: string; }) => application.status === 'accepted'); - + const approvedApplication = applications.find( + (application: { status: string }) => application.status === "accepted" + ); + if (!approvedApplication) { return res.boom.forbidden("Only users with an accepted application can generate a Discord invite link."); } @@ -34,12 +36,9 @@ const checkCanGenerateDiscordLink = async (req: CustomRequest, res: CustomRespon } }; -export default checkCanGenerateDiscordLink; - // <------ We have to revisit this later -------> // <--- https://github.com/Real-Dev-Squad/website-backend/issues/2078 ---> - // const checkCanGenerateDiscordLink = async (req: CustomRequest, res: CustomResponse, next: NextFunction) => { // const { discordId, roles, id: userId, profileStatus } = req.userData; // const isSuperUser = roles.super_user; @@ -64,4 +63,4 @@ export default checkCanGenerateDiscordLink; // return next(); // }; -module.exports = checkCanGenerateDiscordLink; +export default checkCanGenerateDiscordLink; diff --git a/middlewares/conditionalMiddleware.ts b/middlewares/conditionalMiddleware.ts index 3d1249e80..3d2ca979b 100644 --- a/middlewares/conditionalMiddleware.ts +++ b/middlewares/conditionalMiddleware.ts @@ -7,4 +7,4 @@ const conditionalMiddleware = (validator) => { }; }; -module.exports = conditionalMiddleware; +export default conditionalMiddleware; diff --git a/middlewares/contentTypeCheck.js b/middlewares/contentTypeCheck.js index 1e3f981a1..47e9dd86d 100644 --- a/middlewares/contentTypeCheck.js +++ b/middlewares/contentTypeCheck.js @@ -6,7 +6,7 @@ * @param {object} res - Express response object * @param {function} next - Express middleware function */ -module.exports = (req, res, next) => { +export default (req, res, next) => { const contentType = req.headers["content-type"]; if (contentType && contentType !== "application/json") { const notMultiPart = !contentType.includes("multipart/form-data"); diff --git a/middlewares/devFlag.ts b/middlewares/devFlag.ts index 643208cfb..2c785dda4 100644 --- a/middlewares/devFlag.ts +++ b/middlewares/devFlag.ts @@ -1,5 +1,6 @@ import { NextFunction } from "express"; -import { CustomRequest, CustomResponse } from "../types/global"; +import { CustomRequest, CustomResponse } from "../types/global.js"; +import logger from "../utils/logger.js"; export const devFlagMiddleware = (req: CustomRequest, res: CustomResponse, next: NextFunction) => { try { diff --git a/middlewares/index.js b/middlewares/index.ts similarity index 54% rename from middlewares/index.js rename to middlewares/index.ts index a8696ba59..1e7e35d2c 100644 --- a/middlewares/index.js +++ b/middlewares/index.ts @@ -1,16 +1,18 @@ -const express = require("express"); -const cookieParser = require("cookie-parser"); -const morgan = require("morgan"); -const boom = require("express-boom"); -const helmet = require("helmet"); -const cors = require("cors"); -const passport = require("passport"); -const contentTypeCheck = require("./contentTypeCheck"); - -// require middlewares -require("./passport"); - -const middleware = (app) => { +import config from 'config'; +import cookieParser from 'cookie-parser'; +import cors from 'cors'; +import express from 'express'; +import boom from 'express-boom'; +import helmet from 'helmet'; +import morgan from 'morgan'; +import passport from 'passport'; +import logger from '../utils/logger.js'; +import contentTypeCheck from './contentTypeCheck.js'; + +// import middlewares +import './passport.js'; + +export const middleware = (app) => { // Middleware for sending error responses with express response object. To be required above all middlewares app.use(boom()); @@ -35,7 +37,14 @@ const middleware = (app) => { app.use( cors({ - origin: config.get("cors.allowedOrigins"), + origin: (origin, callback) => { + const allowedOrigins = config.get("cors.allowedOrigins") as RegExp; + if (!origin || allowedOrigins.test(origin)) { + callback(null, true); + } else { + callback(new Error('Not allowed by CORS')); + } + }, credentials: true, optionsSuccessStatus: 200, }) @@ -45,5 +54,3 @@ const middleware = (app) => { // Initialise authentication middleware app.use(passport.initialize()); }; - -module.exports = middleware; diff --git a/middlewares/passport.js b/middlewares/passport.js index 62c9d3d71..a27ae2e46 100644 --- a/middlewares/passport.js +++ b/middlewares/passport.js @@ -1,6 +1,8 @@ -const passport = require("passport"); -const GitHubStrategy = require("passport-github2").Strategy; -const GoogleStrategy = require("passport-google-oauth20").Strategy; +import passport from "passport"; +import { Strategy as GitHubStrategy } from "passport-github2"; +import { Strategy as GoogleStrategy } from "passport-google-oauth20"; +import config from "config"; +import logger from "../utils/logger.js"; try { passport.use( diff --git a/middlewares/rateLimiting.js b/middlewares/rateLimiting.js index f0b0417f1..ca99cdc79 100644 --- a/middlewares/rateLimiting.js +++ b/middlewares/rateLimiting.js @@ -1,6 +1,6 @@ -const { RateLimiterMemory } = require("rate-limiter-flexible"); -const { TOO_MANY_REQUESTS } = require("../constants/rateLimiting"); -const { getRetrySeconds } = require("../utils/rateLimiting"); +import { RateLimiterMemory } from "rate-limiter-flexible"; +import { TOO_MANY_REQUESTS } from "../constants/rateLimiting.js"; +import { getRetrySeconds } from "../utils/rateLimiting.js"; // INFO: temporarily added here, will be take from env-var/config const opts = { @@ -47,6 +47,6 @@ async function commonRateLimiter(req, res, next) { } } -module.exports = { +export default { commonRateLimiter, }; diff --git a/middlewares/responseHeaders.js b/middlewares/responseHeaders.ts similarity index 91% rename from middlewares/responseHeaders.js rename to middlewares/responseHeaders.ts index 4e31d19e2..9a4b88bf5 100644 --- a/middlewares/responseHeaders.js +++ b/middlewares/responseHeaders.ts @@ -1,3 +1,5 @@ +import config from 'config'; +import logger from '../utils/logger.js'; /** * Middleware to attach Cache header. * https://support.cloudflare.com/hc/en-us/articles/200172516-Understanding-Cloudflare-s-CDN @@ -16,7 +18,7 @@ * If the server returns an error instead of proper revalidation responses, Cloudflare continues serving the stale resource for a total M seconds beyond the expiration of the resource. */ -module.exports = (req, res, next) => { +export const responseHeaders = (req, res, next) => { try { const cacheExpiry = config.get("routesCacheTTL"); let cacheControl = "private, max-age=0"; diff --git a/middlewares/skipAuthenticateForOnboardingExtension.ts b/middlewares/skipAuthenticateForOnboardingExtension.ts index 92bd5802b..814a9e23e 100644 --- a/middlewares/skipAuthenticateForOnboardingExtension.ts +++ b/middlewares/skipAuthenticateForOnboardingExtension.ts @@ -1,5 +1,5 @@ import { NextFunction, Request, Response } from "express" -import { REQUEST_TYPE } from "../constants/requests"; +import { REQUEST_TYPE } from "../constants/requests.js"; /** * Middleware to selectively authenticate or verify Discord bot based on the request type. * Specifically handles requests for onboarding extensions by skipping authentication. diff --git a/middlewares/skipAuthorizeRolesWrapper.js b/middlewares/skipAuthorizeRolesWrapper.js index 74c72d3c9..6369b9165 100644 --- a/middlewares/skipAuthorizeRolesWrapper.js +++ b/middlewares/skipAuthorizeRolesWrapper.js @@ -10,4 +10,4 @@ const skipAuthorizeRolesUnderFF = (authorizeMiddleware) => { }; }; -module.exports = skipAuthorizeRolesUnderFF; +export default skipAuthorizeRolesUnderFF; diff --git a/middlewares/taskRequests.js b/middlewares/taskRequests.js index bca7af322..1a6c83c9a 100644 --- a/middlewares/taskRequests.js +++ b/middlewares/taskRequests.js @@ -1,6 +1,8 @@ -const { SOMETHING_WENT_WRONG } = require("../constants/errorMessages"); -const dataAccess = require("../services/dataAccessLayer"); -const { TASK_REQUEST_ACTIONS } = require("../constants/taskRequests"); +import { SOMETHING_WENT_WRONG } from "../constants/errorMessages.js"; +import { retrieveUsers } from "../services/dataAccessLayer.js"; +import { TASK_REQUEST_ACTIONS } from "../constants/taskRequests.js"; +import logger from "../utils/logger.js"; + /** * Validates user id for task request * @@ -18,7 +20,7 @@ async function validateUser(req, res, next) { return res.boom.badRequest("userId not provided"); } - const { userExists, user } = await dataAccess.retrieveUsers({ id: userId }); + const { userExists, user } = await retrieveUsers({ id: userId }); if (!userExists) { return res.boom.conflict("User does not exist"); } @@ -32,6 +34,4 @@ async function validateUser(req, res, next) { } } -module.exports = { - validateUser, -}; +export { validateUser }; diff --git a/middlewares/userAuthorization.ts b/middlewares/userAuthorization.ts index 376f2dda2..eefa54689 100644 --- a/middlewares/userAuthorization.ts +++ b/middlewares/userAuthorization.ts @@ -1,5 +1,5 @@ import { NextFunction } from "express"; -import { CustomRequest, CustomResponse } from "../types/global"; +import { CustomRequest, CustomResponse } from "../types/global.js"; export const userAuthorization = (req: CustomRequest, res: CustomResponse, next: NextFunction) => { if (req.params.userId === req.userData.id) { diff --git a/middlewares/validators/answers.ts b/middlewares/validators/answers.ts index 7a5f7f2a6..46c8d8d92 100644 --- a/middlewares/validators/answers.ts +++ b/middlewares/validators/answers.ts @@ -1,6 +1,7 @@ -const joi = require("joi"); +import joi from "joi"; import { Request, NextFunction } from "express"; -import { CustomResponse } from "../../typeDefinitions/global"; +import { CustomResponse } from "../../typeDefinitions/global.js"; +import logger from "../../utils/logger.js"; const createAnswer = async (req: Request, res: CustomResponse, next: NextFunction) => { const schema = joi.object({ @@ -33,4 +34,4 @@ const updateAnswer = async (req: Request, res: CustomResponse, next: NextFunctio } }; -module.exports = { createAnswer, updateAnswer }; +export default { createAnswer, updateAnswer }; diff --git a/middlewares/validators/application.ts b/middlewares/validators/application.ts index c1324b8ba..8593bdc99 100644 --- a/middlewares/validators/application.ts +++ b/middlewares/validators/application.ts @@ -1,9 +1,9 @@ +import joi from "joi"; import { NextFunction } from "express"; -import { CustomRequest, CustomResponse } from "../../types/global"; -import { customWordCountValidator } from "../../utils/customWordCountValidator"; -const joi = require("joi"); -const { APPLICATION_STATUS_TYPES } = require("../../constants/application"); -const logger = require("../../utils/logger"); +import { CustomRequest, CustomResponse } from "../../types/global.js"; +import { customWordCountValidator } from "../../utils/customWordCountValidator.js"; +import { APPLICATION_STATUS_TYPES } from "../../constants/application.js"; +import logger from "../../utils/logger.js"; const validateApplicationData = async (req: CustomRequest, res: CustomResponse, next: NextFunction) => { const schema = joi @@ -56,7 +56,7 @@ const validateApplicationUpdateData = async (req: CustomRequest, res: CustomResp .optional() .custom((value, helper) => { if (!APPLICATION_STATUS_TYPES.includes(value)) { - return helper.message("Status is not valid"); + return helper.message({ custom: "Status is not valid" }); } return value; }), @@ -90,7 +90,7 @@ const validateApplicationQueryParam = async (req: CustomRequest, res: CustomResp } }; -module.exports = { +export default { validateApplicationData, validateApplicationUpdateData, validateApplicationQueryParam, diff --git a/middlewares/validators/arts.js b/middlewares/validators/arts.js index 31f233d1b..e7194cf4d 100644 --- a/middlewares/validators/arts.js +++ b/middlewares/validators/arts.js @@ -1,6 +1,7 @@ -const joi = require("joi"); +import joi from "joi"; +import logger from "../../utils/logger.js"; -const createArt = async (req, res, next) => { +export const createArt = async (req, res, next) => { const schema = joi .object() .strict() @@ -17,7 +18,3 @@ const createArt = async (req, res, next) => { res.boom.badRequest(error.details[0].message); } }; - -module.exports = { - createArt, -}; diff --git a/middlewares/validators/auctions.js b/middlewares/validators/auctions.js index 585abbab7..4e173ba12 100644 --- a/middlewares/validators/auctions.js +++ b/middlewares/validators/auctions.js @@ -1,4 +1,5 @@ -const joi = require("joi"); +import joi from "joi"; +import logger from "../../utils/logger.js"; const createAuction = async (req, res, next) => { const schema = joi.object().strict().keys({ @@ -29,7 +30,7 @@ const placeBid = async (req, res, next) => { } }; -module.exports = { +export default { createAuction, placeBid, }; diff --git a/middlewares/validators/badges.js b/middlewares/validators/badges.js index 513742426..3c48940c0 100644 --- a/middlewares/validators/badges.js +++ b/middlewares/validators/badges.js @@ -1,62 +1,55 @@ -const joi = require("joi"); -const { ERROR_MESSAGES } = require("../../constants/badges"); -const { - VALIDATORS: { CREATE_BADGE, ASSIGN_OR_REMOVE_BADGES, API_PAYLOAD_VALIDATION_FAILED }, -} = ERROR_MESSAGES; -const logger = require("../../utils/logger"); +import joi from "joi"; +import { ERROR_MESSAGES } from "../../constants/badges.js"; +import logger from "../../utils/logger.js"; + +const { VALIDATORS } = ERROR_MESSAGES; +const { CREATE_BADGE, ASSIGN_OR_REMOVE_BADGES } = VALIDATORS; /** - * Validates badge payload - * @param req {Object} - Express request object - * @param res {Object} - Express response object - * @param next {function} - Express middelware + * Validates the request payload for creating a new badge + * @param {Object} req - Express request object + * @param {Object} res - Express response object + * @param {Function} next - Express next middleware function */ -async function createBadge(req, res, next) { - const schema = joi - .object() - .strict() - .keys({ - name: joi.string().min(3).max(30).required(), - description: joi.string().min(3).max(130).optional(), - createdBy: joi.string().min(1).required(), +// eslint-disable-next-line consistent-return +const createBadge = (req, res, next) => { + const schema = joi.object({ + name: joi.string().required(), + description: joi.string().required(), + imageUrl: joi.string().required(), + }); + + const { error } = schema.validate(req.body); + if (error) { + logger.error(`Error validating badge: ${error}`); + return res.boom.badRequest(CREATE_BADGE, { + error: error.details[0].message, }); - try { - if (!req.file) { - throw new Error(CREATE_BADGE.FILE_IS_MISSING); - } - await schema.validateAsync(req.body); - next(); - } catch (error) { - logger.error(`${CREATE_BADGE.VALIDATON_FAILED}: ${error}`); - res.boom.badRequest(`${API_PAYLOAD_VALIDATION_FAILED}, ${error.details?.[0]?.message ?? error?.message}`); } -} + next(); +}; /** - * Validates param username and payload badgeIds - * @param req {Object} - Express request object - * @param res {Object} - Express response object - * @param next {function} - Express middelware + * Validates the request payload for assigning or removing badges + * @param {Object} req - Express request object + * @param {Object} res - Express response object + * @param {Function} next - Express next middleware function */ -async function assignOrRemoveBadges(req, res, next) { - const schema = joi - .object() - .strict() - .keys({ - userId: joi.string().required(), - badgeIds: joi.array().min(1).items(joi.string().required()).unique().required(), +// eslint-disable-next-line consistent-return +const assignOrRemoveBadges = (req, res, next) => { + const schema = joi.object({ + userId: joi.string().required(), + badgeIds: joi.array().items(joi.string()).required(), + }); + + const { error } = schema.validate(req.body); + if (error) { + logger.error(`Error validating badge assignment: ${error}`); + return res.boom.badRequest(ASSIGN_OR_REMOVE_BADGES, { + error: error.details[0].message, }); - try { - const { badgeIds, userId } = req.body; - await schema.validateAsync({ userId, badgeIds }); - next(); - } catch (error) { - logger.error(`${ASSIGN_OR_REMOVE_BADGES.VALIDATON_FAILED}: ${error}`); - res.boom.badRequest(`${API_PAYLOAD_VALIDATION_FAILED}, ${error.details?.[0]?.message}`); } -} - -module.exports = { - createBadge, - assignOrRemoveBadges, + next(); }; + +export { assignOrRemoveBadges, createBadge }; diff --git a/middlewares/validators/challenges.js b/middlewares/validators/challenges.js index 6d0ce4248..0e670ae6d 100644 --- a/middlewares/validators/challenges.js +++ b/middlewares/validators/challenges.js @@ -1,6 +1,7 @@ -const joi = require("joi"); +import joi from "joi"; +import logger from "../../utils/logger.js"; -const createChallenge = async (req, res, next) => { +export const createChallenge = async (req, res, next) => { const schema = joi.object().strict().keys({ title: joi.string().required(), level: joi.string().required(), @@ -16,7 +17,3 @@ const createChallenge = async (req, res, next) => { res.boom.badRequest(error.details[0].message); } }; - -module.exports = { - createChallenge, -}; diff --git a/middlewares/validators/discordactions.js b/middlewares/validators/discordactions.js index 42eaf8775..b3df851d1 100644 --- a/middlewares/validators/discordactions.js +++ b/middlewares/validators/discordactions.js @@ -1,5 +1,6 @@ -const Joi = require("joi"); -const { validateMillisecondsTimestamp } = require("./utils"); +import Joi from "joi"; +import logger from "../../utils/logger.js"; +import { validateMillisecondsTimestamp } from "./utils.js"; const validateGroupRoleBody = async (req, res, next) => { const schema = Joi.object({ @@ -61,7 +62,7 @@ const validateLazyLoadingParams = async (req, res, next) => { } }; -module.exports = { +export { validateGroupRoleBody, validateMemberRoleBody, validateLazyLoadingParams, diff --git a/middlewares/validators/events.js b/middlewares/validators/events.js index 7b5465be4..7955eeaaa 100644 --- a/middlewares/validators/events.js +++ b/middlewares/validators/events.js @@ -1,4 +1,5 @@ -const joi = require("joi"); +import joi from "joi"; +import logger from "../../utils/logger.js"; const createEvent = async (req, res, next) => { const schema = joi.object({ @@ -184,7 +185,7 @@ const getEventCodes = async (req, res, next) => { } }; -module.exports = { +export default { createEvent, getAllEvents, joinEvent, diff --git a/middlewares/validators/extensionRequests.js b/middlewares/validators/extensionRequests.js index 8b2b0af0f..eb3cacd3f 100644 --- a/middlewares/validators/extensionRequests.js +++ b/middlewares/validators/extensionRequests.js @@ -1,7 +1,7 @@ -const joi = require("joi"); -const { EXTENSION_REQUEST_STATUS } = require("../../constants/extensionRequests"); -const { parseQueryParams } = require("../../utils/queryParser"); -const { URLSearchParams } = require("url"); +import joi from "joi"; +import { EXTENSION_REQUEST_STATUS } from "../../constants/extensionRequests.js"; +import { parseQueryParams } from "../../utils/queryParser.js"; +import { URLSearchParams } from "url"; const ER_STATUS_ENUM = Object.values(EXTENSION_REQUEST_STATUS); @@ -106,7 +106,7 @@ const getExtensionRequestsValidator = async (req, res, next) => { } }; -module.exports = { +export default { createExtensionRequest, updateExtensionRequest, updateExtensionRequestStatus, diff --git a/middlewares/validators/extensionRequestsv2.ts b/middlewares/validators/extensionRequestsv2.ts index 40dee4eac..573af6eea 100644 --- a/middlewares/validators/extensionRequestsv2.ts +++ b/middlewares/validators/extensionRequestsv2.ts @@ -1,7 +1,7 @@ import joi from "joi"; -import { ExtensionRequestRequest, ExtensionRequestResponse } from "../../types/extensionRequests"; import { NextFunction } from "express"; -import { REQUEST_TYPE,REQUEST_STATE } from "../../constants/requests"; +import { ExtensionRequestRequest, ExtensionRequestResponse } from "../../types/extensionRequests.js"; +import { REQUEST_TYPE,REQUEST_STATE } from "../../constants/requests.js"; export const createExtensionRequestValidator = async ( req: ExtensionRequestRequest, diff --git a/middlewares/validators/external-accounts.js b/middlewares/validators/external-accounts.js index 1b083d3ab..141a8a8f5 100644 --- a/middlewares/validators/external-accounts.js +++ b/middlewares/validators/external-accounts.js @@ -1,5 +1,5 @@ -const joi = require("joi"); -const { EXTERNAL_ACCOUNTS_POST_ACTIONS } = require("../../constants/external-accounts"); +import joi from "joi"; +import { EXTERNAL_ACCOUNTS_POST_ACTIONS } from "../../constants/external-accounts.js"; const externalAccountData = async (req, res, next) => { const schema = joi @@ -64,4 +64,4 @@ const linkDiscord = async (req, res, next) => { } }; -module.exports = { externalAccountData, postExternalAccountsUsers, linkDiscord }; +export default { externalAccountData, postExternalAccountsUsers, linkDiscord }; diff --git a/middlewares/validators/fcmToken.js b/middlewares/validators/fcmToken.js index bbed1c755..6600ebe7c 100644 --- a/middlewares/validators/fcmToken.js +++ b/middlewares/validators/fcmToken.js @@ -1,4 +1,5 @@ -const joi = require("joi"); +import joi from "joi"; +import logger from "../../utils/logger.js"; export const fcmTokenValidator = async (req, res, next) => { const schema = joi.object().strict().keys({ diff --git a/middlewares/validators/invites.ts b/middlewares/validators/invites.ts index f152f1619..606ebfe8e 100644 --- a/middlewares/validators/invites.ts +++ b/middlewares/validators/invites.ts @@ -1,7 +1,8 @@ import joi from "joi"; import { NextFunction } from "express"; -import { InviteBodyRequest } from "../../types/invites"; -import {CustomResponse} from "../../types/global"; +import { InviteBodyRequest } from "../../types/invites.js"; +import {CustomResponse} from "../../types/global.js"; +import logger from "../../utils/logger.js"; export const createInviteValidator = async (req: InviteBodyRequest, res: CustomResponse, next: NextFunction) => { const schema = joi diff --git a/middlewares/validators/items.js b/middlewares/validators/items.js index 2d3278f2c..aaff96d2b 100644 --- a/middlewares/validators/items.js +++ b/middlewares/validators/items.js @@ -1,6 +1,6 @@ -const Joi = require("joi"); - -const { TYPES } = require("../../constants/items"); +import Joi from "joi"; +import { TYPES } from "../../constants/items.js"; +import logger from "../../utils/logger.js"; const validateItemsPayload = async (req, res, next) => { const schema = Joi.object({ @@ -49,7 +49,4 @@ const validateItemQuery = async (req, res, next) => { } }; -module.exports = { - validateItemsPayload, - validateItemQuery, -}; +export { validateItemsPayload, validateItemQuery }; diff --git a/middlewares/validators/levels.js b/middlewares/validators/levels.js index 217e6cde3..ba2fffba4 100644 --- a/middlewares/validators/levels.js +++ b/middlewares/validators/levels.js @@ -1,4 +1,5 @@ -const Joi = require("joi"); +import Joi from "joi"; +import logger from "../../utils/logger.js"; const validateLevelBody = async (req, res, next) => { const schema = Joi.object({ @@ -15,6 +16,4 @@ const validateLevelBody = async (req, res, next) => { } }; -module.exports = { - validateLevelBody, -}; +export { validateLevelBody }; diff --git a/middlewares/validators/members.js b/middlewares/validators/members.js index 125d799c1..7978b63b2 100644 --- a/middlewares/validators/members.js +++ b/middlewares/validators/members.js @@ -1,4 +1,5 @@ -const joi = require("joi"); +import joi from "joi"; +import logger from "../../utils/logger.js"; const validateGetMembers = async (req, res, next) => { const querySchema = joi.object().keys({ @@ -14,6 +15,4 @@ const validateGetMembers = async (req, res, next) => { } }; -module.exports = { - validateGetMembers, -}; +export { validateGetMembers }; diff --git a/middlewares/validators/monitor.js b/middlewares/validators/monitor.js index 84121a96e..d8937d22e 100644 --- a/middlewares/validators/monitor.js +++ b/middlewares/validators/monitor.js @@ -1,5 +1,6 @@ -const joi = require("joi"); -const { VALID_PROGRESS_TYPES, TYPE_MAP } = require("../../constants/progresses"); +import joi from "joi"; +import { VALID_PROGRESS_TYPES, TYPE_MAP } from "../../constants/progresses.js"; +import logger from "../../utils/logger.js"; const baseSchema = joi .object() @@ -113,8 +114,4 @@ const validateGetTrackedProgressQueryParams = async (req, res, next) => { } }; -module.exports = { - validateCreateTrackedProgressRecord, - validateUpdateTrackedProgress, - validateGetTrackedProgressQueryParams, -}; +export { validateCreateTrackedProgressRecord, validateUpdateTrackedProgress, validateGetTrackedProgressQueryParams }; diff --git a/middlewares/validators/notify.js b/middlewares/validators/notify.js index f960fea83..e066cc5f5 100644 --- a/middlewares/validators/notify.js +++ b/middlewares/validators/notify.js @@ -1,4 +1,5 @@ -const joi = require("joi"); +import joi from "joi"; +import logger from "../../utils/logger.js"; export const notifyValidator = async (req, res, next) => { const MAX_TITLE_LENGTH = 512; diff --git a/middlewares/validators/onboardingExtensionRequest.ts b/middlewares/validators/onboardingExtensionRequest.ts index 953a26aba..62db8a701 100644 --- a/middlewares/validators/onboardingExtensionRequest.ts +++ b/middlewares/validators/onboardingExtensionRequest.ts @@ -1,14 +1,18 @@ import joi from "joi"; import { NextFunction } from "express"; -import { REQUEST_TYPE } from "../../constants/requests"; -import { OnboardingExtensionCreateRequest, OnboardingExtensionResponse, UpdateOnboardingExtensionRequest } from "../../types/onboardingExtension"; +import { REQUEST_TYPE } from "../../constants/requests.js"; +import { + OnboardingExtensionCreateRequest, + OnboardingExtensionResponse, + UpdateOnboardingExtensionRequest, +} from "../../types/onboardingExtension.js"; +import logger from "../../utils/logger.js"; export const createOnboardingExtensionRequestValidator = async ( req: OnboardingExtensionCreateRequest, _res: OnboardingExtensionResponse, _next: NextFunction ) => { - const schema = joi .object() .strict() @@ -18,7 +22,7 @@ export const createOnboardingExtensionRequestValidator = async ( "any.required": "numberOfDays is required", "number.positive": "numberOfDays must be positive", "number.min": "numberOfDays must be greater than zero", - "number.integer": "numberOfDays must be a integer" + "number.integer": "numberOfDays must be a integer", }), reason: joi.string().required().messages({ "string.empty": "reason cannot be empty", @@ -30,12 +34,12 @@ export const createOnboardingExtensionRequestValidator = async ( }), userId: joi.string().required().messages({ "string.empty": "userId cannot be empty", - "any.required": "userId is required" - }) + "any.required": "userId is required", + }), }); - try{ + try { await schema.validateAsync(req.body, { abortEarly: false }); - }catch(error){ + } catch (error) { logger.error(`Error while validating request payload`, error); throw error; } @@ -43,38 +47,39 @@ export const createOnboardingExtensionRequestValidator = async ( /** * Validates onboarding extension request payload. - * + * * @param {UpdateOnboardingExtensionRequest} req - Request object. * @param {OnboardingExtensionResponse} res - Response object. * @param {NextFunction} next - Next middleware if valid. * @returns {Promise} Resolves or sends errors. */ export const updateOnboardingExtensionRequestValidator = async ( - req: UpdateOnboardingExtensionRequest, - res: OnboardingExtensionResponse, - next: NextFunction): Promise => { + req: UpdateOnboardingExtensionRequest, + res: OnboardingExtensionResponse, + next: NextFunction +): Promise => { const schema = joi - .object() - .strict() - .keys({ + .object() + .strict() + .keys({ reason: joi.string().optional(), newEndsOn: joi.number().positive().min(Date.now()).required().messages({ - 'number.any': 'newEndsOn is required', - 'number.base': 'newEndsOn must be a number', - 'number.positive': 'newEndsOn must be positive', - 'number.greater': 'newEndsOn must be greater than current date', + "number.any": "newEndsOn is required", + "number.base": "newEndsOn must be a number", + "number.positive": "newEndsOn must be positive", + "number.greater": "newEndsOn must be greater than current date", }), type: joi.string().equal(REQUEST_TYPE.ONBOARDING).required().messages({ - "type.any": "type is required", - }) - }); + "type.any": "type is required", + }), + }); try { - await schema.validateAsync(req.body, { abortEarly: false }); - next(); + await schema.validateAsync(req.body, { abortEarly: false }); + next(); } catch (error) { - const errorMessages = error.details.map((detail:{message: string}) => detail.message); - logger.error(`Error while validating request payload : ${errorMessages}`); - return res.boom.badRequest(errorMessages); + const errorMessages = error.details.map((detail: { message: string }) => detail.message); + logger.error(`Error while validating request payload : ${errorMessages}`); + return res.boom.badRequest(errorMessages); } -} +}; diff --git a/middlewares/validators/oooRequests.ts b/middlewares/validators/oooRequests.ts index ab73929f1..17c0ee9d0 100644 --- a/middlewares/validators/oooRequests.ts +++ b/middlewares/validators/oooRequests.ts @@ -1,7 +1,7 @@ import joi from "joi"; import { NextFunction } from "express"; -import { REQUEST_STATE, REQUEST_TYPE } from "../../constants/requests"; -import { OooRequestCreateRequest, OooRequestResponse } from "../../types/oooRequest"; +import { REQUEST_STATE, REQUEST_TYPE } from "../../constants/requests.js"; +import { OooRequestCreateRequest, OooRequestResponse } from "../../types/oooRequest.js"; export const createOooStatusRequestValidator = async ( req: OooRequestCreateRequest, diff --git a/middlewares/validators/progresses.js b/middlewares/validators/progresses.js index 2b04befee..2443464e2 100644 --- a/middlewares/validators/progresses.js +++ b/middlewares/validators/progresses.js @@ -1,7 +1,7 @@ -const joi = require("joi"); -const { VALID_PROGRESS_TYPES, PROGRESS_VALID_SORT_FIELDS } = require("../../constants/progresses"); +import joi from "joi"; +import { VALID_PROGRESS_TYPES, PROGRESS_VALID_SORT_FIELDS } from "../../constants/progresses.js"; -const validateCreateProgressRecords = async (req, res, next) => { +export const validateCreateProgressRecords = async (req, res, next) => { const baseSchema = joi .object() .strict() @@ -47,7 +47,7 @@ const validateCreateProgressRecords = async (req, res, next) => { } }; -const validateGetProgressRecordsQuery = async (req, res, next) => { +export const validateGetProgressRecordsQuery = async (req, res, next) => { const schema = joi .object({ type: joi @@ -97,7 +97,7 @@ const validateGetProgressRecordsQuery = async (req, res, next) => { } }; -const validateGetRangeProgressRecordsParams = async (req, res, next) => { +export const validateGetRangeProgressRecordsParams = async (req, res, next) => { const schema = joi .object({ userId: joi.string().optional(), @@ -123,7 +123,7 @@ const validateGetRangeProgressRecordsParams = async (req, res, next) => { } }; -const validateGetDayProgressParams = async (req, res, next) => { +export const validateGetDayProgressParams = async (req, res, next) => { const schema = joi.object({ type: joi .string() @@ -144,9 +144,3 @@ const validateGetDayProgressParams = async (req, res, next) => { res.boom.badRequest(error.details[0].message); } }; -module.exports = { - validateCreateProgressRecords, - validateGetProgressRecordsQuery, - validateGetRangeProgressRecordsParams, - validateGetDayProgressParams, -}; diff --git a/middlewares/validators/qrCodeAuth.js b/middlewares/validators/qrCodeAuth.js index ee9ae21f4..5140d9511 100644 --- a/middlewares/validators/qrCodeAuth.js +++ b/middlewares/validators/qrCodeAuth.js @@ -1,4 +1,5 @@ -const joi = require("joi"); +import joi from "joi"; +import logger from "../../utils/logger.js"; const storeUserDeviceInfo = async (req, res, next) => { const schema = joi.object().strict().keys({ @@ -47,7 +48,7 @@ const validateFetchingUserDocument = async (req, res, next) => { } }; -module.exports = { +export default { storeUserDeviceInfo, validateAuthStatus, validateFetchingUserDocument, diff --git a/middlewares/validators/questions.ts b/middlewares/validators/questions.ts index 7b09adea3..568989eee 100644 --- a/middlewares/validators/questions.ts +++ b/middlewares/validators/questions.ts @@ -1,6 +1,7 @@ +import joi from "joi"; import { NextFunction } from "express"; import { CustomRequest, CustomResponse } from "../../types/global"; -const joi = require("joi"); +import logger from "../../utils/logger.js"; const createQuestion = async (req: CustomRequest, res: CustomResponse, next: NextFunction) => { const schema = joi.object({ @@ -19,4 +20,4 @@ const createQuestion = async (req: CustomRequest, res: CustomResponse, next: Nex } }; -module.exports = { createQuestion }; +export default { createQuestion }; diff --git a/middlewares/validators/recruiter.js b/middlewares/validators/recruiter.js index a506d1f8b..9673e6f0c 100644 --- a/middlewares/validators/recruiter.js +++ b/middlewares/validators/recruiter.js @@ -1,4 +1,5 @@ -const joi = require("joi"); +import joi from "joi"; +import logger from "../../utils/logger.js"; const validateRecruiter = async (req, res, next) => { const schema = joi.object().strict().keys({ @@ -21,6 +22,4 @@ const validateRecruiter = async (req, res, next) => { } }; -module.exports = { - validateRecruiter, -}; +export { validateRecruiter }; diff --git a/middlewares/validators/requests.ts b/middlewares/validators/requests.ts index 80ff0478b..c131528e0 100644 --- a/middlewares/validators/requests.ts +++ b/middlewares/validators/requests.ts @@ -1,16 +1,17 @@ import joi from "joi"; import { NextFunction } from "express"; -import { REQUEST_STATE, REQUEST_TYPE } from "../../constants/requests"; -import { OooRequestCreateRequest, OooRequestResponse } from "../../types/oooRequest"; -import { createOooStatusRequestValidator } from "./oooRequests"; -import { createExtensionRequestValidator } from "./extensionRequestsv2"; -import {createTaskRequestValidator} from "./taskRequests"; -import { ExtensionRequestRequest, ExtensionRequestResponse } from "../../types/extensionRequests"; -import { CustomResponse } from "../../typeDefinitions/global"; -import { UpdateRequest } from "../../types/requests"; -import { TaskRequestRequest, TaskRequestResponse } from "../../types/taskRequests"; -import { createOnboardingExtensionRequestValidator, updateOnboardingExtensionRequestValidator } from "./onboardingExtensionRequest"; -import { OnboardingExtensionCreateRequest, OnboardingExtensionResponse, UpdateOnboardingExtensionRequest } from "../../types/onboardingExtension"; +import { REQUEST_STATE, REQUEST_TYPE } from "../../constants/requests.js"; +import { OooRequestCreateRequest, OooRequestResponse } from "../../types/oooRequest.js"; +import { createOooStatusRequestValidator } from "./oooRequests.js"; +import { createExtensionRequestValidator } from "./extensionRequestsv2.js"; +import {createTaskRequestValidator} from "./taskRequests.js"; +import { ExtensionRequestRequest, ExtensionRequestResponse } from "../../types/extensionRequests.js"; +import { CustomResponse } from "../../typeDefinitions/global.js"; +import { UpdateRequest } from "../../types/requests.js"; +import { TaskRequestRequest, TaskRequestResponse } from "../../types/taskRequests.js"; +import { createOnboardingExtensionRequestValidator, updateOnboardingExtensionRequestValidator } from "./onboardingExtensionRequest.js"; +import { OnboardingExtensionCreateRequest, OnboardingExtensionResponse, UpdateOnboardingExtensionRequest } from "../../types/onboardingExtension.js"; +import logger from "../../utils/logger.js"; export const createRequestsMiddleware = async ( req: OooRequestCreateRequest|ExtensionRequestRequest | TaskRequestRequest | OnboardingExtensionCreateRequest, @@ -124,7 +125,7 @@ export const getRequestsMiddleware = async (req: OooRequestCreateRequest, res: O /** * Validates update requests based on their type. - * + * * @param {UpdateOnboardingExtensionRequest} req - Request object. * @param {CustomResponse} res - Response object. * @param {NextFunction} next - Next middleware if valid. @@ -139,10 +140,10 @@ export const updateRequestValidator = async ( switch (type) { case REQUEST_TYPE.ONBOARDING: await updateOnboardingExtensionRequestValidator( - req, + req, res as OnboardingExtensionResponse, next); break; default: return res.boom.badRequest("Invalid type"); } -}; \ No newline at end of file +}; diff --git a/middlewares/validators/staging.js b/middlewares/validators/staging.js index 66f43addc..2f76d4e05 100644 --- a/middlewares/validators/staging.js +++ b/middlewares/validators/staging.js @@ -1,4 +1,5 @@ -const joi = require("joi"); +import joi from "joi"; +import logger from "../../utils/logger.js"; const validateUserRoles = async (req, res, next) => { const schema = joi.object().strict().keys({ @@ -33,7 +34,4 @@ const validateRevokePrivileges = async (req, res, next) => { } }; -module.exports = { - validateUserRoles, - validateRevokePrivileges, -}; +export { validateUserRoles, validateRevokePrivileges }; diff --git a/middlewares/validators/stocks.js b/middlewares/validators/stocks.js index 111f1fd7e..62e0654e8 100644 --- a/middlewares/validators/stocks.js +++ b/middlewares/validators/stocks.js @@ -1,4 +1,5 @@ -const joi = require("joi"); +import joi from "joi"; +import logger from "../../utils/logger.js"; const createStock = async (req, res, next) => { const schema = joi.object().strict().keys({ @@ -16,6 +17,4 @@ const createStock = async (req, res, next) => { } }; -module.exports = { - createStock, -}; +export { createStock }; diff --git a/middlewares/validators/subscription.ts b/middlewares/validators/subscription.ts index dc28d7676..d7e31705e 100644 --- a/middlewares/validators/subscription.ts +++ b/middlewares/validators/subscription.ts @@ -1,10 +1,10 @@ -import { NextFunction } from "express"; -import { CustomRequest, CustomResponse } from "../../types/global"; -import { emailRegex, phoneNumberRegex } from "../../constants/subscription-validator"; import Joi from 'joi'; +import { NextFunction } from "express"; +import { CustomRequest, CustomResponse } from "../../types/global.js"; +import { emailRegex, phoneNumberRegex } from "../../constants/subscription-validator.js"; export const validateSubscribe = (req: CustomRequest, res: CustomResponse, next: NextFunction) => { - + if(req.body.email){ req.body.email = req.body.email.trim(); } @@ -12,7 +12,7 @@ export const validateSubscribe = (req: CustomRequest, res: CustomResponse, next: req.body.phone = req.body.phone.trim(); } const subscribeSchema = Joi.object({ - phone: Joi.string().allow('').optional().regex(phoneNumberRegex), + phone: Joi.string().allow('').optional().regex(phoneNumberRegex), email: Joi.string().required().regex(emailRegex) }); const { error } = subscribeSchema.validate(req.body); diff --git a/middlewares/validators/tags.js b/middlewares/validators/tags.js index 0e05aed9c..aabf4447a 100644 --- a/middlewares/validators/tags.js +++ b/middlewares/validators/tags.js @@ -1,5 +1,6 @@ -const Joi = require("joi"); -const { TYPES } = require("../../constants/tags"); +import Joi from "joi"; +import { TYPES } from "../../constants/tags.js"; +import logger from "../../utils/logger.js"; const validTagBody = async (req, res, next) => { const schema = Joi.object({ @@ -24,6 +25,4 @@ const validTagBody = async (req, res, next) => { } }; -module.exports = { - validTagBody, -}; +export { validTagBody }; diff --git a/middlewares/validators/task-requests.js b/middlewares/validators/task-requests.js index f9754824d..413ac6216 100644 --- a/middlewares/validators/task-requests.js +++ b/middlewares/validators/task-requests.js @@ -1,11 +1,14 @@ -import { GITHUB_URL } from "../../constants/urls"; -const joi = require("joi"); -const { RQLQueryParser } = require("../../utils/RQLParser"); +import joi from "joi"; +import config from "config"; + +import { GITHUB_URL } from "../../constants/urls.js"; +import { RQLQueryParser } from "../../utils/RQLParser.js"; +import { TASK_REQUEST_STATUS, TASK_REQUEST_TYPE } from "../../constants/taskRequests.js"; + const githubOrg = config.get("githubApi.org"); const githubBaseUrl = config.get("githubApi.baseUrl"); const githubIssuerUrlPattern = new RegExp(`^${githubBaseUrl}/repos/${githubOrg}/.+/issues/\\d+$`); const githubIssueHtmlUrlPattern = new RegExp(`^${GITHUB_URL}/${githubOrg}/.+/issues/\\d+$`); // Example: https://github.com/Real-Dev-Squad/website-status/issues/1050 -const { TASK_REQUEST_STATUS, TASK_REQUEST_TYPE } = require("../../constants/taskRequests"); const postTaskRequests = async (req, res, next) => { const taskAssignmentSchema = joi @@ -101,7 +104,7 @@ const getTaskRequests = async (req, res, next) => { res.boom.badRequest(error?.details?.[0]?.message || error?.message); } }; -module.exports = { +export default { getTaskRequests, postTaskRequests, }; diff --git a/middlewares/validators/taskRequests.ts b/middlewares/validators/taskRequests.ts index 383ee3e6b..20c06c2a6 100644 --- a/middlewares/validators/taskRequests.ts +++ b/middlewares/validators/taskRequests.ts @@ -1,76 +1,76 @@ import joi from "joi"; -import { TaskRequestResponse, TaskRequestRequest } from "../../types/taskRequests"; +import config from "config"; import { NextFunction } from "express"; -import { REQUEST_TYPE, REQUEST_STATE } from "../../constants/requests"; -import { GITHUB_URL } from "../../constants/urls"; -import config from "config"; -import { TASK_REQUEST_TYPE } from "../../constants/taskRequests"; +import { TaskRequestResponse, TaskRequestRequest } from "../../types/taskRequests.js"; +import { REQUEST_TYPE, REQUEST_STATE } from "../../constants/requests.js"; +import { GITHUB_URL } from "../../constants/urls.js"; +import { TASK_REQUEST_TYPE } from "../../constants/taskRequests.js"; + const githubOrg = config.get("githubApi.org"); const githubBaseUrl = config.get("githubApi.baseUrl"); const githubIssuerUrlPattern = new RegExp(`^${githubBaseUrl}/repos/${githubOrg}/.+/issues/\\d+$`); const githubIssueHtmlUrlPattern = new RegExp(`^${GITHUB_URL}/${githubOrg}/.+/issues/\\d+$`); // Example: https://github.com/Real-Dev-Squad/website-status/issues/1050 export const createTaskRequestValidator = async ( - req: TaskRequestRequest, - res: TaskRequestResponse, - next: NextFunction + req: TaskRequestRequest, + res: TaskRequestResponse, + next: NextFunction ) => { - const schema = joi - .object() - .strict() - .keys({ - requestType: joi.string().valid(TASK_REQUEST_TYPE.CREATION, TASK_REQUEST_TYPE.ASSIGNMENT).required().messages({ - "string.empty": "requestType cannot be empty", - "any.required": "requestType is required", - }), - externalIssueUrl: joi.string().required().regex(githubIssuerUrlPattern).required().messages({ - "string.empty": "externalIssueUrl cannot be empty", - "any.required": "externalIssueUrl is required", - }), - externalIssueHtmlUrl: joi.string().required().regex(githubIssueHtmlUrlPattern).messages({ - "string.empty": "externalIssueHtmlUrl cannot be empty", - "any.required": "externalIssueHtmlUrl is required", - }), - type: joi.string().valid(REQUEST_TYPE.TASK).required().messages({ - "string.empty": "type cannot be empty", - "any.required": "type is required", - }), - state: joi.string().valid(REQUEST_STATE.PENDING).required().messages({ - "string.empty": "state cannot be empty", - "any.required": "state is required", - }), - proposedStartDate: joi.number().required().messages({ - "number.base": "proposedStartDate must be a number", - "any.required": "proposedStartDate is required", - }), - proposedDeadline: joi.number().required().greater(joi.ref("proposedStartDate")). - messages({ - "number.base": "proposedDeadline must be a number", - "any.required": "proposedDeadline is required", - }), - description: joi.string().optional().messages({ - "string.empty": "description cannot be empty", - }), - markdownEnabled: joi.boolean().optional().messages({ - "boolean.base": "markdownEnabled must be a boolean", - }), - taskId: joi.when('requestType', { - is: TASK_REQUEST_TYPE.ASSIGNMENT, - then: joi.string().required().messages({ - "string.empty": "taskId cannot be empty", - "any.required": "taskId is required when requestType is ASSIGNMENT", - }), - otherwise: joi.forbidden() - }), - userId: joi.when('requestType', { - is: TASK_REQUEST_TYPE.CREATION, - then: joi.string().required().messages({ - "string.empty": "userId cannot be empty", - "any.required": "userId is required when requestType is CREATION", - }), - otherwise: joi.forbidden() - }), - }); - await schema.validateAsync(req.body, { abortEarly: false }); + const schema = joi + .object() + .strict() + .keys({ + requestType: joi.string().valid(TASK_REQUEST_TYPE.CREATION, TASK_REQUEST_TYPE.ASSIGNMENT).required().messages({ + "string.empty": "requestType cannot be empty", + "any.required": "requestType is required", + }), + externalIssueUrl: joi.string().required().regex(githubIssuerUrlPattern).required().messages({ + "string.empty": "externalIssueUrl cannot be empty", + "any.required": "externalIssueUrl is required", + }), + externalIssueHtmlUrl: joi.string().required().regex(githubIssueHtmlUrlPattern).messages({ + "string.empty": "externalIssueHtmlUrl cannot be empty", + "any.required": "externalIssueHtmlUrl is required", + }), + type: joi.string().valid(REQUEST_TYPE.TASK).required().messages({ + "string.empty": "type cannot be empty", + "any.required": "type is required", + }), + state: joi.string().valid(REQUEST_STATE.PENDING).required().messages({ + "string.empty": "state cannot be empty", + "any.required": "state is required", + }), + proposedStartDate: joi.number().required().messages({ + "number.base": "proposedStartDate must be a number", + "any.required": "proposedStartDate is required", + }), + proposedDeadline: joi.number().required().greater(joi.ref("proposedStartDate")).messages({ + "number.base": "proposedDeadline must be a number", + "any.required": "proposedDeadline is required", + }), + description: joi.string().optional().messages({ + "string.empty": "description cannot be empty", + }), + markdownEnabled: joi.boolean().optional().messages({ + "boolean.base": "markdownEnabled must be a boolean", + }), + taskId: joi.when("requestType", { + is: TASK_REQUEST_TYPE.ASSIGNMENT, + then: joi.string().required().messages({ + "string.empty": "taskId cannot be empty", + "any.required": "taskId is required when requestType is ASSIGNMENT", + }), + otherwise: joi.forbidden(), + }), + userId: joi.when("requestType", { + is: TASK_REQUEST_TYPE.CREATION, + then: joi.string().required().messages({ + "string.empty": "userId cannot be empty", + "any.required": "userId is required when requestType is CREATION", + }), + otherwise: joi.forbidden(), + }), + }); + await schema.validateAsync(req.body, { abortEarly: false }); }; diff --git a/middlewares/validators/tasks.js b/middlewares/validators/tasks.js index d36677d5f..053e49165 100644 --- a/middlewares/validators/tasks.js +++ b/middlewares/validators/tasks.js @@ -1,13 +1,16 @@ -const joi = require("joi"); -const { BadRequest } = require("http-errors"); -const { DINERO, NEELAM } = require("../../constants/wallets"); -const { TASK_STATUS, TASK_STATUS_OLD, MAPPED_TASK_STATUS, tasksUsersStatus } = require("../../constants/tasks"); -const { RQLQueryParser } = require("../../utils/RQLParser"); -const { Operators } = require("../../typeDefinitions/rqlParser"); -const { daysOfWeek } = require("../../constants/constants"); +import joi from "joi"; +import httpError from "http-errors"; + +import { DINERO, NEELAM } from "../../constants/wallets.js"; +import { RQLQueryParser } from "../../utils/RQLParser.js"; +import { Operators } from "../../typeDefinitions/rqlParser.js"; +import { daysOfWeek } from "../../constants/constants.js"; +import { validateMillisecondsTimestamp } from "./utils.js"; +import { TASK_STATUS, TASK_STATUS_OLD, MAPPED_TASK_STATUS, tasksUsersStatus } from "../../constants/tasks.js"; +import logger from "../../utils/logger.js"; + const TASK_STATUS_ENUM = Object.values(TASK_STATUS); const MAPPED_TASK_STATUS_ENUM = Object.keys(MAPPED_TASK_STATUS); -const { validateMillisecondsTimestamp } = require("./utils"); const createTask = async (req, res, next) => { const schema = joi @@ -131,7 +134,7 @@ const updateSelfTask = async (req, res, next) => { .string() .valid(...validStatus) .optional() - .error(new BadRequest(`The value for the 'status' field is invalid.`)), + .error(new httpError.BadRequest(`The value for the 'status' field is invalid.`)), percentCompleted: joi.number().integer().min(0).max(100).optional(), }); try { @@ -139,7 +142,7 @@ const updateSelfTask = async (req, res, next) => { next(); } catch (error) { logger.error(`Error validating updateSelfTask payload : ${error}`); - if (error instanceof BadRequest) { + if (error instanceof httpError.BadRequest) { res.boom.badRequest(error.message); } else { res.boom.badRequest(error.details[0].message); @@ -275,7 +278,7 @@ const filterOrphanTasksValidator = async (req, res, next) => { res.boom.badRequest(error); } }; -module.exports = { +export default { createTask, updateTask, updateSelfTask, diff --git a/middlewares/validators/trading.js b/middlewares/validators/trading.js index e3631170a..6ab5034d6 100644 --- a/middlewares/validators/trading.js +++ b/middlewares/validators/trading.js @@ -1,4 +1,5 @@ -const joi = require("joi"); +import joi from "joi"; +import logger from "../../utils/logger.js"; const newTrade = async (req, res, next) => { const schema = joi.object().strict().keys({ @@ -19,6 +20,4 @@ const newTrade = async (req, res, next) => { } }; -module.exports = { - newTrade, -}; +export { newTrade }; diff --git a/middlewares/validators/user.js b/middlewares/validators/user.js index 2604ff51d..93a6c3851 100644 --- a/middlewares/validators/user.js +++ b/middlewares/validators/user.js @@ -1,14 +1,10 @@ -const { customWordCountValidator } = require("../../utils/customWordCountValidator"); +import joi from "joi"; -const joi = require("joi"); -const { - USER_STATUS, - USERS_PATCH_HANDLER_ACTIONS, - USERS_PATCH_HANDLER_ERROR_MESSAGES, -} = require("../../constants/users"); -const ROLES = require("../../constants/roles"); -const { IMAGE_VERIFICATION_TYPES } = require("../../constants/imageVerificationTypes"); -const { userState } = require("../../constants/userStatus"); +import { ROLES } from "../../constants/roles.js"; +import { userState } from "../../constants/userStatus.js"; +import { customWordCountValidator } from "../../utils/customWordCountValidator.js"; +import { IMAGE_VERIFICATION_TYPES } from "../../constants/imageVerificationTypes.js"; +import { USER_STATUS, USERS_PATCH_HANDLER_ACTIONS, USERS_PATCH_HANDLER_ERROR_MESSAGES } from "../../constants/users.js"; const updateUser = async (req, res, next) => { const schema = joi @@ -368,7 +364,8 @@ const migrationsValidator = async (req, res, next) => { res.boom.badRequest("Invalid Query Parameters Passed"); } }; -module.exports = { + +export { updateUser, updateProfileURL, validateJoinData, diff --git a/middlewares/validators/userStatus.js b/middlewares/validators/userStatus.js index 926e38feb..78467f5d8 100644 --- a/middlewares/validators/userStatus.js +++ b/middlewares/validators/userStatus.js @@ -1,5 +1,7 @@ -const Joi = require("joi"); -const { userState, CANCEL_OOO } = require("../../constants/userStatus"); +import Joi from "joi"; +import { userState, CANCEL_OOO } from "../../constants/userStatus.js"; +import logger from "../../utils/logger.js"; + const threeDaysInMilliseconds = 172800000; const validateUserStatusData = async (todaysTime, req, res, next) => { @@ -135,8 +137,4 @@ const validateGetQueryParams = async (req, res, next) => { } }; -module.exports = { - validateUserStatus, - validateMassUpdate, - validateGetQueryParams, -}; +export { validateUserStatus, validateMassUpdate, validateGetQueryParams }; diff --git a/middlewares/validators/utils.ts b/middlewares/validators/utils.ts index 5974c08ce..de2e79ee1 100644 --- a/middlewares/validators/utils.ts +++ b/middlewares/validators/utils.ts @@ -1,4 +1,4 @@ -const Joi = require("joi"); +import Joi from "joi"; const validateMillisecondsTimestamp = async (reqBody, timestampProperty) => { const schema = Joi.object({ @@ -7,6 +7,4 @@ const validateMillisecondsTimestamp = async (reqBody, timestampProperty) => { return schema.validateAsync(reqBody); }; -module.exports = { - validateMillisecondsTimestamp -} +export { validateMillisecondsTimestamp }; diff --git a/middlewares/verifydiscord.js b/middlewares/verifydiscord.js index dff98d690..25cb2d1fc 100644 --- a/middlewares/verifydiscord.js +++ b/middlewares/verifydiscord.js @@ -19,4 +19,4 @@ const checkIsVerifiedDiscord = async (req, res, next) => { return next(); }; -module.exports = checkIsVerifiedDiscord; +export default checkIsVerifiedDiscord; diff --git a/mockdata/appOwners.js b/mockdata/appOwners.js index f6f0caf85..43a649aae 100644 --- a/mockdata/appOwners.js +++ b/mockdata/appOwners.js @@ -49,4 +49,4 @@ const appOwners = [ }, ]; -module.exports = appOwners; +export default appOwners; diff --git a/models/answers.ts b/models/answers.ts index 636cbd27b..4427f1401 100644 --- a/models/answers.ts +++ b/models/answers.ts @@ -1,8 +1,10 @@ -const admin = require("firebase-admin"); -const firestore = require("../utils/firestore"); +import admin from "firebase-admin"; +import firestore from "../utils/firestore.js"; +import { Answer, AnswerBody, AnswerFieldsToUpdate } from "../typeDefinitions/answers.js"; +import { ANSWER_STATUS } from "../constants/answers.js"; +import logger from "../utils/logger.js"; + const answerModel = firestore.collection("answers"); -import { Answer, AnswerBody, AnswerFieldsToUpdate } from "../typeDefinitions/answers"; -const { ANSWER_STATUS } = require("../constants/answers"); const createAnswer = async (answerData: AnswerBody) => { try { @@ -47,24 +49,33 @@ const updateAnswer = async (id: string, fieldsToUpdate: AnswerFieldsToUpdate) => } }; -const getAnswers = async (queryFields) => { - const questionId = queryFields.questionId || ""; - const eventId = queryFields.eventId || ""; - const status = queryFields.status || ""; - let answersRef = answerModel; - let answers: Answer[] = []; +interface QueryFields { + event_id?: string; + answered_by?: string; + question_id?: string; + status?: string; +} +const getAnswers = async (queryFields: QueryFields): Promise => { try { - answersRef = questionId ? answersRef.where("question_id", "==", questionId) : answersRef; - answersRef = eventId ? answersRef.where("event_id", "==", eventId) : answersRef; - answersRef = status ? answersRef.where("status", "==", status) : answersRef; - - const answerSnapshot = await answersRef.get(); - - answerSnapshot.forEach((answer) => { - answers.push({ id: answer.id, ...answer.data() }); + let query: admin.firestore.Query = answerModel; + if (queryFields.event_id) { + query = query.where("event_id", "==", queryFields.event_id); + } + if (queryFields.answered_by) { + query = query.where("answered_by", "==", queryFields.answered_by); + } + if (queryFields.question_id) { + query = query.where("question_id", "==", queryFields.question_id); + } + if (queryFields.status) { + query = query.where("status", "==", queryFields.status); + } + const answersSnapshot = await query.get(); + const answers: Answer[] = []; + answersSnapshot.forEach((doc) => { + answers.push({ id: doc.id, ...doc.data() } as Answer); }); - return answers; } catch (error) { logger.error(`Some error occured while getting answers ${error}`); @@ -72,4 +83,8 @@ const getAnswers = async (queryFields) => { } }; -module.exports = { createAnswer, updateAnswer, getAnswers }; +export { + createAnswer, + updateAnswer, + getAnswers, +}; diff --git a/models/applications.ts b/models/applications.ts index 98b732061..740c88ae8 100644 --- a/models/applications.ts +++ b/models/applications.ts @@ -1,5 +1,7 @@ -import { application } from "../types/application"; -const firestore = require("../utils/firestore"); +import { application } from "../types/application.js"; +import firestore from "../utils/firestore.js"; +import logger from "../utils/logger.js"; + const ApplicationsModel = firestore.collection("applicants"); const getAllApplications = async (limit: number, lastDocId?: string) => { @@ -134,7 +136,7 @@ const updateApplication = async (dataToUpdate: object, applicationId: string) => } }; -module.exports = { +export { getAllApplications, getUserApplications, addApplication, diff --git a/models/arts.js b/models/arts.js index 418008a47..1e8528a66 100644 --- a/models/arts.js +++ b/models/arts.js @@ -1,4 +1,6 @@ -const firestore = require("../utils/firestore"); +import firestore from "../utils/firestore.js"; +import logger from "../utils/logger.js"; + const artsModel = firestore.collection("arts"); /** @@ -62,8 +64,4 @@ const fetchUserArts = async (id) => { } }; -module.exports = { - addArt, - fetchArts, - fetchUserArts, -}; +export default { addArt, fetchArts, fetchUserArts }; diff --git a/models/auctions.js b/models/auctions.js index b71b10831..6334eda1c 100644 --- a/models/auctions.js +++ b/models/auctions.js @@ -1,8 +1,10 @@ -const firestore = require("../utils/firestore"); +import firestore from "../utils/firestore.js"; +import * as usersUtils from "../utils/users.js"; +import * as walletModels from "./wallets.js"; +import logger from "../utils/logger.js"; + const auctionsModel = firestore.collection("auctions"); const bidsModel = firestore.collection("bids"); -const usersUtils = require("../utils/users"); -const walletModels = require("./wallets"); /** * Fetches auction details by auctionId @@ -184,10 +186,4 @@ const makeNewBid = async ({ bidder, auctionId, bid }) => { } }; -module.exports = { - fetchAuctionById, - fetchAvailableAuctions, - fetchAuctionBidders, - createNewAuction, - makeNewBid, -}; +export default { fetchAuctionById, fetchAvailableAuctions, fetchAuctionBidders, createNewAuction, makeNewBid }; diff --git a/models/badges.js b/models/badges.js index d0901eb67..b7f950e31 100644 --- a/models/badges.js +++ b/models/badges.js @@ -1,15 +1,12 @@ -const admin = require("firebase-admin"); -const firestore = require("../utils/firestore"); +import { ERROR_MESSAGES } from "../constants/badges.js"; +import { DOCUMENT_WRITE_SIZE } from "../constants/constants.js"; +import { chunks } from "../utils/array.js"; +import { assignOrRemoveBadgesInBulk, convertFirebaseDocumentToBadgeDocument } from "../utils/badges.js"; +import firestore from "../utils/firestore.js"; +import logger from "../utils/logger.js"; + const badgeModel = firestore.collection("badges"); const userBadgeModel = firestore.collection("userBadges"); -const { - convertFirebaseTimestampToDateTime, - convertFirebaseDocumentToBadgeDocument, - assignOrRemoveBadgesInBulk, -} = require("../utils/badges"); -const { chunks } = require("../utils/array"); -const { ERROR_MESSAGES } = require("../constants/badges"); -const { DOCUMENT_WRITE_SIZE } = require("../constants/constants"); const MODEL_ERROR_MESSAGES = ERROR_MESSAGES.MODELS; /** @@ -17,7 +14,7 @@ const MODEL_ERROR_MESSAGES = ERROR_MESSAGES.MODELS; * @param query { Object }: Filter for badges data * @return {Promise}: returns all badges */ -const fetchBadges = async ({ size = 100, page = 0 }) => { +export const fetchBadges = async ({ size = 100, page = 0 }) => { try { const snapshot = await badgeModel .limit(parseInt(size)) @@ -37,7 +34,7 @@ const fetchBadges = async ({ size = 100, page = 0 }) => { * @param userId : Filter for badges data * @return {Promise}: <{badges: Array} returns badges array */ -async function fetchUserBadges(userId) { +export const fetchUserBadges = async (userId) => { try { const badgeIdsSnapshot = await userBadgeModel.where("userId", "==", userId).get(); // INFO: if userId is incorrect it returns success response @@ -48,85 +45,67 @@ async function fetchUserBadges(userId) { const badgeId = doc.get("badgeId"); return firestore.doc(`badges/${badgeId}`); }); - // INFO: getAll accepts unpacked array - const badgesSnapshot = await firestore.getAll(...badgeDocReferences); - const badges = badgesSnapshot.map((doc) => convertFirebaseDocumentToBadgeDocument(doc.id, doc.data())); - return { badges }; + const badgeDocs = await firestore.getAll(...badgeDocReferences); + const badges = badgeDocs.map((doc) => { + if (!doc.exists) { + return null; + } + return convertFirebaseDocumentToBadgeDocument(doc.id, doc.data()); + }); + return { badges: badges.filter(Boolean) }; } catch (err) { logger.error(MODEL_ERROR_MESSAGES.FETCH_USER_BADGES, err); throw Error(err?.message ?? MODEL_ERROR_MESSAGES.FETCH_USER_BADGES); } -} +}; /** - * Add badge to firestore - * @param badgeInfo { Object }: has badge name, description, imageUrl and createdBy - * @return {Promise}: <{id: string, createdAt: {date: string, time: string}, data: any> returns badge object + * Creates a new badge + * @param badgeInfo { Object }: Badge information + * @return {Promise}: returns created badge */ -async function createBadge(badgeInfo) { +export const createBadge = async (badgeInfo) => { try { - const createdAt = admin.firestore.Timestamp.now(); - // INFO: description is optional - const description = badgeInfo.description ?? ""; - const docRef = await badgeModel.add({ - ...badgeInfo, - description, - createdAt, - }); - const { date, time } = convertFirebaseTimestampToDateTime(createdAt); - const snapshot = await docRef.get(); - const data = snapshot.data(); - return { id: docRef.id, ...data, createdAt: { date, time } }; + const { id } = await badgeModel.add(badgeInfo); + return { id, ...badgeInfo }; } catch (err) { logger.error(MODEL_ERROR_MESSAGES.CREATE_BADGE, err); throw Error(err?.message ?? MODEL_ERROR_MESSAGES.CREATE_BADGE); } -} +}; /** - * assign badges to a user - * @param { Object }: userId: string and badgeIds: Array - * @return {Promise}: > returns void promise + * Assigns badges to a user + * @param userId : User ID + * @param badgeIds >: Array of badge IDs + * @return {Promise}: */ -async function assignBadges({ userId, badgeIds }) { +export const assignBadges = async ({ userId, badgeIds }) => { try { - const badgeIdsChunks = chunks(badgeIds, DOCUMENT_WRITE_SIZE); - const bulkWriterBatches = badgeIdsChunks.map((value) => assignOrRemoveBadgesInBulk({ userId, array: value })); - return await Promise.all(bulkWriterBatches); + const badgeChunks = chunks(badgeIds, DOCUMENT_WRITE_SIZE); + for (const chunk of badgeChunks) { + await assignOrRemoveBadgesInBulk(userId, chunk, "assign"); + } } catch (err) { logger.error(MODEL_ERROR_MESSAGES.ASSIGN_BADGES, err); throw Error(err?.message ?? MODEL_ERROR_MESSAGES.ASSIGN_BADGES); } -} +}; /** - * remove assigned badges from a user - * @param { Object }: userId: string and badgeIds: Array - * @return {Promise}: > returns void promise + * Removes badges from a user + * @param userId : User ID + * @param badgeIds >: Array of badge IDs + * @return {Promise}: */ -async function removeBadges({ userId, badgeIds }) { +export const removeBadges = async ({ userId, badgeIds }) => { try { - const snapshot = await userBadgeModel.where("userId", "==", userId).where("badgeId", "in", badgeIds).get(); - // INFO[Promise.resolve]: trick to silent eslint: consistent-return - if (snapshot.empty) { - return Promise.resolve(); + const badgeChunks = chunks(badgeIds, DOCUMENT_WRITE_SIZE); + for (const chunk of badgeChunks) { + await assignOrRemoveBadgesInBulk(userId, chunk, "remove"); } - const documentRefferences = snapshot.docs.map((doc) => doc.ref); - const documentsRefferencesChunks = chunks(documentRefferences, DOCUMENT_WRITE_SIZE); - const bulkWriterBatches = documentsRefferencesChunks.map((value) => - assignOrRemoveBadgesInBulk({ userId, array: value, isRemove: true }) - ); - return await Promise.all(bulkWriterBatches); } catch (err) { logger.error(MODEL_ERROR_MESSAGES.REMOVE_BADGES, err); throw Error(err?.message ?? MODEL_ERROR_MESSAGES.REMOVE_BADGES); } -} - -module.exports = { - fetchBadges, - fetchUserBadges, - createBadge, - assignBadges, - removeBadges, }; diff --git a/models/chaincodes.js b/models/chaincodes.js index 3d2eeaa12..a320cf5a2 100644 --- a/models/chaincodes.js +++ b/models/chaincodes.js @@ -1,7 +1,9 @@ -const firestore = require("../utils/firestore"); -const admin = require("firebase-admin"); +import firestore from "../utils/firestore.js"; +import admin from "firebase-admin"; +import logger from "../utils/logger.js"; const chaincodeModel = firestore.collection("chaincodes"); + const storeChaincode = async (userId) => { try { const userChaincode = await chaincodeModel.add({ @@ -15,6 +17,4 @@ const storeChaincode = async (userId) => { } }; -module.exports = { - storeChaincode, -}; +export { storeChaincode }; diff --git a/models/challenges.js b/models/challenges.js index 71dac11e7..fa4340f13 100644 --- a/models/challenges.js +++ b/models/challenges.js @@ -3,9 +3,10 @@ * This will contain the DB schema if we start consuming an ORM for managing the DB operations */ -const Firestore = require("@google-cloud/firestore"); -const firestore = require("../utils/firestore"); -const { fetchUser } = require("./users"); +import Firestore from "@google-cloud/firestore"; +import firestore from "../utils/firestore.js"; +import { fetchUser } from "./users.js"; +import logger from "../utils/logger.js"; const challengesModel = firestore.collection("challenges"); const userModel = firestore.collection("users"); @@ -18,7 +19,6 @@ const ERROR_MESSAGE = "Error getting challenges"; * Fetch the challenges * @return {Promise} */ - const fetchChallenges = async () => { try { const challengesSnapshot = await challengesModel.get(); @@ -48,35 +48,24 @@ const fetchParticipantsData = async (participants) => { return { ...user, phone: undefined, - email: undefined, }; }); - const fetchedparticipants = await Promise.all(promises); - return fetchedparticipants; + return Promise.all(promises); } catch (err) { - logger.error("Failed to get participated users", err); + logger.error(ERROR_MESSAGE, err); throw err; } }; /** - * Post the challenge - * @return {Promise} + * Post a new challenge + * @param {Object} challengeData + * @returns {Promise} */ - const postChallenge = async (challengeData) => { try { - const { start_date: startDate, end_date: endDate } = challengeData; - const startdate = new Firestore.Timestamp(startDate, 0); - const enddate = new Firestore.Timestamp(endDate, 0); - const challengeRef = await challengesModel.add({ - ...challengeData, - start_date: startdate, - end_date: enddate, - participants: [], - is_active: true, - }); - return challengeRef.id; + const { id } = await challengesModel.add(challengeData); + return { id, ...challengeData }; } catch (err) { logger.error(ERROR_MESSAGE, err); throw err; @@ -84,31 +73,34 @@ const postChallenge = async (challengeData) => { }; /** + * Subscribe a user to a challenge * @param {String} userId * @param {String} challengeId - * @return {Promise} + * @returns {Promise} */ - const subscribeUserToChallenge = async (userId, challengeId) => { try { - const getUser = await userModel.doc(userId).get(); - const user = getUser.data(); - if (user) { - const challengeRef = await challengesModel.doc(challengeId); - await challengeRef.update({ participants: Firestore.FieldValue.arrayUnion(userId) }); - return challengeRef.get(); - } else { + const userDoc = await userModel.doc(userId).get(); + if (!userDoc.exists) { throw new Error(USER_DOES_NOT_EXIST_ERROR); } + const challengeDoc = await challengesModel.doc(challengeId).get(); + if (!challengeDoc.exists) { + throw new Error(CANNOT_SUBSCRIBE); + } + const challengeData = challengeDoc.data(); + const participants = challengeData.participants || []; + if (participants.includes(userId)) { + return challengeData; + } + await challengesModel.doc(challengeId).update({ + participants: Firestore.FieldValue.arrayUnion(userId), + }); + return { ...challengeData, participants: [...participants, userId] }; } catch (err) { - logger.error(CANNOT_SUBSCRIBE, err); + logger.error(ERROR_MESSAGE, err); throw err; } }; -module.exports = { - fetchChallenges, - postChallenge, - subscribeUserToChallenge, - fetchParticipantsData, -}; +export default { fetchChallenges, fetchParticipantsData, postChallenge, subscribeUserToChallenge }; diff --git a/models/discordactions.js b/models/discordactions.js index dabff6f2c..4420ac196 100644 --- a/models/discordactions.js +++ b/models/discordactions.js @@ -1,35 +1,36 @@ -const { generateDiscordProfileImageUrl } = require("../utils/discord-actions"); -const firestore = require("../utils/firestore"); +import { generateDiscordProfileImageUrl } from "../utils/discord-actions.js"; +import firestore from "../utils/firestore.js"; +import admin from "firebase-admin"; +import { findSubscribedGroupIds } from "../utils/helper.js"; +import { retrieveUsers } from "../services/dataAccessLayer.js"; +import { BATCH_SIZE_IN_CLAUSE } from "../constants/firebase.js"; +import { getAllUserStatus, getGroupRole, getUserStatus } from "./userStatus.js"; +import { userState } from "../constants/userStatus.js"; +import { ONE_DAY_IN_MS, SIMULTANEOUS_WORKER_CALLS, FIRESTORE_IN_CLAUSE_SIZE } from "../constants/users.js"; +import { getDiscordMembers, addRoleToUser, removeRoleFromUser } from "../services/discordService.js"; +import config from "config"; +import { updateNickname } from "../utils/users.js"; +import { getUsersBasedOnFilter, fetchUser } from "./users.js"; +import { convertDaysToMilliseconds, convertMillisToSeconds } from "../utils/time.js"; +import { chunks } from "../utils/array.js"; +import { buildTasksQueryForMissedUpdates } from "../utils/tasks.js"; +import { buildProgressQueryForMissedUpdates } from "../utils/progresses.js"; +import { getRequestByKeyValues } from "./requests.js"; +import { REQUEST_TYPE, REQUEST_STATE } from "../constants/requests.js"; +import logger from "../utils/logger.js"; + const discordRoleModel = firestore.collection("discord-roles"); const memberRoleModel = firestore.collection("member-group-roles"); const discordInvitesModel = firestore.collection("discord-invites"); -const admin = require("firebase-admin"); -const { findSubscribedGroupIds } = require("../utils/helper"); -const { retrieveUsers } = require("../services/dataAccessLayer"); -const { BATCH_SIZE_IN_CLAUSE } = require("../constants/firebase"); -const { getAllUserStatus, getGroupRole, getUserStatus } = require("./userStatus"); -const { userState } = require("../constants/userStatus"); -const { ONE_DAY_IN_MS, SIMULTANEOUS_WORKER_CALLS } = require("../constants/users"); const userModel = firestore.collection("users"); const photoVerificationModel = firestore.collection("photo-verification"); -const dataAccess = require("../services/dataAccessLayer"); -const { getDiscordMembers, addRoleToUser, removeRoleFromUser } = require("../services/discordService"); +const userStatusModel = firestore.collection("usersStatus"); +const tasksModel = firestore.collection("tasks"); + const discordDeveloperRoleId = config.get("discordDeveloperRoleId"); const discordMavenRoleId = config.get("discordMavenRoleId"); const discordMissedUpdatesRoleId = config.get("discordMissedUpdatesRoleId"); -const userStatusModel = firestore.collection("usersStatus"); -const usersUtils = require("../utils/users"); -const { getUsersBasedOnFilter, fetchUser } = require("./users"); -const { convertDaysToMilliseconds, convertMillisToSeconds } = require("../utils/time"); -const { chunks } = require("../utils/array"); -const tasksModel = firestore.collection("tasks"); -const { FIRESTORE_IN_CLAUSE_SIZE } = require("../constants/users"); -const discordService = require("../services/discordService"); -const { buildTasksQueryForMissedUpdates } = require("../utils/tasks"); -const { buildProgressQueryForMissedUpdates } = require("../utils/progresses"); -const { getRequestByKeyValues } = require("./requests"); -const { REQUEST_TYPE, REQUEST_STATE } = require("../constants/requests"); const allMavens = []; /** @@ -562,15 +563,15 @@ const updateUsersNicknameStatus = async (lastNicknameUpdate) => { const { state: currentState } = currentStatus; if (currentState === userState.OOO && today <= currentStatus.until) { - promises.push(usersUtils.updateNickname(userId, currentStatus)); + promises.push(updateNickname(userId, currentStatus)); } else if ( futureState === userState.OOO && today + 3 * ONE_DAY_IN_MS >= futureStatus.from && today <= futureStatus.until ) { - promises.push(usersUtils.updateNickname(userId, futureStatus)); + promises.push(updateNickname(userId, futureStatus)); } else { - promises.push(usersUtils.updateNickname(userId)); + promises.push(updateNickname(userId)); } }); @@ -868,7 +869,7 @@ const updateUsersWith31DaysPlusOnboarding = async () => { usersForRoleAddition.map(async (user) => { const userDiscordId = user.discordId; try { - const result = await dataAccess.retrieveUsers({ id: userDiscordId }); + const result = await retrieveUsers({ id: userDiscordId }); if (result.user?.roles?.archived) { totalArchivedUsers++; } else if (!userDiscordId) { @@ -966,7 +967,7 @@ const getMissedProgressUpdatesUsers = async (options = {}) => { missedUpdatesTasks: 0, }; try { - const discordUsersPromise = discordService.getDiscordMembers(); + const discordUsersPromise = getDiscordMembers(); const missedUpdatesRoleId = discordMissedUpdatesRoleId; let gapWindowStart = Date.now() - convertDaysToMilliseconds(dateGap); @@ -1154,28 +1155,28 @@ const groupUpdateLastJoinDate = async ({ id }) => { return { updated: true }; }; -module.exports = { +export { createNewRole, + deleteGroupRole, removeMemberGroup, - getGroupRolesForUser, + deleteRoleFromDatabase, getPaginatedGroupRolesByPage, getAllGroupRoles, getGroupRoleByName, updateGroupRole, - addGroupRoleToMember, isGroupRoleExists, - deleteRoleFromDatabase, + getGroupRolesForUser, + addGroupRoleToMember, updateDiscordImageForVerification, enrichGroupDataWithMembershipInfo, fetchGroupToUserMapping, updateIdleUsersOnDiscord, updateUsersNicknameStatus, updateIdle7dUsersOnDiscord, + skipOnboardingUsersHavingApprovedExtensionRequest, updateUsersWith31DaysPlusOnboarding, getMissedProgressUpdatesUsers, - getUserDiscordInvite, addInviteToInviteModel, + getUserDiscordInvite, groupUpdateLastJoinDate, - deleteGroupRole, - skipOnboardingUsersHavingApprovedExtensionRequest, }; diff --git a/models/events.js b/models/events.js index fb15219c1..08508b21e 100644 --- a/models/events.js +++ b/models/events.js @@ -1,7 +1,6 @@ -const admin = require("firebase-admin"); -const Firestore = require("@google-cloud/firestore"); -const firestore = require("../utils/firestore"); -const logger = require("../utils/logger"); +import Firestore from "@google-cloud/firestore"; +import firestore from "../utils/firestore.js"; +import logger from "../utils/logger.js"; const eventModel = firestore.collection("events"); const peerModel = firestore.collection("peers"); @@ -82,7 +81,6 @@ const endActiveEvent = async ({ id, reason, lock }) => { * @returns {Promise} The data of the added peer. * @throws {Error} If an error occurs while adding the peer to the event. */ - const addPeerToEvent = async (peerData) => { try { const batch = firestore.batch(); @@ -192,6 +190,7 @@ const kickoutPeer = async ({ eventId, peerId, reason }) => { throw error; } }; + /** * Creates an events code document in the Firestore database with the given event code data. * @async @@ -199,110 +198,49 @@ const kickoutPeer = async ({ eventId, peerId, reason }) => { * @param {object} eventCodeData - The data for the event code to be created. * @throws {Error} If an error occurs while creating the event code document. */ - const createEventCode = async (eventCodeData) => { try { - const eventRef = eventModel.doc(eventCodeData.event_id); - const eventSnapshot = await eventRef.get(); - const eventSnapshotData = eventSnapshot.data(); - const createdAndUpdatedAt = admin.firestore.Timestamp.now(); const docRef = eventCodeModel.doc(eventCodeData.id); - - await docRef.set({ ...eventCodeData, created_at: createdAndUpdatedAt, updated_at: createdAndUpdatedAt }); - + await docRef.set(eventCodeData); const docSnapshot = await docRef.get(); const data = docSnapshot.data(); - - const previouslyPresentEventCodes = eventSnapshotData?.event_codes?.by_role?.mavens && [ - ...eventSnapshotData?.event_codes?.by_role?.mavens, - ]; - - if (!data) throw new Error(); - - if (previouslyPresentEventCodes?.length) { - await eventRef.update({ - event_codes: { - by_role: { - mavens: [...previouslyPresentEventCodes, data?.id], - }, - }, - }); - } else { - await eventRef.update({ - event_codes: { - by_role: { - mavens: [data?.id], - }, - }, - }); - } - - const updatedEventRef = eventModel.doc(eventCodeData.event_id); - const updatedEventSnapshot = await updatedEventRef.get(); - const updatedEventSnapshotData = updatedEventSnapshot.data(); - const allEventCodesIdsForMavens = updatedEventSnapshotData?.event_codes?.by_role?.mavens; - - const allEventCodesIdsForMavensPromises = allEventCodesIdsForMavens.map(async (eventCodeRefId) => { - const eventCodeRef = eventCodeModel.doc(eventCodeRefId); - const eventCodeSnapshot = await eventCodeRef.get(); - const eventCodeData = eventCodeSnapshot.data(); - return eventCodeData; - }); - - const allEventCodesForMavens = await Promise.all(allEventCodesIdsForMavensPromises); - - return allEventCodesForMavens; - } catch (error) { - logger.error("Error in creating event code", error); - throw error; - } -}; - -const getEventById = async ({ id }) => { - try { - const eventRef = eventModel.doc(id); - const eventSnapshot = await eventRef.get(); - const eventSnapshotData = eventSnapshot.data(); - return eventSnapshotData; + return data; } catch (error) { - logger.error("Error in getting event by id from the database.", error); + logger.error("Error in creating event code.", error); throw error; } }; +/** + * Gets event codes for a particular event from the Firestore database. + * @async + * @function + * @param {object} params - The parameters for getting event codes. + * @param {string} params.id - The unique identifier of the event. + * @returns {Promise} The event codes for the specified event. + * @throws {Error} If an error occurs while retrieving the event codes. + */ const getEventCodes = async ({ id }) => { try { - const eventData = await getEventById({ id }); - if (!eventData) { - throw new Error("Event not found with this id!"); - } - const eventCodesArrayPromises = eventData?.event_codes?.by_role?.mavens.map(async (codeId) => { - const eventCodeRef = eventCodeModel.doc(codeId); - const eventCodeSnapshot = await eventCodeRef.get(); - const eventCodeSnapshotData = eventCodeSnapshot.data(); - return eventCodeSnapshotData; + const eventCodesSnapshot = await eventCodeModel.where("event_id", "==", id).get(); + const eventCodes = []; + eventCodesSnapshot.forEach((doc) => { + eventCodes.push(doc.data()); }); - - if (!eventCodesArrayPromises) { - throw new Error("Event codes not found with this event id!"); - } - - const eventCodesArray = await Promise.all(eventCodesArrayPromises); - return eventCodesArray; + return eventCodes; } catch (error) { - logger.error("Error in getting event by id from the database.", error); + logger.error("Error in getting event codes.", error); throw error; } }; -module.exports = { - createEvent, - updateEvent, - endActiveEvent, +export { addPeerToEvent, - kickoutPeer, + createEvent, createEventCode, - getEventById, + endActiveEvent, getEventCodes, getPeerById, + kickoutPeer, + updateEvent, }; diff --git a/models/extensionRequests.js b/models/extensionRequests.js index 632ce1423..1b57952bb 100644 --- a/models/extensionRequests.js +++ b/models/extensionRequests.js @@ -1,6 +1,8 @@ -const firestore = require("../utils/firestore"); +import firestore from "../utils/firestore.js"; +import { buildExtensionRequests, formatExtensionRequest, generateNextLink } from "../utils/extensionRequests.js"; +import logger from "../utils/logger.js"; + const extensionRequestsModel = firestore.collection("extensionRequests"); -const { buildExtensionRequests, formatExtensionRequest, generateNextLink } = require("../utils/extensionRequests"); /** * Create Extension Request @@ -166,7 +168,7 @@ const fetchLatestExtensionRequest = async (ExtensionRequestQuery) => { } }; -module.exports = { +export { createExtensionRequest, fetchExtensionRequests, fetchExtensionRequest, diff --git a/models/external-accounts.js b/models/external-accounts.js index 2b21aa86e..d1dce3411 100644 --- a/models/external-accounts.js +++ b/models/external-accounts.js @@ -1,4 +1,6 @@ -const firestore = require("../utils/firestore"); +import firestore from "../utils/firestore.js"; +import logger from "../utils/logger.js"; + const externalAccountsModel = firestore.collection("external-accounts"); const addExternalAccountData = async (data) => { @@ -38,4 +40,4 @@ const fetchExternalAccountData = async (query, param) => { } }; -module.exports = { addExternalAccountData, fetchExternalAccountData }; +export { addExternalAccountData, fetchExternalAccountData }; diff --git a/models/fcmToken.js b/models/fcmToken.js index 7c8258b9b..13ee82540 100644 --- a/models/fcmToken.js +++ b/models/fcmToken.js @@ -1,5 +1,6 @@ -const firestore = require("../utils/firestore"); -const { Conflict } = require("http-errors"); +import firestore from "../utils/firestore.js"; +import httpError from "http-errors"; +import logger from "../utils/logger.js"; const fcmTokenModel = firestore.collection("fcmToken"); @@ -28,7 +29,7 @@ const saveFcmToken = async (fcmTokenData) => { }); return fcmTokenObj.id; } else { - throw new Conflict("Device Already Registered"); + throw new httpError.Conflict("Device Already Registered"); } } } catch (err) { @@ -37,4 +38,4 @@ const saveFcmToken = async (fcmTokenData) => { } }; -module.exports = { saveFcmToken }; +export { saveFcmToken }; diff --git a/models/items.js b/models/items.js index ad76f2353..98c636ab4 100644 --- a/models/items.js +++ b/models/items.js @@ -1,4 +1,5 @@ -const firestore = require("../utils/firestore"); +import firestore from "../utils/firestore.js"; +import logger from "../utils/logger.js"; const itemTagsModel = firestore.collection("itemTags"); const tagModel = firestore.collection("tags"); @@ -91,8 +92,4 @@ const getItemBasedOnFilter = async (query) => { } }; -module.exports = { - addTagsToItem, - removeTagsFromItem, - getItemBasedOnFilter, -}; +export default { addTagsToItem, removeTagsFromItem, getItemBasedOnFilter }; diff --git a/models/levels.js b/models/levels.js index 7751fe006..7912c6ef3 100644 --- a/models/levels.js +++ b/models/levels.js @@ -1,4 +1,6 @@ -const firestore = require("../utils/firestore"); +import firestore from "../utils/firestore.js"; +import logger from "../utils/logger.js"; + const levelModel = firestore.collection("levels"); /** @@ -56,8 +58,4 @@ const getAllLevels = async () => { } }; -module.exports = { - addLevel, - deleteLevel, - getAllLevels, -}; +export default { addLevel, deleteLevel, getAllLevels }; diff --git a/models/logs.js b/models/logs.js index a12b9ab7c..879c34c90 100644 --- a/models/logs.js +++ b/models/logs.js @@ -1,17 +1,13 @@ -const firestore = require("../utils/firestore"); -const { getBeforeHourTime } = require("../utils/time"); +import firestore from "../utils/firestore.js"; +import { getBeforeHourTime } from "../utils/time.js"; +import admin from "firebase-admin"; +import { logType, ERROR_WHILE_FETCHING_LOGS } from "../constants/logs.js"; +import { INTERNAL_SERVER_ERROR } from "../constants/errorMessages.js"; +import { getFullName, getUserId } from "../utils/users.js"; +import { getUsersListFromLogs, formatLogsForFeed, mapify, convertTimestamp, getTasksFromLogs } from "../utils/logs.js"; +import logger from "../utils/logger.js"; + const logsModel = firestore.collection("logs"); -const admin = require("firebase-admin"); -const { logType, ERROR_WHILE_FETCHING_LOGS } = require("../constants/logs"); -const { INTERNAL_SERVER_ERROR } = require("../constants/errorMessages"); -const { getFullName, getUserId } = require("../utils/users"); -const { - getUsersListFromLogs, - formatLogsForFeed, - mapify, - convertTimestamp, - getTasksFromLogs, -} = require("../utils/logs"); const SIZE = 25; /** @@ -345,11 +341,4 @@ const updateLogs = async () => { } }; -module.exports = { - addLog, - fetchLogs, - fetchCacheLogs, - fetchLastAddedCacheLog, - fetchAllLogs, - updateLogs, -}; +export { addLog, fetchLogs, fetchCacheLogs, fetchLastAddedCacheLog, fetchAllLogs, updateLogs }; diff --git a/models/members.js b/models/members.js index a666b210e..e2bfb9cc5 100644 --- a/models/members.js +++ b/models/members.js @@ -3,9 +3,11 @@ * This will contain the DB schema if we start consuming an ORM for managing the DB operations */ -const firestore = require("../utils/firestore"); +import firestore from "../utils/firestore.js"; +import { ROLES } from "../constants/roles.js"; + const userModel = firestore.collection("users"); -const ROLES = require("../constants/roles"); + /** * Fetches the data about our users * @return {Promise} @@ -111,9 +113,4 @@ const addArchiveRoleToMembers = async (userId) => { } }; -module.exports = { - moveToMembers, - addArchiveRoleToMembers, - fetchUsers, - fetchUsersWithRole, -}; +export { moveToMembers, addArchiveRoleToMembers, fetchUsers, fetchUsersWithRole }; diff --git a/models/monitor.js b/models/monitor.js index 36cfad3f8..17972067a 100644 --- a/models/monitor.js +++ b/models/monitor.js @@ -1,15 +1,16 @@ -const { Conflict, NotFound } = require("http-errors"); -const fireStore = require("../utils/firestore"); +import httpError from "http-errors"; +import fireStore from "../utils/firestore.js"; +import { assertUserOrTaskExists } from "../utils/progresses.js"; +import { buildQueryByTypeId, buildQueryForFetchingDocsOfType, getTrackedProgressDocs } from "../utils/monitor.js"; +import { RESPONSE_MESSAGES } from "../constants/monitor.js"; + const trackedProgressesCollection = fireStore.collection("trackedProgresses"); -const { assertUserOrTaskExists } = require("../utils/progresses"); -const { buildQueryByTypeId, buildQueryForFetchingDocsOfType, getTrackedProgressDocs } = require("../utils/monitor"); -const { RESPONSE_MESSAGES } = require("../constants/monitor"); const { RESOURCE_NOT_FOUND, RESOURCE_ALREADY_TRACKED } = RESPONSE_MESSAGES; /** * Creates a tracked progress document based on the provided data. * If a document with the same userId and taskId already exists, - * a Conflict error is thrown. + * a httpError.Conflict error is thrown. * * @param {Object} documentData - The data for creating the tracked progress document. * @param {string} documentData.userId - The ID of the user associated with the tracked progress. @@ -17,7 +18,7 @@ const { RESOURCE_NOT_FOUND, RESOURCE_ALREADY_TRACKED } = RESPONSE_MESSAGES; * @param {number} [documentData.frequency=1] - The frequency of tracking (optional, default: 1). * @param {boolean} documentData.marked - Indicates if the user/task is currently being marked for tracking. * @returns {Object} - The created tracked progress document with additional ID and timestamps. - * @throws {Conflict} - If a document with the same userId and taskId already exists. + * @throws {httpError.Conflict} - If a document with the same userId and taskId already exists. */ const createTrackedProgressDocument = async (documentData) => { const { userId, taskId } = documentData; @@ -25,7 +26,7 @@ const createTrackedProgressDocument = async (documentData) => { const query = buildQueryByTypeId({ userId, taskId }); const existingDocumentSnapshot = await query.get(); if (!existingDocumentSnapshot.empty) { - throw new Conflict(RESOURCE_ALREADY_TRACKED); + throw new httpError.Conflict(RESOURCE_ALREADY_TRACKED); } const timeNow = new Date().toISOString(); // if not passed, the default frequency of 1 will be used as the frequency @@ -38,7 +39,7 @@ const createTrackedProgressDocument = async (documentData) => { /** * Updates a tracked progress document based on the provided request data. * The document to update is determined by the type and typeId parameters from the request parameters. - * If the document is not found, a NotFound error is thrown. + * If the document is not found, a httpError.NotFound error is thrown. * * @param {Object} req - The request object containing the parameters and body data. * @param {Object} req.params - The parameters extracted from the request URL. @@ -48,7 +49,7 @@ const createTrackedProgressDocument = async (documentData) => { * @param {number} [req.body.frequency] - The frequency of tracking (optional). * @param {boolean} [req.body.marked] - Indicates if the user/task is currently being marked for tracking.(optional). * @returns {Object} - The updated tracked progress document with additional ID and merged data. - * @throws {NotFound} - If the tracked progress document is not found. + * @throws {httpError.NotFound} - If the tracked progress document is not found. */ const updateTrackedProgressDocument = async (req) => { @@ -57,7 +58,7 @@ const updateTrackedProgressDocument = async (req) => { const query = buildQueryByTypeId(updatedData); const existingDocumentSnapshot = await query.get(); if (existingDocumentSnapshot.empty) { - throw new NotFound(RESOURCE_NOT_FOUND); + throw new httpError.NotFound(RESOURCE_NOT_FOUND); } const doc = existingDocumentSnapshot.docs[0]; const docId = doc.id; @@ -71,7 +72,7 @@ const updateTrackedProgressDocument = async (req) => { * * @param {Object} reqQuery - The query parameters for fetching tracked progress document(s). * @returns {Object| Array} - The tracked progress document or list of tracked documents matching the query. - * @throws {NotFound} - If the tracked progress document is not found. + * @throws {httpError.NotFound} - If the tracked progress document is not found. */ const getTrackedProgressDocuments = async (reqQuery) => { @@ -89,8 +90,4 @@ const getTrackedProgressDocuments = async (reqQuery) => { return docsData; }; -module.exports = { - createTrackedProgressDocument, - updateTrackedProgressDocument, - getTrackedProgressDocuments, -}; +export { createTrackedProgressDocument, updateTrackedProgressDocument, getTrackedProgressDocuments }; diff --git a/models/profileDiffs.js b/models/profileDiffs.js index 34b64e340..878e8d4ed 100644 --- a/models/profileDiffs.js +++ b/models/profileDiffs.js @@ -1,9 +1,10 @@ -const { profileStatus } = require("../constants/users"); -const firestore = require("../utils/firestore"); +import { profileStatus } from "../constants/users.js"; +import firestore from "../utils/firestore.js"; +import * as obfuscate from "../utils/obfuscate.js"; +import { generateNextLink } from "../utils/profileDiffs.js"; + const userModel = firestore.collection("users"); const profileDiffsModel = firestore.collection("profileDiffs"); -const obfuscate = require("../utils/obfuscate"); -const { generateNextLink } = require("../utils/profileDiffs"); /** * Add profileDiff @@ -199,11 +200,11 @@ const updateProfileDiff = async (profileDiffData, profileId) => { } }; -module.exports = { +export default { fetchProfileDiffs, + fetchProfileDiffsWithPagination, fetchProfileDiff, + fetchProfileDiffUnobfuscated, add, updateProfileDiff, - fetchProfileDiffsWithPagination, - fetchProfileDiffUnobfuscated, }; diff --git a/models/progresses.js b/models/progresses.js index c0eb353d6..3f7ec9a55 100644 --- a/models/progresses.js +++ b/models/progresses.js @@ -1,8 +1,7 @@ -const { Conflict, NotFound } = require("http-errors"); -const fireStore = require("../utils/firestore"); -const progressesCollection = fireStore.collection("progresses"); -const { PROGRESSES_RESPONSE_MESSAGES, TYPE_MAP } = require("../constants/progresses"); -const { +import httpError from "http-errors"; +import fireStore from "../utils/firestore.js"; +import { PROGRESSES_RESPONSE_MESSAGES, TYPE_MAP } from "../constants/progresses.js"; +import { buildQueryToFetchDocs, getProgressDocs, buildRangeProgressQuery, @@ -14,8 +13,10 @@ const { buildQueryToSearchProgressByDay, buildQueryToFetchPaginatedDocs, getPaginatedProgressDocs, -} = require("../utils/progresses"); -const { retrieveUsers } = require("../services/dataAccessLayer"); +} from "../utils/progresses.js"; +import { retrieveUsers } from "../services/dataAccessLayer.js"; + +const progressesCollection = fireStore.collection("progresses"); const { PROGRESS_ALREADY_CREATED, PROGRESS_DOCUMENT_NOT_FOUND } = PROGRESSES_RESPONSE_MESSAGES; /** @@ -35,7 +36,7 @@ const createProgressDocument = async (progressData) => { const query = buildQueryForPostingProgress(progressData); const existingDocumentSnapshot = await query.where("date", "==", progressDateTimestamp).get(); if (!existingDocumentSnapshot.empty) { - throw new Conflict(`${type.charAt(0).toUpperCase() + type.slice(1)} ${PROGRESS_ALREADY_CREATED}`); + throw new httpError.Conflict(`${type.charAt(0).toUpperCase() + type.slice(1)} ${PROGRESS_ALREADY_CREATED}`); } const progressDocumentData = { ...progressData, createdAt: createdAtTimestamp, date: progressDateTimestamp }; const { id } = await progressesCollection.add(progressDocumentData); @@ -104,7 +105,7 @@ async function getProgressByDate(pathParams, queryParams) { const query = buildQueryToSearchProgressByDay({ [TYPE_MAP[type]]: typeId, date }); const result = await query.get(); if (!result.size) { - throw new NotFound(PROGRESS_DOCUMENT_NOT_FOUND); + throw new httpError.NotFound(PROGRESS_DOCUMENT_NOT_FOUND); } const doc = result.docs[0]; const docData = doc.data(); @@ -146,7 +147,7 @@ const addUserDetailsToProgressDocs = async (progressDocs) => { } }; -module.exports = { +export { createProgressDocument, getProgressDocument, getPaginatedProgressDocument, diff --git a/models/qrCodeAuth.js b/models/qrCodeAuth.js index e071282e8..1511c15e9 100644 --- a/models/qrCodeAuth.js +++ b/models/qrCodeAuth.js @@ -1,4 +1,6 @@ -const firestore = require("../utils/firestore"); +import firestore from "../utils/firestore.js"; +import logger from "../utils/logger.js"; + const QrCodeAuthModel = firestore.collection("QrCodeAuth"); /** @@ -75,8 +77,4 @@ const retrieveUserDeviceInfo = async ({ deviceId, userId }) => { } }; -module.exports = { - updateStatus, - storeUserDeviceInfo, - retrieveUserDeviceInfo, -}; +export default { updateStatus, storeUserDeviceInfo, retrieveUserDeviceInfo }; diff --git a/models/questions.ts b/models/questions.ts index 46b11326f..7d23159d5 100644 --- a/models/questions.ts +++ b/models/questions.ts @@ -1,34 +1,33 @@ -const admin = require("firebase-admin"); - +import admin from "firebase-admin"; import { Question, QuestionBody } from "../types/questions"; - -const firestore = require("../utils/firestore"); +import firestore from "../utils/firestore.js"; +import logger from "../utils/logger.js"; const questionModel = firestore.collection("questions"); -const createQuestion = async (questionData: QuestionBody): Promise => { +const createQuestion = async (inputData: QuestionBody): Promise => { try { - const { eventId: event_id, createdBy: created_by, question, maxCharacters: max_characters } = questionData; - const questionRef = questionModel.doc(questionData.id); + const { eventId: event_id, createdBy: created_by, question, maxCharacters } = inputData; + const questionRef = questionModel.doc(inputData.id); const createdAndUpdatedAt = admin.firestore.Timestamp.now(); - await questionRef.set({ + const questionData: Omit = { question, event_id, created_by, - max_characters: max_characters || null, + max_characters: maxCharacters ? String(maxCharacters) : null, created_at: createdAndUpdatedAt, - updated_at: createdAndUpdatedAt, - }); + }; + + await questionRef.set(questionData); const questionSnapshot = await questionRef.get(); const id = questionSnapshot.id; - const questionFromDB = questionSnapshot.data(); - return { id, ...questionFromDB }; + return { id, ...questionData }; } catch (error) { logger.error(`Some error occured while creating question ${error}`); throw error; } }; -module.exports = { createQuestion }; +export { createQuestion }; diff --git a/models/recruiters.js b/models/recruiters.js index a13013195..71de9472e 100644 --- a/models/recruiters.js +++ b/models/recruiters.js @@ -3,9 +3,10 @@ * This will contain the DB schema if we start consuming an ORM for managing the DB operations */ -const firestore = require("../utils/firestore"); +import firestore from "../utils/firestore.js"; +import * as userModel from "./users.js"; + const recruiterModel = firestore.collection("recruiters"); -const userModel = require("./users"); /** * Add the recruiter data @@ -66,7 +67,4 @@ const fetchRecruitersInfo = async () => { } }; -module.exports = { - addRecruiterInfo, - fetchRecruitersInfo, -}; +export { addRecruiterInfo, fetchRecruitersInfo }; diff --git a/models/requests.ts b/models/requests.ts index 064eebd8c..dc2ecb06b 100644 --- a/models/requests.ts +++ b/models/requests.ts @@ -1,13 +1,15 @@ -import firestore from "../utils/firestore"; +import firestore from "../utils/firestore.js"; +import logger from "../utils/logger.js"; +import { REQUEST_ALREADY_APPROVED, REQUEST_ALREADY_REJECTED, REQUEST_STATE } from "../constants/requests.js"; + const requestModel = firestore.collection("requests"); -import { REQUEST_ALREADY_APPROVED, REQUEST_ALREADY_REJECTED, REQUEST_STATE } from "../constants/requests"; import { ERROR_WHILE_FETCHING_REQUEST, ERROR_WHILE_CREATING_REQUEST, ERROR_WHILE_UPDATING_REQUEST, REQUEST_DOES_NOT_EXIST, -} from "../constants/requests"; -import { getUserId } from "../utils/users"; +} from "../constants/requests.js"; +import { getUserId } from "../utils/users.js"; const SIZE = 5; export const createRequest = async (body: any) => { @@ -88,7 +90,7 @@ export const getRequests = async (query: any) => { ...requestDoc.data(), }; } - + if(requestedBy && dev){ requestQuery = requestQuery.where("requestedBy", "==", requestedBy); } diff --git a/models/stocks.js b/models/stocks.js index 6ab0db2cf..6245ef216 100644 --- a/models/stocks.js +++ b/models/stocks.js @@ -1,4 +1,6 @@ -const firestore = require("../utils/firestore"); +import firestore from "../utils/firestore.js"; +import logger from "../utils/logger.js"; + const stocksModel = firestore.collection("stocks"); const userStocksModel = firestore.collection("user-stocks"); @@ -8,7 +10,7 @@ const userStocksModel = firestore.collection("user-stocks"); * @param stockData { Object }: stock data object to be stored in DB * @return {Promise<{id: string, stockData: Object}>} */ -const addStock = async (stockData) => { +export const addStock = async (stockData) => { try { const { id } = await stocksModel.add(stockData); return { id, stockData }; @@ -23,7 +25,7 @@ const addStock = async (stockData) => { * * @return {Promise} */ -const fetchStocks = async () => { +export const fetchStocks = async () => { try { const stockSnapshot = await stocksModel.get(); const stocks = []; @@ -44,7 +46,7 @@ const fetchStocks = async () => { * Fetches the user stocks * @return {Promise} */ -const fetchUserStocks = async (userId, stockId = null) => { +export const fetchUserStocks = async (userId, stockId = null) => { try { let userStocksRef = ""; const query = userStocksModel.where("userId", "==", userId); @@ -76,7 +78,7 @@ const fetchUserStocks = async (userId, stockId = null) => { * Update Users Stocks * @return {Promise} */ -const updateUserStocks = async (userId, stockData) => { +export const updateUserStocks = async (userId, stockData) => { try { const userStocks = await fetchUserStocks(userId, stockData.stockId); if (!userStocks.id) { @@ -95,10 +97,3 @@ const updateUserStocks = async (userId, stockData) => { throw err; } }; - -module.exports = { - addStock, - fetchStocks, - fetchUserStocks, - updateUserStocks, -}; diff --git a/models/tags.js b/models/tags.js index 6abb02ff9..92c069b02 100644 --- a/models/tags.js +++ b/models/tags.js @@ -1,4 +1,5 @@ -const firestore = require("../utils/firestore"); +import firestore from "../utils/firestore.js"; + const tagModel = firestore.collection("tags"); /** @@ -85,9 +86,4 @@ const getTagByType = async (type) => { } }; -module.exports = { - addTag, - deleteTag, - getAllTags, - getTagByType, -}; +export { addTag, deleteTag, getAllTags, getTagByType }; diff --git a/models/taskRequests.js b/models/taskRequests.js index bf5641281..d3d86b906 100644 --- a/models/taskRequests.js +++ b/models/taskRequests.js @@ -1,4 +1,4 @@ -const { +import { TASK_REQUEST_STATUS, TASK_REQUEST_TYPE, TASK_REQUEST_FILTER_KEYS, @@ -6,17 +6,18 @@ const { TASK_REQUEST_SORT_KEYS, TASK_REQUEST_SORT_VALUES, TASK_REQUEST_ERROR_MESSAGE, -} = require("../constants/taskRequests"); -const { TASK_TYPE, TASK_STATUS, DEFAULT_TASK_PRIORITY } = require("../constants/tasks"); -const { Operators } = require("../typeDefinitions/rqlParser"); -const { RQLQueryParser } = require("../utils/RQLParser"); -const firestore = require("../utils/firestore"); -const { buildTaskRequests, generateLink, transformTaskRequests } = require("../utils/task-requests"); -const { getCurrentEpochTime } = require("../utils/time"); -const { convertMillisToSeconds } = require("../utils/time"); +} from "../constants/taskRequests.js"; +import { TASK_TYPE, TASK_STATUS, DEFAULT_TASK_PRIORITY } from "../constants/tasks.js"; +import { Operators } from "../typeDefinitions/rqlParser.js"; +import { RQLQueryParser } from "../utils/RQLParser.js"; +import firestore from "../utils/firestore.js"; +import { buildTaskRequests, generateLink, transformTaskRequests } from "../utils/task-requests.js"; +import { getCurrentEpochTime, convertMillisToSeconds } from "../utils/time.js"; +import * as tasksModel from "./tasks.js"; +import * as userModel from "./users.js"; +import config from "config"; + const taskRequestsCollection = firestore.collection("taskRequests"); -const tasksModel = require("./tasks"); -const userModel = require("./users"); const tasksCollection = firestore.collection("tasks"); /** @@ -580,15 +581,15 @@ const removeOldField = async () => { return { documentsModified, totalDocuments }; }; -module.exports = { - createRequest, +export default { fetchTaskRequests, + fetchPaginatedTaskRequests, fetchTaskRequestById, + createRequest, addOrUpdate, approveTaskRequest, - fetchPaginatedTaskRequests, + rejectTaskRequest, addNewFields, - removeOldField, addUsersCountAndCreatedAt, - rejectTaskRequest, + removeOldField, }; diff --git a/models/tasks.js b/models/tasks.js index 467903d97..1b3aacbf9 100644 --- a/models/tasks.js +++ b/models/tasks.js @@ -1,13 +1,17 @@ -const firestore = require("../utils/firestore"); +import firestore from "../utils/firestore.js"; +import { chunks } from "../utils/array.js"; +import { DOCUMENT_WRITE_SIZE } from "../constants/constants.js"; +import { fromFirestoreData, toFirestoreData, buildTasks } from "../utils/tasks.js"; +import { TASK_TYPE, TASK_STATUS, TASK_STATUS_OLD, TASK_SIZE, COMPLETED_TASK_STATUS } from "../constants/tasks.js"; +import { INTERNAL_SERVER_ERROR } from "../constants/errorMessages.js"; +import { BATCH_SIZE_IN_CLAUSE } from "../constants/firebase.js"; +import * as userUtils from "../utils/users.js"; +import logger from "../utils/logger.js"; + const tasksModel = firestore.collection("tasks"); const userModel = firestore.collection("users"); const ItemModel = firestore.collection("itemTags"); const dependencyModel = firestore.collection("taskDependencies"); -const userUtils = require("../utils/users"); -const { chunks } = require("../utils/array"); -const { DOCUMENT_WRITE_SIZE } = require("../constants/constants"); -const { fromFirestoreData, toFirestoreData, buildTasks } = require("../utils/tasks"); -const { TASK_TYPE, TASK_STATUS, TASK_STATUS_OLD, TASK_SIZE, COMPLETED_TASK_STATUS } = require("../constants/tasks"); const { IN_PROGRESS, NEEDS_REVIEW, @@ -21,9 +25,8 @@ const { DONE, AVAILABLE, } = TASK_STATUS; + const { OLD_ACTIVE, OLD_BLOCKED, OLD_PENDING, OLD_COMPLETED } = TASK_STATUS_OLD; -const { INTERNAL_SERVER_ERROR } = require("../constants/errorMessages"); -const { BATCH_SIZE_IN_CLAUSE } = require("../constants/firebase"); /** * Update multiple tasks' status to DONE in one batch operation. @@ -770,25 +773,26 @@ const fetchIncompleteTasksByUserIds = async (userIds) => { } }; -module.exports = { +export default { + updateTaskStatusToDone, updateTask, + addDependency, + getBuiltTasks, + fetchPaginatedTasks, fetchTasks, + fetchActiveTaskMembers, fetchTask, + fetchTaskByIssueId, + fetchSelfTask, fetchUserTasks, + getNewTask, + fetchSkillLevelTask, fetchSelfTasks, fetchUserCompletedTasks, - fetchActiveTaskMembers, - fetchSelfTask, - fetchSkillLevelTask, overdueTasks, - addDependency, - fetchTaskByIssueId, - fetchPaginatedTasks, - getBuiltTasks, getOverdueTasks, updateTaskStatus, updateOrphanTasksStatus, markUnDoneTasksOfArchivedUsersBacklog, - updateTaskStatusToDone, fetchIncompleteTasksByUserIds, }; diff --git a/models/userFutureStatus.ts b/models/userFutureStatus.ts index b1e003ba4..84407d693 100644 --- a/models/userFutureStatus.ts +++ b/models/userFutureStatus.ts @@ -1,7 +1,9 @@ -import firestore from "../utils/firestore"; -const userFutureStatusModel = firestore.collection("userFutureStatus"); -import { UserFutureStatusType } from "../types/userFutureStatus"; import * as admin from "firebase-admin"; +import firestore from "../utils/firestore.js"; +import logger from "../utils/logger.js"; +import { UserFutureStatusType } from "../types/userFutureStatus.js"; + +const userFutureStatusModel = firestore.collection("userFutureStatus"); /** * Function to create user future status @@ -53,4 +55,4 @@ export const getUserFutureStatus = async (userId: string, status: string, state: logger.error("Error while fetching user future status", error); throw error; } -}; \ No newline at end of file +}; diff --git a/models/userStatus.js b/models/userStatus.js index 0a250a814..4cc6030e5 100644 --- a/models/userStatus.js +++ b/models/userStatus.js @@ -1,8 +1,8 @@ /* eslint-disable no-console */ -const { Forbidden, NotFound } = require("http-errors"); -const admin = require("firebase-admin"); -const firestore = require("../utils/firestore"); -const { +import httpError from "http-errors"; +import admin from "firebase-admin"; +import firestore from "../utils/firestore.js"; +import { getTomorrowTimeStamp, filterStatusData, generateAlreadyExistingStatusResponse, @@ -15,17 +15,19 @@ const { generateNewStatus, getNextDayTimeStamp, convertTimestampsToUTC, -} = require("../utils/userStatus"); -const { TASK_STATUS } = require("../constants/tasks"); +} from "../utils/userStatus.js"; +import { TASK_STATUS } from "../constants/tasks.js"; +import { userState } from "../constants/userStatus.js"; +import { generateAuthTokenForCloudflare } from "../utils/discord-actions.js"; +import config from "config"; +import logger from "../utils/logger.js"; + const userStatusModel = firestore.collection("usersStatus"); const tasksModel = firestore.collection("tasks"); -const { userState } = require("../constants/userStatus"); const discordRoleModel = firestore.collection("discord-roles"); const memberRoleModel = firestore.collection("member-group-roles"); const usersCollection = firestore.collection("users"); -const config = require("config"); const DISCORD_BASE_URL = config.get("services.discordBot.baseUrl"); -const { generateAuthTokenForCloudflare } = require("../utils/discord-actions"); // added this function here to avoid circular dependency /** @@ -411,7 +413,7 @@ const updateUserStatusOnTaskUpdate = async (userName) => { const userStatusUpdate = await updateUserStatusOnNewTaskAssignment(userId); return userStatusUpdate; } catch (error) { - if (error instanceof NotFound) { + if (error instanceof httpError.NotFound) { return { status: 404, error: "Not Found", @@ -643,13 +645,13 @@ const cancelOooStatus = async (userId) => { throw error; } if (!userStatusDoc.size) { - throw new NotFound("No User status document found"); + throw new httpError.NotFound("No User status document found"); } const [userStatusDocument] = userStatusDoc.docs; const docId = userStatusDocument.id; const { futureStatus, ...docData } = userStatusDocument.data(); if (docData.currentStatus.state !== userState.OOO) { - throw new Forbidden( + throw new httpError.Forbidden( `The ${userState.OOO} Status cannot be canceled because the current status is ${docData.currentStatus.state}.` ); } @@ -705,7 +707,10 @@ const addFutureStatus = async (futureStatusData) => { } }; -module.exports = { +export { + getGroupRole, + removeGroupIdleRoleFromDiscordUser, + addGroupIdleRoleToDiscordUser, deleteUserStatus, getUserStatus, getAllUserStatus, @@ -717,6 +722,5 @@ module.exports = { batchUpdateUsersStatus, getTaskBasedUsersStatus, cancelOooStatus, - getGroupRole, addFutureStatus, }; diff --git a/models/users.js b/models/users.js index 7d64fd194..7d5b42eff 100644 --- a/models/users.js +++ b/models/users.js @@ -2,34 +2,35 @@ * This file contains wrapper functions to interact with the DB. * This will contain the DB schema if we start consuming an ORM for managing the DB operations */ -const walletConstants = require("../constants/wallets"); - -const firestore = require("../utils/firestore"); -const { fetchWallet, createWallet } = require("../models/wallets"); -const { updateUserStatus } = require("../models/userStatus"); -const { arraysHaveCommonItem, chunks } = require("../utils/array"); -const { +import { INITIAL_WALLET } from "../constants/wallets.js"; +import firestore from "../utils/firestore.js"; +import { fetchWallet, createWallet } from "../models/wallets.js"; +import { updateUserStatus } from "../models/userStatus.js"; +import { arraysHaveCommonItem, chunks } from "../utils/array.js"; +import { ALLOWED_FILTER_PARAMS, FIRESTORE_IN_CLAUSE_SIZE, USERS_PATCH_HANDLER_SUCCESS_MESSAGES, USERS_PATCH_HANDLER_ERROR_MESSAGES, -} = require("../constants/users"); -const { DOCUMENT_WRITE_SIZE } = require("../constants/constants"); -const { userState } = require("../constants/userStatus"); -const { BATCH_SIZE_IN_CLAUSE } = require("../constants/firebase"); -const ROLES = require("../constants/roles"); +} from "../constants/users.js"; +import { DOCUMENT_WRITE_SIZE } from "../constants/constants.js"; +import { userState } from "../constants/userStatus.js"; +import { BATCH_SIZE_IN_CLAUSE } from "../constants/firebase.js"; +import { ROLES } from "../constants/roles.js"; +import { INTERNAL_SERVER_ERROR } from "../constants/errorMessages.js"; +import { AUTHORITIES } from "../constants/authorities.js"; +import { formatUsername } from "../utils/username.js"; +import { logType } from "../constants/logs.js"; +import { addLog } from "../services/logService.js"; +import admin from "firebase-admin"; +import logger from "../utils/logger.js"; + const userModel = firestore.collection("users"); const joinModel = firestore.collection("applicants"); const itemModel = firestore.collection("itemTags"); const userStatusModel = firestore.collection("usersStatus"); const photoVerificationModel = firestore.collection("photo-verification"); const { ITEM_TAG, USER_STATE } = ALLOWED_FILTER_PARAMS; -const admin = require("firebase-admin"); -const { INTERNAL_SERVER_ERROR } = require("../constants/errorMessages"); -const { AUTHORITIES } = require("../constants/authorities"); -const { formatUsername } = require("../utils/username"); -const { logType } = require("../constants/logs"); -const { addLog } = require("../services/logService"); /** * Archive users by setting the roles.archived field to true. @@ -464,7 +465,7 @@ const initializeUser = async (userId) => { // Create wallet and give them initial amount const userWallet = await fetchWallet(userId); if (!userWallet) { - await createWallet(userId, walletConstants.INITIAL_WALLET); + await createWallet(userId, INITIAL_WALLET); } await updateUserStatus(userId, { currentStatus: { state: userState.ONBOARDING }, monthlyHours: { committed: 0 } }); return true; @@ -1129,35 +1130,37 @@ const fetchUsersNotInDiscordServer = async () => { } }; -module.exports = { +export { archiveUsers, addOrUpdate, + addJoinData, + getJoinData, + getSuggestedUsers, fetchPaginatedUsers, + fetchUsers, fetchUser, setIncompleteUserDetails, initializeUser, + addForVerification, + markAsVerified, + getUserImageForVerification, updateUserPicture, fetchUserImage, - addJoinData, - getJoinData, - getSuggestedUsers, fetchUserSkills, getRdsUserInfoByGitHubUsername, - fetchUsers, getUsersBasedOnFilter, - markAsVerified, - addForVerification, - getUserImageForVerification, + getUsersWithOnboardingStateInRange, getDiscordUsers, fetchAllUsers, archiveUserIfNotInDiscord, + fetchUserByIds, removeGitHubToken, getUsersByRole, - fetchUserByIds, updateUsersInBatch, - fetchUsersListForMultipleValues, fetchUserForKeyValue, + fetchUsersListForMultipleValues, getNonNickNameSyncedUsers, + updateUsernamesInBatch, updateUsersWithNewUsernames, fetchUsersNotInDiscordServer, }; diff --git a/models/wallets.js b/models/wallets.js index 4887cfdc9..19a1c68e0 100644 --- a/models/wallets.js +++ b/models/wallets.js @@ -1,5 +1,7 @@ -const { INITIAL_WALLET } = require("../constants/wallets"); -const firestore = require("../utils/firestore"); +import { INITIAL_WALLET } from "../constants/wallets.js"; +import firestore from "../utils/firestore.js"; +import logger from "../utils/logger.js"; + const walletModel = firestore.collection("wallets"); /** @@ -70,8 +72,4 @@ const updateWallet = async (userId, currencies) => { } }; -module.exports = { - fetchWallet, - updateWallet, - createWallet, -}; +export { fetchWallet, updateWallet, createWallet }; diff --git a/newrelic.js b/newrelic.cjs similarity index 98% rename from newrelic.js rename to newrelic.cjs index 8bbbefab2..b9ff3d05e 100644 --- a/newrelic.js +++ b/newrelic.cjs @@ -1,12 +1,10 @@ -"use strict"; - /** * New Relic agent configuration. * * See lib/config/default.js in the agent distribution for a more complete * description of configuration variables and their potential values. */ -exports.config = { +export default { /** * Array of application names. */ diff --git a/nyc.config.js b/nyc.config.js index 11b1b3a77..15191f295 100644 --- a/nyc.config.js +++ b/nyc.config.js @@ -2,7 +2,7 @@ * Nyc coverage config * Documentation: https://github.com/istanbuljs/nyc#common-configuration-options */ -module.exports = { +export default { all: true, "check-coverage": false, // Will be enabled after reaching 50% coverage: https://github.com/Real-Dev-Squad/website-backend/issues/493 exclude: ["test/**", "mockdata/**", "docs/**", "public/**", "dist/**"], diff --git a/package.json b/package.json index 1280b2ae9..87b3d50d8 100644 --- a/package.json +++ b/package.json @@ -2,11 +2,12 @@ "name": "website-backend", "version": "1.0.0", "private": true, + "type": "module", "scripts": { "start": "node ./dist/server.js", "tsc": "tsc", "postinstall": "yarn run tsc", - "dev": "cross-env NODE_ENV=development ts-node-dev server.js", + "dev": "cross-env NODE_ENV=development nodemon --ignore 'dist/**' --watch '**/*.{ts,js}' --exec \"tsc && node dist/server.js\"", "lint": "eslint .", "lint-fix": "eslint . --fix", "validate-setup": "node scripts/validateSetup.js", @@ -20,11 +21,12 @@ "@types/nodemailer": "^6.4.15", "axios": "1.7.4", "cloudinary": "2.0.3", - "config": "3.3.7", + "config": "3.3.12", "cookie-parser": "1.4.6", "cors": "2.8.5", "datauri": "4.1.0", "debug": "4.3.5", + "dotenv": "^16.5.0", "express": "~4.18.3", "express-boom": "3.0.0", "firebase-admin": "12.1.1", @@ -46,12 +48,13 @@ }, "devDependencies": { "@types/chai": "4.3.16", - "@types/config": "3.3.4", + "@types/config": "^3.3.5", "@types/express": "4.17.21", "@types/jest": "29.5.12", "@types/mocha": "10.0.6", "@types/node": "20.11.24", "@types/sinon": "17.0.3", + "@types/winston": "^2.4.4", "@typescript-eslint/parser": "^7.1.1", "chai": "4.4.1", "chai-http": "4.4.0", diff --git a/routes/answers.ts b/routes/answers.ts index 8925d374e..2bdbcb961 100644 --- a/routes/answers.ts +++ b/routes/answers.ts @@ -1,11 +1,15 @@ -import authenticate from "../middlewares/authenticate"; +import express from "express"; -const express = require("express"); -const authorizeRoles = require("../middlewares/authorizeRoles"); -const { SUPERUSER, MEMBER } = require("../constants/roles"); +import authenticate from "../middlewares/authenticate.js"; +import { authorizeRoles } from "../middlewares/authorizeRoles.js"; +import { ROLES } from "../constants/roles.js"; +import answers from "../controllers/answers.js"; +import answerValidators from "../middlewares/validators/answers.js"; + + +const { SUPERUSER, MEMBER } = ROLES; const router = express.Router(); -const answers = require("../controllers/answers"); -const answerValidators = require("../middlewares/validators/answers"); + router.post("/", answerValidators.createAnswer, answers.createAnswer); router.patch( @@ -18,4 +22,4 @@ router.patch( router.get("/", answers.getAnswers); -module.exports = router; +export default router; diff --git a/routes/applications.ts b/routes/applications.ts index 7c687e78f..2671cc4ec 100644 --- a/routes/applications.ts +++ b/routes/applications.ts @@ -1,10 +1,12 @@ -const express = require("express"); -const { SUPERUSER } = require("../constants/roles"); -const authenticate = require("../middlewares/authenticate"); -const authorizeRoles = require("../middlewares/authorizeRoles"); -const applications = require("../controllers/applications"); -const { authorizeOwnOrSuperUser } = require("../middlewares/authorizeOwnOrSuperUser"); -const applicationValidator = require("../middlewares/validators/application"); +// @ts-nocheck + +import express from "express"; +import { ROLES } from "../constants/roles.js"; +import authenticate from "../middlewares/authenticate.js"; +import { authorizeRoles } from "../middlewares/authorizeRoles.js"; +import { getAllOrUserApplication, addNewApplication, updateApplicationStatus } from "../controllers/applications.js"; +import { authorizeOwnOrSuperUser } from "../middlewares/authorizeOwnOrSuperUser.js"; +import applicationValidator from "../middlewares/validators/application.js"; const router = express.Router(); @@ -13,16 +15,16 @@ router.get( authenticate, authorizeOwnOrSuperUser, applicationValidator.validateApplicationQueryParam, - applications.getAllOrUserApplication + getAllOrUserApplication ); -router.get("/:applicationId", authenticate, authorizeRoles([SUPERUSER]), applications.getApplicationById); -router.post("/", authenticate, applicationValidator.validateApplicationData, applications.addApplication); +// router.get("/:applicationId", authenticate, authorizeRoles([ROLES.SUPERUSER]), getApplicationById); +router.post("/", authenticate, applicationValidator.validateApplicationData, addNewApplication); router.patch( "/:applicationId", authenticate, - authorizeRoles([SUPERUSER]), + authorizeRoles([ROLES.SUPERUSER]), applicationValidator.validateApplicationUpdateData, - applications.updateApplication + updateApplicationStatus ); -module.exports = router; +export default router; diff --git a/routes/arts.ts b/routes/arts.ts index 2b7e3c4ad..3d0a7a4d5 100644 --- a/routes/arts.ts +++ b/routes/arts.ts @@ -1,14 +1,14 @@ import express from "express"; +import authenticate from "../middlewares/authenticate.js"; +import { createArt } from "../middlewares/validators/arts.js"; +import { addArt, getArts, getUserArts } from "../controllers/arts.js"; + const router = express.Router(); -import authenticate from "../middlewares/authenticate"; -import arts from "../controllers/arts"; -import artValidator from "../middlewares/validators/arts"; -import { devFlagMiddleware } from "../middlewares/devFlag"; -router.get("/", arts.fetchArts); -router.get("/user/self", authenticate, arts.getSelfArts); // this route is soon going to be deprecated soon, please use /arts/:userId endpoint. -router.get("/user/:userId", authenticate, arts.getUserArts); // this route is soon going to be deprecated soon, please use /arts/:userId endpoint. -router.get("/:userId", authenticate, arts.getUserArts); -router.post("/user/add", authenticate, artValidator.createArt, arts.addArt); +router.get("/", getArts); +router.get("/user/self", authenticate, getUserArts); // this route is soon going to be deprecated soon, please use /arts/:userId endpoint. +router.get("/user/:userId", authenticate, getUserArts); // this route is soon going to be deprecated soon, please use /arts/:userId endpoint. +router.get("/:userId", authenticate, getUserArts); +router.post("/user/add", authenticate, createArt, addArt); -module.exports = router; +export default router; diff --git a/routes/auctions.ts b/routes/auctions.ts index d4ffae9fc..b46976b41 100644 --- a/routes/auctions.ts +++ b/routes/auctions.ts @@ -1,7 +1,9 @@ import express from "express"; -import authenticate from "../middlewares/authenticate"; -import auction from "../controllers/auction"; -import auctionValidator from "../middlewares/validators/auctions"; + +import authenticate from "../middlewares/authenticate.js"; +import auction from "../controllers/auction.js"; +import auctionValidator from "../middlewares/validators/auctions.js"; + const router = express.Router(); router.get("/:id", auction.fetchAuctionById); @@ -9,4 +11,4 @@ router.get("/", auction.fetchAvailableAuctions); router.post("/bid/:id", authenticate, auctionValidator.placeBid, auction.makeNewBid); router.post("/", authenticate, auctionValidator.createAuction, auction.createNewAuction); -module.exports = router; +export default router; diff --git a/routes/auth.ts b/routes/auth.ts index 0c53dbda9..61ce7975d 100644 --- a/routes/auth.ts +++ b/routes/auth.ts @@ -1,32 +1,43 @@ import express from "express"; +import { + githubAuthLogin, + githubAuthCallback, + googleAuthLogin, + googleAuthCallback, + signout, + fetchUserDeviceInfo, + storeUserDeviceInfo, + fetchDeviceDetails, + updateAuthStatus, +} from "../controllers/auth.js"; +import authenticate from "../middlewares/authenticate.js"; +import userDeviceInfoValidator from "../middlewares/validators/qrCodeAuth.js"; +import qrCodeAuthValidator from "../middlewares/validators/qrCodeAuth.js"; +import { devFlagMiddleware } from "../middlewares/devFlag.js"; + const router = express.Router(); -import auth from "../controllers/auth"; -import authenticate from "../middlewares/authenticate"; -import userDeviceInfoValidator from "../middlewares/validators/qrCodeAuth"; -import qrCodeAuthValidator from "../middlewares/validators/qrCodeAuth"; -import { devFlagMiddleware } from "../middlewares/devFlag"; -router.get("/github/login", auth.githubAuthLogin); +router.get("/github/login", githubAuthLogin); -router.get("/github/callback", auth.githubAuthCallback); +router.get("/github/callback", githubAuthCallback); -router.get("/google/login", devFlagMiddleware, auth.googleAuthLogin); +router.get("/google/login", devFlagMiddleware, googleAuthLogin); -router.get("/google/callback", auth.googleAuthCallback); +router.get("/google/callback", googleAuthCallback); -router.get("/signout", auth.signout); +router.get("/signout", signout); -router.get("/qr-code-auth", userDeviceInfoValidator.validateFetchingUserDocument, auth.fetchUserDeviceInfo); +router.get("/qr-code-auth", userDeviceInfoValidator.validateFetchingUserDocument, fetchUserDeviceInfo); -router.get("/device", authenticate, auth.fetchDeviceDetails); +router.get("/device", authenticate, fetchDeviceDetails); -router.post("/qr-code-auth", userDeviceInfoValidator.storeUserDeviceInfo, auth.storeUserDeviceInfo); +router.post("/qr-code-auth", userDeviceInfoValidator.storeUserDeviceInfo, storeUserDeviceInfo); router.patch( "/qr-code-auth/authorization_status/:authorization_status", authenticate, qrCodeAuthValidator.validateAuthStatus, - auth.updateAuthStatus + updateAuthStatus ); -module.exports = router; +export default router; diff --git a/routes/awsAccess.ts b/routes/awsAccess.ts index be4332aa4..6f8e2dc4f 100644 --- a/routes/awsAccess.ts +++ b/routes/awsAccess.ts @@ -1,8 +1,8 @@ import express from "express" -import { addUserToAWSGroup } from "../controllers/awsAccess"; +import { addUserToAWSGroup } from "../controllers/awsAccess.js"; const router = express.Router(); -const { verifyDiscordBot } = require("../middlewares/authorizeBot"); +import { verifyDiscordBot } from "../middlewares/authorizeBot.js"; router.post("/access", verifyDiscordBot, addUserToAWSGroup); -module.exports = router; \ No newline at end of file +export default router; diff --git a/routes/badges.js b/routes/badges.js deleted file mode 100644 index 917662bf3..000000000 --- a/routes/badges.js +++ /dev/null @@ -1,35 +0,0 @@ -const express = require("express"); -const router = express.Router(); -const authenticate = require("../middlewares/authenticate"); -const badgesValidator = require("../middlewares/validators/badges"); -const { upload } = require("../utils/multer"); -const badgesController = require("../controllers/badges"); -const authorizeRoles = require("../middlewares/authorizeRoles"); -const { SUPERUSER } = require("../constants/roles"); - -router.get("/", badgesController.getBadges); -// INFO: upload(muter-middelware) looks for form-data key named file -router.post( - "/", - authenticate, - authorizeRoles([SUPERUSER]), - upload.single("file"), - badgesValidator.createBadge, - badgesController.postBadge -); -router.post( - "/assign", - authenticate, - authorizeRoles([SUPERUSER]), - badgesValidator.assignOrRemoveBadges, - badgesController.postUserBadges -); -router.delete( - "/remove", - authenticate, - authorizeRoles([SUPERUSER]), - badgesValidator.assignOrRemoveBadges, - badgesController.deleteUserBadges -); - -module.exports = router; diff --git a/routes/badges.ts b/routes/badges.ts new file mode 100644 index 000000000..a7fefaa04 --- /dev/null +++ b/routes/badges.ts @@ -0,0 +1,36 @@ +import express from "express"; +import authenticate from "../middlewares/authenticate.js"; +import { assignOrRemoveBadges, createBadge } from "../middlewares/validators/badges.js"; +import { upload } from "../utils/multer.js"; +import * as badgesController from "../controllers/badges.js"; +import { authorizeRoles } from "../middlewares/authorizeRoles.js"; +import { ROLES } from "../constants/roles.js"; + +const router = express.Router(); + +router.get("/", badgesController.getBadges); +// INFO: upload(muter-middelware) looks for form-data key named file +router.post( + "/", + authenticate, + authorizeRoles([ROLES.SUPERUSER]), + upload.single("file"), + createBadge, + badgesController.createBadge +); +router.post( + "/assign", + authenticate, + authorizeRoles([ROLES.SUPERUSER]), + assignOrRemoveBadges, + badgesController.createBadge +); +router.delete( + "/remove", + authenticate, + authorizeRoles([ROLES.SUPERUSER]), + assignOrRemoveBadges, + badgesController.deleteBadge +); + +export default router; diff --git a/routes/challenges.ts b/routes/challenges.ts index 50a9773ae..397572655 100644 --- a/routes/challenges.ts +++ b/routes/challenges.ts @@ -1,11 +1,11 @@ import express from "express"; -const router = express.Router(); -import authenticate from "../middlewares/authenticate"; -import challenges from "../controllers/challenge"; -import { createChallenge } from "../middlewares/validators/challenges"; +import authenticate from "../middlewares/authenticate.js"; +import * as challenges from "../controllers/challenge.js"; +import { createChallenge } from "../middlewares/validators/challenges.js"; +const router = express.Router(); router.get("/", authenticate, challenges.fetchChallenges); router.post("/", authenticate, createChallenge, challenges.createChallenge); router.post("/subscribe", authenticate, challenges.subscribeToChallenge); -module.exports = router; +export default router; diff --git a/routes/cloudflareCache.ts b/routes/cloudflareCache.ts index 578dc9ab4..cea3a718c 100644 --- a/routes/cloudflareCache.ts +++ b/routes/cloudflareCache.ts @@ -1,9 +1,9 @@ import express from "express"; const router = express.Router(); -import cloudflareCache from "../controllers/cloudflareCache"; -import authenticate from "../middlewares/authenticate"; +import cloudflareCache from "../controllers/cloudflareCache.js"; +import authenticate from "../middlewares/authenticate.js"; router.get("/", authenticate, cloudflareCache.fetchPurgedCacheMetadata); router.post("/", authenticate, cloudflareCache.purgeCache); -module.exports = router; +export default router; diff --git a/routes/contributions.ts b/routes/contributions.ts index 0b7d48a23..fc80649da 100644 --- a/routes/contributions.ts +++ b/routes/contributions.ts @@ -1,7 +1,7 @@ import express from "express"; const router = express.Router(); -import contributions from "../controllers/contributions"; +import { getUserContributions } from "../controllers/contributions.js"; -router.get("/:username", contributions.getUserContributions); +router.get("/:username", getUserContributions); -module.exports = router; +export default router; diff --git a/routes/discordactions.js b/routes/discordactions.js index 5475e0344..6edf790c6 100644 --- a/routes/discordactions.js +++ b/routes/discordactions.js @@ -1,6 +1,6 @@ -const express = require("express"); -const authenticate = require("../middlewares/authenticate"); -const { +import express from "express"; +import authenticate from "../middlewares/authenticate.js"; +import { createGroupRole, getGroupsRoleId, addGroupRoleToMember, @@ -16,26 +16,32 @@ const { setRoleToUsersWith31DaysPlusOnboarding, deleteGroupRole, getPaginatedAllGroupRoles, -} = require("../controllers/discordactions"); -const { +} from "../controllers/discordactions.js"; +import { validateGroupRoleBody, validateMemberRoleBody, validateUpdateUsersNicknameStatusBody, validateLazyLoadingParams, -} = require("../middlewares/validators/discordactions"); -const checkIsVerifiedDiscord = require("../middlewares/verifydiscord"); -const checkCanGenerateDiscordLink = require("../middlewares/checkCanGenerateDiscordLink"); -const { SUPERUSER } = require("../constants/roles"); -const authorizeRoles = require("../middlewares/authorizeRoles"); -const ROLES = require("../constants/roles"); -const { Services } = require("../constants/bot"); -const { verifyCronJob } = require("../middlewares/authorizeBot"); -const { authorizeAndAuthenticate } = require("../middlewares/authorizeUsersAndService"); +} from "../middlewares/validators/discordactions.js"; +import checkIsVerifiedDiscord from "../middlewares/verifydiscord.js"; +import checkCanGenerateDiscordLink from "../middlewares/checkCanGenerateDiscordLink.js"; +import { ROLES } from "../constants/roles.js"; +import { authorizeRoles } from "../middlewares/authorizeRoles.js"; +import { Services } from "../constants/bot.js"; +import { verifyCronJob } from "../middlewares/authorizeBot.js"; +import { authorizeAndAuthenticate } from "../middlewares/authorizeUsersAndService.js"; + const router = express.Router(); router.post("/groups", authenticate, checkIsVerifiedDiscord, validateGroupRoleBody, createGroupRole); router.get("/groups", authenticate, checkIsVerifiedDiscord, validateLazyLoadingParams, getPaginatedAllGroupRoles); -router.delete("/groups/:groupId", authenticate, checkIsVerifiedDiscord, authorizeRoles([SUPERUSER]), deleteGroupRole); +router.delete( + "/groups/:groupId", + authenticate, + checkIsVerifiedDiscord, + authorizeRoles([ROLES.SUPERUSER]), + deleteGroupRole +); router.post("/roles", authenticate, checkIsVerifiedDiscord, validateMemberRoleBody, addGroupRoleToMember); router.get("/invite", authenticate, getUserDiscordInvite); router.post("/invite", authenticate, checkCanGenerateDiscordLink, generateInviteForUser); @@ -44,7 +50,7 @@ router.get("/roles", authenticate, checkIsVerifiedDiscord, getGroupsRoleId); router.patch( "/avatar/verify/:id", authenticate, - authorizeRoles([SUPERUSER]), + authorizeRoles([ROLES.SUPERUSER]), checkIsVerifiedDiscord, updateDiscordImageForVerification ); @@ -64,10 +70,10 @@ router.post( updateDiscordNicknames ); router.post("/nickname/status", verifyCronJob, validateUpdateUsersNicknameStatusBody, updateUsersNicknameStatus); -router.post("/discord-roles", authenticate, authorizeRoles([SUPERUSER]), syncDiscordGroupRolesInFirestore); +router.post("/discord-roles", authenticate, authorizeRoles([ROLES.SUPERUSER]), syncDiscordGroupRolesInFirestore); router.put( "/group-onboarding-31d-plus", authorizeAndAuthenticate([ROLES.SUPERUSER], [Services.CRON_JOB_HANDLER]), setRoleToUsersWith31DaysPlusOnboarding ); -module.exports = router; +export default router; diff --git a/routes/events.js b/routes/events.js index db8fb9584..b3642e179 100644 --- a/routes/events.js +++ b/routes/events.js @@ -1,17 +1,18 @@ -const express = require("express"); +import express from "express"; +import authenticate from "../middlewares/authenticate.js"; +import { authorizeRoles } from "../middlewares/authorizeRoles.js"; +import { ROLES } from "../constants/roles.js"; +import events from "../controllers/events.js"; +import eventsValidator from "../middlewares/validators/events.js"; + const router = express.Router(); -const events = require("../controllers/events"); -const authenticate = require("../middlewares/authenticate"); -const eventsValidator = require("../middlewares/validators/events"); -const { SUPERUSER, MEMBER } = require("../constants/roles"); -const authorizeRoles = require("../middlewares/authorizeRoles"); router.post("/", authenticate, eventsValidator.createEvent, events.createEvent); router.get("/", eventsValidator.getAllEvents, events.getAllEvents); router.post( "/join-admin", authenticate, - authorizeRoles([SUPERUSER, MEMBER]), + authorizeRoles([ROLES.SUPERUSER, ROLES.MEMBER]), eventsValidator.joinEvent, events.joinEvent ); @@ -21,7 +22,7 @@ router.patch("/", authenticate, eventsValidator.updateEvent, events.updateEvent) router.patch( "/end", authenticate, - authorizeRoles([SUPERUSER, MEMBER]), + authorizeRoles([ROLES.SUPERUSER, ROLES.MEMBER]), eventsValidator.endActiveEvent, events.endActiveEvent ); @@ -29,22 +30,22 @@ router.post("/:id/peers", eventsValidator.addPeerToEvent, events.addPeerToEvent) router.patch( "/:id/peers/kickout", authenticate, - authorizeRoles([SUPERUSER, MEMBER]), + authorizeRoles([ROLES.SUPERUSER, ROLES.MEMBER]), eventsValidator.kickoutPeer, events.kickoutPeer ); router.post( "/:id/codes", authenticate, - authorizeRoles([SUPERUSER]), + authorizeRoles([ROLES.SUPERUSER]), eventsValidator.generateEventCode, events.generateEventCode ); router.get( "/:id/codes", authenticate, - authorizeRoles([SUPERUSER]), + authorizeRoles([ROLES.SUPERUSER]), eventsValidator.getEventCodes, events.getEventCodes ); -module.exports = router; +export default router; diff --git a/routes/extensionRequests.js b/routes/extensionRequests.js index 693e7107d..b4c086598 100644 --- a/routes/extensionRequests.js +++ b/routes/extensionRequests.js @@ -1,21 +1,28 @@ -const express = require("express"); +import express from "express"; +import * as extensionRequests from "../controllers/extensionRequests.js"; +import authenticate from "../middlewares/authenticate.js"; +import { authorizeRoles } from "../middlewares/authorizeRoles.js"; +import { ROLES } from "../constants/roles.js"; +import extensionRequestValidator from "../middlewares/validators/extensionRequests.js"; +import skipAuthorizeRolesUnderFF from "../middlewares/skipAuthorizeRolesWrapper.js"; +import { userAuthorization } from "../middlewares/userAuthorization.js"; +import { devFlagMiddleware } from "../middlewares/devFlag.js"; + const router = express.Router(); -const extensionRequests = require("../controllers/extensionRequests"); -const authenticate = require("../middlewares/authenticate"); -const authorizeRoles = require("../middlewares/authorizeRoles"); -const { SUPERUSER, APPOWNER } = require("../constants/roles"); -const { - createExtensionRequest, - updateExtensionRequest, - updateExtensionRequestStatus, - getExtensionRequestsValidator, -} = require("../middlewares/validators/extensionRequests"); -const skipAuthorizeRolesUnderFF = require("../middlewares/skipAuthorizeRolesWrapper"); -const { userAuthorization } = require("../middlewares/userAuthorization"); -const { devFlagMiddleware } = require("../middlewares/devFlag"); +const { SUPERUSER, APPOWNER } = ROLES; -router.post("/", authenticate, createExtensionRequest, extensionRequests.createTaskExtensionRequest); -router.get("/", authenticate, getExtensionRequestsValidator, extensionRequests.fetchExtensionRequests); +router.post( + "/", + authenticate, + extensionRequestValidator.createExtensionRequest, + extensionRequests.createTaskExtensionRequest +); +router.get( + "/", + authenticate, + extensionRequestValidator.getExtensionRequestsValidator, + extensionRequests.fetchExtensionRequests +); router.get("/self", authenticate, extensionRequests.getSelfExtensionRequests); // This endpoint is being deprecated. Please use `/extension-requests/user/:userId` route to get the user extension-requests details based on userID." router.get( "/user/:userId", @@ -30,15 +37,15 @@ router.patch( "/:id", authenticate, skipAuthorizeRolesUnderFF(authorizeRoles([SUPERUSER, APPOWNER])), - updateExtensionRequest, + extensionRequestValidator.updateExtensionRequest, extensionRequests.updateExtensionRequest ); router.patch( "/:id/status", authenticate, authorizeRoles([SUPERUSER, APPOWNER]), - updateExtensionRequestStatus, + extensionRequestValidator.updateExtensionRequestStatus, extensionRequests.updateExtensionRequestStatus ); -module.exports = router; +export default router; diff --git a/routes/external-accounts.js b/routes/external-accounts.js index 2cf24c484..66fc95cc0 100644 --- a/routes/external-accounts.js +++ b/routes/external-accounts.js @@ -1,19 +1,19 @@ -const express = require("express"); +import express from "express"; +import { verifyDiscordBot } from "../middlewares/authorizeBot.js"; +import validator from "../middlewares/validators/external-accounts.js"; +import externalAccount from "../controllers/external-accounts.js"; +import authenticate from "../middlewares/authenticate.js"; +import { authorizeRoles } from "../middlewares/authorizeRoles.js"; +import { ROLES } from "../constants/roles.js"; +import { Services } from "../constants/bot.js"; +import { authorizeAndAuthenticate } from "../middlewares/authorizeUsersAndService.js"; + const router = express.Router(); -const authorizeBot = require("../middlewares/authorizeBot"); -const validator = require("../middlewares/validators/external-accounts"); -const externalAccount = require("../controllers/external-accounts"); -const authenticate = require("../middlewares/authenticate"); -const authorizeRoles = require("../middlewares/authorizeRoles"); -const { SUPERUSER } = require("../constants/roles"); -const ROLES = require("../constants/roles"); -const { Services } = require("../constants/bot"); -const { authorizeAndAuthenticate } = require("../middlewares/authorizeUsersAndService"); -router.post("/", validator.externalAccountData, authorizeBot.verifyDiscordBot, externalAccount.addExternalAccountData); +router.post("/", validator.externalAccountData, verifyDiscordBot, externalAccount.addExternalAccountData); router.get("/:token", authenticate, externalAccount.getExternalAccountData); router.patch("/link/:token", authenticate, validator.linkDiscord, externalAccount.linkExternalAccount); -router.patch("/discord-sync", authenticate, authorizeRoles([SUPERUSER]), externalAccount.syncExternalAccountData); +router.patch("/discord-sync", authenticate, authorizeRoles([ROLES.SUPERUSER]), externalAccount.syncExternalAccountData); router.post( "/users", authorizeAndAuthenticate([ROLES.SUPERUSER], [Services.CRON_JOB_HANDLER]), @@ -21,4 +21,4 @@ router.post( externalAccount.externalAccountsUsersPostHandler ); -module.exports = router; +export default router; diff --git a/routes/fcmToken.js b/routes/fcmToken.js index 7c09d144a..74b246fc0 100644 --- a/routes/fcmToken.js +++ b/routes/fcmToken.js @@ -1,9 +1,10 @@ -const express = require("express"); -const router = express.Router(); +import express from "express"; +import authenticate from "../middlewares/authenticate.js"; +import { fcmTokenController } from "../controllers/fcmToken.js"; +import { fcmTokenValidator } from "../middlewares/validators/fcmToken.js"; -const authenticate = require("../middlewares/authenticate"); -const { fcmTokenController } = require("../controllers/fcmToken"); -const { fcmTokenValidator } = require("../middlewares/validators/fcmToken"); +const router = express.Router(); router.post("/", authenticate, fcmTokenValidator, fcmTokenController); -module.exports = router; + +export default router; diff --git a/routes/goals.ts b/routes/goals.ts index 65d5b62fa..cea120ab4 100644 --- a/routes/goals.ts +++ b/routes/goals.ts @@ -1,8 +1,9 @@ -import authenticate from "../middlewares/authenticate"; import express from "express"; -import goals from "../controllers/goals"; +import authenticate from "../middlewares/authenticate.js"; +import { getGoalSiteToken } from "../controllers/goals.js"; + const router = express.Router(); -router.get("/token", authenticate, goals.getGoalSiteToken); +router.get("/token", authenticate, getGoalSiteToken); -module.exports = router; +export default router; diff --git a/routes/healthCheck.ts b/routes/healthCheck.ts index ba6330aed..0c8321849 100644 --- a/routes/healthCheck.ts +++ b/routes/healthCheck.ts @@ -1,9 +1,10 @@ import express from "express"; -import authenticate from "../middlewares/authenticate"; -import health from "../controllers/health"; +import authenticate from "../middlewares/authenticate.js"; +import { healthCheck } from "../controllers/health.js"; + const router = express.Router(); -router.get("/", health.healthCheck); -router.get("/v2", authenticate, health.healthCheck); +router.get("/", healthCheck); +router.get("/v2", authenticate, healthCheck); -module.exports = router; +export default router; diff --git a/routes/index.ts b/routes/index.ts index 985d1f424..5dbf6b904 100644 --- a/routes/index.ts +++ b/routes/index.ts @@ -1,45 +1,87 @@ import express from "express"; -const app = express.Router(); -import { devFlagMiddleware } from "../middlewares/devFlag"; +import { devFlagMiddleware } from "../middlewares/devFlag.js"; -app.use("/aws/groups", devFlagMiddleware, require("./awsAccess")) -app.use("/answers", require("./answers")); -app.use("/auctions", require("./auctions")); -app.use("/arts", require("./arts")); -app.use("/auth", require("./auth")); -app.use("/badges", require("./badges.js")); -app.use("/challenges", require("./challenges")); -app.use("/contributions", require("./contributions")); -app.use("/healthcheck", require("./healthCheck")); -app.use("/logs", require("./logs.js")); -app.use("/members", require("./members.js")); -app.use("/pullrequests", require("./pullrequests")); -app.use("/questions", require("./questions")); -app.use("/stocks", require("./stocks.js")); -app.use("/tasks", require("./tasks.js")); -app.use("/taskRequests", require("./taskRequests")); -app.use("/trade", require("./trading")); -app.use("/users/status", require("./userStatus.js")); -app.use("/users", require("./users.js")); -app.use("/profileDiffs", require("./profileDiffs.js")); -app.use("/wallet", require("./wallets.js")); -app.use("/extension-requests", require("./extensionRequests")); -app.use("/tags", require("./tags.js")); -app.use("/levels", require("./levels.js")); -app.use("/items", require("./items.js")); -app.use("/cache", require("./cloudflareCache")); -app.use("/external-accounts", require("./external-accounts.js")); -app.use("/events", require("./events.js")); -app.use("/discord-actions", require("./discordactions.js")); -app.use("/issues", require("./issues")); -app.use("/progresses", require("./progresses")); -app.use("/monitor", require("./monitor.js")); -app.use("/staging", require("./staging")); -app.use("/applications", require("./applications")); -app.use("/v1/fcm-tokens", require("./fcmToken.js")); -app.use("/v1/notifications", require("./notify")); -app.use("/goals", require("./goals")); -app.use("/invites", require("./invites")); -app.use("/requests", require("./requests")); -app.use("/subscription", devFlagMiddleware, require("./subscription")); -module.exports = app; +export const appRoutes = express.Router(); + +import awsAccess from "./awsAccess.js"; +import answers from "./answers.js"; +import auctions from "./auctions.js"; +import arts from "./arts.js"; +import auth from "./auth.js"; +import badge from "./badges.js"; +import challenges from "./challenges.js"; +import contributions from "./contributions.js"; +import healthCheck from "./healthCheck.js"; +import logs from "./logs.js"; +import members from "./members.js"; +import pullRequests from "./pullrequests.js"; +import questions from "./questions.js"; +import stocks from "./stocks.js"; +import tasks from "./tasks.js"; +import taskRequests from "./taskRequests.js"; +import trading from "./trading.js"; +import userStatus from "./userStatus.js"; +import users from "./users.js"; +import profileDiffs from "./profileDiffs.js"; +import wallets from "./wallets.js"; +import extensionRequests from "./extensionRequests.js"; +import tags from "./tags.js"; +import levels from "./levels.js"; +import items from "./items.js"; +import cloudflareCache from "./cloudflareCache.js"; +import externalAccounts from "./external-accounts.js"; +import events from "./events.js"; +import discordActions from "./discordactions.js"; +import issues from "./issues.js"; +import progresses from "./progresses.js"; +import monitor from "./monitor.js"; +import staging from "./staging.js"; +import applications from "./applications.js"; +import fcmToken from "./fcmToken.js"; +import notify from "./notify.js"; +import goals from "./goals.js"; +import invites from "./invites.js"; +import requests from "./requests.js"; +import subscription from "./subscription.js"; + +appRoutes.use("/aws/groups", devFlagMiddleware, awsAccess); +appRoutes.use("/answers", answers); +appRoutes.use("/auctions", auctions); +appRoutes.use("/arts", arts); +appRoutes.use("/auth", auth); +appRoutes.use("/auth", auth); +appRoutes.use("/badges", badge); +appRoutes.use("/challenges", challenges); +appRoutes.use("/contributions", contributions); +appRoutes.use("/healthcheck", healthCheck); +appRoutes.use("/logs", logs); +appRoutes.use("/members", members); +appRoutes.use("/pullrequests", pullRequests); +appRoutes.use("/questions", questions); +appRoutes.use("/stocks", stocks); +appRoutes.use("/tasks", tasks); +appRoutes.use("/taskRequests", taskRequests); +appRoutes.use("/trade", trading); +appRoutes.use("/users/status", userStatus); +appRoutes.use("/users", users); +appRoutes.use("/profileDiffs", profileDiffs); +appRoutes.use("/wallet", wallets); +appRoutes.use("/extension-requests", extensionRequests); +appRoutes.use("/tags", tags); +appRoutes.use("/levels", levels); +appRoutes.use("/items", items); +appRoutes.use("/cache", cloudflareCache); +appRoutes.use("/external-accounts", externalAccounts); +appRoutes.use("/events", events); +appRoutes.use("/discord-actions", discordActions); +appRoutes.use("/issues", issues); +appRoutes.use("/progresses", progresses); +appRoutes.use("/monitor", monitor); +appRoutes.use("/staging", staging); +appRoutes.use("/applications", applications); +appRoutes.use("/v1/fcm-tokens", fcmToken); +appRoutes.use("/v1/notifications", notify); +appRoutes.use("/goals", goals); +appRoutes.use("/invites", invites); +appRoutes.use("/requests", requests); +appRoutes.use("/subscription", devFlagMiddleware, subscription); diff --git a/routes/invites.ts b/routes/invites.ts index c5aaefffb..bce73fdd7 100644 --- a/routes/invites.ts +++ b/routes/invites.ts @@ -1,10 +1,11 @@ import express from "express"; +import { createInviteValidator } from "../middlewares/validators/invites.js"; +import { createInviteLink,getInviteLink } from "../controllers/invites.js"; +import authinticateServiceRequest from "../middlewares/authinticateServiceRequest.js"; + const router = express.Router(); -import { createInviteValidator } from "../middlewares/validators/invites"; -import { createInviteLink,getInviteLink } from "../controllers/invites"; -import authinticateServiceRequest from "../middlewares/authinticateServiceRequest"; router.post("/",authinticateServiceRequest, createInviteValidator, createInviteLink); router.get("/:userId" ,authinticateServiceRequest, getInviteLink); -module.exports = router; \ No newline at end of file +export default router; diff --git a/routes/issues.ts b/routes/issues.ts index ec59468ed..f76e4fc49 100644 --- a/routes/issues.ts +++ b/routes/issues.ts @@ -1,8 +1,9 @@ import express from "express"; -import issues from "../controllers/issues"; +import { getIssues, issueUpdates } from "../controllers/issues.js"; + const router = express.Router(); -router.get("/", issues.getIssues); -router.post("/updates", issues.issueUpdates); +router.get("/", getIssues); +router.post("/updates", issueUpdates); -module.exports = router; +export default router; diff --git a/routes/items.js b/routes/items.js index 9e850c408..af0794747 100644 --- a/routes/items.js +++ b/routes/items.js @@ -1,14 +1,15 @@ -const express = require("express"); -const { addTagsToItem, removeTagsFromItem, getItemBasedOnFilter } = require("../controllers/items"); -const { validateItemsPayload, validateItemQuery } = require("../middlewares/validators/items"); -const authenticate = require("../middlewares/authenticate"); -const authorizeRoles = require("../middlewares/authorizeRoles"); -const { SUPERUSER } = require("../constants/roles"); +import express from "express"; +import { addTagsToItem, removeTagsFromItem, getItemBasedOnFilter } from "../controllers/items.js"; +import { validateItemsPayload, validateItemQuery } from "../middlewares/validators/items.js"; +import authenticate from "../middlewares/authenticate.js"; +import { authorizeRoles } from "../middlewares/authorizeRoles.js"; +import { ROLES } from "../constants/roles.js"; const router = express.Router(); +const { SUPERUSER } = ROLES; router.post("/", authenticate, authorizeRoles([SUPERUSER]), validateItemsPayload, addTagsToItem); router.delete("/", authenticate, authorizeRoles([SUPERUSER]), removeTagsFromItem); router.get("/filter", authenticate, validateItemQuery, getItemBasedOnFilter); -module.exports = router; +export default router; diff --git a/routes/levels.js b/routes/levels.js index 344ffa0f0..46652e548 100644 --- a/routes/levels.js +++ b/routes/levels.js @@ -1,14 +1,15 @@ -const express = require("express"); -const { addLevel, deleteLevel, getAllLevels } = require("../controllers/levels"); -const { validateLevelBody } = require("../middlewares/validators/levels"); -const authenticate = require("../middlewares/authenticate"); -const authorizeRoles = require("../middlewares/authorizeRoles"); -const { SUPERUSER } = require("../constants/roles"); +import express from "express"; +import { addLevel, deleteLevel, getAllLevels } from "../controllers/levels.js"; +import { validateLevelBody } from "../middlewares/validators/levels.js"; +import authenticate from "../middlewares/authenticate.js"; +import { authorizeRoles } from "../middlewares/authorizeRoles.js"; +import { ROLES } from "../constants/roles.js"; const router = express.Router(); +const { SUPERUSER } = ROLES; -router.post("/", authenticate, authorizeRoles([SUPERUSER]), validateLevelBody, addLevel); -router.delete("/:levelid", authenticate, authorizeRoles([SUPERUSER]), deleteLevel); router.get("/", getAllLevels); +router.post("/", authenticate, authorizeRoles([SUPERUSER]), validateLevelBody, addLevel); +router.delete("/:id", authenticate, authorizeRoles([SUPERUSER]), deleteLevel); -module.exports = router; +export default router; diff --git a/routes/logs.js b/routes/logs.js index 6f4d2b119..1a2208f74 100644 --- a/routes/logs.js +++ b/routes/logs.js @@ -1,12 +1,13 @@ -const express = require("express"); +import express from "express"; +import { fetchAllLogs, fetchLogs } from "../controllers/logs.js"; +import authenticate from "../middlewares/authenticate.js"; +import { authorizeRoles } from "../middlewares/authorizeRoles.js"; +import { ROLES } from "../constants/roles.js"; + const router = express.Router(); -const logs = require("../controllers/logs"); -const authenticate = require("../middlewares/authenticate"); -const authorizeRoles = require("../middlewares/authorizeRoles"); -const { SUPERUSER } = require("../constants/roles"); +const { SUPERUSER } = ROLES; -router.get("/:type", authenticate, authorizeRoles([SUPERUSER]), logs.fetchLogs); -router.get("/", authenticate, authorizeRoles([SUPERUSER]), logs.fetchAllLogs); -router.post("/migrate", authenticate, authorizeRoles([SUPERUSER]), logs.updateLogs); +router.get("/:type", authenticate, authorizeRoles([SUPERUSER]), fetchLogs); +router.get("/", authenticate, authorizeRoles([SUPERUSER]), fetchAllLogs); -module.exports = router; +export default router; diff --git a/routes/members.js b/routes/members.js index 8434e86e0..349f7f8f6 100644 --- a/routes/members.js +++ b/routes/members.js @@ -1,18 +1,17 @@ -const express = require("express"); +import express from "express"; +import members from "../controllers/members.js"; +import { authorizeRoles } from "../middlewares/authorizeRoles.js"; +import authenticate from "../middlewares/authenticate.js"; +import recruiter from "../controllers/recruiters.js"; +import { validateRecruiter } from "../middlewares/validators/recruiter.js"; +import { validateGetMembers } from "../middlewares/validators/members.js"; +import { ROLES } from "../constants/roles.js"; + const router = express.Router(); -const members = require("../controllers/members"); -const authorizeRoles = require("../middlewares/authorizeRoles"); -const authenticate = require("../middlewares/authenticate"); -const { addRecruiter, fetchRecruitersInfo } = require("../controllers/recruiters"); -const { validateRecruiter } = require("../middlewares/validators/recruiter"); -const { validateGetMembers } = require("../middlewares/validators/members"); -const { SUPERUSER } = require("../constants/roles"); +const { SUPERUSER } = ROLES; -router.get("/", validateGetMembers, members.getMembers); -router.get("/idle", members.getIdleMembers); -router.post("/intro/:username", validateRecruiter, addRecruiter); -router.get("/intro", authenticate, authorizeRoles([SUPERUSER]), fetchRecruitersInfo); -router.patch("/moveToMembers/:username", authenticate, authorizeRoles([SUPERUSER]), members.moveToMembers); -router.patch("/archiveMembers/:username", authenticate, authorizeRoles([SUPERUSER]), members.archiveMembers); +router.get("/", authenticate, authorizeRoles([SUPERUSER]), validateGetMembers, members.getMembers); +router.get("/recruiters", authenticate, authorizeRoles([SUPERUSER]), recruiter.fetchRecruitersInfo); +router.post("/recruiters", authenticate, authorizeRoles([SUPERUSER]), validateRecruiter, recruiter.addRecruiter); -module.exports = router; +export default router; diff --git a/routes/monitor.js b/routes/monitor.js index c0796f63f..a5a5c9712 100644 --- a/routes/monitor.js +++ b/routes/monitor.js @@ -1,18 +1,20 @@ -const express = require("express"); -const router = express.Router(); -const authenticate = require("../middlewares/authenticate"); -const authorizeRoles = require("../middlewares/authorizeRoles"); -const { SUPERUSER } = require("../constants/roles"); -const { +import express from "express"; +import { ROLES } from "../constants/roles.js"; +import { createTrackedProgressController, - updateTrackedProgressController, getTrackedProgressController, -} = require("../controllers/monitor"); -const { + updateTrackedProgressController, +} from "../controllers/monitor.js"; +import authenticate from "../middlewares/authenticate.js"; +import { authorizeRoles } from "../middlewares/authorizeRoles.js"; +import { validateCreateTrackedProgressRecord, - validateUpdateTrackedProgress, validateGetTrackedProgressQueryParams, -} = require("../middlewares/validators/monitor"); + validateUpdateTrackedProgress, +} from "../middlewares/validators/monitor.js"; + +const router = express.Router(); +const { SUPERUSER } = ROLES; router.post( "/", @@ -32,4 +34,4 @@ router.patch( router.get("/", validateGetTrackedProgressQueryParams, getTrackedProgressController); -module.exports = router; +export default router; diff --git a/routes/notify.ts b/routes/notify.ts index 2954d9e11..c5791ba98 100644 --- a/routes/notify.ts +++ b/routes/notify.ts @@ -1,9 +1,9 @@ import express from "express"; const router = express.Router(); -import authenticate from "../middlewares/authenticate"; -import { notifyController } from "../controllers/notify"; -import { notifyValidator } from "../middlewares/validators/notify"; +import authenticate from "../middlewares/authenticate.js"; +import { notifyController } from "../controllers/notify.js"; +import { notifyValidator } from "../middlewares/validators/notify.js"; router.post("/", authenticate, notifyValidator, notifyController); -module.exports = router; +export default router; diff --git a/routes/profileDiffs.js b/routes/profileDiffs.js index 275a98c64..c6ea820c7 100644 --- a/routes/profileDiffs.js +++ b/routes/profileDiffs.js @@ -1,11 +1,13 @@ -const express = require("express"); +import express from "express"; +import * as profileDiffs from "../controllers/profileDiffs.js"; +import { authorizeRoles } from "../middlewares/authorizeRoles.js"; +import authenticate from "../middlewares/authenticate.js"; +import { ROLES } from "../constants/roles.js"; + const router = express.Router(); -const profileDiffs = require("../controllers/profileDiffs"); -const authorizeRoles = require("../middlewares/authorizeRoles"); -const authenticate = require("../middlewares/authenticate"); -const { SUPERUSER } = require("../constants/roles"); +const { SUPERUSER } = ROLES; router.get("/", authenticate, authorizeRoles([SUPERUSER]), profileDiffs.getProfileDiffs); router.get("/:id", authenticate, authorizeRoles([SUPERUSER]), profileDiffs.getProfileDiff); -module.exports = router; +export default router; diff --git a/routes/progresses.ts b/routes/progresses.ts index 0c12f37e2..5d461ef35 100644 --- a/routes/progresses.ts +++ b/routes/progresses.ts @@ -1,21 +1,22 @@ import express from "express"; -import authenticate from "../middlewares/authenticate"; +import authenticate from "../middlewares/authenticate.js"; import { validateCreateProgressRecords, validateGetProgressRecordsQuery, validateGetRangeProgressRecordsParams, validateGetDayProgressParams, -} from "../middlewares/validators/progresses"; +} from "../middlewares/validators/progresses.js"; import { createProgress, getProgress, getProgressRangeData, getProgressBydDateController, -} from "../controllers/progresses"; +} from "../controllers/progresses.js"; + const router = express.Router(); router.post("/", authenticate, validateCreateProgressRecords, createProgress); router.get("/", validateGetProgressRecordsQuery, getProgress); router.get("/:type/:typeId/date/:date", validateGetDayProgressParams, getProgressBydDateController); router.get("/range", validateGetRangeProgressRecordsParams, getProgressRangeData); -module.exports = router; +export default router; diff --git a/routes/pullrequests.ts b/routes/pullrequests.ts index c1a7053bf..0335a1d0a 100644 --- a/routes/pullrequests.ts +++ b/routes/pullrequests.ts @@ -1,9 +1,10 @@ import express from "express"; -import pullRequest from "../controllers/pullRequests"; +import { getOpenPRs, getStalePRs, getUserPRs } from "../controllers/pullRequests.js"; + const router = express.Router(); -router.get("/open", pullRequest.getOpenPRs); -router.get("/stale", pullRequest.getStalePRs); -router.get("/user/:username", pullRequest.getUserPRs); +router.get("/open", getOpenPRs); +router.get("/stale", getStalePRs); +router.get("/user/:username", getUserPRs); -module.exports = router; +export default router; diff --git a/routes/questions.ts b/routes/questions.ts index 3e701ae8a..703f933f0 100644 --- a/routes/questions.ts +++ b/routes/questions.ts @@ -1,10 +1,12 @@ import express from "express"; const router = express.Router(); -const authorizeRoles = require("../middlewares/authorizeRoles"); -const { SUPERUSER } = require("../constants/roles"); -const authenticate = require("../middlewares/authenticate"); -const questions = require("../controllers/questions"); -const questionValidators = require("../middlewares/validators/questions"); +import { authorizeRoles } from "../middlewares/authorizeRoles.js"; +import { ROLES } from "../constants/roles.js"; +import authenticate from "../middlewares/authenticate.js"; +import questions from "../controllers/questions.js"; +import questionValidators from "../middlewares/validators/questions.js"; + +const { SUPERUSER } = ROLES; router.post( "/", @@ -16,4 +18,4 @@ router.post( router.get("/", questions.getQuestions); -module.exports = router; +export default router; diff --git a/routes/requests.ts b/routes/requests.ts index 098e00a82..2eccff5f7 100644 --- a/routes/requests.ts +++ b/routes/requests.ts @@ -1,27 +1,28 @@ import express from "express"; -const router = express.Router(); -const authorizeRoles = require("../middlewares/authorizeRoles"); -const { SUPERUSER } = require("../constants/roles"); -import authenticate from "../middlewares/authenticate"; +import { authorizeRoles } from "../middlewares/authorizeRoles.js"; +import { ROLES } from "../constants/roles.js"; +import authenticate from "../middlewares/authenticate.js"; import { createRequestsMiddleware, updateRequestsMiddleware, getRequestsMiddleware, updateRequestValidator -} from "../middlewares/validators/requests"; +} from "../middlewares/validators/requests.js"; import { createRequestController , updateRequestController, getRequestsController, updateRequestBeforeAcknowledgedController -} from "../controllers/requests"; -import { skipAuthenticateForOnboardingExtensionRequest } from "../middlewares/skipAuthenticateForOnboardingExtension"; -import { verifyDiscordBot } from "../middlewares/authorizeBot"; +} from "../controllers/requests.js"; +import { skipAuthenticateForOnboardingExtensionRequest } from "../middlewares/skipAuthenticateForOnboardingExtension.js"; +import { verifyDiscordBot } from "../middlewares/authorizeBot.js"; +const router = express.Router(); router.get("/", getRequestsMiddleware, getRequestsController); router.post("/", skipAuthenticateForOnboardingExtensionRequest(authenticate, verifyDiscordBot), createRequestsMiddleware, createRequestController); -router.put("/:id",authenticate, authorizeRoles([SUPERUSER]), updateRequestsMiddleware, updateRequestController); +router.put("/:id",authenticate, authorizeRoles([ROLES.SUPERUSER]), updateRequestsMiddleware, updateRequestController); router.patch("/:id", authenticate, updateRequestValidator, updateRequestBeforeAcknowledgedController); -module.exports = router; + +export default router; diff --git a/routes/staging.ts b/routes/staging.ts index 65f3a8e59..aea122316 100644 --- a/routes/staging.ts +++ b/routes/staging.ts @@ -1,12 +1,12 @@ -import { removePrivileges, updateRoles } from "../controllers/staging"; -import { validateRevokePrivileges, validateUserRoles } from "../middlewares/validators/staging"; - -import authenticate from "../middlewares/authenticate"; import express from "express"; +import { removePrivileges, updateRoles } from "../controllers/staging.js"; +import { validateRevokePrivileges, validateUserRoles } from "../middlewares/validators/staging.js"; +import authenticate from "../middlewares/authenticate.js"; + const router = express.Router(); router.patch("/user", validateUserRoles, authenticate, updateRoles); router.post("/users/privileges", validateRevokePrivileges, removePrivileges); -module.exports = router; +export default router; diff --git a/routes/stocks.js b/routes/stocks.js index 7b83cb0b1..cbb5d9b34 100644 --- a/routes/stocks.js +++ b/routes/stocks.js @@ -1,16 +1,18 @@ -const express = require("express"); +import express from "express"; +import authenticate from "../middlewares/authenticate.js"; +import { authorizeRoles } from "../middlewares/authorizeRoles.js"; +import { addNewStock, fetchStocks, getSelfStocks, getUserStocks } from "../controllers/stocks.js"; +import { createStock } from "../middlewares/validators/stocks.js"; +import { ROLES } from "../constants/roles.js"; +import { devFlagMiddleware } from "../middlewares/devFlag.js"; +import { userAuthorization } from "../middlewares/userAuthorization.js"; + const router = express.Router(); -const authenticate = require("../middlewares/authenticate"); -const authorizeRoles = require("../middlewares/authorizeRoles"); -const { addNewStock, fetchStocks, getSelfStocks, getUserStocks } = require("../controllers/stocks"); -const { createStock } = require("../middlewares/validators/stocks"); -const { SUPERUSER } = require("../constants/roles"); -const { devFlagMiddleware } = require("../middlewares/devFlag"); -const { userAuthorization } = require("../middlewares/userAuthorization"); +const { SUPERUSER } = ROLES; router.get("/", fetchStocks); router.post("/", authenticate, authorizeRoles([SUPERUSER]), createStock, addNewStock); router.get("/user/self", authenticate, getSelfStocks); // this route will soon be deprecated, please use `/stocks/:userId` route. router.get("/:userId", devFlagMiddleware, authenticate, userAuthorization, getUserStocks); -module.exports = router; +export default router; diff --git a/routes/subscription.ts b/routes/subscription.ts index 5827a3fd4..3c8f168fd 100644 --- a/routes/subscription.ts +++ b/routes/subscription.ts @@ -1,12 +1,13 @@ import express from "express"; -import authenticate from "../middlewares/authenticate"; -import { subscribe, unsubscribe, sendEmail } from "../controllers/subscription"; -import { validateSubscribe } from "../middlewares/validators/subscription"; -const authorizeRoles = require("../middlewares/authorizeRoles"); -const router = express.Router(); -const { SUPERUSER } = require("../constants/roles"); +import authenticate from "../middlewares/authenticate.js"; +import { subscribe, unsubscribe, sendEmail } from "../controllers/subscription.js"; +import { validateSubscribe } from "../middlewares/validators/subscription.js"; +import { authorizeRoles } from "../middlewares/authorizeRoles.js"; +import { ROLES } from "../constants/roles.js"; -router.post("/", authenticate, validateSubscribe, subscribe); +const router = express.Router(); +const { SUPERUSER } = ROLES; +router.post("/", authenticate, validateSubscribe, subscribe); router.patch("/", authenticate, unsubscribe); router.get("/notify", authenticate, authorizeRoles([SUPERUSER]), sendEmail); -module.exports = router; +export default router; diff --git a/routes/tags.js b/routes/tags.js index 3dc458a32..49fbb7e78 100644 --- a/routes/tags.js +++ b/routes/tags.js @@ -1,16 +1,16 @@ -const express = require("express"); - -const { addTag, deleteTag, getAllTags, getTagsByType } = require("../controllers/tags"); -const { validTagBody } = require("../middlewares/validators/tags"); -const authenticate = require("../middlewares/authenticate"); -const authorizeRoles = require("../middlewares/authorizeRoles"); -const { SUPERUSER } = require("../constants/roles"); +import express from "express"; +import { addTag, deleteTag, getAllTags, getTagsByType } from "../controllers/tags.js"; +import { validTagBody } from "../middlewares/validators/tags.js"; +import authenticate from "../middlewares/authenticate.js"; +import { authorizeRoles } from "../middlewares/authorizeRoles.js"; +import { ROLES } from "../constants/roles.js"; const router = express.Router(); +const { SUPERUSER } = ROLES; router.post("/", authenticate, authorizeRoles([SUPERUSER]), validTagBody, addTag); router.delete("/:tagid", authenticate, authorizeRoles([SUPERUSER]), deleteTag); router.get("/", getAllTags); router.get("/:type", getTagsByType); -module.exports = router; +export default router; diff --git a/routes/taskRequests.js b/routes/taskRequests.js index 996db3fa7..96b5ce718 100644 --- a/routes/taskRequests.js +++ b/routes/taskRequests.js @@ -1,21 +1,30 @@ -const express = require("express"); -const { SUPERUSER } = require("../constants/roles"); +import express from "express"; +import { ROLES } from "../constants/roles.js"; +import { + fetchTaskRequests, + fetchTaskRequestById, + updateTaskRequests, + migrateTaskRequests, + addTaskRequests, + addOrUpdate, +} from "../controllers/tasksRequests.js"; +import authenticate from "../middlewares/authenticate.js"; +import { authorizeRoles } from "../middlewares/authorizeRoles.js"; +import validators from "../middlewares/validators/task-requests.js"; +import { validateUser } from "../middlewares/taskRequests.js"; + const router = express.Router(); -const authenticate = require("../middlewares/authenticate"); -const authorizeRoles = require("../middlewares/authorizeRoles"); -const taskRequests = require("../controllers/tasksRequests"); -const { validateUser } = require("../middlewares/taskRequests"); -const validators = require("../middlewares/validators/task-requests"); +const { SUPERUSER } = ROLES; -router.get("/", authenticate, taskRequests.fetchTaskRequests); -router.get("/:id", authenticate, taskRequests.fetchTaskRequestById); -router.patch("/", authenticate, authorizeRoles([SUPERUSER]), validateUser, taskRequests.updateTaskRequests); -router.post("/", authenticate, validators.postTaskRequests, taskRequests.addTaskRequests); +router.get("/", authenticate, fetchTaskRequests); +router.get("/:id", authenticate, fetchTaskRequestById); +router.patch("/", authenticate, authorizeRoles([SUPERUSER]), validateUser, updateTaskRequests); +router.post("/", authenticate, validators.postTaskRequests, addTaskRequests); -router.post("/migrations", authenticate, authorizeRoles([SUPERUSER]), taskRequests.migrateTaskRequests); +router.post("/migrations", authenticate, authorizeRoles([SUPERUSER]), migrateTaskRequests); // Deprecated | @Ajeyakrishna-k | https://github.com/Real-Dev-Squad/website-backend/issues/1597 -router.post("/addOrUpdate", authenticate, validateUser, taskRequests.addOrUpdate); -router.patch("/approve", authenticate, authorizeRoles([SUPERUSER]), validateUser, taskRequests.updateTaskRequests); +router.post("/addOrUpdate", authenticate, validateUser, addOrUpdate); +router.patch("/approve", authenticate, authorizeRoles([SUPERUSER]), validateUser, updateTaskRequests); -module.exports = router; +export default router; diff --git a/routes/tasks.js b/routes/tasks.js index 4422a2a1d..5305d2e6a 100644 --- a/routes/tasks.js +++ b/routes/tasks.js @@ -1,24 +1,20 @@ -const express = require("express"); +import express from "express"; +import authenticate from "../middlewares/authenticate.js"; +import * as tasks from "../controllers/tasks.js"; +import validateTask from "../middlewares/validators/tasks.js"; +import { authorizeRoles } from "../middlewares/authorizeRoles.js"; +import { authorizeAndAuthenticate } from "../middlewares/authorizeUsersAndService.js"; +import { ROLES } from "../constants/roles.js"; +import assignTask from "../middlewares/assignTask.js"; +import { cacheResponse, invalidateCache } from "../utils/cache.js"; +import { ALL_TASKS } from "../constants/cacheKeys.js"; +import { verifyCronJob } from "../middlewares/authorizeBot.js"; +import { CLOUDFLARE_WORKER, CRON_JOB_HANDLER } from "../constants/bot.js"; +import { devFlagMiddleware } from "../middlewares/devFlag.js"; +import { userAuthorization } from "../middlewares/userAuthorization.js"; + const router = express.Router(); -const authenticate = require("../middlewares/authenticate"); -const tasks = require("../controllers/tasks"); -const { - createTask, - updateTask, - updateSelfTask, - getTasksValidator, - getUsersValidator, -} = require("../middlewares/validators/tasks"); -const authorizeRoles = require("../middlewares/authorizeRoles"); -const { authorizeAndAuthenticate } = require("../middlewares/authorizeUsersAndService"); -const { APPOWNER, SUPERUSER } = require("../constants/roles"); -const assignTask = require("../middlewares/assignTask"); -const { cacheResponse, invalidateCache } = require("../utils/cache"); -const { ALL_TASKS } = require("../constants/cacheKeys"); -const { verifyCronJob } = require("../middlewares/authorizeBot"); -const { CLOUDFLARE_WORKER, CRON_JOB_HANDLER } = require("../constants/bot"); -const { devFlagMiddleware } = require("../middlewares/devFlag"); -const { userAuthorization } = require("../middlewares/userAuthorization"); +const { APPOWNER, SUPERUSER } = ROLES; const oldAuthorizationMiddleware = authorizeRoles([APPOWNER, SUPERUSER]); const newAuthorizationMiddleware = authorizeAndAuthenticate( @@ -35,7 +31,12 @@ const enableDevModeMiddleware = (req, res, next) => { } }; -router.get("/", getTasksValidator, cacheResponse({ invalidationKey: ALL_TASKS, expiry: 10 }), tasks.fetchTasks); +router.get( + "/", + validateTask.getTasksValidator, + cacheResponse({ invalidationKey: ALL_TASKS, expiry: 10 }), + tasks.fetchTasks +); router.get("/self", authenticate, tasks.getSelfTasks); router.get("/overdue", authenticate, authorizeRoles([SUPERUSER]), tasks.overdueTasks); @@ -44,7 +45,7 @@ router.post( authenticate, authorizeRoles([APPOWNER, SUPERUSER]), invalidateCache({ invalidationKeys: [ALL_TASKS] }), - createTask, + validateTask.createTask, tasks.addNewTask ); router.patch( @@ -52,7 +53,7 @@ router.patch( authenticate, enableDevModeMiddleware, invalidateCache({ invalidationKeys: [ALL_TASKS] }), - updateTask, + validateTask.updateTask, tasks.updateTask ); router.get("/:id/details", tasks.getTask); @@ -62,7 +63,7 @@ router.patch( "/self/:id", authenticate, invalidateCache({ invalidationKeys: [ALL_TASKS] }), - updateSelfTask, + validateTask.updateSelfTask, tasks.updateTaskStatus, assignTask ); // this route is being deprecated in favor of /tasks/:id/status. @@ -71,7 +72,7 @@ router.patch( authenticate, devFlagMiddleware, invalidateCache({ invalidationKeys: [ALL_TASKS] }), - updateSelfTask, + validateTask.updateSelfTask, tasks.updateTaskStatus, assignTask ); @@ -86,9 +87,9 @@ router.patch( tasks.assignTask ); -router.get("/users/discord", verifyCronJob, getUsersValidator, tasks.getUsersHandler); +router.get("/users/discord", verifyCronJob, validateTask.getUsersValidator, tasks.getUsersHandler); router.post("/migration", authenticate, authorizeRoles([SUPERUSER]), tasks.updateStatus); router.post("/orphanTasks", authenticate, authorizeRoles([SUPERUSER]), tasks.orphanTasks); -module.exports = router; +export default router; diff --git a/routes/trading.ts b/routes/trading.ts index 7dc7a6ecb..c5fa34e72 100644 --- a/routes/trading.ts +++ b/routes/trading.ts @@ -1,12 +1,12 @@ import express from "express"; const router = express.Router(); -import authenticate from "../middlewares/authenticate"; -import { newTrade } from "../middlewares/validators/trading"; -import { trade } from "../controllers/trading"; -import { devFlagMiddleware } from "../middlewares/devFlag"; -import { userAuthorization } from "../middlewares/userAuthorization"; +import authenticate from "../middlewares/authenticate.js"; +import { newTrade } from "../middlewares/validators/trading.js"; +import { trade } from "../controllers/trading.js"; +import { devFlagMiddleware } from "../middlewares/devFlag.js"; +import { userAuthorization } from "../middlewares/userAuthorization.js"; router.post("/stock/new/self", authenticate, newTrade, trade); // this route is being deprecated, please use new available route `/stock/new/:userId` router.post("/stock/new/:userId", devFlagMiddleware, authenticate, userAuthorization, newTrade, trade); -module.exports = router; +export default router; diff --git a/routes/userStatus.js b/routes/userStatus.js index cbc5c7ce2..d2d03bb81 100644 --- a/routes/userStatus.js +++ b/routes/userStatus.js @@ -1,5 +1,5 @@ -const express = require("express"); -const { +import express from "express"; +import { deleteUserStatus, getUserStatus, updateUserStatuses, @@ -7,19 +7,19 @@ const { batchUpdateUsersStatus, getUserStatusControllers, updateUserStatusController, -} = require("../controllers/userStatus"); -const router = express.Router(); -const authenticate = require("../middlewares/authenticate"); -const authorizeRoles = require("../middlewares/authorizeRoles"); -const { SUPERUSER } = require("../constants/roles"); -const { +} from "../controllers/userStatus.js"; +import authenticate from "../middlewares/authenticate.js"; +import { authorizeRoles } from "../middlewares/authorizeRoles.js"; +import { validateUserStatus, validateMassUpdate, validateGetQueryParams, -} = require("../middlewares/validators/userStatus"); -const { authorizeAndAuthenticate } = require("../middlewares/authorizeUsersAndService"); -const ROLES = require("../constants/roles"); -const { Services } = require("../constants/bot"); +} from "../middlewares/validators/userStatus.js"; +import { authorizeAndAuthenticate } from "../middlewares/authorizeUsersAndService.js"; +import { ROLES } from "../constants/roles.js"; +import { Services } from "../constants/bot.js"; + +const router = express.Router(); router.get("/", validateGetQueryParams, getUserStatusControllers); router.get("/self", authenticate, getUserStatus); @@ -33,6 +33,6 @@ router.patch( batchUpdateUsersStatus ); router.patch("/:userId", authenticate, validateUserStatus, updateUserStatuses); -router.delete("/:userId", authenticate, authorizeRoles([SUPERUSER]), deleteUserStatus); +router.delete("/:userId", authenticate, authorizeRoles([ROLES.SUPERUSER]), deleteUserStatus); -module.exports = router; +export default router; diff --git a/routes/users.js b/routes/users.js index 921b139f6..5164898e4 100644 --- a/routes/users.js +++ b/routes/users.js @@ -1,33 +1,44 @@ -const express = require("express"); +import express from "express"; +import authenticate from "../middlewares/authenticate.js"; +import { authorizeRoles } from "../middlewares/authorizeRoles.js"; +import users from "../controllers/users.js"; +import { ROLES } from "../constants/roles.js"; +import { + updateUser, + getUsers, + validateGenerateUsernameQuery, + validateUserQueryParams, + validateJoinData, + validateUsersPatchHandler, + validateUpdateRoles, + validateImageVerificationQuery, + updateProfileURL, +} from "../middlewares/validators/user.js"; +import { upload } from "../utils/multer.js"; +import { getUserBadges } from "../controllers/badges.js"; +import checkIsVerifiedDiscord from "../middlewares/verifydiscord.js"; +import { authorizeAndAuthenticate } from "../middlewares/authorizeUsersAndService.js"; +import { Services } from "../constants/bot.js"; +import authenticateProfile from "../middlewares/authenticateProfile.js"; +import { devFlagMiddleware } from "../middlewares/devFlag.js"; +import { userAuthorization } from "../middlewares/userAuthorization.js"; +import conditionalMiddleware from "../middlewares/conditionalMiddleware.js"; + const router = express.Router(); -const authenticate = require("../middlewares/authenticate"); -const authorizeRoles = require("../middlewares/authorizeRoles"); -const users = require("../controllers/users"); -const { SUPERUSER } = require("../constants/roles"); -const userValidator = require("../middlewares/validators/user"); -const { upload } = require("../utils/multer"); -const { getUserBadges } = require("../controllers/badges"); -const checkIsVerifiedDiscord = require("../middlewares/verifydiscord"); -const { authorizeAndAuthenticate } = require("../middlewares/authorizeUsersAndService"); -const ROLES = require("../constants/roles"); -const { Services } = require("../constants/bot"); -const authenticateProfile = require("../middlewares/authenticateProfile"); -const { devFlagMiddleware } = require("../middlewares/devFlag"); -const { userAuthorization } = require("../middlewares/userAuthorization"); -const conditionalMiddleware = require("../middlewares/conditionalMiddleware"); +const { SUPERUSER } = ROLES; router.post("/", authorizeAndAuthenticate([ROLES.SUPERUSER], [Services.CRON_JOB_HANDLER]), users.markUnverified); router.post("/update-in-discord", authenticate, authorizeRoles([SUPERUSER]), users.setInDiscordScript); router.post("/verify", authenticate, users.verifyUser); router.get("/userId/:userId", users.getUserById); -router.patch("/self", authenticate, userValidator.updateUser, users.updateSelf); // this route is being deprecated soon, please use alternate available `/users/:userId?profile=true` PATCH endpoint. -router.get("/", authenticateProfile(authenticate), userValidator.getUsers, users.getUsers); +router.patch("/self", authenticate, updateUser, users.updateSelf); // this route is being deprecated soon, please use alternate available `/users/:userId?profile=true` PATCH endpoint. +router.get("/", authenticateProfile(authenticate), getUsers, users.getUsers); router.get("/self", authenticate, users.getSelfDetails); router.get("/isDeveloper", authenticate, users.isDeveloper); router.get("/isUsernameAvailable/:username", authenticate, users.getUsernameAvailabilty); -router.get("/username", authenticate, userValidator.validateGenerateUsernameQuery, users.generateUsername); +router.get("/username", authenticate, validateGenerateUsernameQuery, users.generateUsername); router.get("/chaincode", authenticate, users.generateChaincode); -router.get("/search", userValidator.validateUserQueryParams, users.filterUsers); +router.get("/search", validateUserQueryParams, users.filterUsers); router.get("/identity-stats", authenticate, authorizeRoles([SUPERUSER]), users.getIdentityStats); router.patch( "/:userId/update-nickname", @@ -38,31 +49,12 @@ router.patch( ); router.get("/:username", users.getUser); router.get("/:userId/intro", authenticate, authorizeRoles([SUPERUSER]), users.getUserIntro); -router.put("/self/intro", authenticate, userValidator.validateJoinData, users.addUserIntro); // This route is being deprecated soon, please use alternate available route `/users/:userId/intro`. -router.put( - "/:userId/intro", - devFlagMiddleware, - authenticate, - userValidator.validateJoinData, - userAuthorization, - users.addUserIntro -); +router.put("/self/intro", authenticate, validateJoinData, users.addUserIntro); // This route is being deprecated soon, please use alternate available route `/users/:userId/intro`. +router.put("/:userId/intro", devFlagMiddleware, authenticate, validateJoinData, userAuthorization, users.addUserIntro); router.get("/:id/skills", users.getUserSkills); router.get("/:id/badges", getUserBadges); -router.patch( - "/", - authenticate, - authorizeRoles([SUPERUSER]), - userValidator.validateUsersPatchHandler, - users.usersPatchHandler -); -router.patch( - "/:id/temporary/data", - authenticate, - authorizeRoles([SUPERUSER]), - userValidator.validateUpdateRoles, - users.updateRoles -); +router.patch("/", authenticate, authorizeRoles([SUPERUSER]), validateUsersPatchHandler, users.usersPatchHandler); +router.patch("/:id/temporary/data", authenticate, authorizeRoles([SUPERUSER]), validateUpdateRoles, users.updateRoles); // upload.single('profile') -> multer inmemory storage of file for type multipart/form-data router.post("/picture", authenticate, checkIsVerifiedDiscord, upload.single("profile"), users.postUserPicture); @@ -70,14 +62,14 @@ router.patch( "/picture/verify/:id", authenticate, authorizeRoles([SUPERUSER]), - userValidator.validateImageVerificationQuery, + validateImageVerificationQuery, users.verifyUserImage ); router.get("/picture/:id", authenticate, authorizeRoles([SUPERUSER]), users.getUserImageForVerification); -router.patch("/profileURL", authenticate, userValidator.updateProfileURL, users.profileURL); +router.patch("/profileURL", authenticate, updateProfileURL, users.profileURL); router.patch("/rejectDiff", authenticate, authorizeRoles([SUPERUSER]), users.rejectProfileDiff); -router.patch("/:userId", authenticate, conditionalMiddleware(userValidator.updateUser), users.updateProfile); +router.patch("/:userId", authenticate, conditionalMiddleware(updateUser), users.updateProfile); router.get("/suggestedUsers/:skillId", authenticate, authorizeRoles([SUPERUSER]), users.getSuggestedUsers); -module.exports = router; router.post("/batch-username-update", authenticate, authorizeRoles([SUPERUSER]), users.updateUsernames); -module.exports = router; + +export default router; diff --git a/routes/wallets.js b/routes/wallets.js index fdabca85e..e9ec14e10 100644 --- a/routes/wallets.js +++ b/routes/wallets.js @@ -1,11 +1,13 @@ -const express = require("express"); +import express from "express"; +import wallet from "../controllers/wallets.js"; +import authenticate from "../middlewares/authenticate.js"; +import { authorizeRoles } from "../middlewares/authorizeRoles.js"; +import { ROLES } from "../constants/roles.js"; + const router = express.Router(); -const wallet = require("../controllers/wallets"); -const authenticate = require("../middlewares/authenticate"); -const authorizeRoles = require("../middlewares/authorizeRoles"); -const { SUPERUSER } = require("../constants/roles"); +const { SUPERUSER } = ROLES; router.get("/", authenticate, wallet.getOwnWallet); router.get("/:username", authenticate, authorizeRoles([SUPERUSER]), wallet.getUserWallet); -module.exports = router; +export default router; diff --git a/scripts/validateSetup.js b/scripts/validateSetup.js index b0751ab51..654dfd011 100644 --- a/scripts/validateSetup.js +++ b/scripts/validateSetup.js @@ -1,6 +1,6 @@ /* eslint-disable no-console */ -const Firestore = require("../utils/firestore.js"); -const config = require("config"); +import Firestore from "../utils/firestore.js"; +import config from "config"; // check whether github credentials are not falsy if (config.githubOauth.clientId === "" || config.githubOauth.clientSecret === "") { diff --git a/server.js b/server.ts similarity index 86% rename from server.js rename to server.ts index 614dac74f..719c1629a 100644 --- a/server.js +++ b/server.ts @@ -1,39 +1,34 @@ /** * Initialise globals */ -const config = require("config"); -global.config = config; +import config from "config"; +import * as http from "http"; +import app from "./app.js"; +import logger from "./utils/logger.js"; -const logger = require("./utils/logger"); +// Set globals global.logger = logger; +global.config = config; -logger.info(`Initialising newrelic with app name:: ${config.get("integrations.newrelic.appName")}`); // Initialise newrelic -require("newrelic"); +import "newrelic"; -/** - * Module dependencies. - */ -const http = require("http"); -const app = require("./app"); +logger.info(`Initialising newrelic with app name:: ${config.get("integrations.newrelic.appName")}`); /** * Get port from environment and store in Express. */ - const port = config.get("port"); app.set("port", port); /** * Create HTTP server. */ - const server = http.createServer(app); /** * Listen on provided port, on all network interfaces. */ - server.listen(port); server.on("error", onError); server.on("listening", onListening); @@ -41,7 +36,6 @@ server.on("listening", onListening); /** * Event listener for HTTP server "error" event. */ - function onError(error) { if (error.syscall !== "listen") { throw error; @@ -71,9 +65,8 @@ function onError(error) { /** * Event listener for HTTP server "listening" event. */ - function onListening() { logger.info(`Express API running on port:${port} with environment:${process.env.NODE_ENV}`); } -module.exports = server; +export default server; diff --git a/services/EventAPIService.js b/services/EventAPIService.js index e5671cf96..ac4dc48ed 100644 --- a/services/EventAPIService.js +++ b/services/EventAPIService.js @@ -1,5 +1,6 @@ -const axios = require("axios"); -const { API_100MS_BASE_URL } = require("../constants/events"); +import axios from "axios"; +import { API_100MS_BASE_URL } from "../constants/events.js"; +import logger from "../utils/logger.js"; // A service class for all REST API operations class EventAPIService { @@ -54,17 +55,17 @@ class EventAPIService { // A method for GET requests using the configured Axios instance async get(path, queryParams) { - const res = await this.#axiosInstance.get(path, { params: queryParams }); - logger.info(`get call to path - ${path}, status code - ${res.status}`); - return res.data; + const response = await this.#axiosInstance.get(path, { params: queryParams }); + logger.info(`get call to path - ${path}, status code - ${response.status}`); + return response.data; } // A method for POST requests using the configured Axios instance async post(path, payload) { - const res = await this.#axiosInstance.post(path, payload); - logger.info(`post call to path - ${path}, status code - ${res.status}`); - return res.data; + const response = await this.#axiosInstance.post(path, payload); + logger.info(`post call to path - ${path}, status code - ${response.status}`); + return response.data; } } -module.exports = { EventAPIService }; +export { EventAPIService }; diff --git a/services/EventTokenService.js b/services/EventTokenService.js index 14e81c8d5..18c3bb1bf 100644 --- a/services/EventTokenService.js +++ b/services/EventTokenService.js @@ -1,5 +1,7 @@ -const jwt = require("jsonwebtoken"); -const crypto = require("crypto"); +import jwt from "jsonwebtoken"; +import crypto from "crypto"; +import config from "config"; +import logger from "../utils/logger.js"; // A service class for Token generation and management @@ -48,7 +50,7 @@ class EventTokenService { return this.#managementToken; } - // Generate new Auth token for a peer + // Generate Auth token for a user to join a room getAuthToken({ roomId, userId, role }) { const payload = { access_key: EventTokenService.#app_access_key, @@ -63,4 +65,4 @@ class EventTokenService { } } -module.exports = { EventTokenService }; +export { EventTokenService }; diff --git a/services/authService.js b/services/authService.js index 4e698b44f..73572a646 100644 --- a/services/authService.js +++ b/services/authService.js @@ -1,11 +1,13 @@ -const jwt = require("jsonwebtoken"); +import jwt from "jsonwebtoken"; +import config from "config"; + /** * Generates the JWT * * @param payload {Object} - Payload to be added in the JWT * @return {String} - Generated JWT */ -const generateAuthToken = (payload) => { +export const generateAuthToken = (payload) => { return jwt.sign(payload, config.get("userToken.privateKey"), { algorithm: "RS256", expiresIn: config.get("userToken.ttl"), @@ -18,7 +20,7 @@ const generateAuthToken = (payload) => { * @param token {String} - JWT to be verified * @return {Object} - Decode value of JWT */ -const verifyAuthToken = (token) => { +export const verifyAuthToken = (token) => { return jwt.verify(token, config.get("userToken.publicKey"), { algorithms: ["RS256"] }); }; @@ -28,12 +30,6 @@ const verifyAuthToken = (token) => { * @param token {String} - JWT to be decoded * @return {Object} - Decode value of JWT */ -const decodeAuthToken = (token) => { +export const decodeAuthToken = (token) => { return jwt.decode(token); }; - -module.exports = { - generateAuthToken, - verifyAuthToken, - decodeAuthToken, -}; diff --git a/services/botVerificationService.js b/services/botVerificationService.js index 2f8f96cd9..980c93d47 100644 --- a/services/botVerificationService.js +++ b/services/botVerificationService.js @@ -1,4 +1,5 @@ -const jwt = require("jsonwebtoken"); +import jwt from "jsonwebtoken"; +import config from "config"; /** * Verifies if the JWT is valid. Throws error in case of signature error or expiry @@ -20,4 +21,4 @@ const verifyCronJob = (token) => { return jwt.verify(token, config.get("cronJobHandler.publicKey"), { algorithms: ["RS256"] }); }; -module.exports = { verifyToken, verifyCronJob }; +export { verifyToken, verifyCronJob }; diff --git a/services/cloudflareService.js b/services/cloudflareService.js index 39dcac554..5bdf9b15d 100644 --- a/services/cloudflareService.js +++ b/services/cloudflareService.js @@ -1,5 +1,6 @@ -const { fetch } = require("../utils/fetch"); -const { CLOUDFLARE_PURGE_CACHE_API } = require("../constants/cloudflareCache"); +import { fetch } from "../utils/fetch.js"; +import { CLOUDFLARE_PURGE_CACHE_API } from "../constants/cloudflareCache.js"; +import config from "config"; async function purgeCache(files) { const response = await fetch( @@ -16,6 +17,4 @@ async function purgeCache(files) { return response; } -module.exports = { - purgeCache, -}; +export { purgeCache }; diff --git a/services/contributions.js b/services/contributions.js index 8090598eb..ca009ab4b 100644 --- a/services/contributions.js +++ b/services/contributions.js @@ -1,16 +1,16 @@ -const githubService = require("../services/githubService"); -const tasks = require("../models/tasks"); -const { fetchUser } = require("../models/users"); -const userUtils = require("../utils/users"); +import { fetchPRsByUser } from "../services/githubService.js"; +import taskModel from "../models/tasks.js"; +import { fetchUser } from "../models/users.js"; +import { getUsername } from "../utils/users.js"; + /** * Get the contributions of the user * @param {string} username */ - const getUserContributions = async (username) => { const contributions = {}; - const { data } = await githubService.fetchPRsByUser(username); - const allUserTasks = await tasks.fetchUserTasks(username); + const { data } = await fetchPRsByUser(username); + const allUserTasks = await taskModel.fetchUserTasks(username); const noteworthy = []; const all = []; @@ -32,7 +32,7 @@ const getUserContributions = async (username) => { if (Array.isArray(task.participants)) { for (const userId of task.participants) { - const username = await userUtils.getUsername(userId); + const username = await getUsername(userId); const userDetails = participantsDetailsMap.get(username); if (userDetails) { participantsDetails.push(userDetails); @@ -81,7 +81,6 @@ const getUserContributions = async (username) => { * Extracts only the necessary details required from the object returned by Github API * @param data {Object} - Object returned by Github API */ - const extractPRdetails = (data) => { const allPRs = []; data.items.forEach(({ title, user, html_url: url, state, created_at: createdAt, updated_at: updatedAt }) => { @@ -101,7 +100,6 @@ const extractPRdetails = (data) => { * Extracts only the necessary details required from the object returned by Task API * @param data {Object} - Object returned by Task API */ - const extractTaskdetails = (data) => { const { id, @@ -135,7 +133,6 @@ const extractTaskdetails = (data) => { * Get the user details * @param username {string} */ - const getUserDetails = async (username) => { const { user } = await fetchUser({ username }); const userDetails = extractUserDetails(user); @@ -146,7 +143,6 @@ const getUserDetails = async (username) => { * Extracts only the necessary details required from the object returned by user API * @param data {Object} - Object returned by User api */ - const extractUserDetails = (data) => { const { username, firstname, lastname, img } = data; if (!data.incompleteUserDetails) { @@ -161,6 +157,4 @@ const extractUserDetails = (data) => { } }; -module.exports = { - getUserContributions, -}; +export default { getUserContributions }; diff --git a/services/dataAccessLayer.js b/services/dataAccessLayer.ts similarity index 67% rename from services/dataAccessLayer.js rename to services/dataAccessLayer.ts index 877ad3e1b..af77cbf88 100644 --- a/services/dataAccessLayer.js +++ b/services/dataAccessLayer.ts @@ -1,6 +1,19 @@ -const userQuery = require("../models/users"); -const members = require("../models/members"); -const { ROLE_LEVEL, KEYS_NOT_ALLOWED, ACCESS_LEVEL } = require("../constants/userDataLevels"); +import { fetchUser, fetchUsers, fetchUserByIds, fetchPaginatedUsers, getDiscordUsers, getUsersBasedOnFilter, fetchUsersListForMultipleValues, fetchUserForKeyValue } from "../models/users.js"; +import { fetchUsers as fetchMembers, fetchUsersWithRole } from "../models/members.js"; +import { ROLE_LEVEL, KEYS_NOT_ALLOWED, ACCESS_LEVEL } from "../constants/userDataLevels.js"; +import { User } from "../typeDefinitions/users.js"; + +type RetrieveUsersParams = { + discordId?: string | null; + id?: string | null; + username?: string | null; + usernames?: string[] | null; + query?: string | null; + userdata?: User | null; + level?: string | null; + role?: string | null; + userIds?: string[] | null; +} const retrieveUsers = async ({ discordId = null, @@ -12,19 +25,19 @@ const retrieveUsers = async ({ level = ACCESS_LEVEL.PUBLIC, role = null, userIds = null, -}) => { +}: RetrieveUsersParams) => { let result; if (id || username) { if (id != null) { - result = await userQuery.fetchUser({ userId: id }); + result = await fetchUser({ userId: id }); } else { - result = await userQuery.fetchUser({ username: username }); + result = await fetchUser({ username: username }); } const user = levelSpecificAccess(result.user, level, role); result.user = user; return result; } else if (usernames) { - const { users } = await userQuery.fetchUsers(usernames); + const { users } = await fetchUsers(usernames); const result = []; users.forEach((userdata) => { const user = levelSpecificAccess(userdata, level, role); @@ -35,13 +48,15 @@ const retrieveUsers = async ({ if (userIds.length === 0) { return {}; } - const userDetails = await userQuery.fetchUserByIds(userIds); + // @ts-ignore + const userDetails = await fetchUserByIds(userIds); Object.keys(userDetails).forEach((userId) => { removeSensitiveInfo(userDetails[userId]); }); return userDetails; } else if (query) { - const { allUsers, nextId, prevId } = await userQuery.fetchPaginatedUsers(query); + // @ts-ignore + const { allUsers, nextId, prevId } = await fetchPaginatedUsers(query); const users = []; allUsers.forEach((userdata) => { const user = levelSpecificAccess(userdata, level, role); @@ -49,10 +64,10 @@ const retrieveUsers = async ({ }); return { users, nextId, prevId }; } else if (discordId !== null) { - result = await userQuery.fetchUser({ discordId }); + result = await fetchUser({ discordId }); return levelSpecificAccess(result, level, role); } else if (userdata) { - const result = await userQuery.fetchUser({ userId: userdata.id }); + const result = await fetchUser({ userId: userdata.id }); return levelSpecificAccess(result.user, level, role); } else { return { @@ -62,7 +77,7 @@ const retrieveUsers = async ({ }; const retrieveDiscordUsers = async (level = ACCESS_LEVEL.PUBLIC, role = null) => { - const users = await userQuery.getDiscordUsers(); + const users = await getDiscordUsers(); const usersData = []; users.forEach((userdata) => { const user = levelSpecificAccess(userdata, level, role); @@ -72,7 +87,7 @@ const retrieveDiscordUsers = async (level = ACCESS_LEVEL.PUBLIC, role = null) => }; const retreiveFilteredUsers = async (query) => { - const users = await userQuery.getUsersBasedOnFilter(query); + const users = await getUsersBasedOnFilter(query); users.forEach((userdata) => { removeSensitiveInfo(userdata); }); @@ -80,7 +95,8 @@ const retreiveFilteredUsers = async (query) => { }; const retrieveMembers = async (query) => { - const allUsers = await members.fetchUsers(query); + const allUsers = await fetchMembers(query); + // @ts-ignore allUsers.forEach((userdata) => { removeSensitiveInfo(userdata); }); @@ -88,7 +104,8 @@ const retrieveMembers = async (query) => { }; const retrieveUsersWithRole = async (role) => { - const users = await members.fetchUsersWithRole(role); + const users = await fetchUsersWithRole(role); + // @ts-ignore users.forEach((userdata) => { removeSensitiveInfo(userdata); }); @@ -119,15 +136,15 @@ const levelSpecificAccess = (user, level = ACCESS_LEVEL.PUBLIC, role = null) => const fetchUsersForKeyValues = async (documentKey, value, removeSensitiveInfo = true) => { let userList; if (Array.isArray(value)) { - userList = await userQuery.fetchUsersListForMultipleValues(documentKey, value); + userList = await fetchUsersListForMultipleValues(documentKey, value); } else { - userList = await userQuery.fetchUserForKeyValue(documentKey, value); + userList = await fetchUserForKeyValue(documentKey, value); } return userList.map((user) => (removeSensitiveInfo ? levelSpecificAccess(user) : user)); }; -module.exports = { +export { retrieveUsers, removeSensitiveInfo, retrieveDiscordUsers, diff --git a/services/discordMembersService.js b/services/discordMembersService.js index 4ed1b14a1..0d63eb35f 100644 --- a/services/discordMembersService.js +++ b/services/discordMembersService.js @@ -1,12 +1,13 @@ -const jwt = require("jsonwebtoken"); -const config = require("config"); +import jwt from "jsonwebtoken"; +import config from "config"; +import logger from "../utils/logger.js"; + const DISCORD_BASE_URL = config.get("services.discordBot.baseUrl"); /** * Extracts the discord data of a user * @param discordId {String} - User discordId */ - const getDiscordMemberDetails = async (discordId) => { try { const authToken = jwt.sign({}, config.get("rdsServerlessBot.rdsServerLessPrivateKey"), { @@ -27,4 +28,4 @@ const getDiscordMemberDetails = async (discordId) => { } }; -module.exports = { getDiscordMemberDetails }; +export { getDiscordMemberDetails }; diff --git a/services/discordService.js b/services/discordService.js index 1244fe9d3..146b615b1 100644 --- a/services/discordService.js +++ b/services/discordService.js @@ -1,6 +1,9 @@ -const firestore = require("../utils/firestore"); -const { fetchAllUsers } = require("../models/users"); -const { generateAuthTokenForCloudflare, generateCloudFlareHeaders } = require("../utils/discord-actions"); +import config from "config"; +import firestore from "../utils/firestore.js"; +import { fetchAllUsers } from "../models/users.js"; +import { generateAuthTokenForCloudflare, generateCloudFlareHeaders } from "../utils/discord-actions.js"; +import logger from "../utils/logger.js"; + const userModel = firestore.collection("users"); const DISCORD_BASE_URL = config.get("services.discordBot.baseUrl"); @@ -117,7 +120,6 @@ const setUserDiscordNickname = async (userName, discordId) => { * @returns {Promise} The response from the Discord API * @throws {Error} If the deletion fails or there's a network error */ - const deleteGroupRoleFromDiscord = async (roleId) => { try { const authToken = generateAuthTokenForCloudflare(); @@ -140,7 +142,7 @@ const deleteGroupRoleFromDiscord = async (roleId) => { } }; -module.exports = { +export { getDiscordMembers, getDiscordRoles, setInDiscordFalseScript, diff --git a/services/getFcmTokenFromUserId.js b/services/getFcmTokenFromUserId.js index 16217b8c9..f38a47c49 100644 --- a/services/getFcmTokenFromUserId.js +++ b/services/getFcmTokenFromUserId.js @@ -1,4 +1,4 @@ -const firestore = require("../utils/firestore"); +import firestore from "../utils/firestore.js"; const fcmTokenModel = firestore.collection("fcmToken"); diff --git a/services/getUserIdsFromRoleId.js b/services/getUserIdsFromRoleId.js index 3014bf18a..3b7db2b57 100644 --- a/services/getUserIdsFromRoleId.js +++ b/services/getUserIdsFromRoleId.js @@ -1,4 +1,6 @@ -const firestore = require("../utils/firestore"); +import firestore from "../utils/firestore.js"; +import logger from "../utils/logger.js"; + const memberRoleModel = firestore.collection("member-group-roles"); export const getUserIdsFromRoleId = async (roleId) => { diff --git a/services/githubService.js b/services/githubService.js index e164da462..54adec3d9 100644 --- a/services/githubService.js +++ b/services/githubService.js @@ -1,5 +1,6 @@ -const utils = require("../utils/fetch"); -const { fetchUser } = require("../models/users"); +/* eslint-disable no-dupe-keys */ +import { fetch } from "../utils/fetch.js"; +import logger from "../utils/logger.js"; /** * Extracts only the necessary details required from the object returned by Github API @@ -49,312 +50,179 @@ const extractPRdetails = (data) => { * @param resultsOptions {Object} - Ordering and pagination of results */ const getGithubURL = (searchParams, resultsOptions = {}, searchString) => { - const baseURL = config.get("githubApi.baseUrl"); - const issuesAndPRsPath = "/search/issues"; - - const urlObj = new URL(baseURL); - urlObj.pathname = issuesAndPRsPath; - - const defaultParams = { - org: config.get("githubApi.org"), - }; - - const finalSearchParams = Object.assign({}, defaultParams, searchParams); - - const paramsObjArr = Object.entries(finalSearchParams); - const paramsStrArr = paramsObjArr.map(([key, value]) => `${key}:${value}`); - - // The string that can be entrered as text on Github website for simple search - let prsSearchText = paramsStrArr.join(" "); + const baseURL = "https://api.github.com/search/issues"; + const queryParams = []; + // Add search string if provided if (searchString) { - prsSearchText = `${searchString} ${prsSearchText}`; + queryParams.push(searchString); } - urlObj.searchParams.append("q", prsSearchText); - - // Manipulate returned results - // e.g number of results, pagination, etc - Object.entries(resultsOptions).forEach(([key, value]) => { - urlObj.searchParams.append(key, value); + // Add all search params to the query + Object.keys(searchParams).forEach((key) => { + if (searchParams[key]) { + queryParams.push(`${key}:${searchParams[key]}`); + } }); - const createdURL = urlObj.href; - return createdURL; + // Add sorting and order params + if (resultsOptions.sort) { + queryParams.push(`sort:${resultsOptions.sort}`); + } + if (resultsOptions.order) { + queryParams.push(`order:${resultsOptions.order}`); + } + + // Construct the final URL + const queryString = queryParams.join("+"); + const url = `${baseURL}?q=${queryString}`; + + // Add pagination if provided + if (resultsOptions.page) { + return `${url}&page=${resultsOptions.page}`; + } + if (resultsOptions.per_page) { + return `${url}&per_page=${resultsOptions.per_page}`; + } + return url; }; -/** Create the fetch object to call on github url - * @access private - * @param url {string} - URL on github to call - */ function getFetch(url) { - return utils.fetch(url, "get", null, null, null, { - auth: { - username: config.get("githubOauth.clientId"), - password: config.get("githubOauth.clientSecret"), + return fetch(url, { + method: "GET", + headers: { + Accept: "application/vnd.github.v3+json", }, }); } -/** - * Create fetch call for GitHub APIs as an authenticated user - * @param {*} url - url to fetch from - * @param {*} params - query params to pass - * @param {*} headers - requested headers - * @returns response object - */ -function getFetchWithAuthToken(url, params = null, headers = null) { - return utils.fetch(url, "get", params, null, headers); -} -/** - * Fetches the pull requests in Real-Dev-Squad by user using GitHub API - * @param username {string} - Username String - */ +// function getFetchWithAuthToken(url, params = null, headers = null) { +// return utils.fetch(url, { +// method: "GET", +// headers: { +// Accept: "application/vnd.github.v3+json", +// ...headers, +// }, +// params, +// }); +// } const fetchPRsByUser = async (username) => { - try { - const { user } = await fetchUser({ username }); - const url = getGithubURL({ - author: user.github_id, - type: "pr", - }); - return getFetch(url); - } catch (err) { - logger.error(`Error while fetching pull requests: ${err}`); - throw err; - } + const searchParams = { + is: "pr", + author: username, + }; + const url = getGithubURL(searchParams); + const data = await getFetch(url); + return extractPRdetails(data); }; -/** - * Fetches the latest `per_page` open PRs - * - * Order by default is desc, which will fetch latest open PRs, - * to fetch stale PRs just change pass order as asc - * - */ const fetchOpenPRs = async (params = {}) => { - const { perPage = 100, page = 1, searchParams = {}, resultOptions = {} } = params; - - try { - const url = getGithubURL( - { - type: "pr", - is: "open", - ...searchParams, - }, - { - sort: "created", - ...resultOptions, - per_page: perPage, - page, - } - ); - return getFetch(url); - } catch (err) { - logger.error(`Error while fetching open pull requests: ${err}`); - throw err; - } + const searchParams = { + is: "pr", + is_open: "true", + ...params, + }; + const url = getGithubURL(searchParams); + const data = await getFetch(url); + return extractPRdetails(data); }; const fetchMergedPRs = async (params = {}) => { - const { perPage = 100, page = 1, searchParams = {}, resultOptions = {} } = params; - - try { - const url = getGithubURL( - { - type: "pr", - is: "merged", - ...searchParams, - }, - { - sort: "updated", - ...resultOptions, - per_page: perPage, - page, - } - ); - - return getFetch(url); - } catch (err) { - logger.error(`Error while fetching closed pull requests: ${err}`); - throw err; - } + const searchParams = { + is: "pr", + is: "merged", + ...params, + }; + const url = getGithubURL(searchParams); + const data = await getFetch(url); + return extractPRdetails(data); }; const fetchOpenIssues = async (params = {}) => { - const { perPage = 100, page = 1, searchParams = {}, resultOptions = {}, searchString = "" } = params; - - try { - const url = getGithubURL( - { - type: "issue", - is: "open", - ...searchParams, - }, - { - sort: "created", - ...resultOptions, - per_page: perPage, - page, - }, - searchString - ); - return getFetch(url); - } catch (err) { - logger.error(`Error while fetching open issues: ${err}`); - throw err; - } + const searchParams = { + is: "issue", + is_open: "true", + ...params, + }; + const url = getGithubURL(searchParams); + const data = await getFetch(url); + return extractPRdetails(data); }; const fetchClosedIssues = async (params = {}) => { - const { perPage = 100, page = 1, searchParams = {}, resultOptions = {} } = params; - - try { - const url = getGithubURL( - { - type: "issue", - is: "closed", - ...searchParams, - }, - { - sort: "updated", - ...resultOptions, - per_page: perPage, - page, - } - ); - return getFetch(url); - } catch (err) { - logger.error(`Error while fetching closed issues: ${err}`); - throw err; - } + const searchParams = { + is: "issue", + is: "closed", + ...params, + }; + const url = getGithubURL(searchParams); + const data = await getFetch(url); + return extractPRdetails(data); }; -/** - * Fetches issues across all repositories in the ORG - */ const fetchIssues = async () => { - try { - const baseURL = config.get("githubApi.baseUrl"); - const issues = "/issues"; - const urlObj = new URL(baseURL); - urlObj.pathname = "orgs" + "/" + config.get("githubApi.org") + issues; - const createdURL = urlObj.href; - const res = await getFetchWithAuthToken( - createdURL, - { - filter: "all", - state: "open", - }, - { - Accept: "application/vnd.github+json", - // TODO: replace with RDS org PAT - Authorization: `Bearer `, - org: config.get("githubApi.org"), - } - ); - return res; - } catch (err) { - logger.error(`Error while fetching issues: ${err}`); - throw err; - } + const searchParams = { + is: "issue", + }; + const url = getGithubURL(searchParams); + const data = await getFetch(url); + return extractPRdetails(data); }; -/** - * Fetches issues for given repository and id - * @param repositoryName {string} - Github repository name where the issue is created. - * @param issueId {string} - Github issue id to be found. - * @returns {Object | null} - Object containing Issue details or null if no issue is found. - */ const fetchIssuesById = async (repositoryName, issueId) => { - try { - const baseURL = config.get("githubApi.baseUrl"); - const org = config.get("githubApi.org"); - const url = `${baseURL}/repos/${org}/${repositoryName}/issues/${issueId}`; - const headers = { - Accept: "application/vnd.github+json", - Authorization: `Bearer ${config.get("githubAccessToken")}`, - org: org, - }; - const res = await fetch(url, { headers }); - if (!res.ok) { - logger.error(`GitHub API request failed. Status: ${res.status}, URL: ${url}`); - return null; - } - return await res.json(); - } catch (err) { - logger.error(`Error while fetching issues: ${err}`); - throw err; - } + const url = `https://api.github.com/repos/${repositoryName}/issues/${issueId}`; + const data = await getFetch(url); + return { + title: data.title, + username: data.user.login, + state: data.state, + createdAt: data.created_at, + updatedAt: data.updated_at, + repository: repositoryName, + url: data.html_url, + labels: data.labels.map((label) => label.name), + assignees: data.assignees.map((assignee) => assignee.login), + }; }; -/** - * Fetches the last merged PR by a user - * @param username {string} - Username String - * @returns {Object} - Object containing the last merged PR - **/ const fetchLastMergedPR = async (username) => { - try { - const searchParams = { - type: "pr", - is: "merged", - author: username, - }; - const createdURL = getGithubURL(searchParams, { sort: "merged", order: "desc", per_page: "1" }); - - const headers = { - Accept: "application/vnd.github+json", - Authorization: `Bearer ${config.get("githubAccessToken")}`, - org: config.get("githubApi.org"), - }; - - const res = await fetch(createdURL, { headers }); - - if (!res.ok) { - logger.error(`GitHub API request failed. Status: ${res.status}, URL: ${createdURL}`); - return null; - } - - const data = await res.json(); - - if (!data || !data.items || !data.items.length) { - logger.error(`No merged PRs found for user ${username}`); - return null; - } - - return data; - } catch (err) { - logger.error(`Error while fetching merged PRs: ${err}`); - throw err; + const searchParams = { + is: "pr", + is: "merged", + author: username, + }; + const resultsOptions = { + sort: "updated", + order: "desc", + per_page: 1, + }; + const url = getGithubURL(searchParams, resultsOptions); + const data = await getFetch(url); + if (data.items.length === 0) { + return null; } + return extractPRdetails(data)[0]; }; -/** - * Checks if the last PR merged by a user is within the last `days` days - * @param username {string} - Username String - * @param days {number} - Number of days - * @returns {boolean} - True if last PR merged is within the last `days` days else false - **/ + const isLastPRMergedWithinDays = async (username, days) => { try { - const res = await fetchLastMergedPR(username); - if (!res) { + const lastMergedPR = await fetchLastMergedPR(username); + if (!lastMergedPR) { return false; } - const mergedAt = res.items[0].pull_request.merged_at; - const lastPRMergedDate = new Date(mergedAt); + const lastMergedDate = new Date(lastMergedPR.updatedAt); const currentDate = new Date(); - - const timeDifferenceInMilliseconds = currentDate - lastPRMergedDate; - const timeDifferenceInDays = timeDifferenceInMilliseconds / (1000 * 60 * 60 * 24); - - return timeDifferenceInDays <= days; - } catch (err) { - logger.error(`Error while checking last PR merged: ${err}`); - throw err; + const diffTime = Math.abs(currentDate - lastMergedDate); + const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)); + return diffDays <= days; + } catch (error) { + logger.error("Error in isLastPRMergedWithinDays", error); + return false; } }; -module.exports = { +export { fetchPRsByUser, fetchOpenPRs, fetchMergedPRs, diff --git a/services/goalService.js b/services/goalService.js index 39f033412..a9a881fb9 100644 --- a/services/goalService.js +++ b/services/goalService.js @@ -1,6 +1,6 @@ -const config = require("config"); +import config from "config"; -const getOrCreateGoalUser = async ({ userId, roles }) => { +export const getOrCreateGoalUser = async ({ userId, roles }) => { const body = JSON.stringify({ data: { type: "User", @@ -17,4 +17,3 @@ const getOrCreateGoalUser = async ({ userId, roles }) => { headers: { "Content-Type": "application/vnd.api+json", "Rest-Key": goalSiteConfig.secretKey }, }); }; -module.exports = { getOrCreateGoalUser }; diff --git a/services/imageService.js b/services/imageService.js index 3c5bc739c..0768955d7 100644 --- a/services/imageService.js +++ b/services/imageService.js @@ -1,7 +1,9 @@ -const DatauriParser = require("datauri/parser"); -const userModel = require("../models/users"); -const { upload } = require("../utils/cloudinary"); -const cloudinaryMetaData = require("../constants/cloudinary"); +import DatauriParser from "datauri/parser.js"; + +import { updateUserPicture } from "../models/users.js"; +import { upload } from "../utils/cloudinary.js"; +import cloudinaryMetaData from "../constants/cloudinary.js"; +import logger from "../utils/logger.js"; /** * upload user profile picture to cloudinary @@ -24,7 +26,7 @@ const uploadProfilePicture = async ({ file, userId, coordinates }) => { }, }); const { public_id: publicId, secure_url: url } = uploadResponse; - await userModel.updateUserPicture({ publicId, url }, userId); + await updateUserPicture({ publicId, url }, userId); return { publicId, url }; } catch (err) { logger.error(`Error while uploading profile picture ${err}`); @@ -55,7 +57,4 @@ async function uploadBadgeImage({ file, badgeName }) { } } -module.exports = { - uploadProfilePicture, - uploadBadgeImage, -}; +export { uploadProfilePicture, uploadBadgeImage }; diff --git a/services/index.js b/services/index.js index cd692f2a3..05c8cd19c 100644 --- a/services/index.js +++ b/services/index.js @@ -1,4 +1,4 @@ -const { EventAPIService } = require("../services/EventAPIService"); -const { EventTokenService } = require("../services/EventTokenService"); +import { EventAPIService } from "./EventAPIService.js"; +import { EventTokenService } from "./EventTokenService.js"; -module.exports = { EventAPIService, EventTokenService }; +export { EventAPIService, EventTokenService }; diff --git a/services/issuesService.js b/services/issuesService.js index 39eb8604f..f4a0a3918 100644 --- a/services/issuesService.js +++ b/services/issuesService.js @@ -1,23 +1,20 @@ -const githubService = require("./githubService"); +import { fetchIssues, fetchOpenIssues } from "./githubService.js"; + /** * Get the contributions of the user * @param {string} username */ - const getOrgIssues = async () => { - const data = await githubService.fetchIssues(); + const data = await fetchIssues(); return data; }; const searchOrgIssues = async (searchString) => { - const data = await githubService.fetchOpenIssues({ + const data = await fetchOpenIssues({ searchString, }); return data; }; -module.exports = { - getOrgIssues, - searchOrgIssues, -}; +export { getOrgIssues, searchOrgIssues }; diff --git a/services/logService.ts b/services/logService.ts index 2af85ef62..fb5dd7c30 100644 --- a/services/logService.ts +++ b/services/logService.ts @@ -1,7 +1,9 @@ -import firestore from "../utils/firestore"; -const logsModel = firestore.collection("logs"); +import firestore from "../utils/firestore.js"; import admin from "firebase-admin"; -const { INTERNAL_SERVER_ERROR } = require("../constants/errorMessages"); +import { INTERNAL_SERVER_ERROR } from "../constants/errorMessages.js"; +import logger from "../utils/logger.js"; + +const logsModel = firestore.collection("logs"); interface LogMeta { userId?: string; diff --git a/services/onboardingExtension.ts b/services/onboardingExtension.ts index f2b21fea9..42682040c 100644 --- a/services/onboardingExtension.ts +++ b/services/onboardingExtension.ts @@ -1,23 +1,25 @@ -import { logType } from "../constants/logs"; -import { - INVALID_REQUEST_DEADLINE, - INVALID_REQUEST_TYPE, - LOG_ACTION, - PENDING_REQUEST_UPDATED, - REQUEST_DOES_NOT_EXIST, - REQUEST_LOG_TYPE, - REQUEST_STATE, - REQUEST_TYPE, - UNAUTHORIZED_TO_UPDATE_REQUEST -} from "../constants/requests"; -import { OnboardingExtension, UpdateOnboardingExtensionRequestBody } from "../types/onboardingExtension"; -import { addLog } from "./logService"; -import firestore from "../utils/firestore"; +import { logType } from "../constants/logs.js"; +import { + INVALID_REQUEST_DEADLINE, + INVALID_REQUEST_TYPE, + LOG_ACTION, + PENDING_REQUEST_UPDATED, + REQUEST_DOES_NOT_EXIST, + REQUEST_LOG_TYPE, + REQUEST_STATE, + REQUEST_TYPE, + UNAUTHORIZED_TO_UPDATE_REQUEST, +} from "../constants/requests.js"; +import { OnboardingExtension, UpdateOnboardingExtensionRequestBody } from "../types/onboardingExtension.js"; +import { addLog } from "./logService.js"; +import firestore from "../utils/firestore.js"; +import logger from "../utils/logger.js"; + const requestModel = firestore.collection("requests"); /** * Validates the onboarding extension update request. - * + * * @param {object} extensionRequestDoc - The extension request document. * @param {string} id - Unique identifier for the request. * @param {boolean} isSuperuser - Whether the user has superuser privileges. @@ -26,105 +28,104 @@ const requestModel = firestore.collection("requests"); * @returns {Promise} Error details if validation fails. */ export const validateOnboardingExtensionUpdateRequest = async ( - extensionRequestDoc, - id: string, - isSuperuser: boolean, - lastModifiedBy: string, - newEndsOn: number + extensionRequestDoc, + id: string, + isSuperuser: boolean, + lastModifiedBy: string, + newEndsOn: number ) => { - try{ + try { + if (!extensionRequestDoc.exists) { + await addLog(logType.REQUEST_DOES_NOT_EXIST, { id }, { message: REQUEST_DOES_NOT_EXIST }); + return { + error: REQUEST_DOES_NOT_EXIST, + }; + } + + const extensionRequest = extensionRequestDoc.data() as OnboardingExtension; - if(!extensionRequestDoc.exists){ - await addLog(logType.REQUEST_DOES_NOT_EXIST, { id }, { message: REQUEST_DOES_NOT_EXIST }); - return { - error: REQUEST_DOES_NOT_EXIST, - } - } + if (!isSuperuser && lastModifiedBy !== extensionRequest.userId) { + await addLog( + logType.UNAUTHORIZED_TO_UPDATE_REQUEST, + { lastModifiedBy, userId: extensionRequest.userId }, + { message: UNAUTHORIZED_TO_UPDATE_REQUEST } + ); + return { + error: UNAUTHORIZED_TO_UPDATE_REQUEST, + }; + } - const extensionRequest = extensionRequestDoc.data() as OnboardingExtension; - - if(!isSuperuser && lastModifiedBy !== extensionRequest.userId) { - await addLog(logType.UNAUTHORIZED_TO_UPDATE_REQUEST, - { lastModifiedBy, userId: extensionRequest.userId }, - { message: UNAUTHORIZED_TO_UPDATE_REQUEST } - ); - return { - error: UNAUTHORIZED_TO_UPDATE_REQUEST - }; - } + if (extensionRequest.type !== REQUEST_TYPE.ONBOARDING) { + await addLog(logType.INVALID_REQUEST_TYPE, { type: extensionRequest.type }, { message: INVALID_REQUEST_TYPE }); + return { + error: INVALID_REQUEST_TYPE, + }; + } - if(extensionRequest.type !== REQUEST_TYPE.ONBOARDING) { - await addLog(logType.INVALID_REQUEST_TYPE, - { type: extensionRequest.type }, - { message: INVALID_REQUEST_TYPE } - ); - return { - error: INVALID_REQUEST_TYPE - }; - } - - if(extensionRequest.state !== REQUEST_STATE.PENDING){ - await addLog(logType.PENDING_REQUEST_CAN_BE_UPDATED, - { state: extensionRequest.state }, - { message:PENDING_REQUEST_UPDATED } - ); - return { - error: PENDING_REQUEST_UPDATED - }; - } + if (extensionRequest.state !== REQUEST_STATE.PENDING) { + await addLog( + logType.PENDING_REQUEST_CAN_BE_UPDATED, + { state: extensionRequest.state }, + { message: PENDING_REQUEST_UPDATED } + ); + return { + error: PENDING_REQUEST_UPDATED, + }; + } - if(extensionRequest.oldEndsOn >= newEndsOn) { - await addLog(logType.INVALID_REQUEST_DEADLINE, - { oldEndsOn: extensionRequest.oldEndsOn, newEndsOn: newEndsOn }, - { message: INVALID_REQUEST_DEADLINE } - ); - return { - error: INVALID_REQUEST_DEADLINE - }; - } - }catch(error){ - logger.error("Error while validating onboarding extension update request", error); - throw error; + if (extensionRequest.oldEndsOn >= newEndsOn) { + await addLog( + logType.INVALID_REQUEST_DEADLINE, + { oldEndsOn: extensionRequest.oldEndsOn, newEndsOn: newEndsOn }, + { message: INVALID_REQUEST_DEADLINE } + ); + return { + error: INVALID_REQUEST_DEADLINE, + }; } -} + } catch (error) { + logger.error("Error while validating onboarding extension update request", error); + throw error; + } +}; /** * Updates an onboarding extension request. - * + * * @param {string} id - The extension request document. * @param {UpdateOnboardingExtensionRequestBody} body - New request details. * @param {string} lastModifiedBy - ID of the user updating the request. * @returns {Promise} Updated request body. */ export const updateOnboardingExtensionRequest = async ( - id: string, - body: UpdateOnboardingExtensionRequestBody, - lastModifiedBy: string + id: string, + body: UpdateOnboardingExtensionRequestBody, + lastModifiedBy: string ) => { - try{ - const requestBody = { - ...body, - lastModifiedBy, - updatedAt: Date.now(), - } - - await requestModel.doc(id).update(requestBody); - - const requestLog = { - type: REQUEST_LOG_TYPE.REQUEST_UPDATED, - meta: { - requestId: id, - action: LOG_ACTION.UPDATE, - createdBy: lastModifiedBy, - }, - body: requestBody, - }; - - await addLog(requestLog.type, requestLog.meta, requestLog.body); - - return requestBody; - }catch(error){ - logger.error("Error while updating onboarding extension request", error); - throw error; - } -} \ No newline at end of file + try { + const requestBody = { + ...body, + lastModifiedBy, + updatedAt: Date.now(), + }; + + await requestModel.doc(id).update(requestBody); + + const requestLog = { + type: REQUEST_LOG_TYPE.REQUEST_UPDATED, + meta: { + requestId: id, + action: LOG_ACTION.UPDATE, + createdBy: lastModifiedBy, + }, + body: requestBody, + }; + + await addLog(requestLog.type, requestLog.meta, requestLog.body); + + return requestBody; + } catch (error) { + logger.error("Error while updating onboarding extension request", error); + throw error; + } +}; diff --git a/services/oooRequest.ts b/services/oooRequest.ts index 2e2f35ab7..8e63bac64 100644 --- a/services/oooRequest.ts +++ b/services/oooRequest.ts @@ -1,16 +1,17 @@ -import { logType } from "../constants/logs"; -import { +import { logType } from "../constants/logs.js"; +import { LOG_ACTION, OOO_STATUS_ALREADY_EXIST, REQUEST_LOG_TYPE, REQUEST_STATE, USER_STATUS_NOT_FOUND, -} from "../constants/requests"; -import { userState } from "../constants/userStatus"; -import { createRequest } from "../models/requests"; -import { OooStatusRequest, OooStatusRequestBody } from "../types/oooRequest"; -import { UserStatus } from "../types/userStatus"; -import { addLog } from "./logService"; +} from "../constants/requests.js"; +import { userState } from "../constants/userStatus.js"; +import { createRequest } from "../models/requests.js"; +import { OooStatusRequest, OooStatusRequestBody } from "../types/oooRequest.js"; +import { UserStatus } from "../types/userStatus.js"; +import logger from "../utils/logger.js"; +import { addLog } from "./logService.js"; /** * Validates the user status. diff --git a/services/tasks.js b/services/tasks.js index bedf8a851..62ce9854a 100644 --- a/services/tasks.js +++ b/services/tasks.js @@ -1,9 +1,11 @@ -const firestore = require("../utils/firestore"); +import firestore from "../utils/firestore.js"; +import { chunks } from "../utils/array.js"; +import { DOCUMENT_WRITE_SIZE as FIRESTORE_BATCH_OPERATIONS_LIMIT } from "../constants/constants.js"; +import { fetchUsersNotInDiscordServer } from "../models/users.js"; +import taskModel from "../models/tasks.js"; +import logger from "../utils/logger.js"; + const tasksModel = firestore.collection("tasks"); -const { chunks } = require("../utils/array"); -const { DOCUMENT_WRITE_SIZE: FIRESTORE_BATCH_OPERATIONS_LIMIT } = require("../constants/constants"); -const usersQuery = require("../models/users"); -const tasksQuery = require("../models/tasks"); const addTaskCreatedAtAndUpdatedAtFields = async () => { const operationStats = { @@ -60,13 +62,13 @@ const addTaskCreatedAtAndUpdatedAtFields = async () => { const fetchOrphanedTasks = async () => { try { - const userSnapshot = await usersQuery.fetchUsersNotInDiscordServer(); + const userSnapshot = await fetchUsersNotInDiscordServer(); if (userSnapshot.empty) return []; const userIds = userSnapshot.docs.map((doc) => doc.id); - const orphanedTasksData = await tasksQuery.fetchIncompleteTasksByUserIds(userIds); + const orphanedTasksData = await taskModel.fetchIncompleteTasksByUserIds(userIds); if (orphanedTasksData.empty) { return []; @@ -81,7 +83,4 @@ const fetchOrphanedTasks = async () => { } }; -module.exports = { - addTaskCreatedAtAndUpdatedAtFields, - fetchOrphanedTasks, -}; +export { addTaskCreatedAtAndUpdatedAtFields, fetchOrphanedTasks }; diff --git a/services/tradingService.js b/services/tradingService.js index af4a6f0d4..d3f8bb501 100644 --- a/services/tradingService.js +++ b/services/tradingService.js @@ -1,10 +1,12 @@ -const firestore = require("../utils/firestore"); +import firestore from "../utils/firestore.js"; +import { fetchWallet, updateWallet } from "../models/wallets.js"; +import { fetchUserStocks, updateUserStocks } from "../models/stocks.js"; +import { DINERO } from "../constants/wallets.js"; +import logger from "../utils/logger.js"; + const stocksModel = firestore.collection("stocks"); const transactionsModel = firestore.collection("transactions"); const tradeLogsModel = firestore.collection("trade-logs"); -const { fetchWallet, updateWallet } = require("../models/wallets"); -const { fetchUserStocks, updateUserStocks } = require("../models/stocks"); -const { DINERO } = require("../constants/wallets"); const INSUFFICIENT_FUNDS = "Trade was not successful due to insufficient funds"; const INSUFFICIENT_QUANTITIES = "Trade was not successful because you do not have enough quantity"; @@ -90,7 +92,6 @@ const trade = async (tradeData) => { }; // Update user stocks - await updateUserStocks(userId, { stockId, stockName, @@ -100,7 +101,6 @@ const trade = async (tradeData) => { }); // Transaction Log - const { id } = await tradeLogsModel.add({ type: `STOCK_${tradeType}`, userId: userId, @@ -119,7 +119,6 @@ const trade = async (tradeData) => { }); // update user wallet - await updateWallet(userId, { ...currencies, ...updatedCurrencyData, @@ -133,6 +132,4 @@ const trade = async (tradeData) => { } }; -module.exports = { - trade, -}; +export { trade }; diff --git a/services/users.js b/services/users.js index 94646d896..134f7be9c 100644 --- a/services/users.js +++ b/services/users.js @@ -1,7 +1,9 @@ -const firestore = require("../utils/firestore"); -const { formatUsername } = require("../utils/username"); +import firestore from "../utils/firestore.js"; +import { formatUsername } from "../utils/username.js"; +import taskModel from "../models/tasks.js"; +import logger from "../utils/logger.js"; + const userModel = firestore.collection("users"); -const tasksModel = require("../models/tasks"); const getUsersWithIncompleteTasks = async (users) => { if (users.length === 0) return []; @@ -9,7 +11,7 @@ const getUsersWithIncompleteTasks = async (users) => { try { const userIds = users.map((user) => user.id); - const abandonedTasksQuerySnapshot = await tasksModel.fetchIncompleteTasksByUserIds(userIds); + const abandonedTasksQuerySnapshot = await taskModel.fetchIncompleteTasksByUserIds(userIds); if (abandonedTasksQuerySnapshot.empty) { return []; @@ -46,7 +48,4 @@ const generateUniqueUsername = async (firstName, lastName) => { } }; -module.exports = { - generateUniqueUsername, - getUsersWithIncompleteTasks, -}; +export { generateUniqueUsername, getUsersWithIncompleteTasks }; diff --git a/test/config/test.js b/test/config/test.js index 824800679..1190ee236 100644 --- a/test/config/test.js +++ b/test/config/test.js @@ -5,7 +5,7 @@ const port = 7337; const NODE_ENV = process.env.NODE_ENV; -module.exports = { +export default { port, enableFileLogs: false, // Console logs are set to avoid the winston error of no defined transports diff --git a/test/fixtures/abandoned-tasks/departed-users.js b/test/fixtures/abandoned-tasks/departed-users.js index ad58e877c..9fbb6b27d 100644 --- a/test/fixtures/abandoned-tasks/departed-users.js +++ b/test/fixtures/abandoned-tasks/departed-users.js @@ -1,4 +1,4 @@ -const usersData = [ +export const usersData = [ { id: "user1_id", discordId: "123456789", @@ -64,7 +64,7 @@ const usersData = [ }, ]; -const tasksData = [ +export const tasksData = [ { id: "task1_id", title: "Abandoned Task 1", @@ -146,5 +146,3 @@ const tasksData = [ dependsOn: [], }, ]; - -module.exports = { usersData, tasksData }; diff --git a/test/fixtures/answers/answers.ts b/test/fixtures/answers/answers.ts index 0f629252d..b47d9dcc2 100644 --- a/test/fixtures/answers/answers.ts +++ b/test/fixtures/answers/answers.ts @@ -1,4 +1,4 @@ -const answerData = [ +export const SAMPLE_ANSWER_DATA = [ { id: "dummy-answer-id", eventId: "event_id", @@ -32,4 +32,3 @@ const answerData = [ }, ]; -module.exports = answerData; diff --git a/test/fixtures/applications/applications.ts b/test/fixtures/applications/applications.ts index 1eac5ba0a..101890b73 100644 --- a/test/fixtures/applications/applications.ts +++ b/test/fixtures/applications/applications.ts @@ -1,10 +1,9 @@ -module.exports = () => { - return [ - { - firstName: "vinayak", - lastName: "triveid", - college: "Christ Church college", - skills: "React, Ember, Node js", +export const SAMPLE_APPLICATION_DATA = [ + { + firstName: "vinayak", + lastName: "triveid", + college: "Christ Church college", + skills: "React, Ember, Node js", city: "Kanpur", state: "Uttar Pradesh", country: "India", @@ -151,6 +150,5 @@ module.exports = () => { whyRds: "mattis aliquam faucibus purus in massa tempor nec feugiat nisl pretium fusce id velit ut tortor pretium viverra suspendisse potenti nullam ac tortor vitae purus faucibus ornare suspendisse sed nisi lacus sed viverra tellus in hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit ullamcorper dignissim cras tincidunt lobortis feugiat vivamus at augue eget arcu dictum varius duis at consectetur lorem donec massa sapien faucibus et molestie ac feugiat sed lectus vestibulum mattis ullamcorper velit sed ullamcorper morbi tincidunt ornare massa eget egestas purus viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor eu augue ut lectus arcu bibendum at", foundFrom: "twitter", - }, - ]; -}; + }, +]; diff --git a/test/fixtures/arts/arts.js b/test/fixtures/arts/arts.js index 0e5a35b5d..172a33d58 100644 --- a/test/fixtures/arts/arts.js +++ b/test/fixtures/arts/arts.js @@ -1,4 +1,4 @@ -module.exports = () => { +export default () => { return [ { title: "Green Square", diff --git a/test/fixtures/auctions/auctions.js b/test/fixtures/auctions/auctions.js index 1403853be..26d0f1c27 100644 --- a/test/fixtures/auctions/auctions.js +++ b/test/fixtures/auctions/auctions.js @@ -1,4 +1,4 @@ -const { NEELAM } = require("../../../constants/wallets"); +import { NEELAM } from "../../../constants/wallets.js"; /* Import fixtures * @@ -18,4 +18,4 @@ const auctionKeys = ["auctions", "message"]; const auctionWithIdKeys = ["bidders_and_bids", "end_time", "highest_bid", "item", "quantity", "seller", "start_time"]; -module.exports = { auctionData, auctionKeys, auctionWithIdKeys }; +export default { auctionData, auctionKeys, auctionWithIdKeys }; diff --git a/test/fixtures/auth/githubUserInfo.js b/test/fixtures/auth/githubUserInfo.js index 80631c7ea..eac7e5017 100644 --- a/test/fixtures/auth/githubUserInfo.js +++ b/test/fixtures/auth/githubUserInfo.js @@ -4,7 +4,7 @@ * * @return {Object} */ -module.exports = () => { +export default () => { return [ // Response for no scope specified { diff --git a/test/fixtures/auth/googleUserInfo.js b/test/fixtures/auth/googleUserInfo.js index 54428561d..8e1a45fa0 100644 --- a/test/fixtures/auth/googleUserInfo.js +++ b/test/fixtures/auth/googleUserInfo.js @@ -4,7 +4,7 @@ * * @return {Object} */ -module.exports = () => { +export default () => { return [ { id: "1234567890", diff --git a/test/fixtures/badges/badges.js b/test/fixtures/badges/badges.js index 7160886d0..80d3f7c77 100644 --- a/test/fixtures/badges/badges.js +++ b/test/fixtures/badges/badges.js @@ -53,7 +53,7 @@ const CLOUNDINARY_BADGE_IMAGE_UPLOAD_RESPONSE = { imageUrl: CLOUNDINARY_IMAGE_URL, }; -module.exports = { +export default { BADGES, EXPECTED_BADGE_OBJECT, CLOUNDINARY_BADGE_IMAGE_UPLOAD_RESPONSE, diff --git a/test/fixtures/cache/cache.js b/test/fixtures/cache/cache.js index 1b1bdf997..d0651bac4 100644 --- a/test/fixtures/cache/cache.js +++ b/test/fixtures/cache/cache.js @@ -1,3 +1,3 @@ const dummyResponse = { body: "test" }; -module.exports = { dummyResponse }; +export default { dummyResponse }; diff --git a/test/fixtures/challenges/challenges.js b/test/fixtures/challenges/challenges.js index b6ca70087..3a9f86343 100644 --- a/test/fixtures/challenges/challenges.js +++ b/test/fixtures/challenges/challenges.js @@ -1,6 +1,6 @@ -const timeUtils = require("../../../utils/time"); +import timeUtils from "../../../utils/time.js"; -module.exports = () => { +export default () => { return [ { title: "Sherlock and Anagrams", diff --git a/test/fixtures/cloudflareCache/data.js b/test/fixtures/cloudflareCache/data.js index 0bd1fe4fd..5d6c4676a 100644 --- a/test/fixtures/cloudflareCache/data.js +++ b/test/fixtures/cloudflareCache/data.js @@ -36,7 +36,7 @@ const purgeCacheResponse = [ }, ]; -module.exports = { +export default { cacheLogs, cacheModelData, purgeCacheResponse, diff --git a/test/fixtures/contributions/githubPRInfo.js b/test/fixtures/contributions/githubPRInfo.js index b4d641911..8713a3bd8 100644 --- a/test/fixtures/contributions/githubPRInfo.js +++ b/test/fixtures/contributions/githubPRInfo.js @@ -4,7 +4,7 @@ * * @return {Object} */ -module.exports = () => { +export default () => { return { prakash: { data: { diff --git a/test/fixtures/currencies/currencies.js b/test/fixtures/currencies/currencies.js index 97fa7460f..c5659376f 100644 --- a/test/fixtures/currencies/currencies.js +++ b/test/fixtures/currencies/currencies.js @@ -1,4 +1,4 @@ -const { DINERO, NEELAM } = require("../../../constants/wallets"); +import { DINERO, NEELAM } from "../../../constants/wallets.js"; /* Import fixtures * @@ -7,7 +7,7 @@ const { DINERO, NEELAM } = require("../../../constants/wallets"); * @return {Object} */ -module.exports = { +export default { default: { [DINERO]: 1000, [NEELAM]: 2, diff --git a/test/fixtures/discordResponse/discord-response.js b/test/fixtures/discordResponse/discord-response.js index ba2a6b213..1fbde0b85 100644 --- a/test/fixtures/discordResponse/discord-response.js +++ b/test/fixtures/discordResponse/discord-response.js @@ -290,7 +290,7 @@ const getOnboarding31DPlusMembers = [ }, ]; -module.exports = { +export default { getDiscordMembers, usersFromRds, updatedNicknameResponse, diff --git a/test/fixtures/discordactions/discordactions.js b/test/fixtures/discordactions/discordactions.js index cc2da4d1f..a65b49531 100644 --- a/test/fixtures/discordactions/discordactions.js +++ b/test/fixtures/discordactions/discordactions.js @@ -49,7 +49,7 @@ const groupOnboarding31dPlus = { createdBy: "1dad23q23j131j", }; -module.exports = { +export { groupData, roleData, memberGroupData, diff --git a/test/fixtures/events/event-codes.js b/test/fixtures/events/event-codes.js index 1d164335b..7222b4141 100644 --- a/test/fixtures/events/event-codes.js +++ b/test/fixtures/events/event-codes.js @@ -1,4 +1,4 @@ -module.exports = () => { +export default () => { return [ { message: "Event code created succesfully!", diff --git a/test/fixtures/events/events.js b/test/fixtures/events/events.js index abfd2de3b..146a596aa 100644 --- a/test/fixtures/events/events.js +++ b/test/fixtures/events/events.js @@ -1,4 +1,4 @@ -module.exports = () => { +export default () => { return [ { template: "Video-Conferencing-Testing", diff --git a/test/fixtures/events/peers.js b/test/fixtures/events/peers.js index eccc6e2e2..afa1f0d40 100644 --- a/test/fixtures/events/peers.js +++ b/test/fixtures/events/peers.js @@ -1,4 +1,5 @@ -const eventData = require("../events/events")(); +import eventData from "../events/events.js"; + const event1Data = eventData[0]; const eventOnePeerData = { @@ -9,4 +10,4 @@ const eventOnePeerData = { joinedAt: new Date(), }; -module.exports = { eventOnePeerData }; +export default { eventOnePeerData }; diff --git a/test/fixtures/external-accounts/external-accounts.js b/test/fixtures/external-accounts/external-accounts.js index 86a061e10..977a796f3 100644 --- a/test/fixtures/external-accounts/external-accounts.js +++ b/test/fixtures/external-accounts/external-accounts.js @@ -1,4 +1,4 @@ -module.exports = () => { +export default () => { return [ { type: "discord", diff --git a/test/fixtures/featureFlag/featureFlag.js b/test/fixtures/featureFlag/featureFlag.js index 50aef0840..7bd849fc0 100644 --- a/test/fixtures/featureFlag/featureFlag.js +++ b/test/fixtures/featureFlag/featureFlag.js @@ -1,4 +1,4 @@ -module.exports = () => { +export default () => { return [ { name: "Test-feature", diff --git a/test/fixtures/goals/Token.js b/test/fixtures/goals/Token.js index 08875ccfc..45d6dc313 100644 --- a/test/fixtures/goals/Token.js +++ b/test/fixtures/goals/Token.js @@ -6,4 +6,4 @@ const GET_OR_CREATE_GOAL_USER = { data: { attributes: { rds_id: "134556", token: "WHhHhWHu9ijHjkKhdbvFFhbnhCj" } }, }), }; -module.exports = { GET_OR_CREATE_GOAL_USER }; +export default { GET_OR_CREATE_GOAL_USER }; diff --git a/test/fixtures/issues/issues.js b/test/fixtures/issues/issues.js index bb08b1411..e91c9d299 100644 --- a/test/fixtures/issues/issues.js +++ b/test/fixtures/issues/issues.js @@ -111,4 +111,4 @@ const issuesData = { }; const issuesHtmlUrl = "https://github.com/Real-Dev-Squad/website-www/issues/679"; -module.exports = { issuesData, issuesHtmlUrl }; +export default { issuesData, issuesHtmlUrl }; diff --git a/test/fixtures/profileDiffs/profileDiffs.js b/test/fixtures/profileDiffs/profileDiffs.js index 73cedcdf2..72864c499 100644 --- a/test/fixtures/profileDiffs/profileDiffs.js +++ b/test/fixtures/profileDiffs/profileDiffs.js @@ -1,4 +1,4 @@ -module.exports = () => { +export default () => { return [ { approval: "PENDING", diff --git a/test/fixtures/progress/progresses.js b/test/fixtures/progress/progresses.js index abcb80677..6460550a2 100644 --- a/test/fixtures/progress/progresses.js +++ b/test/fixtures/progress/progresses.js @@ -1,11 +1,11 @@ -const standupProgressDay1 = { +export const standupProgressDay1 = { type: "user", completed: "Working on a backend Go project", planned: "Implement error handling for API endpoints", blockers: "Waiting for database access credentials", }; -const incompleteProgress = [ +export const incompleteProgress = [ { missingField: "type", payload: { @@ -40,7 +40,7 @@ const incompleteProgress = [ }, ]; -const stubbedModelProgressData = (userId, createdAt, date) => { +export const stubbedModelProgressData = (userId, createdAt, date) => { return { userId, createdAt, @@ -52,7 +52,7 @@ const stubbedModelProgressData = (userId, createdAt, date) => { }; }; -const taskProgressDay1 = (taskId) => { +export const taskProgressDay1 = (taskId) => { return { taskId, type: "task", @@ -62,7 +62,7 @@ const taskProgressDay1 = (taskId) => { }; }; -const incompleteTaskProgress = (taskId) => [ +export const incompleteTaskProgress = (taskId) => [ { missingField: "type", payload: { @@ -110,7 +110,7 @@ const incompleteTaskProgress = (taskId) => [ }, ]; -const stubbedModelTaskProgressData = (userId, taskId, createdAt, date) => { +export const stubbedModelTaskProgressData = (userId, taskId, createdAt, date) => { return { userId, taskId, @@ -122,12 +122,3 @@ const stubbedModelTaskProgressData = (userId, taskId, createdAt, date) => { blockers: "Waiting for feedback from the code review", }; }; - -module.exports = { - standupProgressDay1, - incompleteProgress, - stubbedModelProgressData, - taskProgressDay1, - incompleteTaskProgress, - stubbedModelTaskProgressData, -}; diff --git a/test/fixtures/pullrequests/pullrequests.js b/test/fixtures/pullrequests/pullrequests.js index fd9aef059..f4cfbd996 100644 --- a/test/fixtures/pullrequests/pullrequests.js +++ b/test/fixtures/pullrequests/pullrequests.js @@ -128,7 +128,7 @@ const prDates = [ }, }, ]; -module.exports = { +export default { filteredPRs, prDates, }; diff --git a/test/fixtures/qrCodeAuth/qrCodeAuth.js b/test/fixtures/qrCodeAuth/qrCodeAuth.js index 35e078bf7..82059cd3d 100644 --- a/test/fixtures/qrCodeAuth/qrCodeAuth.js +++ b/test/fixtures/qrCodeAuth/qrCodeAuth.js @@ -15,4 +15,4 @@ const userDeviceInfoDataArray = [ const userDeviceInfoIdKeys = ["user_id", "device_info", "device_id"]; -module.exports = { userDeviceInfoDataArray, userDeviceInfoIdKeys }; +export default { userDeviceInfoDataArray, userDeviceInfoIdKeys }; diff --git a/test/fixtures/questions/questions.ts b/test/fixtures/questions/questions.ts index beb9d2f37..c6a6863d8 100644 --- a/test/fixtures/questions/questions.ts +++ b/test/fixtures/questions/questions.ts @@ -1,4 +1,4 @@ -const questionDataArray = [ +export const SAMPLE_QUESTION_DATA = [ { id: "demo-question-id-1", question: "This is the question", @@ -70,5 +70,3 @@ const questionDataArray = [ updated_at: new Date().toString(), }, ]; - -module.exports = questionDataArray; diff --git a/test/fixtures/recruiter/recruiter.js b/test/fixtures/recruiter/recruiter.js index 4fa9a009e..0ddff231a 100644 --- a/test/fixtures/recruiter/recruiter.js +++ b/test/fixtures/recruiter/recruiter.js @@ -32,4 +32,4 @@ const recruiterWithIdKeys = [ "username", ]; -module.exports = { recruiterDataArray, recruiterWithIdKeys }; +export default { recruiterDataArray, recruiterWithIdKeys }; diff --git a/test/fixtures/standup/standup.js b/test/fixtures/standup/standup.js index 5e9c95967..3f22b3451 100644 --- a/test/fixtures/standup/standup.js +++ b/test/fixtures/standup/standup.js @@ -1,4 +1,4 @@ -module.exports = () => { +export default () => { return [ { timestamp: "2023-04-20T16:23:58Z", diff --git a/test/fixtures/task-requests/task-requests.js b/test/fixtures/task-requests/task-requests.js index 8190087a9..a79de2c6c 100644 --- a/test/fixtures/task-requests/task-requests.js +++ b/test/fixtures/task-requests/task-requests.js @@ -1,4 +1,4 @@ -const { TASK_REQUEST_TYPE } = require("../../../constants/taskRequests"); +import { TASK_REQUEST_TYPE } from "../../../constants/taskRequests.js"; const validAssignmentRequest = { taskId: "1234", externalIssueUrl: "https://api.github.com/repos/Real-Dev-Squad/website-status/issues/1564672", @@ -72,7 +72,7 @@ const existingOldTaskRequestWithMultipleUsers = { status: "PENDING", taskId: "task456", }; -module.exports = { +export default { existingOldTaskRequest, taskRequestData, existingTaskRequest, diff --git a/test/fixtures/tasks/tasks.js b/test/fixtures/tasks/tasks.js index a6389d73c..f0bf1884c 100644 --- a/test/fixtures/tasks/tasks.js +++ b/test/fixtures/tasks/tasks.js @@ -1,12 +1,13 @@ -const { DINERO, NEELAM } = require("../../../constants/wallets"); -const userData = require("../fixtures/../user/user")(); +import { DINERO, NEELAM } from "../../../constants/wallets.js"; +import userData from "../user/user.js"; + const adminuser = userData[3]; /** * Sample tasks for tests * @return {object} */ -module.exports = () => { +export default () => { return [ { title: "Overdue task 1", diff --git a/test/fixtures/tasks/tasks1.js b/test/fixtures/tasks/tasks1.js index 0f5072407..256051b22 100644 --- a/test/fixtures/tasks/tasks1.js +++ b/test/fixtures/tasks/tasks1.js @@ -1,12 +1,13 @@ -const { DINERO, NEELAM } = require("../../../constants/wallets"); -const userData = require("../user/user")(); +import { DINERO, NEELAM } from "../../../constants/wallets.js"; +import userData from "../user/user.js"; + const appOwner = userData[3]; /** * Sample tasks for tests * @return {object} */ -module.exports = () => { +export default () => { return [ { title: "Test task", diff --git a/test/fixtures/time/time.js b/test/fixtures/time/time.js index 0d957771f..8035b9f5b 100644 --- a/test/fixtures/time/time.js +++ b/test/fixtures/time/time.js @@ -1,4 +1,4 @@ -const admin = require("firebase-admin"); +import admin from "firebase-admin"; const minutesToMilliseconds = [ { @@ -65,7 +65,7 @@ const timeBeforeHour = [ }, ]; -module.exports = { +export default { minutesToMilliseconds, hoursToMilliseconds, daysToMilliseconds, diff --git a/test/fixtures/trackedProgress/index.js b/test/fixtures/trackedProgress/index.js index 742ba459f..f147e3cf1 100644 --- a/test/fixtures/trackedProgress/index.js +++ b/test/fixtures/trackedProgress/index.js @@ -40,7 +40,7 @@ const isISOString = (value) => { return new Date(value).toISOString() === value; }; -module.exports = { +export default { predefinedTrackedProgressDataForUser, predefinedTrackedProgressDataForTask, trackedProgressUserDataForPost, diff --git a/test/fixtures/user/inDiscord.js b/test/fixtures/user/inDiscord.js index ac16abf2d..6896104cf 100644 --- a/test/fixtures/user/inDiscord.js +++ b/test/fixtures/user/inDiscord.js @@ -1,4 +1,4 @@ -module.exports = () => { +export default () => { return [ { avatar: null, diff --git a/test/fixtures/user/join.js b/test/fixtures/user/join.js index 173fa36c0..adceec66c 100644 --- a/test/fixtures/user/join.js +++ b/test/fixtures/user/join.js @@ -1,4 +1,4 @@ -module.exports = (userId = " ") => { +export default (userId = " ") => { return [ { college: "I work at Tata Consultancy Services", diff --git a/test/fixtures/user/photo-verification.js b/test/fixtures/user/photo-verification.js index 1950b750e..b4bbd4596 100644 --- a/test/fixtures/user/photo-verification.js +++ b/test/fixtures/user/photo-verification.js @@ -39,4 +39,4 @@ const newUserPhotoVerificationData = { }, }; -module.exports = { userPhotoVerificationData, newUserPhotoVerificationData }; +export default { userPhotoVerificationData, newUserPhotoVerificationData }; diff --git a/test/fixtures/user/removalData.js b/test/fixtures/user/removalData.js index 49b94e4a7..26902b93f 100644 --- a/test/fixtures/user/removalData.js +++ b/test/fixtures/user/removalData.js @@ -1,3 +1,3 @@ -module.exports = () => { +export default () => { return ["phone", "emails", "tokens", "chaincode"]; }; diff --git a/test/fixtures/user/search.js b/test/fixtures/user/search.js index 355a293d7..48c4c437b 100644 --- a/test/fixtures/user/search.js +++ b/test/fixtures/user/search.js @@ -3,6 +3,6 @@ * @return {object} */ -module.exports = () => { +export default () => { return { an: "an", AN: "AN", null: "", mu: "mu", number23: 23 }; }; diff --git a/test/fixtures/user/user.js b/test/fixtures/user/user.js index 96817bd77..fe43289fb 100644 --- a/test/fixtures/user/user.js +++ b/test/fixtures/user/user.js @@ -1,5 +1,5 @@ // Import fixtures -const githubUserInfo = require("../auth/githubUserInfo")(); +import githubUserInfo from "../auth/githubUserInfo.js"; /** * User info for GitHub auth response @@ -7,7 +7,7 @@ const githubUserInfo = require("../auth/githubUserInfo")(); * * @return {Object} */ -module.exports = () => { +export default () => { return [ { username: "ankur", diff --git a/test/fixtures/userBadges/userBadges.js b/test/fixtures/userBadges/userBadges.js index cca78af1e..cb21e4f61 100644 --- a/test/fixtures/userBadges/userBadges.js +++ b/test/fixtures/userBadges/userBadges.js @@ -20,4 +20,4 @@ const badgesEmpty = { userBadges: [], }; -module.exports = { userFound, userNotFound, badgesEmpty }; +export default { userFound, userNotFound, badgesEmpty }; diff --git a/test/fixtures/userDeviceInfo/userDeviceInfo.js b/test/fixtures/userDeviceInfo/userDeviceInfo.js index 35e078bf7..82059cd3d 100644 --- a/test/fixtures/userDeviceInfo/userDeviceInfo.js +++ b/test/fixtures/userDeviceInfo/userDeviceInfo.js @@ -15,4 +15,4 @@ const userDeviceInfoDataArray = [ const userDeviceInfoIdKeys = ["user_id", "device_info", "device_id"]; -module.exports = { userDeviceInfoDataArray, userDeviceInfoIdKeys }; +export default { userDeviceInfoDataArray, userDeviceInfoIdKeys }; diff --git a/test/fixtures/userStatus/userStatus.js b/test/fixtures/userStatus/userStatus.js index 733bb73a5..224a66da0 100644 --- a/test/fixtures/userStatus/userStatus.js +++ b/test/fixtures/userStatus/userStatus.js @@ -1,5 +1,5 @@ -const { userState } = require("../../../constants/userStatus"); -const { ONE_DAY_IN_MS } = require("../../../constants/users"); +import { userState } from "../../../constants/userStatus.js"; +import { ONE_DAY_IN_MS } from "../../../constants/users.js"; const userStatusDataForNewUser = { currentStatus: { @@ -218,7 +218,7 @@ const generateDefaultFutureStatus = (state, from, until) => { return futureStatusData; }; -module.exports = { +export { userStatusDataForNewUser, userStatusDataAfterSignup, userStatusDataAfterFillingJoinSection, diff --git a/test/fixtures/wallet/wallet.js b/test/fixtures/wallet/wallet.js index e34bfa6ad..68d4ad1ad 100644 --- a/test/fixtures/wallet/wallet.js +++ b/test/fixtures/wallet/wallet.js @@ -11,4 +11,4 @@ const walletBodyKeys = ["message", "wallet"]; const walletDataKeys = ["userId", "isActive", "currencies"]; -module.exports = { walletBodyKeys, walletKeys, walletDataKeys }; +export default { walletBodyKeys, walletKeys, walletDataKeys }; diff --git a/test/integration/answers.test.ts b/test/integration/answers.test.ts index e1b9356bc..abadd7c7e 100644 --- a/test/integration/answers.test.ts +++ b/test/integration/answers.test.ts @@ -1,22 +1,24 @@ +// @ts-nocheck + import chai, { expect } from "chai"; import chaiHttp from "chai-http"; -const sinon = require("sinon"); -const config = require("config"); - -const app = require("../../server"); -import addUser from "../utils/addUser"; -const cleanDb = require("../utils/cleanDb"); -const answerQuery = require("../../models/answers"); -const authService = require("../../services/authService"); +import sinon from "sinon"; +import config from "config"; + +import app from "../../server.js"; +import addUser from "../utils/addUser.js"; +import cleanDb from "../utils/cleanDb.js"; +import * as answerQuery from "../../models/answers.js"; +import * as authService from "../../services/authService.js"; const cookieName = config.get("userToken.cookieName"); -const answerDataArray = require("../fixtures/answers/answers"); -const userData = require("../fixtures/user/user")(); +import { SAMPLE_ANSWER_DATA } from "../fixtures/answers/answers.js"; +import userData from "../fixtures/user/user.js"; const defaultUser = userData[16]; const superUser = userData[4]; const memberUser = userData[6]; -import { AnswerStatus } from "../../typeDefinitions/answers"; +import { AnswerStatus } from "../../typeDefinitions/answers.js"; chai.use(chaiHttp); @@ -52,7 +54,7 @@ describe("answers", function () { chai .request(app) .post("/answers") - .send(answerDataArray[1]) + .send(SAMPLE_ANSWER_DATA[1]) .end((error, response) => { if (error) { return done(error); @@ -66,12 +68,12 @@ describe("answers", function () { }); it("should create and return answer", function (done) { - sinon.stub(answerQuery, "createAnswer").returns(answerDataArray[2]); + sinon.stub(answerQuery, "createAnswer").returns(SAMPLE_ANSWER_DATA[2]); chai .request(app) .post("/answers") - .send(answerDataArray[1]) + .send(SAMPLE_ANSWER_DATA[1]) .end((error, response) => { if (error) { return done(error); @@ -80,8 +82,8 @@ describe("answers", function () { expect(response).to.have.status(201); expect(response.body.data.id).to.equal("dummy-answer-id-2"); - Object.keys(answerDataArray[2]).forEach((key) => { - expect(response.body.data[key]).to.equal(answerDataArray[2][key]); + Object.keys(SAMPLE_ANSWER_DATA[2]).forEach((key) => { + expect(response.body.data[key]).to.equal(SAMPLE_ANSWER_DATA[2][key]); }); return done(); }); @@ -90,7 +92,7 @@ describe("answers", function () { describe("PATCH answers - updateAnswer", function () { beforeEach(function () { - sinon.stub(answerQuery, "createAnswer").returns(answerDataArray[2]); + sinon.stub(answerQuery, "createAnswer").returns(SAMPLE_ANSWER_DATA[2]); }); afterEach(function () { @@ -106,7 +108,7 @@ describe("answers", function () { chai .request(app) - .patch(`/answers/${answerDataArray[2].id}`) + .patch(`/answers/${SAMPLE_ANSWER_DATA[2].id}`) .set("cookie", `${cookieName}=${superUserAuthToken}`) .send(payload) .end((error, response) => { @@ -122,7 +124,7 @@ describe("answers", function () { }); it("should update the status with REJECTED value and set reviewed_by with rds user id if user is super user", function (done) { - sinon.stub(answerQuery, "updateAnswer").returns(answerDataArray[2]); + sinon.stub(answerQuery, "updateAnswer").returns(SAMPLE_ANSWER_DATA[2]); const payload: { status: AnswerStatus } = { status: "REJECTED", @@ -130,7 +132,7 @@ describe("answers", function () { chai .request(app) - .patch(`/answers/${answerDataArray[2].id}`) + .patch(`/answers/${SAMPLE_ANSWER_DATA[2].id}`) .set("cookie", `${cookieName}=${superUserAuthToken}`) .send(payload) .end((error, response) => { @@ -144,7 +146,7 @@ describe("answers", function () { }); it("should update the status with APPROVED value and set reviewed_by with rds user id if user is super user", function (done) { - sinon.stub(answerQuery, "updateAnswer").returns(answerDataArray[2]); + sinon.stub(answerQuery, "updateAnswer").returns(SAMPLE_ANSWER_DATA[2]); const payload: { status: AnswerStatus } = { status: "APPROVED", @@ -152,7 +154,7 @@ describe("answers", function () { chai .request(app) - .patch(`/answers/${answerDataArray[2].id}`) + .patch(`/answers/${SAMPLE_ANSWER_DATA[2].id}`) .set("cookie", `${cookieName}=${superUserAuthToken}`) .send(payload) .end((error, response) => { @@ -166,7 +168,7 @@ describe("answers", function () { }); it("should update the status with REJECTED value and set reviewed_by with rds user id if user is member", function (done) { - sinon.stub(answerQuery, "updateAnswer").returns(answerDataArray[2]); + sinon.stub(answerQuery, "updateAnswer").returns(SAMPLE_ANSWER_DATA[2]); const payload: { status: AnswerStatus } = { status: "REJECTED", @@ -174,7 +176,7 @@ describe("answers", function () { chai .request(app) - .patch(`/answers/${answerDataArray[2].id}`) + .patch(`/answers/${SAMPLE_ANSWER_DATA[2].id}`) .set("cookie", `${cookieName}=${memberAuthToken}`) .send(payload) .end((error, response) => { @@ -188,7 +190,7 @@ describe("answers", function () { }); it("should update the status with APPROVED value and set reviewed_by to rds user id if user is member", function (done) { - sinon.stub(answerQuery, "updateAnswer").returns(answerDataArray[2]); + sinon.stub(answerQuery, "updateAnswer").returns(SAMPLE_ANSWER_DATA[2]); const payload: { status: AnswerStatus } = { status: "APPROVED", @@ -196,7 +198,7 @@ describe("answers", function () { chai .request(app) - .patch(`/answers/${answerDataArray[2].id}`) + .patch(`/answers/${SAMPLE_ANSWER_DATA[2].id}`) .set("cookie", `${cookieName}=${memberAuthToken}`) .send(payload) .end((error, response) => { @@ -210,7 +212,7 @@ describe("answers", function () { }); it("should return not authorized if user is not super user or member", function (done) { - sinon.stub(answerQuery, "updateAnswer").returns(answerDataArray[2]); + sinon.stub(answerQuery, "updateAnswer").returns(SAMPLE_ANSWER_DATA[2]); const payload: { status: AnswerStatus } = { status: "REJECTED", @@ -218,7 +220,7 @@ describe("answers", function () { chai .request(app) - .patch(`/answers/${answerDataArray[2].id}`) + .patch(`/answers/${SAMPLE_ANSWER_DATA[2].id}`) .set("cookie", `${cookieName}=${defaultUserAuthToken}`) .send(payload) .end((error, response) => { diff --git a/test/integration/application.test.ts b/test/integration/application.test.ts index bb6a11c57..3c9801a98 100644 --- a/test/integration/application.test.ts +++ b/test/integration/application.test.ts @@ -1,16 +1,18 @@ +// @ts-nocheck + import chai from "chai"; import chaiHttp from "chai-http"; const { expect } = chai; import config from "config"; -const app = require("../../server"); -const addUser = require("../utils/addUser"); -const cleanDb = require("../utils/cleanDb"); -const authService = require("../../services/authService"); -const userData = require("../fixtures/user/user")(); -const applicationModel = require("../../models/applications"); -const { requestRoleData } = require("../fixtures/discordactions/discordactions"); - -const applicationsData = require("../fixtures/applications/applications")(); +import app from "../../server.js"; +import addUser from "../utils/addUser.js"; +import cleanDb from "../utils/cleanDb.js"; +import * as authService from "../../services/authService.js"; +import userData from "../fixtures/user/user.js"; +import * as applicationModel from "../../models/applications.js"; +import { requestRoleData } from "../fixtures/discordactions/discordactions.js"; + +import { SAMPLE_APPLICATION_DATA } from "../fixtures/applications/applications.js"; const cookieName = config.get("userToken.cookieName"); const appOwner = userData[3]; @@ -41,11 +43,11 @@ describe("Application", function () { jwt = authService.generateAuthToken({ userId }); superUserJwt = authService.generateAuthToken({ userId: superUserId }); secondUserJwt = authService.generateAuthToken({ userId: secondUserId }); - const applicationOne = { ...applicationsData[0], userId }; - const applicationTwo = { ...applicationsData[1], userId: superUserId }; - const applicationThree = { ...applicationsData[2], userId: "fakfjdkfjkfasjdkfsjdkf" }; - const applicationFour = { ...applicationsData[3], userId: "fkasdjfkldjfldjkfalsdfjl" }; - const applicationFive = { ...applicationsData[4], userId: "kfasdjfkdlfjkasdjflsdjfk" }; + const applicationOne = { ...SAMPLE_APPLICATION_DATA[0], userId }; + const applicationTwo = { ...SAMPLE_APPLICATION_DATA[1], userId: superUserId }; + const applicationThree = { ...SAMPLE_APPLICATION_DATA[2], userId: "fakfjdkfjkfasjdkfsjdkf" }; + const applicationFour = { ...SAMPLE_APPLICATION_DATA[3], userId: "fkasdjfkldjfldjkfalsdfjl" }; + const applicationFive = { ...SAMPLE_APPLICATION_DATA[4], userId: "kfasdjfkdlfjkasdjflsdjfk" }; const promises = [ applicationModel.addApplication(applicationOne), @@ -339,7 +341,7 @@ describe("Application", function () { .post(`/applications`) .set("cookie", `${cookieName}=${secondUserJwt}`) .send({ - ...applicationsData[5], + ...SAMPLE_APPLICATION_DATA[5], }) .end((err, res) => { if (err) { @@ -358,7 +360,7 @@ describe("Application", function () { .post(`/applications`) .set("cookie", `${cookieName}=${secondUserJwt}`) .send({ - ...applicationsData[5], + ...SAMPLE_APPLICATION_DATA[5], }) .end((err, res) => { if (err) { diff --git a/test/integration/arts.test.js b/test/integration/arts.test.js index 9977caf24..9e46baa1a 100644 --- a/test/integration/arts.test.js +++ b/test/integration/arts.test.js @@ -1,22 +1,21 @@ -const chai = require("chai"); -const { expect } = chai; -const chaiHttp = require("chai-http"); -const sinon = require("sinon"); -const artsQuery = require("../../models/arts"); +import chai from "chai"; +import chaiHttp from "chai-http"; +import sinon from "sinon"; +import * as artsQuery from "../../models/arts.js"; -const app = require("../../server"); -const authService = require("../../services/authService"); -const addUser = require("../utils/addUser"); -const arts = require("../../models/arts"); -const cleanDb = require("../utils/cleanDb"); +import app from "../../server.js"; +import * as authService from "../../services/authService.js"; +import addUser from "../utils/addUser.js"; +import cleanDb from "../utils/cleanDb.js"; // Import fixtures -const artData = require("../fixtures/arts/arts")(); +import artData from "../fixtures/arts/arts.js"; -const config = require("config"); +import config from "config"; +import { addJoinData } from "../../models/users.js"; +import joinData from "../fixtures/user/join.js"; +const { expect } = chai; const cookieName = config.get("userToken.cookieName"); -const { addJoinData } = require("../../models/users"); -const joinData = require("../fixtures/user/join"); chai.use(chaiHttp); @@ -27,7 +26,7 @@ describe("Arts", function () { beforeEach(async function () { userId = await addUser(); jwt = authService.generateAuthToken({ userId }); - await arts.addArt(artData[0], userId); + await artsQuery.addArt(artData[0], userId); }); afterEach(async function () { diff --git a/test/integration/auction.test.js b/test/integration/auction.test.js index 1cb33d42f..48fce99dc 100644 --- a/test/integration/auction.test.js +++ b/test/integration/auction.test.js @@ -1,23 +1,23 @@ -const chai = require("chai"); -const { expect } = chai; -const chaiHttp = require("chai-http"); +import chai from "chai"; +import chaiHttp from "chai-http"; -const app = require("../../server"); -const authService = require("../../services/authService"); -const addUser = require("../utils/addUser"); -const cleanDb = require("../utils/cleanDb"); +import app from "../../server.js"; +import * as authService from "../../services/authService.js"; +import addUser from "../utils/addUser.js"; +import cleanDb from "../utils/cleanDb.js"; -const { createNewAuction } = require("../../models/auctions"); -const { createWallet } = require("../../models/wallets"); +import { createNewAuction } from "../../models/auctions.js"; +import { createWallet } from "../../models/wallets.js"; // Import fixtures -const userData = require("../fixtures/user/user")(); -const { auctionData, auctionKeys, auctionWithIdKeys } = require("../fixtures/auctions/auctions"); +import userData from "../fixtures/user/user.js"; +import { auctionData, auctionKeys, auctionWithIdKeys } from "../fixtures/auctions/auctions.js"; +import currencyDataArray from "../fixtures/currencies/currencies.js"; + +import config from "config"; +const { expect } = chai; const { initial_price: initialPrice, item_type: itemType, end_time: endTime, quantity } = auctionData; -const currencyDataArray = require("../fixtures/currencies/currencies"); const currenciesData = currencyDataArray.default; - -const config = require("config"); const cookieName = config.get("userToken.cookieName"); chai.use(chaiHttp); diff --git a/test/integration/auth.test.js b/test/integration/auth.test.js index 8180abd0b..bac472e9f 100644 --- a/test/integration/auth.test.js +++ b/test/integration/auth.test.js @@ -1,21 +1,21 @@ -const chai = require("chai"); -const sinon = require("sinon"); +import chai from "chai"; +import sinon from "sinon"; +import chaiHttp from "chai-http"; +import passport from "passport"; +import app from "../../server.js"; +import cleanDb from "../utils/cleanDb.js"; +import { generateGithubAuthRedirectUrl } from "../utils/github.js"; +import { generateGoogleAuthRedirectUrl, stubPassportAuthenticate } from "../utils/googleauth.js"; +import { addUserToDBForTest } from "../../utils/users.js"; +import userData from "../fixtures/user/user.js"; + +// Import fixtures +import githubUserInfo from "../fixtures/auth/githubUserInfo.js"; +import googleUserInfo from "../fixtures/auth/googleUserInfo.js"; const { expect } = chai; -const chaiHttp = require("chai-http"); -const passport = require("passport"); -const app = require("../../server"); -const cleanDb = require("../utils/cleanDb"); -const { generateGithubAuthRedirectUrl } = require("..//utils/github"); -const { generateGoogleAuthRedirectUrl, stubPassportAuthenticate } = require("..//utils/googleauth"); -const { addUserToDBForTest } = require("../../utils/users"); -const userData = require("../fixtures/user/user")(); chai.use(chaiHttp); -// Import fixtures -const githubUserInfo = require("../fixtures/auth/githubUserInfo")(); -const googleUserInfo = require("../fixtures/auth/googleUserInfo")(); - describe("auth", function () { afterEach(async function () { await cleanDb(); diff --git a/test/integration/authorization.test.js b/test/integration/authorization.test.js index 7d8f2d99a..74d60eedb 100644 --- a/test/integration/authorization.test.js +++ b/test/integration/authorization.test.js @@ -1,23 +1,23 @@ -const chai = require("chai"); -const { expect } = chai; +import chai from "chai"; + +import { authorizeUser } from "../../middlewares/authorization.js"; +import authenticate from "../../middlewares/authenticate.js"; +import * as authService from "../../services/authService.js"; +import addUser from "../utils/addUser.js"; +import cleanDb from "../utils/cleanDb.js"; +import config from "config"; +import userData from "../fixtures/user/user.js"; -const { authorizeUser } = require("../../middlewares/authorization"); -const authenticate = require("../../middlewares/authenticate"); -const authService = require("../../services/authService"); -const addUser = require("../utils/addUser"); -const cleanDb = require("../utils/cleanDb"); -const config = require("config"); +// Setup some routes with various permissions for testing +import express from "express"; +import AppMiddlewares from "../../middlewares/index.js"; +const { expect } = chai; const cookieName = config.get("userToken.cookieName"); -const userData = require("../fixtures/user/user")(); const defaultUser = userData[0]; // user with no `roles` key const appOwner = userData[3]; const superUser = userData[4]; - -// Setup some routes with various permissions for testing -const express = require("express"); const router = express.Router(); -const AppMiddlewares = require("../../middlewares"); const pongHandler = (_, res) => { return res.json({ message: "pong" }); diff --git a/test/integration/authorizeRoles.test.js b/test/integration/authorizeRoles.test.js index 03938d6b4..87507b2d4 100644 --- a/test/integration/authorizeRoles.test.js +++ b/test/integration/authorizeRoles.test.js @@ -1,25 +1,25 @@ -const chai = require("chai"); -const { expect } = chai; +import chai from "chai"; -const authorizeRoles = require("../../middlewares/authorizeRoles"); -const authenticate = require("../../middlewares/authenticate"); -const authService = require("../../services/authService"); -const addUser = require("../utils/addUser"); -const cleanDb = require("../utils/cleanDb"); -const config = require("config"); -const cookieName = config.get("userToken.cookieName"); -const userData = require("../fixtures/user/user")(); +import authorizeRoles from "../../middlewares/authorizeRoles.js"; +import authenticate from "../../middlewares/authenticate.js"; +import * as authService from "../../services/authService.js"; +import addUser from "../utils/addUser.js"; +import cleanDb from "../utils/cleanDb.js"; +import config from "config"; +import userData from "../fixtures/user/user.js"; -const { APPOWNER, SUPERUSER } = require("../../constants/roles"); +import { APPOWNER, SUPERUSER } from "../../constants/roles.js"; + +// Route setup with various permissions for testing +import express from "express"; +import AppMiddlewares from "../../middlewares/index.js"; +const { expect } = chai; +const cookieName = config.get("userToken.cookieName"); const defaultUser = userData[0]; // user with no `roles` key const appOwner = userData[3]; const superUser = userData[4]; - -// Route setup with various permissions for testing -const express = require("express"); const router = express.Router(); -const AppMiddlewares = require("../../middlewares"); const pongHandler = (_, res) => { return res.json({ message: "pong" }); diff --git a/test/integration/authorizeUsersAndService.test.ts b/test/integration/authorizeUsersAndService.test.ts index 8271fc31f..b5ec4c701 100644 --- a/test/integration/authorizeUsersAndService.test.ts +++ b/test/integration/authorizeUsersAndService.test.ts @@ -1,21 +1,27 @@ +// @ts-nocheck + import { expect } from "chai"; import { authorizeAndAuthenticate } from "../../middlewares/authorizeUsersAndService"; -import bot from "../utils/generateBotToken"; -const userData = require("../fixtures/user/user")(); -import authService from "../../services/authService"; +import { generateCronJobToken, generateToken } from "../utils/generateBotToken.js"; +import userDataFixture from "../fixtures/user/user.js"; +import { generateAuthToken } from "../../services/authService.js"; import addUser from "../utils/addUser"; import cleanDb from "../utils/cleanDb"; -const ROLES = require("../../constants/roles"); -const { Services, CLOUDFLARE_WORKER, CRON_JOB_HANDLER } = require("../../constants/bot"); +import ROLES from "../../constants/roles.js"; +import { Services, CLOUDFLARE_WORKER, CRON_JOB_HANDLER } from "../../constants/bot.js"; +import config from "config"; +import express from "express"; +import AppMiddlewares from "../../middlewares/index.js"; +import chai from "chai"; +import sinon from "sinon"; + +import * as authorizeBot from "../../middlewares/authorizeBot"; +import { CustomRequest, CustomResponse } from "../../types/global"; + +const userData = userDataFixture(); const cookieName = config.get("userToken.cookieName"); -const express = require("express"); const router = express.Router(); -const AppMiddlewares = require("../../middlewares"); -const chai = require("chai"); -const sinon = require("sinon"); -import authorizeBot from "../../middlewares/authorizeBot"; -import { CustomRequest, CustomResponse } from "../../types/global"; describe("Middleware | Authorization", function () { let req: any, res: any, next: any; const superUser = userData[4]; @@ -64,21 +70,21 @@ describe("Middleware | Authorization", function () { }); it("should call verifyCronJob for valid cron job token", async function () { - const jwtToken = bot.generateCronJobToken({ name: CRON_JOB_HANDLER }); + const jwtToken = generateCronJobToken({ name: CRON_JOB_HANDLER }); req.headers.authorization = `Bearer ${jwtToken}`; await authorizeAndAuthenticate ([ROLES.APPOWNER], [Services.CRON_JOB_HANDLER])(req, res, next); expect(next.calledOnce).to.be.equal(true); }); it("should call verifyDiscordBot for valid Discord bot token", async function () { - const jwtToken = bot.generateToken({ name: CLOUDFLARE_WORKER }); + const jwtToken = generateToken({ name: CLOUDFLARE_WORKER }); req.headers.authorization = `Bearer ${jwtToken}`; await authorizeAndAuthenticate ([ROLES.APPOWNER], [Services.CLOUDFLARE_WORKER])(req, res, next); expect(next.calledOnce).to.be.equal(true); }); it("should return unauthorized for unknown service names", async function () { - const jwtToken = bot.generateToken({ name: "Invalid name" }); + const jwtToken = generateToken({ name: "Invalid name" }); req.headers.authorization = `Bearer ${jwtToken}`; await authorizeAndAuthenticate ([ROLES.APPOWNER], [Services.CLOUDFLARE_WORKER])(req, res, next); expect(res.boom.unauthorized.calledOnce).to.be.equal(true); @@ -98,8 +104,8 @@ describe("Middleware | Authorization", function () { beforeEach(async () => { const defaultUserId = await addUser(defaultUser); const superUserId = await addUser(superUser); - defaultJwt = authService.generateAuthToken({ userId: defaultUserId }); - superUserJwt = authService.generateAuthToken({ userId: superUserId }); + defaultJwt = generateAuthToken({ userId: defaultUserId }); + superUserJwt = generateAuthToken({ userId: superUserId }); }); afterEach(async () => { await cleanDb(); @@ -118,7 +124,7 @@ describe("Middleware | Authorization", function () { }); }); it("should not authenticate invalid tokens", function (done) { - const jwtToken = bot.generateCronJobToken({ name: CRON_JOB_HANDLER }); + const jwtToken = generateCronJobToken({ name: CRON_JOB_HANDLER }); chai .request(app) .get("/for-super-user") @@ -145,7 +151,7 @@ describe("Middleware | Authorization", function () { }); }); it("should allow services if user does not have authorization", function (done) { - const jwtToken = bot.generateCronJobToken({ name: CRON_JOB_HANDLER }); + const jwtToken = generateCronJobToken({ name: CRON_JOB_HANDLER }); chai .request(app) .get("/for-super-user") @@ -160,7 +166,7 @@ describe("Middleware | Authorization", function () { }); }); it("should respond with status 500 for unknown errors", function (done) { - const jwtToken = bot.generateCronJobToken({ name: CRON_JOB_HANDLER }); + const jwtToken = generateCronJobToken({ name: CRON_JOB_HANDLER }); sinon.stub(authorizeBot, "verifyCronJob").throws(new Error("Error")); chai .request(app) diff --git a/test/integration/awsAccess.test.ts b/test/integration/awsAccess.test.ts index 58b9f7e78..811679ae3 100644 --- a/test/integration/awsAccess.test.ts +++ b/test/integration/awsAccess.test.ts @@ -1,16 +1,15 @@ -import chai, {expect} from "chai"; -import sinon from 'sinon'; +import chai, { expect } from "chai"; import chaiHttp from 'chai-http'; -import * as awsFunctions from '../../utils/awsFunctions'; -import bot from "../utils/generateBotToken"; -import { PROFILE_SVC_GITHUB_URL } from '../../constants/urls'; +import sinon from 'sinon'; +import { PROFILE_SVC_GITHUB_URL } from '../../constants/urls.js'; +import * as awsFunctions from '../../utils/awsFunctions.js'; +import { generateToken } from "../utils/generateBotToken.js"; -const app = require("../../server"); -const userData = require("../fixtures/user/user")(); -const authorizeBot = require("../../middlewares/authorizeBot"); -const addUser = require("../utils/addUser"); -const cleanDb = require("../utils/cleanDb"); -const { CLOUDFLARE_WORKER } = require("../../constants/bot") +import { CLOUDFLARE_WORKER } from "../../constants/bot.js"; +import app from "../../server.js"; +import userData from "../fixtures/user/user.js"; +import addUser from "../utils/addUser.js"; +import cleanDb from "../utils/cleanDb.js"; chai.use(chaiHttp); @@ -25,7 +24,7 @@ describe('addUserToAWSGroup', function(){ req = { headers: {}, }; - const jwtToken = bot.generateToken({ name: CLOUDFLARE_WORKER }); + const jwtToken = generateToken({ name: CLOUDFLARE_WORKER }); req.headers.authorization = `Bearer ${jwtToken}`; }) diff --git a/test/integration/badges.test.js b/test/integration/badges.test.js index 6404d34a7..2c45fa883 100644 --- a/test/integration/badges.test.js +++ b/test/integration/badges.test.js @@ -1,20 +1,21 @@ -const app = require("../../server"); -const chai = require("chai"); -const chaiHttp = require("chai-http"); -const sinon = require("sinon"); -const { Buffer } = require("node:buffer"); +import app from "../../server.js"; +import chai from "chai"; +import chaiHttp from "chai-http"; +import sinon from "sinon"; +import { Buffer } from "node:buffer"; +import config from "config"; -const fixture = require("../fixtures/badges/badges"); -const userData = require("../fixtures/user/user")(); +import fixture from "../fixtures/badges/badges.js"; +import userData from "../fixtures/user/user.js"; -const model = require("../../models/badges"); +import model from "../../models/badges.js"; -const authService = require("../../services/authService"); -const imageService = require("../../services/imageService"); -const addUser = require("../utils/addUser"); -const cleanDb = require("../utils/cleanDb"); +import { generateAuthToken } from "../../services/authService.js"; +import imageService from "../../services/imageService.js"; +import addUser from "../utils/addUser.js"; +import cleanDb from "../utils/cleanDb.js"; -const { SUCCESS_MESSAGES, ERROR_MESSAGES } = require("../../constants/badges"); +import { SUCCESS_MESSAGES, ERROR_MESSAGES } from "../../constants/badges.js"; const { CONTROLLERS: CONTROLLERS_SUCCESS_MESSAGES } = SUCCESS_MESSAGES; const { VALIDATORS: ERROR_MESSAGES_VALIDATORS, MISC } = ERROR_MESSAGES; const { expect } = chai; @@ -30,7 +31,7 @@ chai.use(chaiHttp); describe("Badges", function () { before(async function () { userId = await addUser(superUser); - jwt = authService.generateAuthToken({ userId }); + jwt = generateAuthToken({ userId }); }); after(async function () { diff --git a/test/integration/cloudflareCache.test.js b/test/integration/cloudflareCache.test.js index 4a29d9ac8..4768462f9 100644 --- a/test/integration/cloudflareCache.test.js +++ b/test/integration/cloudflareCache.test.js @@ -1,20 +1,20 @@ -const chai = require("chai"); -const { expect } = chai; -const chaiHttp = require("chai-http"); -const sinon = require("sinon"); +import chai from "chai"; +import chaiHttp from "chai-http"; +import sinon from "sinon"; -const app = require("../../server"); -const addUser = require("../utils/addUser"); -const authService = require("../../services/authService"); -const cleanDb = require("../utils/cleanDb"); -const logsQuery = require("../../models/logs"); +import app from "../../server.js"; +import addUser from "../utils/addUser.js"; +import { generateAuthToken } from "../../services/authService.js"; +import cleanDb from "../utils/cleanDb.js"; +import logsQuery from "../../models/logs.js"; -const config = require("config"); -const cookieName = config.get("userToken.cookieName"); -const cloudflare = require("../../services/cloudflareService"); +import config from "config"; +import cloudflare from "../../services/cloudflareService.js"; -const userData = require("../fixtures/user/user")(); -const cacheData = require("../fixtures/cloudflareCache/data"); +import userData from "../fixtures/user/user.js"; +import cacheData from "../fixtures/cloudflareCache/data.js"; +const { expect } = chai; +const cookieName = config.get("userToken.cookieName"); const superUser = userData[4]; @@ -32,7 +32,7 @@ describe("Purged Cache Metadata", function () { before(async function () { await cleanDb(); const userId = await addUser(userData[0]); - jwt = authService.generateAuthToken({ userId }); + jwt = generateAuthToken({ userId }); }); it("Should return no cache is cleared yet if no cache logs found in last 24 hours", function (done) { @@ -99,7 +99,7 @@ describe("Purged Cache Metadata", function () { await cleanDb(); await addUser(userData[0]); const userId = await addUser(superUser); - jwt = authService.generateAuthToken({ userId }); + jwt = generateAuthToken({ userId }); }); beforeEach(async function () { diff --git a/test/integration/contributions.test.js b/test/integration/contributions.test.js index e544c73ce..71072ad42 100644 --- a/test/integration/contributions.test.js +++ b/test/integration/contributions.test.js @@ -1,19 +1,19 @@ /* eslint-disable no-unused-expressions */ -const chai = require("chai"); -const sinon = require("sinon"); -const { expect } = chai; -const chaiHttp = require("chai-http"); - -const githubService = require("../../services/githubService"); -const testModel = require("../../models/tasks"); -const userModel = require("../../models/users"); +import chai from "chai"; +import sinon from "sinon"; +import chaiHttp from "chai-http"; -const app = require("../../server"); +import githubService from "../../services/githubService.js"; +import testModel from "../../models/tasks.js"; +import userModel from "../../models/users.js"; -chai.use(chaiHttp); +import app from "../../server.js"; // Import fixtures -const githubPRInfo = require("../fixtures/contributions/githubPRInfo")(); +import githubPRInfo from "../fixtures/contributions/githubPRInfo.js"; +const { expect } = chai; + +chai.use(chaiHttp); describe("Contributions", function () { before(async function () { diff --git a/test/integration/discord.test.js b/test/integration/discord.test.js index 188fbf1b5..8f0880da6 100644 --- a/test/integration/discord.test.js +++ b/test/integration/discord.test.js @@ -1,20 +1,20 @@ -const chai = require("chai"); -const { expect } = chai; +import chai from "chai"; +import config from "config"; -const app = require("../../server"); -const addUser = require("../utils/addUser"); -const cleanDb = require("../utils/cleanDb"); -const authService = require("../../services/authService"); -const userData = require("../fixtures/user/user")(); -const { requestRoleData } = require("../fixtures/discordactions/discordactions"); +import app from "../../server.js"; +import addUser from "../utils/addUser.js"; +import cleanDb from "../utils/cleanDb.js"; +import { generateAuthToken } from "../../services/authService.js"; +import userData from "../fixtures/user/user.js"; +import { requestRoleData, groupData } from "../fixtures/discordactions/discordactions.js"; -const firestore = require("../../utils/firestore"); -const discordRoleModel = firestore.collection("discord-roles"); -const userModel = firestore.collection("users"); +import firestore from "../../utils/firestore.js"; -const { addGroupRoleToMember } = require("../../models/discordactions"); +import { addGroupRoleToMember } from "../../models/discordactions.js"; -const { groupData } = require("../fixtures/discordactions/discordactions"); +const { expect } = chai; +const discordRoleModel = firestore.collection("discord-roles"); +const userModel = firestore.collection("users"); const cookieName = config.get("userToken.cookieName"); @@ -25,7 +25,7 @@ describe("test discord actions", function () { describe("test discord actions for archived users", function (done) { beforeEach(async function () { userId = await addUser(userData[5]); - jwt = authService.generateAuthToken({ userId }); + jwt = generateAuthToken({ userId }); }); afterEach(async function () { @@ -66,7 +66,7 @@ describe("test discord actions", function () { beforeEach(async function () { const user = { ...userData[4], discordId: "123456789" }; userId = await addUser(user); - jwt = authService.generateAuthToken({ userId }); + jwt = generateAuthToken({ userId }); let allIds = []; diff --git a/test/integration/discordactions.test.js b/test/integration/discordactions.test.js index d5604897f..78e9614db 100644 --- a/test/integration/discordactions.test.js +++ b/test/integration/discordactions.test.js @@ -1,16 +1,39 @@ -const chai = require("chai"); -const { expect } = chai; -const chaiHttp = require("chai-http"); +import chai from "chai"; +import chaiHttp from "chai-http"; +import config from "config"; +import sinon from "sinon"; + +import app from "../../server.js"; +import { generateAuthToken } from "../../services/authService.js"; +import addUser from "../utils/addUser.js"; +import cleanDb from "../utils/cleanDb.js"; +import userData from "../fixtures/user/user.js"; +import ApplicationModel from "../../models/applications.js"; +import usersInDiscord from "../fixtures/user/inDiscord.js"; +import firestore from "../../utils/firestore.js"; +import { userPhotoVerificationData } from "../fixtures/user/photo-verification.js"; +import { + groupData, + groupIdle7d, + roleDataFromDiscord, + memberGroupData, + groupOnboarding31dPlus, + groupIdle, +} from "../fixtures/discordactions/discordactions.js"; +import discordServices from "../../services/discordService.js"; +import discordRolesModel, { addGroupRoleToMember, addInviteToInviteModel } from "../../models/discordactions.js"; +import { updateUserStatus } from "../../models/userStatus.js"; +import { generateUserStatusData, userStatusDataForOooState } from "../fixtures/userStatus/userStatus.js"; +import { getDiscordMembers, getOnboarding31DPlusMembers } from "../fixtures/discordResponse/discord-response.js"; +import { generateCronJobToken } from "../utils/generateBotToken.js"; +import { CRON_JOB_HANDLER } from "../../constants/bot.js"; +import { createRequest } from "../../models/requests.js"; +import { REQUEST_TYPE, REQUEST_STATE } from "../../constants/requests.js"; +import { convertDaysToMilliseconds } from "../../utils/time.js"; -const app = require("../../server"); -const authService = require("../../services/authService"); -const addUser = require("../utils/addUser"); -const cleanDb = require("../utils/cleanDb"); -// Import fixtures -const userData = require("../fixtures/user/user")(); -const ApplicationModel = require("../../models/applications"); +const { expect } = chai; +const cookieName = config.get("userToken.cookieName"); -const usersInDiscord = require("../fixtures/user/inDiscord"); const superUser = userData[4]; const archievedUser = userData[19]; const developerUserWithoutApprovedProfileStatus = userData[6]; @@ -18,39 +41,13 @@ const designerUser = userData[8]; const productManagerUser = userData[9]; const mavenUser = userData[10]; -const config = require("config"); -const sinon = require("sinon"); -const cookieName = config.get("userToken.cookieName"); -const firestore = require("../../utils/firestore"); -const { userPhotoVerificationData } = require("../fixtures/user/photo-verification"); const photoVerificationModel = firestore.collection("photo-verification"); const discordRoleModel = firestore.collection("discord-roles"); const memberRoleModel = firestore.collection("member-group-roles"); const userModel = firestore.collection("users"); const userStatusModel = firestore.collection("usersStatus"); -const { - groupData, - groupIdle7d, - roleDataFromDiscord, - memberGroupData, - groupOnboarding31dPlus, - groupIdle, -} = require("../fixtures/discordactions/discordactions"); -const discordServices = require("../../services/discordService"); -const { addGroupRoleToMember, addInviteToInviteModel } = require("../../models/discordactions"); -const { updateUserStatus } = require("../../models/userStatus"); -const { generateUserStatusData } = require("../fixtures/userStatus/userStatus"); -const { getDiscordMembers } = require("../fixtures/discordResponse/discord-response"); -const { getOnboarding31DPlusMembers } = require("../fixtures/discordResponse/discord-response"); -const discordRolesModel = require("../../models/discordactions"); chai.use(chaiHttp); -const { userStatusDataForOooState } = require("../fixtures/userStatus/userStatus"); -const { generateCronJobToken } = require("../utils/generateBotToken"); -const { CRON_JOB_HANDLER } = require("../../constants/bot"); -const { createRequest } = require("../../models/requests"); -const { REQUEST_TYPE, REQUEST_STATE } = require("../../constants/requests"); -const { convertDaysToMilliseconds } = require("../../utils/time"); describe("Discord actions", function () { let superUserId; @@ -75,9 +72,9 @@ describe("Discord actions", function () { fetchStub = sinon.stub(global, "fetch"); userId = await addUser(userData[0]); superUserId = await addUser(superUser); - superUserAuthToken = authService.generateAuthToken({ userId: superUserId }); - userAuthToken = authService.generateAuthToken({ userId: userId }); - jwt = authService.generateAuthToken({ userId }); + superUserAuthToken = generateAuthToken({ userId: superUserId }); + userAuthToken = generateAuthToken({ userId: userId }); + jwt = generateAuthToken({ userId }); discordId = "12345"; const docRefUser0 = photoVerificationModel.doc(); @@ -226,7 +223,7 @@ describe("Discord actions", function () { groupId = docRef.id; superUserId = await addUser(superUser); - superUserAuthToken = authService.generateAuthToken({ userId: superUserId }); + superUserAuthToken = generateAuthToken({ userId: superUserId }); sinon.stub(discordRolesModel, "deleteGroupRole").resolves({ isSuccess: true }); }); @@ -1023,7 +1020,7 @@ describe("Discord actions", function () { // eslint-disable-next-line mocha/no-skipped-tests it.skip("should return 403 if user has role archieved", async function () { archievedUserId = await addUser(archievedUser); - archievedUserToken = authService.generateAuthToken({ userId: archievedUserId }); + archievedUserToken = generateAuthToken({ userId: archievedUserId }); const res = await chai .request(app) .post(`/discord-actions/invite`) @@ -1036,7 +1033,7 @@ describe("Discord actions", function () { // eslint-disable-next-line mocha/no-skipped-tests it.skip("should return 403 if the user doesn't have role designer, product_manager, or mavens", async function () { developerUserWithoutApprovedProfileStatusId = await addUser(developerUserWithoutApprovedProfileStatus); - developerUserWithoutApprovedProfileStatusToken = authService.generateAuthToken({ + developerUserWithoutApprovedProfileStatusToken = generateAuthToken({ userId: developerUserWithoutApprovedProfileStatusId, }); const res = await chai @@ -1058,7 +1055,7 @@ describe("Discord actions", function () { ); productManagerUserId = await addUser(productManagerUser); - productManagerAuthToken = authService.generateAuthToken({ userId: productManagerUserId }); + productManagerAuthToken = generateAuthToken({ userId: productManagerUserId }); const res = await chai .request(app) .post(`/discord-actions/invite`) @@ -1079,7 +1076,7 @@ describe("Discord actions", function () { ); designerUserId = await addUser(designerUser); - designerAuthToken = authService.generateAuthToken({ userId: designerUserId }); + designerAuthToken = generateAuthToken({ userId: designerUserId }); const res = await chai .request(app) .post(`/discord-actions/invite`) @@ -1100,7 +1097,7 @@ describe("Discord actions", function () { ); mavenUserId = await addUser(mavenUser); - mavenAuthToken = authService.generateAuthToken({ userId: mavenUserId }); + mavenAuthToken = generateAuthToken({ userId: mavenUserId }); const res = await chai .request(app) .post(`/discord-actions/invite`) @@ -1146,6 +1143,7 @@ describe("Discord actions", function () { .set("cookie", `${cookieName}=${userAuthToken}`); expect(res).to.have.status(403); + expect(res.body).to.be.a("object"); expect(res.body.message).to.be.equal( "Only users with an accepted application can generate a Discord invite link." ); @@ -1254,7 +1252,7 @@ describe("Discord actions", function () { beforeEach(async function () { const user = await addUser(userData[0]); userId = user; - userAuthToken = authService.generateAuthToken({ userId }); + userAuthToken = generateAuthToken({ userId }); await discordRoleModel.add(groupData[0]); await discordRoleModel.add(groupData[1]); diff --git a/test/integration/events.test.js b/test/integration/events.test.js index 57952a0b6..ccd1aa74d 100644 --- a/test/integration/events.test.js +++ b/test/integration/events.test.js @@ -1,30 +1,30 @@ -const chai = require("chai"); -const { expect } = chai; -const chaiHttp = require("chai-http"); +import chai from "chai"; +import chaiHttp from "chai-http"; -const app = require("../../server"); -const authService = require("../../services/authService"); -const { EVENT_ROLES } = require("../../constants/events"); -const addUser = require("../utils/addUser"); -const cleanDb = require("../utils/cleanDb"); +import app from "../../server.js"; +import { generateAuthToken } from "../../services/authService.js"; +import { EVENT_ROLES } from "../../constants/events.js"; +import addUser from "../utils/addUser.js"; +import cleanDb from "../utils/cleanDb.js"; -const eventData = require("../fixtures/events/events")(); -const eventCodeData = require("../fixtures/events/event-codes")(); -const eventCodeDataFirst = [...eventCodeData[0].data]; -const event1Data = eventData[0]; +import eventData from "../fixtures/events/events.js"; +import eventCodeData from "../fixtures/events/event-codes.js"; -const userData = require("../fixtures/user/user")(); +import userData from "../fixtures/user/user.js"; -const eventQuery = require("../../models/events"); -const logsModel = require("../../models/logs"); +import eventQuery from "../../models/events.js"; +import logsModel from "../../models/logs.js"; -const defaultUser = userData[16]; +import config from "config"; +import sinon from "sinon"; -const config = require("config"); -const sinon = require("sinon"); +import { EventTokenService, EventAPIService } from "../../services/index.js"; +import { eventOnePeerData } from "../fixtures/events/peers.js"; +const { expect } = chai; +const eventCodeDataFirst = [...eventCodeData[0].data]; +const event1Data = eventData[0]; -const { EventTokenService, EventAPIService } = require("../../services"); -const { eventOnePeerData } = require("../fixtures/events/peers"); +const defaultUser = userData[16]; const cookieName = config.get("userToken.cookieName"); @@ -36,7 +36,7 @@ describe("events", function () { beforeEach(async function () { userId = await addUser(defaultUser); - authToken = authService.generateAuthToken({ userId }); + authToken = generateAuthToken({ userId }); }); afterEach(async function () { @@ -251,8 +251,8 @@ describe("events", function () { const member = userData[6]; const memberUserId = await addUser(member); const superUserId = await addUser(superUser); - superUserAuthToken = authService.generateAuthToken({ userId: superUserId }); - memberAuthToken = authService.generateAuthToken({ userId: memberUserId }); + superUserAuthToken = generateAuthToken({ userId: superUserId }); + memberAuthToken = generateAuthToken({ userId: memberUserId }); }); afterEach(function () { @@ -490,8 +490,8 @@ describe("events", function () { const member = userData[6]; const memberUserId = await addUser(member); const superUserId = await addUser(superUser); - superUserAuthToken = authService.generateAuthToken({ userId: superUserId }); - memberAuthToken = authService.generateAuthToken({ userId: memberUserId }); + superUserAuthToken = generateAuthToken({ userId: superUserId }); + memberAuthToken = generateAuthToken({ userId: memberUserId }); }); afterEach(function () { @@ -558,7 +558,7 @@ describe("events", function () { beforeEach(async function () { const superUser = userData[4]; const superUserId = await addUser(superUser); - superUserAuthToken = authService.generateAuthToken({ userId: superUserId }); + superUserAuthToken = generateAuthToken({ userId: superUserId }); }); afterEach(function () { @@ -681,7 +681,7 @@ describe("events", function () { beforeEach(async function () { const superUser = userData[4]; const superUserId = await addUser(superUser); - superUserAuthToken = authService.generateAuthToken({ userId: superUserId }); + superUserAuthToken = generateAuthToken({ userId: superUserId }); }); afterEach(function () { @@ -738,8 +738,8 @@ describe("events", function () { const member = userData[6]; const superUserId = await addUser(superUser); const memberUserId = await addUser(member); - superUserAuthToken = authService.generateAuthToken({ userId: superUserId }); - memberAuthToken = authService.generateAuthToken({ userId: memberUserId }); + superUserAuthToken = generateAuthToken({ userId: superUserId }); + memberAuthToken = generateAuthToken({ userId: memberUserId }); }); afterEach(function () { diff --git a/test/integration/extensionRequests.test.js b/test/integration/extensionRequests.test.js index 2969dc611..81b1ec1ea 100644 --- a/test/integration/extensionRequests.test.js +++ b/test/integration/extensionRequests.test.js @@ -1,20 +1,22 @@ -const chai = require("chai"); -const sinon = require("sinon"); +import chai from "chai"; +import sinon from "sinon"; +import chaiHttp from "chai-http"; +import config from "config"; + +import logsQuery from "../../models/logs.js"; +import app from "../../server.js"; +import extensionRequests from "../../models/extensionRequests.js"; +import tasks from "../../models/tasks.js"; +import { generateAuthToken } from "../../services/authService.js"; +import addUser from "../utils/addUser.js"; +import cleanDb from "../utils/cleanDb.js"; +import userData from "../fixtures/user/user.js"; +import { DINERO, NEELAM } from "../../constants/wallets.js"; +import { EXTENSION_REQUEST_STATUS } from "../../constants/extensionRequests.js"; +import { LOGS_FETCHED_SUCCESSFULLY } from "../../constants/logs.js"; + const { expect } = chai; -const chaiHttp = require("chai-http"); -const logsQuery = require("../../models/logs"); -const app = require("../../server"); -const extensionRequests = require("../../models/extensionRequests"); -const tasks = require("../../models/tasks"); -const authService = require("../../services/authService"); -const addUser = require("../utils/addUser"); -const config = require("config"); const cookieName = config.get("userToken.cookieName"); -const userData = require("../fixtures/user/user")(); -const { DINERO, NEELAM } = require("../../constants/wallets"); -const cleanDb = require("../utils/cleanDb"); -const { EXTENSION_REQUEST_STATUS } = require("../../constants/extensionRequests"); -const { LOGS_FETCHED_SUCCESSFULLY } = require("../../constants/logs"); chai.use(chaiHttp); @@ -45,10 +47,10 @@ describe("Extension Requests", function () { const appOwnerUserId = await addUser(appOwner); appOwner.id = appOwnerUserId; superUserId = await addUser(superUser); - appOwnerjwt = authService.generateAuthToken({ userId: appOwnerUserId }); - superUserJwt = authService.generateAuthToken({ userId: superUserId }); - jwt = authService.generateAuthToken({ userId: userId }); - user2Jwt = authService.generateAuthToken({ userId: userId2 }); + appOwnerjwt = generateAuthToken({ userId: appOwnerUserId }); + superUserJwt = generateAuthToken({ userId: superUserId }); + jwt = generateAuthToken({ userId: userId }); + user2Jwt = generateAuthToken({ userId: userId2 }); const taskData = [ { diff --git a/test/integration/external-accounts.test.js b/test/integration/external-accounts.test.js index 00cb55e74..2a2ef3be5 100644 --- a/test/integration/external-accounts.test.js +++ b/test/integration/external-accounts.test.js @@ -1,23 +1,25 @@ -const chai = require("chai"); +import chai from "chai"; +import chaiHttp from "chai-http"; +import app from "../../server.js"; +import cleanDb from "../utils/cleanDb.js"; +import bot from "../utils/generateBotToken.js"; +import addUser from "../utils/addUser.js"; +import { BAD_TOKEN, CLOUDFLARE_WORKER } from "../../constants/bot.js"; +import { generateAuthToken } from "../../services/authService.js"; +import externalAccountData from "../fixtures/external-accounts/external-accounts.js"; +import externalAccountsModel from "../../models/external-accounts.js"; +import { usersFromRds, getDiscordMembers } from "../fixtures/discordResponse/discord-response.js"; +import Sinon from "sinon"; +import { INTERNAL_SERVER_ERROR } from "../../constants/errorMessages.js"; +import removeDiscordRoleUtils from "../../utils/removeDiscordRoleFromUser.js"; +import firestore from "../../utils/firestore.js"; +import userData from "../fixtures/user/user.js"; +import config from "config"; +import { EXTERNAL_ACCOUNTS_POST_ACTIONS } from "../../constants/external-accounts.js"; const { expect } = chai; -const chaiHttp = require("chai-http"); -const app = require("../../server"); -const cleanDb = require("../utils/cleanDb"); -const bot = require("../utils/generateBotToken"); -const addUser = require("../utils/addUser"); -const { BAD_TOKEN, CLOUDFLARE_WORKER } = require("../../constants/bot"); -const authService = require("../../services/authService"); -const externalAccountData = require("../fixtures/external-accounts/external-accounts")(); -const externalAccountsModel = require("../../models/external-accounts"); -const { usersFromRds, getDiscordMembers } = require("../fixtures/discordResponse/discord-response"); -const Sinon = require("sinon"); -const { INTERNAL_SERVER_ERROR } = require("../../constants/errorMessages"); -const removeDiscordRoleUtils = require("../../utils/removeDiscordRoleFromUser"); -const firestore = require("../../utils/firestore"); -const userData = require("../fixtures/user/user")(); + const userModel = firestore.collection("users"); const tasksModel = firestore.collection("tasks"); -const { EXTERNAL_ACCOUNTS_POST_ACTIONS } = require("../../constants/external-accounts"); chai.use(chaiHttp); const cookieName = config.get("userToken.cookieName"); @@ -142,7 +144,7 @@ describe("External Accounts", function () { beforeEach(async function () { const userId = await addUser(); - jwt = authService.generateAuthToken({ userId }); + jwt = generateAuthToken({ userId }); await externalAccountsModel.addExternalAccountData(externalAccountData[2]); await externalAccountsModel.addExternalAccountData(externalAccountData[3]); }); @@ -236,7 +238,7 @@ describe("External Accounts", function () { beforeEach(async function () { // userData[4] is a super user const userId = await addUser(userData[4]); - superUserJwt = authService.generateAuthToken({ userId }); + superUserJwt = generateAuthToken({ userId }); await userModel.add(usersFromRds[0]); await userModel.add(usersFromRds[1]); await userModel.add(usersFromRds[2]); @@ -299,7 +301,7 @@ describe("External Accounts", function () { beforeEach(async function () { // userData[4] is a super user const userId = await addUser(userData[4]); - superUserJwt = authService.generateAuthToken({ userId }); + superUserJwt = generateAuthToken({ userId }); fetchStub = Sinon.stub(global, "fetch"); }); @@ -452,7 +454,7 @@ describe("External Accounts", function () { beforeEach(async function () { const userId = await addUser(userData[3]); - newUserJWT = authService.generateAuthToken({ userId }); + newUserJWT = generateAuthToken({ userId }); await externalAccountsModel.addExternalAccountData(externalAccountData[2]); await externalAccountsModel.addExternalAccountData(externalAccountData[3]); }); diff --git a/test/integration/fcmToken.test.js b/test/integration/fcmToken.test.js index e7b180425..d69683312 100644 --- a/test/integration/fcmToken.test.js +++ b/test/integration/fcmToken.test.js @@ -1,12 +1,13 @@ -const chai = require("chai"); +import chai from "chai"; +import app from "../../server.js"; +import cleanDb from "../utils/cleanDb.js"; +import addUser from "../utils/addUser.js"; +import userData from "../fixtures/user/user.js"; +import { generateAuthToken } from "../../services/authService.js"; +import config from "config"; const { expect } = chai; -const app = require("../../server"); -const cleanDb = require("../utils/cleanDb"); -const addUser = require("../utils/addUser"); -const userData = require("../fixtures/user/user")(); const userData0 = userData[0]; -const authService = require("../../services/authService"); const cookieName = config.get("userToken.cookieName"); @@ -15,7 +16,7 @@ describe("Fcm Token Test", function () { beforeEach(async function () { userId0 = await addUser(userData0); - userIdToken0 = authService.generateAuthToken({ userId: userId0 }); + userIdToken0 = generateAuthToken({ userId: userId0 }); }); afterEach(async function () { diff --git a/test/integration/goals.test.js b/test/integration/goals.test.js index 9f200844e..63100b00a 100644 --- a/test/integration/goals.test.js +++ b/test/integration/goals.test.js @@ -1,18 +1,18 @@ -const chai = require("chai"); -const sinon = require("sinon"); -const { expect } = chai; -const chaiHttp = require("chai-http"); -const nock = require("nock"); +import chai from "chai"; +import sinon from "sinon"; +import chaiHttp from "chai-http"; +import nock from "nock"; -const app = require("../../server"); -const authService = require("../../services/authService"); -const addUser = require("../utils/addUser"); -const config = require("config"); +import app from "../../server.js"; +import { generateAuthToken } from "../../services/authService.js"; +import addUser from "../utils/addUser.js"; +import config from "config"; +import userData from "../fixtures/user/user.js"; +import cleanDb from "../utils/cleanDb.js"; +import goals from "../../services/goalService.js"; +import { GET_OR_CREATE_GOAL_USER } from "../fixtures/goals/Token.js"; +const { expect } = chai; const cookieName = config.get("userToken.cookieName"); -const userData = require("../fixtures/user/user")(); -const cleanDb = require("../utils/cleanDb"); -const goals = require("../../services/goalService"); -const { GET_OR_CREATE_GOAL_USER } = require("../fixtures/goals/Token"); chai.use(chaiHttp); @@ -25,7 +25,7 @@ describe("Goals Site", function () { const userId = await addUser(user); user.id = userId; const goalsBackendUserId = "test_1"; - jwt = authService.generateAuthToken({ userId: userId }); + jwt = generateAuthToken({ userId: userId }); goalSiteConfig = config.services.goalAPI; nock(goalSiteConfig.baseUrl) diff --git a/test/integration/health.test.js b/test/integration/health.test.js index 94b3682af..ce3710924 100644 --- a/test/integration/health.test.js +++ b/test/integration/health.test.js @@ -1,13 +1,14 @@ -const chai = require("chai"); +import chai from "chai"; +import chaiHttp from "chai-http"; + +import app from "../../server.js"; +import { generateAuthToken } from "../../services/authService.js"; +import addUser from "../utils/addUser.js"; +import config from "config"; const { expect } = chai; -const chaiHttp = require("chai-http"); chai.use(chaiHttp); - -const app = require("../../server"); -const authService = require("../../services/authService"); -const addUser = require("../utils/addUser"); -const config = require("config"); const cookieName = config.get("userToken.cookieName"); + describe("health", function () { it("should return uptime from the healthcheck API", function (done) { chai @@ -49,7 +50,7 @@ describe("health", function () { it("should return 200 from the authenticated healthcheck API when token is passed", async function () { const userId = await addUser(); - const jwt = authService.generateAuthToken({ userId }); + const jwt = generateAuthToken({ userId }); chai .request(app) diff --git a/test/integration/issues.test.js b/test/integration/issues.test.js index d99136320..94a3c5985 100644 --- a/test/integration/issues.test.js +++ b/test/integration/issues.test.js @@ -1,11 +1,13 @@ -const chai = require("chai"); -const sinon = require("sinon"); +import chai from "chai"; +import sinon from "sinon"; +import chaiHttp from "chai-http"; + +import app from "../../server.js"; +import cleanDb from "../utils/cleanDb.js"; +import githubService from "../../services/githubService.js"; +import issuesMockData from "../fixtures/issues/issues.js"; + const { expect } = chai; -const chaiHttp = require("chai-http"); -const app = require("../../server"); -const cleanDb = require("../utils/cleanDb"); -const githubService = require("../../services/githubService"); -const issuesMockData = require("../fixtures/issues/issues"); chai.use(chaiHttp); diff --git a/test/integration/logs.test.js b/test/integration/logs.test.js index fe2b22b77..5d7d274a0 100644 --- a/test/integration/logs.test.js +++ b/test/integration/logs.test.js @@ -1,17 +1,17 @@ import chai from "chai"; import chaiHttp from "chai-http"; import config from "config"; -import app from "../../server"; -import cleanDb from "../utils/cleanDb"; -import authService from "../../services/authService"; -import userDataFixture from "../fixtures/user/user"; -import addUser from "../utils/addUser"; -import { createOooRequests } from "../fixtures/oooRequest/oooRequest"; -import { createRequest } from "../../models/requests"; -import logsQuery, { addLog } from "../../models/logs"; -import { LOG_ACTION, REQUEST_LOG_TYPE } from "../../constants/requests"; -import { requestsLogs } from "../fixtures/logs/requests"; -import { extensionRequestLogs } from "../fixtures/logs/extensionRequests"; +import app from "../../server.js"; +import cleanDb from "../utils/cleanDb.js"; +import { generateAuthToken } from "../../services/authService.js"; +import userDataFixture from "../fixtures/user/user.js"; +import addUser from "../utils/addUser.js"; +import { createOooRequests } from "../fixtures/oooRequest/oooRequest.js"; +import { createRequest } from "../../models/requests.js"; +import logsQuery, { addLog } from "../../models/logs.js"; +import { LOG_ACTION, REQUEST_LOG_TYPE } from "../../constants/requests.js"; +import { requestsLogs } from "../fixtures/logs/requests.js"; +import { extensionRequestLogs } from "../fixtures/logs/extensionRequests.js"; const { expect } = chai; const cookieName = config.get("userToken.cookieName"); @@ -40,8 +40,8 @@ describe("/logs", function () { }; await addLog(requestLog.type, requestLog.meta, requestLog.body); await addLogs(); - authToken = authService.generateAuthToken({ userId }); - superUserToken = authService.generateAuthToken({ userId: superUserId }); + authToken = generateAuthToken({ userId }); + superUserToken = generateAuthToken({ userId: superUserId }); }); afterEach(async function () { @@ -300,7 +300,7 @@ describe("/logs", function () { beforeEach(async function () { userId = await addUser(); - jwt = authService.generateAuthToken({ userId }); + jwt = generateAuthToken({ userId }); }); it("Should update the users and capture the logs", async function () { diff --git a/test/integration/members.test.js b/test/integration/members.test.js index 1499512ff..c0f2afa57 100644 --- a/test/integration/members.test.js +++ b/test/integration/members.test.js @@ -1,20 +1,18 @@ -const chai = require("chai"); -const { expect } = chai; -const chaiHttp = require("chai-http"); - -const app = require("../../server"); -const authService = require("../../services/authService"); -const addUser = require("../utils/addUser"); -const cleanDb = require("../utils/cleanDb"); +import chai from "chai"; +import chaiHttp from "chai-http"; +import config from "config"; +import sinon from "sinon"; + +import app from "../../server.js"; +import { generateAuthToken } from "../../services/authService.js"; +import addUser from "../utils/addUser.js"; +import cleanDb from "../utils/cleanDb.js"; +import userData from "../fixtures/user/user.js"; +import { INTERNAL_SERVER_ERROR } from "../../constants/errorMessages.js"; +import members from "../../models/members.js"; -// Import fixtures -const userData = require("../fixtures/user/user")(); - -const config = require("config"); +const { expect } = chai; const cookieName = config.get("userToken.cookieName"); -const Sinon = require("sinon"); -const { INTERNAL_SERVER_ERROR } = require("../../constants/errorMessages"); -const members = require("../../models/members"); chai.use(chaiHttp); @@ -177,7 +175,7 @@ describe("Members", function () { describe("PATCH /members/moveToMembers/:username", function () { beforeEach(async function () { const superUserId = await addUser(superUser); - jwt = authService.generateAuthToken({ userId: superUserId }); + jwt = generateAuthToken({ userId: superUserId }); }); it("Should return 404 if user doesn't exist", function (done) { @@ -240,7 +238,7 @@ describe("Members", function () { it("Should return 401 if user is not a super_user", function (done) { addUser(nonSuperUser).then((nonSuperUserId) => { - const nonSuperUserJwt = authService.generateAuthToken({ userId: nonSuperUserId }); + const nonSuperUserJwt = generateAuthToken({ userId: nonSuperUserId }); chai .request(app) .patch(`/members/moveToMembers/${nonSuperUser.username}`) @@ -265,16 +263,16 @@ describe("Members", function () { beforeEach(async function () { const superUserId = await addUser(superUser); - jwt = authService.generateAuthToken({ userId: superUserId }); + jwt = generateAuthToken({ userId: superUserId }); }); afterEach(async function () { - Sinon.restore(); + sinon.restore(); await cleanDb(); }); it("Should return an object with status 500 and an error message", function (done) { - archiveRoleToMemberStub = Sinon.stub(members, "addArchiveRoleToMembers"); + archiveRoleToMemberStub = sinon.stub(members, "addArchiveRoleToMembers"); archiveRoleToMemberStub.throws(new Error(INTERNAL_SERVER_ERROR)); addUser(userToBeArchived).then(() => { diff --git a/test/integration/monitor.js b/test/integration/monitor.js index a4a9bef99..1ad779509 100644 --- a/test/integration/monitor.js +++ b/test/integration/monitor.js @@ -1,27 +1,27 @@ -const chai = require("chai"); - -const firestore = require("../../utils/firestore"); -const app = require("../../server"); -const authService = require("../../services/authService"); - -const addUser = require("../utils/addUser"); -const cleanDb = require("../utils/cleanDb"); -const taskData = require("../fixtures/tasks/tasks")(); -const { updateTask } = require("../../models/tasks"); -const { +import chai from "chai"; +import config from "config"; + +import firestore from "../../utils/firestore.js"; +import app from "../../server.js"; +import { generateAuthToken } from "../../services/authService.js"; +import addUser from "../utils/addUser.js"; +import cleanDb from "../utils/cleanDb.js"; +import taskData from "../fixtures/tasks/tasks.js"; +import { updateTask } from "../../models/tasks.js"; +import { predefinedTrackedProgressDataForUser, predefinedTrackedProgressDataForTask, isISOString, trackedProgressUserDataForPost, trackedProgressTaskDataForPost, trackedProgressDataForPatch, -} = require("../fixtures/trackedProgress"); +} from "../fixtures/trackedProgress.js"; -const userData = require("../fixtures/user/user")(); -const [userData0, userData1, , , superUserData] = userData; +import userData from "../fixtures/user/user.js"; -const cookieName = config.get("userToken.cookieName"); const { expect } = chai; +const cookieName = config.get("userToken.cookieName"); +const [userData0, userData1, , , superUserData] = userData; describe("Test the tracked Progress API", function () { let userId0, userId1, superUserId; @@ -30,10 +30,10 @@ describe("Test the tracked Progress API", function () { beforeEach(async function () { userId0 = await addUser(userData0); - userIdToken0 = authService.generateAuthToken({ userId: userId0 }); + userIdToken0 = generateAuthToken({ userId: userId0 }); userId1 = await addUser(userData1); superUserId = await addUser(superUserData); - superUserToken = authService.generateAuthToken({ userId: superUserId }); + superUserToken = generateAuthToken({ userId: superUserId }); const taskObject0 = await updateTask(taskData[0]); taskId0 = taskObject0.taskId; diff --git a/test/integration/notify.test.js b/test/integration/notify.test.js index 6a8a41d70..6b767d15b 100644 --- a/test/integration/notify.test.js +++ b/test/integration/notify.test.js @@ -1,21 +1,22 @@ -const chai = require("chai"); -const { expect } = chai; -const app = require("../../server"); -const cleanDb = require("../utils/cleanDb"); -const addUser = require("../utils/addUser"); -const userData = require("../fixtures/user/user")(); +import chai from "chai"; +import config from "config"; -const userData0 = userData[0]; -const authService = require("../../services/authService"); +import app from "../../server.js"; +import { generateAuthToken } from "../../services/authService.js"; +import userData from "../fixtures/user/user.js"; +import addUser from "../utils/addUser.js"; +import cleanDb from "../utils/cleanDb.js"; +const { expect } = chai; const cookieName = config.get("userToken.cookieName"); +const userData0 = userData[0]; describe("Notify Test", function () { let userId0, userIdToken0; beforeEach(async function () { userId0 = await addUser(userData0); - userIdToken0 = authService.generateAuthToken({ userId: userId0 }); + userIdToken0 = generateAuthToken({ userId: userId0 }); }); afterEach(async function () { diff --git a/test/integration/onboardingExtension.test.ts b/test/integration/onboardingExtension.test.ts index a862ad82e..2118b6dc9 100644 --- a/test/integration/onboardingExtension.test.ts +++ b/test/integration/onboardingExtension.test.ts @@ -1,11 +1,11 @@ -import addUser from "../utils/addUser"; +import addUser from "../utils/addUser.js"; import chai from "chai"; const { expect } = chai; -import userDataFixture from "../fixtures/user/user"; +import userDataFixture from "../fixtures/user/user.js"; import sinon from "sinon"; import chaiHttp from "chai-http"; -import cleanDb from "../utils/cleanDb"; -import { CreateOnboardingExtensionBody, OnboardingExtension } from "../../types/onboardingExtension"; +import cleanDb from "../utils/cleanDb.js"; +import { CreateOnboardingExtensionBody, OnboardingExtension } from "../../types/onboardingExtension.js"; import { REQUEST_ALREADY_PENDING, REQUEST_STATE, REQUEST_TYPE, @@ -18,19 +18,19 @@ import { INVALID_REQUEST_TYPE, REQUEST_DOES_NOT_EXIST, UNAUTHORIZED_TO_UPDATE_REQUEST -} from "../../constants/requests"; -const { generateToken } = require("../../test/utils/generateBotToken"); -import app from "../../server"; -import { createUserStatusWithState } from "../../utils/userStatus"; -const firestore = require("../../utils/firestore"); +} from "../../constants/requests.js"; +import { generateToken } from "../../test/utils/generateBotToken.js"; +import app from "../../server.js"; +import { createUserStatusWithState } from "../../utils/userStatus.js"; +import firestore from "../../utils/firestore.js"; const userStatusModel = firestore.collection("usersStatus"); -import * as requestsQuery from "../../models/requests" -import { userState } from "../../constants/userStatus"; -import { generateAuthToken } from "../../services/authService"; -const { CLOUDFLARE_WORKER, BAD_TOKEN } = require("../../constants/bot"); -import * as logUtils from "../../services/logService"; -import { convertDaysToMilliseconds } from "../../utils/time"; -import { OooStatusRequest } from "../../types/oooRequest"; +import * as requestsQuery from "../../models/requests.js"; +import { userState } from "../../constants/userStatus.js"; +import { generateAuthToken } from "../../services/authService.js"; +import { CLOUDFLARE_WORKER, BAD_TOKEN } from "../../constants/bot.js"; +import * as logUtils from "../../services/logService.js"; +import { convertDaysToMilliseconds } from "../../utils/time.js"; +import { OooStatusRequest } from "../../types/oooRequest.js"; const userData = userDataFixture(); chai.use(chaiHttp); diff --git a/test/integration/profileDiffs.test.js b/test/integration/profileDiffs.test.js index 5d1097071..4c88e1b8d 100644 --- a/test/integration/profileDiffs.test.js +++ b/test/integration/profileDiffs.test.js @@ -1,19 +1,18 @@ -const chai = require("chai"); -const { expect } = chai; -const chaiHttp = require("chai-http"); +import chai from "chai"; +import chaiHttp from "chai-http"; +import config from "config"; -const app = require("../../server"); -const authService = require("../../services/authService"); +import app from "../../server.js"; +import { generateAuthToken } from "../../services/authService.js"; +import addUser from "../utils/addUser.js"; +import userData from "../fixtures/user/user.js"; -const addUser = require("../utils/addUser"); +const { expect } = chai; +const cookieName = config.get("userToken.cookieName"); -const userData = require("../fixtures/user/user")(); const newUser = userData[3]; const superUser = userData[4]; -const config = require("config"); -const cookieName = config.get("userToken.cookieName"); - chai.use(chaiHttp); describe("GET /profileDiffs", function () { @@ -25,10 +24,10 @@ describe("GET /profileDiffs", function () { before(async function () { newUserId = await addUser(newUser); - newUserAuthToken = authService.generateAuthToken({ userId: newUserId }); + newUserAuthToken = generateAuthToken({ userId: newUserId }); superUserId = await addUser(superUser); - superUserAuthToken = authService.generateAuthToken({ userId: superUserId }); + superUserAuthToken = generateAuthToken({ userId: superUserId }); }); it("Should return pending profileDiffs, using authorized user (super_user)", function (done) { diff --git a/test/integration/profileDiffsDev.test.js b/test/integration/profileDiffsDev.test.js index 7538daeac..c5a736c96 100644 --- a/test/integration/profileDiffsDev.test.js +++ b/test/integration/profileDiffsDev.test.js @@ -1,25 +1,23 @@ -const chai = require("chai"); +import chai from "chai"; +import chaiHttp from "chai-http"; +import sinon from "sinon"; +import config from "config"; + +import firestore from "../../utils/firestore.js"; +import obfuscate from "../../utils/obfuscate.js"; +import app from "../../server.js"; +import { generateAuthToken } from "../../services/authService.js"; +import profileDiffsQuery from "../../models/profileDiffs.js"; +import addUser from "../utils/addUser.js"; +import userData from "../fixtures/user/user.js"; +import addProfileDiffs from "../utils/addProfileDiffs.js"; + const { expect } = chai; -const chaiHttp = require("chai-http"); -const sinon = require("sinon"); -const firestore = require("../../utils/firestore"); const profileDiffsModel = firestore.collection("profileDiffs"); -const obfuscate = require("../../utils/obfuscate"); - -const app = require("../../server"); -const authService = require("../../services/authService"); -const profileDiffsQuery = require("../../models/profileDiffs"); - -const addUser = require("../utils/addUser"); - -const userData = require("../fixtures/user/user")(); +const cookieName = config.get("userToken.cookieName"); const newUser = userData[3]; const superUser = userData[4]; -const config = require("config"); -const addProfileDiffs = require("../utils/addProfileDiffs"); -const cookieName = config.get("userToken.cookieName"); - chai.use(chaiHttp); describe("Profile Diffs API Behind Feature Flag", function () { @@ -30,10 +28,10 @@ describe("Profile Diffs API Behind Feature Flag", function () { before(async function () { newUserId = await addUser(newUser); - newUserAuthToken = authService.generateAuthToken({ userId: newUserId }); + newUserAuthToken = generateAuthToken({ userId: newUserId }); superUserId = await addUser(superUser); - superUserAuthToken = authService.generateAuthToken({ userId: superUserId }); + superUserAuthToken = generateAuthToken({ userId: superUserId }); await addProfileDiffs(newUserId); }); diff --git a/test/integration/progressesTasks.test.js b/test/integration/progressesTasks.test.js index 46ee6fa51..197eb04c6 100644 --- a/test/integration/progressesTasks.test.js +++ b/test/integration/progressesTasks.test.js @@ -1,22 +1,23 @@ -const chai = require("chai"); -const sinon = require("sinon"); - -const firestore = require("../../utils/firestore"); -const app = require("../../server"); -const authService = require("../../services/authService"); -const tasks = require("../../models/tasks"); -const progressesModel = require("../../models/progresses"); -const addUser = require("../utils/addUser"); -const cleanDb = require("../utils/cleanDb"); -const { +import chai from "chai"; +import sinon from "sinon"; + +import firestore from "../../utils/firestore.js"; +import app from "../../server.js"; +import { generateAuthToken } from "../../services/authService.js"; +import tasks from "../../models/tasks.js"; +import progressesModel from "../../models/progresses.js"; +import addUser from "../utils/addUser.js"; +import cleanDb from "../utils/cleanDb.js"; +import { taskProgressDay1, stubbedModelTaskProgressData, incompleteTaskProgress, -} = require("../fixtures/progress/progresses"); +} from "../fixtures/progress/progresses.js"; -const userData = require("../fixtures/user/user")(); -const taskData = require("../fixtures/tasks/tasks")(); -const { INTERNAL_SERVER_ERROR_MESSAGE, UNAUTHORIZED_WRITE } = require("../../constants/progresses"); +import userData from "../fixtures/user/user.js"; +import taskData from "../fixtures/tasks/tasks.js"; +import { INTERNAL_SERVER_ERROR_MESSAGE, UNAUTHORIZED_WRITE } from "../../constants/progresses.js"; +import config from "config"; const cookieName = config.get("userToken.cookieName"); const { expect } = chai; @@ -43,8 +44,8 @@ describe("Test Progress Updates API for Tasks", function () { }); userId = await addUser(userData[1]); archivedUserId = await addUser(userData[5]); - archivedUserToken = authService.generateAuthToken({ userId: archivedUserId }); - userToken = authService.generateAuthToken({ userId: userId }); + archivedUserToken = generateAuthToken({ userId: archivedUserId }); + userToken = generateAuthToken({ userId: userId }); const taskObject1 = await tasks.updateTask(taskData[0]); taskId1 = taskObject1.taskId; const taskObject2 = await tasks.updateTask(taskData[1]); diff --git a/test/integration/progressesUsers.test.js b/test/integration/progressesUsers.test.js index afac45ca3..4a5c0ee95 100644 --- a/test/integration/progressesUsers.test.js +++ b/test/integration/progressesUsers.test.js @@ -1,20 +1,17 @@ -const chai = require("chai"); -const sinon = require("sinon"); - -const firestore = require("../../utils/firestore"); -const app = require("../../server"); -const authService = require("../../services/authService"); -const progressesModel = require("../../models/progresses"); -const addUser = require("../utils/addUser"); -const cleanDb = require("../utils/cleanDb"); -const { - standupProgressDay1, - incompleteProgress, - stubbedModelProgressData, -} = require("../fixtures/progress/progresses"); - -const userData = require("../fixtures/user/user")(); -const { INTERNAL_SERVER_ERROR_MESSAGE } = require("../../constants/progresses"); +import chai from "chai"; +import sinon from "sinon"; +import config from "config"; + +import firestore from "../../utils/firestore.js"; +import app from "../../server.js"; +import { generateAuthToken } from "../../services/authService.js"; +import progressesModel from "../../models/progresses.js"; +import addUser from "../utils/addUser.js"; +import cleanDb from "../utils/cleanDb.js"; +import { standupProgressDay1, incompleteProgress, stubbedModelProgressData } from "../fixtures/progress/progresses.js"; + +import userData from "../fixtures/user/user.js"; +import { INTERNAL_SERVER_ERROR_MESSAGE } from "../../constants/progresses.js"; const cookieName = config.get("userToken.cookieName"); const { expect } = chai; @@ -38,9 +35,9 @@ describe("Test Progress Updates API for Users", function () { toFake: ["Date"], }); userId = await addUser(userData[1]); - userToken = authService.generateAuthToken({ userId: userId }); + userToken = generateAuthToken({ userId: userId }); anotherUserId = await addUser(userData[8]); - anotherUserToken = authService.generateAuthToken({ userId: anotherUserId }); + anotherUserToken = generateAuthToken({ userId: anotherUserId }); const progressData = stubbedModelProgressData(anotherUserId, 1682935200000, 1682899200000); await firestore.collection("progresses").doc("anotherUserProgressDocument").set(progressData); }); diff --git a/test/integration/qrCodeAuth.test.js b/test/integration/qrCodeAuth.test.js index bcacbe99f..ba79b9264 100644 --- a/test/integration/qrCodeAuth.test.js +++ b/test/integration/qrCodeAuth.test.js @@ -1,14 +1,16 @@ -const chai = require("chai"); -const sinon = require("sinon"); +import chai from "chai"; +import sinon from "sinon"; +import config from "config"; + +import app from "../../server.js"; +import cleanDb from "../utils/cleanDb.js"; +import userData from "../fixtures/user/user.js"; +import { userDeviceInfoDataArray } from "../fixtures/qrCodeAuth/qrCodeAuth.js"; +import addUser from "../utils/addUser.js"; +import qrCodeAuthModel from "../../models/qrCodeAuth.js"; +import { generateAuthToken } from "../../services/authService.js"; + const { expect } = chai; -const app = require("../../server"); -const cleanDb = require("../utils/cleanDb"); -const userData = require("../fixtures/user/user")(); -const { userDeviceInfoDataArray } = require("../fixtures/qrCodeAuth/qrCodeAuth"); -const addUser = require("../utils/addUser"); -const qrCodeAuthModel = require("../../models/qrCodeAuth"); -const authService = require("../../services/authService"); -const config = require("config"); const cookieName = config.get("userToken.cookieName"); const USER_DOES_NOT_EXIST_ERROR = "User does not exist!"; @@ -101,7 +103,7 @@ describe("QrCodeAuth", function () { beforeEach(async function () { userId = await addUser(); - jwt = authService.generateAuthToken({ userId }); + jwt = generateAuthToken({ userId }); userDeviceInfoData = { ...userDeviceInfoDataArray[0], user_id: userId }; userDeviceInfoWithAuthStatus = { ...userDeviceInfoData, authorization_status: "NOT_INIT" }; }); @@ -205,33 +207,10 @@ describe("QrCodeAuth", function () { await cleanDb(); }); - it("should successfully fetch the user device info", function (done) { - qrCodeAuthModel.storeUserDeviceInfo(userDeviceInfoData).then((response) => { - chai - .request(app) - .get(`/auth/qr-code-auth?device_id=${response.userDeviceInfoData.device_id}`) - .end((err, res) => { - if (err) { - return done(err); - } - expect(res).to.have.status(200); - expect(res.body).to.be.a("object"); - expect(res.body.data.user_id).to.be.a("string"); - expect(res.body.data.device_info).to.be.a("string"); - expect(res.body.data.device_id).to.be.a("string"); - expect(res.body.data.authorization_status).to.be.a("string"); - expect(res.body.data.access_token).to.be.a("string"); - expect(res.body.message).to.equal(`Authentication document retrieved successfully.`); - - return done(); - }); - }); - }); - - it("should fail with 404, when the document is not found", function (done) { + it("should fail with 404, when the user is not found", function (done) { chai .request(app) - .get(`/auth/qr-code-auth?device_id=${userDeviceInfoData.device_id}`) + .get("/auth/qr-code-auth/user-device-info") .end((err, res) => { if (err) { return done(err); @@ -239,11 +218,32 @@ describe("QrCodeAuth", function () { expect(res).to.have.status(404); expect(res.body).to.be.a("object"); - expect(res.body.message).to.equal(`User with id ${userDeviceInfoData.device_id} does not exist.`); + expect(res.body.message).to.equal("Document not found!"); expect(res.body.error).to.equal("Not Found"); return done(); }); }); + + it("should successfully fetch the user device info", function (done) { + qrCodeAuthModel.storeUserDeviceInfo(userDeviceInfoData); + chai + .request(app) + .get("/auth/qr-code-auth/user-device-info") + .end((err, res) => { + if (err) { + return done(err); + } + + expect(res).to.have.status(200); + expect(res.body).to.be.a("object"); + expect(res.body.userDeviceInfoData).to.be.a("object"); + expect(res.body.userDeviceInfoData.user_id).to.equal(userId); + expect(res.body.userDeviceInfoData.authorization_status).to.equal("NOT_INIT"); + expect(res.body.userDeviceInfoData.access_token).to.equal("ACCESS_TOKEN"); + + return done(); + }); + }); }); }); diff --git a/test/integration/questions.test.ts b/test/integration/questions.test.ts index 6c0d721e0..6a6e0fcf2 100644 --- a/test/integration/questions.test.ts +++ b/test/integration/questions.test.ts @@ -1,21 +1,23 @@ +// @ts-nocheck + import chai, { expect } from "chai"; -const sinon = require("sinon"); -const config = require("config"); -const chaiHttp = require("chai-http"); +import sinon from "sinon"; +import config from "config"; +import chaiHttp from "chai-http"; -const app = require("../../server"); -const authService = require("../../services/authService"); -const addUser = require("../utils/addUser"); -const cleanDb = require("../utils/cleanDb"); +import app from "../../server.js"; +import * as authService from "../../services/authService.js"; +import addUser from "../utils/addUser.js"; +import cleanDb from "../utils/cleanDb.js"; -const questionQuery = require("../../models/questions"); +import * as questionQuery from "../../models/questions.js"; -const userData = require("../fixtures/user/user")(); +import userData from "../fixtures/user/user.js"; const defaultUser = userData[16]; const superUser = userData[4]; -const questionDataArray = require("../fixtures/questions/questions"); -const questionDataWithMaxWords = questionDataArray[5]; +import { SAMPLE_QUESTION_DATA } from "../fixtures/questions/questions.js"; +const questionDataWithMaxWords = SAMPLE_QUESTION_DATA[5]; const cookieName = config.get("userToken.cookieName"); @@ -101,7 +103,7 @@ describe("questions", function () { }); it("should create and return the question if the user is super user", function (done) { - sinon.stub(questionQuery, "createQuestion").resolves(questionDataArray[6]); + sinon.stub(questionQuery, "createQuestion").resolves(SAMPLE_QUESTION_DATA[6]); chai .request(app) @@ -115,11 +117,11 @@ describe("questions", function () { expect(response).to.have.status(201); expect(response.body.message).to.equal("Question created and sent successfully to connected peers"); - expect(response.body.data.question).to.equal(questionDataArray[6].question); - expect(response.body.data.id).to.equal(questionDataArray[6].id); - expect(response.body.data.created_at).to.equal(questionDataArray[6].created_at); - expect(response.body.data.created_by).to.equal(questionDataArray[6].created_by); - expect(response.body.data.updated_at).to.equal(questionDataArray[6].updated_at); + expect(response.body.data.question).to.equal(SAMPLE_QUESTION_DATA[6].question); + expect(response.body.data.id).to.equal(SAMPLE_QUESTION_DATA[6].id); + expect(response.body.data.created_at).to.equal(SAMPLE_QUESTION_DATA[6].created_at); + expect(response.body.data.created_by).to.equal(SAMPLE_QUESTION_DATA[6].created_by); + expect(response.body.data.updated_at).to.equal(SAMPLE_QUESTION_DATA[6].updated_at); return done(); }); diff --git a/test/integration/recruiters.test.js b/test/integration/recruiters.test.js index 855c65519..60eb31c8d 100644 --- a/test/integration/recruiters.test.js +++ b/test/integration/recruiters.test.js @@ -1,18 +1,18 @@ -const chai = require("chai"); +import chai from "chai"; +import chaiHttp from "chai-http"; +import config from "config"; + +import app from "../../server.js"; +import { generateAuthToken } from "../../services/authService.js"; +import users from "../../models/users.js"; +import recruiters from "../../models/recruiters.js"; +import addUser from "../utils/addUser.js"; +import cleanDb from "../utils/cleanDb.js"; +import userData from "../fixtures/user/user.js"; +import { recruiterDataArray, recruiterWithIdKeys } from "../fixtures/recruiter/recruiter.js"; + const { expect } = chai; -const chaiHttp = require("chai-http"); - -const app = require("../../server"); -const authService = require("../../services/authService"); -const users = require("../../models/users"); -const recruiters = require("../../models/recruiters"); -const addUser = require("../utils/addUser"); -const cleanDb = require("../utils/cleanDb"); const cookieName = config.get("userToken.cookieName"); -// Import fixtures -const userData = require("../fixtures/user/user")(); -const { recruiterDataArray, recruiterWithIdKeys } = require("../fixtures/recruiter/recruiter"); - const superUser = userData[4]; const nonSuperUser = userData[2]; @@ -25,7 +25,7 @@ describe("Recruiters", function () { beforeEach(async function () { const superUserId = await addUser(superUser); - jwt = authService.generateAuthToken({ userId: superUserId }); + jwt = generateAuthToken({ userId: superUserId }); const userId = await addUser(); const { user } = await users.fetchUser({ userId }); @@ -126,25 +126,24 @@ describe("Recruiters", function () { }); }); - it("Should return 401 if user is not a super_user", function (done) { - addUser(nonSuperUser).then((nonSuperUserId) => { - const nonSuperUserJwt = authService.generateAuthToken({ userId: nonSuperUserId }); - chai - .request(app) - .get("/members/intro") - .set("cookie", `${cookieName}=${nonSuperUserJwt}`) - .end((err, res) => { - if (err) { - return done(err); - } + it("Should return 401 if user is not a super_user", async function (done) { + const nonSuperUserId = await addUser(nonSuperUser); + const nonSuperUserJwt = generateAuthToken({ userId: nonSuperUserId }); + chai + .request(app) + .get("/members/intro") + .set("cookie", `${cookieName}=${nonSuperUserJwt}`) + .end((err, res) => { + if (err) { + return done(err); + } - expect(res).to.have.status(401); - expect(res.body).to.be.a("object"); - expect(res.body.message).to.equal("You are not authorized for this action."); + expect(res).to.have.status(401); + expect(res.body).to.be.a("object"); + expect(res.body.message).to.equal("You are not authorized for this action."); - return done(); - }); - }); + return done(); + }); }); }); }); diff --git a/test/integration/requests.test.ts b/test/integration/requests.test.ts index 2e83acf18..aa040f2a6 100644 --- a/test/integration/requests.test.ts +++ b/test/integration/requests.test.ts @@ -5,11 +5,11 @@ import _ from "lodash"; import config from "config"; import app from "../../server"; import cleanDb from "../utils/cleanDb"; -import authService from "../../services/authService"; +import {generateAuthToken} from "../../services/authService"; import userDataFixture from "../fixtures/user/user"; import sinon from "sinon"; const cookieName = config.get("userToken.cookieName"); -import addUser from "../utils/addUser"; +import addUser from "../utils/addUser.js"; import { createOooRequests, validOooStatusRequests, @@ -35,12 +35,13 @@ import { USER_STATUS_NOT_FOUND, OOO_STATUS_ALREADY_EXIST, } from "../../constants/requests"; -import { updateTask } from "../../models/tasks"; +import updateTask from "../../models/tasks"; import { validTaskAssignmentRequest, validTaskCreqtionRequest } from "../fixtures/taskRequests/taskRequests"; import { deleteUserStatus, updateUserStatus } from "../../models/userStatus"; import * as requestsQuery from "../../models/requests"; import { userState } from "../../constants/userStatus"; import * as logUtils from "../../services/logService"; +import taskModel from "../../models/tasks.js"; const userData = userDataFixture(); chai.use(chaiHttp); @@ -83,8 +84,8 @@ describe("/requests OOO", function () { ); approvedOooRequestId = response?.id; - authToken = authService.generateAuthToken({ userId }); - superUserToken = authService.generateAuthToken({ userId: superUserId }); + authToken = generateAuthToken({ userId }); + superUserToken = generateAuthToken({ userId: superUserId }); }); afterEach(async function () { @@ -98,7 +99,7 @@ describe("/requests OOO", function () { const userIdPromises = [addUser(userData[16])]; const [userId] = await Promise.all(userIdPromises); - authToken = authService.generateAuthToken({ userId }); + authToken = generateAuthToken({ userId }); const testUserStatus = { currentStatus: { @@ -143,7 +144,7 @@ describe("/requests OOO", function () { }); it("should return 403 if user is not part of discord", function (done) { - const authTokenForArchivedUserId = authService.generateAuthToken( + const authTokenForArchivedUserId = generateAuthToken( { userId: testArchivedUserId } ); chai @@ -741,12 +742,12 @@ describe("/requests Extension", function () { userId2 = await addUser(userData[17]); superUserId = await addUser(userData[4]); - userJwtToken1 = authService.generateAuthToken({ userId: userId1 }); - userJwtToken2 = authService.generateAuthToken({ userId: userId2 }); - superUserJwtToken = authService.generateAuthToken({ userId: superUserId }); + userJwtToken1 = generateAuthToken({ userId: userId1 }); + userJwtToken2 = generateAuthToken({ userId: userId2 }); + superUserJwtToken = generateAuthToken({ userId: superUserId }); - taskId1 = (await updateTask({ ...taskData[0], assigneeId: userId1 })).taskId; - taskId2 = (await updateTask({ ...taskData[1] })).taskId; + taskId1 = (await taskModel.updateTask({ ...taskData[0], assigneeId: userId1 })).taskId; + taskId2 = (await taskModel.updateTask({ ...taskData[1] })).taskId; }); afterEach(async function () { @@ -1079,7 +1080,7 @@ describe("/requests Task", function () { beforeEach(async function () { userId1 = await addUser(userData[16]); - userJwtToken1 = authService.generateAuthToken({ userId: userId1 }); + userJwtToken1 = generateAuthToken({ userId: userId1 }); }); afterEach(async function () { diff --git a/test/integration/restricted.test.js b/test/integration/restricted.test.js index aa3b7e5df..a3878c89e 100644 --- a/test/integration/restricted.test.js +++ b/test/integration/restricted.test.js @@ -1,15 +1,16 @@ -const chai = require("chai"); -const { expect } = chai; -const chaiHttp = require("chai-http"); +import chai from "chai"; +import chaiHttp from "chai-http"; +import config from "config"; +import sinon from "sinon"; -const app = require("../../server"); -const authService = require("../../services/authService"); -const cleanDb = require("../utils/cleanDb"); -const userData = require("../fixtures/user/user")(); -const addUser = require("../utils/addUser"); -const sinon = require("sinon"); -const { getDiscordMembers } = require("../fixtures/discordResponse/discord-response"); +import app from "../../server.js"; +import { generateAuthToken } from "../../services/authService.js"; +import cleanDb from "../utils/cleanDb.js"; +import userData from "../fixtures/user/user.js"; +import addUser from "../utils/addUser.js"; +import { getDiscordMembers } from "../fixtures/discordResponse/discord-response.js"; +const { expect } = chai; const cookieName = config.get("userToken.cookieName"); const unrestrictedUser = userData[0]; const restrictedUser = userData[2]; @@ -24,8 +25,8 @@ describe("checkRestrictedUser", function () { before(async function () { const restrictedUserId = await addUser(restrictedUser); const unrestrictedUserId = await addUser(unrestrictedUser); - restrictedJwt = authService.generateAuthToken({ userId: restrictedUserId }); - unrestrictedJwt = authService.generateAuthToken({ userId: unrestrictedUserId }); + restrictedJwt = generateAuthToken({ userId: restrictedUserId }); + unrestrictedJwt = generateAuthToken({ userId: unrestrictedUserId }); fetchStub = sinon.stub(global, "fetch"); fetchStub.returns( diff --git a/test/integration/stocks.test.ts b/test/integration/stocks.test.ts index 2bffd5dfd..b4b99fd4a 100644 --- a/test/integration/stocks.test.ts +++ b/test/integration/stocks.test.ts @@ -1,10 +1,10 @@ import chai from "chai"; import chaiHttp from "chai-http"; -import app from "../../server"; -import authService from "../../services/authService"; -import addUser from "../utils/addUser"; -import cleanDb from "../utils/cleanDb"; -import stocks from "../../models/stocks"; +import app from "../../server.js"; +import { generateAuthToken } from "../../services/authService.js"; +import addUser from "../utils/addUser.js"; +import cleanDb from "../utils/cleanDb.js"; +import * as stocksModel from "../../models/stocks.js"; import sinon from "sinon"; import config from "config"; @@ -20,8 +20,8 @@ describe("GET /stocks/:userId", function () { beforeEach(async function () { userId = await addUser(); - jwt = authService.generateAuthToken({ userId }); - const { id } = await stocks.addStock(stockData); + jwt = generateAuthToken({ userId }); + const { id } = await stocksModel.addStock(stockData); userStock = { stockId: id, stockName: "EURO", quantity: 1, orderValue: 10, initialStockValue: 2 }; }); @@ -31,7 +31,7 @@ describe("GET /stocks/:userId", function () { }); it("Should return user stocks when stocks are available", async function () { - await stocks.updateUserStocks(userId, userStock); + await stocksModel.updateUserStocks(userId, userStock); const res = await chai.request(app).get(`/stocks/${userId}?dev=true`).set("cookie", `${cookieName}=${jwt}`); @@ -78,7 +78,7 @@ describe("GET /stocks/:userId", function () { }); it("Should return 500 when an internal server error occurs", function (done) { - sinon.stub(stocks, "fetchUserStocks").throws(new Error("Database error")); + sinon.stub(stocksModel, "fetchUserStocks").throws(new Error("Database error")); chai .request(app) diff --git a/test/integration/subscription.test.js b/test/integration/subscription.test.js index 66d652287..5b7a61fc2 100644 --- a/test/integration/subscription.test.js +++ b/test/integration/subscription.test.js @@ -1,25 +1,30 @@ -const chai = require("chai"); -const sinon = require("sinon"); -const app = require("../../server"); -const cookieName = config.get("userToken.cookieName"); -const { subscribedMessage, unSubscribedMessage, subscriptionData } = require("../fixtures/subscription/subscription"); -const addUser = require("../utils/addUser"); -const authService = require("../../services/authService"); -const chaiHttp = require("chai-http"); -chai.use(chaiHttp); -const nodemailer = require("nodemailer"); -const nodemailerMock = require("nodemailer-mock"); -const userData = require("../fixtures/user/user")(); +import chai from "chai"; +import sinon from "sinon"; +import chaiHttp from "chai-http"; +import config from "config"; +import nodemailer from "nodemailer"; +import nodemailerMock from "nodemailer-mock"; + +import app from "../../server.js"; +import { generateAuthToken } from "../../services/authService.js"; +import addUser from "../utils/addUser.js"; +import userData from "../fixtures/user/user.js"; +import { subscribedMessage, unSubscribedMessage, subscriptionData } from "../fixtures/subscription/subscription.js"; + const { expect } = chai; +const cookieName = config.get("userToken.cookieName"); let userId = ""; const superUser = userData[4]; let superUserAuthToken = ""; + +chai.use(chaiHttp); + describe("/subscription email notifications", function () { let jwt; beforeEach(async function () { userId = await addUser(); - jwt = authService.generateAuthToken({ userId }); + jwt = generateAuthToken({ userId }); }); it("Should return 401 if the user is not logged in", function (done) { @@ -71,7 +76,7 @@ describe("/subscription email notifications", function () { describe("/notify endpoint", function () { beforeEach(async function () { const superUserId = await addUser(superUser); - superUserAuthToken = authService.generateAuthToken({ userId: superUserId }); + superUserAuthToken = generateAuthToken({ userId: superUserId }); sinon.stub(nodemailerMock, "createTransport").callsFake(nodemailerMock.createTransport); }); diff --git a/test/integration/taskBasedStatusUpdate.test.js b/test/integration/taskBasedStatusUpdate.test.js index 86b353617..6cc60c4c3 100644 --- a/test/integration/taskBasedStatusUpdate.test.js +++ b/test/integration/taskBasedStatusUpdate.test.js @@ -1,18 +1,21 @@ -const chai = require("chai"); -const sinon = require("sinon"); +import chai from "chai"; +import config from "config"; +import sinon from "sinon"; + +import { userState } from "../../constants/userStatus.js"; +import userStatusModelFunction from "../../models/userStatus.js"; +import app from "../../server.js"; +import { generateAuthToken } from "../../services/authService.js"; +import firestore from "../../utils/firestore.js"; +import allTasks from "../fixtures/tasks/tasks.js"; +import userData from "../fixtures/user/user.js"; +import { generateStatusDataForState } from "../fixtures/userStatus/userStatus.js"; +import addUser from "../utils/addUser.js"; +import cleanDb from "../utils/cleanDb.js"; + const { expect } = chai; -const firestore = require("../../utils/firestore"); const userStatusModel = firestore.collection("usersStatus"); -const addUser = require("../utils/addUser"); -const authService = require("../../services/authService"); -const userData = require("../fixtures/user/user")(); -const app = require("../../server"); -const cleanDb = require("../utils/cleanDb"); -const { generateStatusDataForState } = require("../fixtures/userStatus/userStatus"); -const allTasks = require("../fixtures/tasks/tasks"); -const { userState } = require("../../constants/userStatus"); const cookieName = config.get("userToken.cookieName"); -const userStatusModelFunction = require("../../models/userStatus"); describe("Task Based Status Updates", function () { describe("PATCH /tasks/self/:taskId - Update User Status Document on marking Task as Completed.", function () { @@ -27,7 +30,7 @@ describe("Task Based Status Updates", function () { beforeEach(async function () { userId = await addUser(userData[6]); - userJwt = authService.generateAuthToken({ userId }); + userJwt = generateAuthToken({ userId }); superUserId = await addUser(userData[4]); taskArr = allTasks(); const sampleTask1 = taskArr[0]; @@ -238,7 +241,7 @@ describe("Task Based Status Updates", function () { beforeEach(async function () { userId = await addUser(userData[6]); superUserId = await addUser(userData[4]); - superUserJwt = authService.generateAuthToken({ userId: superUserId }); + superUserJwt = generateAuthToken({ userId: superUserId }); taskArr = allTasks(); const assignee = userData[6].username; reqBody.assignee = assignee; @@ -340,7 +343,7 @@ describe("Task Based Status Updates", function () { userId9 = await addUser(userData[9]); userId10 = await addUser(userData[10]); userId11 = await addUser(userData[11]); - superUserJwt = authService.generateAuthToken({ userId: userId4 }); + superUserJwt = generateAuthToken({ userId: userId4 }); listUsers = [ { userId: userId0, state: "IDLE" }, { userId: userId1, state: "IDLE" }, @@ -466,7 +469,7 @@ describe("Task Based Status Updates", function () { userId2 = await addUser(userData[8]); userId3 = await addUser(userData[9]); superUserId = await addUser(userData[4]); - superUserJwt = authService.generateAuthToken({ userId: superUserId }); + superUserJwt = generateAuthToken({ userId: superUserId }); const taskArr = allTasks(); @@ -539,7 +542,7 @@ describe("Task Based Status Updates", function () { beforeEach(async function () { userId1 = await addUser(userData[6]); superUserId = await addUser(userData[4]); - superUserJwt = authService.generateAuthToken({ userId: superUserId }); + superUserJwt = generateAuthToken({ userId: superUserId }); await addUser(userData[0]); user2Name = userData[0].username; taskArr = allTasks(); diff --git a/test/integration/taskRequests.test.js b/test/integration/taskRequests.test.js index bbc7e0ee6..698c01495 100644 --- a/test/integration/taskRequests.test.js +++ b/test/integration/taskRequests.test.js @@ -1,32 +1,33 @@ -const chai = require("chai"); -const sinon = require("sinon"); +import chai from "chai"; +import sinon from "sinon"; +import chaiHttp from "chai-http"; +import config from "config"; + +import app from "../../server.js"; +import { generateAuthToken, verifyAuthToken } from "../../services/authService.js"; +import tasksModel from "../../models/tasks.js"; +import userStatusModel from "../../models/userStatus.js"; +import taskRequestsModel from "../../models/taskRequests.js"; +import addUser from "../utils/addUser.js"; +import cleanDb from "../utils/cleanDb.js"; +import userData from "../fixtures/user/user.js"; +import taskData from "../fixtures/tasks/tasks.js"; +import mockData from "../fixtures/task-requests/task-requests.js"; +import userStatusData from "../fixtures/userStatus/userStatus.js"; +import firestore from "../../utils/firestore.js"; +import { + MIGRATION_TYPE, + TASK_REQUEST_TYPE, + TASK_REQUEST_STATUS, + TASK_REQUEST_ACTIONS, +} from "../../constants/taskRequests.js"; +import usersUtils from "../../utils/users.js"; +import githubService from "../../services/githubService.js"; +import { userState } from "../../constants/userStatus.js"; + const { expect } = chai; -const chaiHttp = require("chai-http"); - -const app = require("../../server"); -const authService = require("../../services/authService"); -const tasksModel = require("../../models/tasks"); -const userStatusModel = require("../../models/userStatus"); -const taskRequestsModel = require("../../models/taskRequests"); -const addUser = require("../utils/addUser"); -const cleanDb = require("../utils/cleanDb"); -const userData = require("../fixtures/user/user")(); -const taskData = require("../fixtures/tasks/tasks")(); -const mockData = require("../fixtures/task-requests/task-requests"); -const userStatusData = require("../fixtures/userStatus/userStatus"); -const firestore = require("../../utils/firestore"); const logsModel = firestore.collection("logs"); -const { MIGRATION_TYPE } = require("../../constants/taskRequests"); const taskRequestsCollection = firestore.collection("taskRequests"); - -chai.use(chaiHttp); - -const config = require("config"); -const { TASK_REQUEST_TYPE, TASK_REQUEST_STATUS, TASK_REQUEST_ACTIONS } = require("../../constants/taskRequests"); -const usersUtils = require("../../utils/users"); -const githubService = require("../../services/githubService"); -const { userState } = require("../../constants/userStatus"); - const cookieName = config.get("userToken.cookieName"); let jwt; @@ -43,6 +44,8 @@ const { userStatusDataForOooState: oooUserStatus, } = userStatusData; +chai.use(chaiHttp); + describe("Task Requests", function () { let userId, superUserId; @@ -55,7 +58,8 @@ describe("Task Requests", function () { }); beforeEach(async function () { - sinon.stub(authService, "generateAuthToken").callsFake(() => "valid_token"); + sinon.stub(verifyAuthToken).callsFake(() => ({ userId: superUserId })); + jwt = generateAuthToken({ userId: superUserId }); }); describe("GET / - gets tasks requests", function () { @@ -63,8 +67,8 @@ describe("Task Requests", function () { before(async function () { userId = await addUser(member); superUserId = await addUser(superUser); - sinon.stub(authService, "verifyAuthToken").callsFake(() => ({ userId: superUserId })); - jwt = authService.generateAuthToken({ userId: superUserId }); + sinon.stub(verifyAuthToken).callsFake(() => ({ userId: superUserId })); + jwt = generateAuthToken({ userId: superUserId }); taskId = (await tasksModel.updateTask(taskData[4])).taskId; await userStatusModel.updateUserStatus(userId, idleUserStatus); @@ -120,8 +124,8 @@ describe("Task Requests", function () { describe("When the user is not a super user", function () { before(async function () { userId = await addUser(member); - sinon.stub(authService, "verifyAuthToken").callsFake(() => ({ userId })); - jwt = authService.generateAuthToken({ userId }); + sinon.stub(verifyAuthToken).callsFake(() => ({ userId })); + jwt = generateAuthToken({ userId }); taskId = (await tasksModel.updateTask(taskData[4])).taskId; @@ -152,8 +156,8 @@ describe("Task Requests", function () { before(async function () { superUserId = await addUser(superUser); - sinon.stub(authService, "verifyAuthToken").callsFake(() => ({ userId: superUserId })); - jwt = authService.generateAuthToken({ userId: superUserId }); + sinon.stub(verifyAuthToken).callsFake(() => ({ userId: superUserId })); + jwt = generateAuthToken({ userId: superUserId }); taskId = (await tasksModel.updateTask(taskData[4])).taskId; taskRequestId = (await taskRequestsModel.addOrUpdate(taskId, userId)).id; @@ -216,10 +220,10 @@ describe("Task Requests", function () { before(async function () { userId = await addUser(member); - sinon.stub(authService, "verifyAuthToken").callsFake(() => ({ + sinon.stub(verifyAuthToken).callsFake(() => ({ userId, })); - jwt = authService.generateAuthToken({ + jwt = generateAuthToken({ userId, }); @@ -249,8 +253,8 @@ describe("Task Requests", function () { describe("When a new task requested is created", function () { before(async function () { userId = await addUser(member); - sinon.stub(authService, "verifyAuthToken").callsFake(() => ({ userId })); - jwt = authService.generateAuthToken({ userId }); + sinon.stub(verifyAuthToken).callsFake(() => ({ userId })); + jwt = generateAuthToken({ userId }); taskId = (await tasksModel.updateTask(taskData[4])).taskId; }); @@ -320,9 +324,9 @@ describe("Task Requests", function () { before(async function () { userId = await addUser(member); - sinon.stub(authService, "verifyAuthToken").callsFake(() => ({ userId })); + sinon.stub(verifyAuthToken).callsFake(() => ({ userId })); - jwt = authService.generateAuthToken({ userId }); + jwt = generateAuthToken({ userId }); await userStatusModel.updateUserStatus(userId, idleUserStatus); }); @@ -353,8 +357,8 @@ describe("Task Requests", function () { before(async function () { userId = await addUser(member); userId2 = await addUser(member2); - sinon.stub(authService, "verifyAuthToken").callsFake(() => ({ userId: userId2 })); - jwt = authService.generateAuthToken({ userId: userId2 }); + sinon.stub(verifyAuthToken).callsFake(() => ({ userId: userId2 })); + jwt = generateAuthToken({ userId: userId2 }); taskId = (await tasksModel.updateTask(taskData[4])).taskId; await userStatusModel.updateUserStatus(userId, idleUserStatus); @@ -407,8 +411,8 @@ describe("Task Requests", function () { before(async function () { userId = await addUser(member); sinon.stub(userStatusModel, "getUserStatus").callsFake(() => ({ userStatusExists: false })); - sinon.stub(authService, "verifyAuthToken").callsFake(() => ({ userId })); - jwt = authService.generateAuthToken({ userId }); + sinon.stub(verifyAuthToken).callsFake(() => ({ userId })); + jwt = generateAuthToken({ userId }); taskId = (await tasksModel.updateTask(taskData[4])).taskId; }); @@ -417,8 +421,8 @@ describe("Task Requests", function () { describe("When the user status is not idle", function () { before(async function () { userId = await addUser(member); - sinon.stub(authService, "verifyAuthToken").callsFake(() => ({ userId })); - jwt = authService.generateAuthToken({ userId }); + sinon.stub(verifyAuthToken).callsFake(() => ({ userId })); + jwt = generateAuthToken({ userId }); taskId = (await tasksModel.updateTask(taskData[4])).taskId; }); @@ -435,8 +439,8 @@ describe("Task Requests", function () { oooUserId = await addUser(member2); superUserId = await addUser(superUser); - jwt = authService.generateAuthToken({ userId: superUserId }); - sinon.stub(authService, "verifyAuthToken").callsFake(() => ({ userId: superUserId })); + jwt = generateAuthToken({ userId: superUserId }); + sinon.stub(verifyAuthToken).callsFake(() => ({ userId: superUserId })); taskId = (await tasksModel.updateTask(taskData[4])).taskId; @@ -606,8 +610,8 @@ describe("Task Requests", function () { userId = await addUser(member); superUserId = await addUser(superUser); - jwt = authService.generateAuthToken({ userId: superUserId }); - sinon.stub(authService, "verifyAuthToken").callsFake(() => ({ userId: superUserId })); + jwt = generateAuthToken({ userId: superUserId }); + sinon.stub(verifyAuthToken).callsFake(() => ({ userId: superUserId })); await userStatusModel.updateUserStatus(userId, idleUserStatus); taskId = (await tasksModel.updateTask(taskData[4])).taskId; }); @@ -651,8 +655,8 @@ describe("Task Requests", function () { describe("When the user is not super user", function () { before(async function () { userId = await addUser(member); - jwt = authService.generateAuthToken({ userId }); - sinon.stub(authService, "verifyAuthToken").callsFake(() => ({ userId })); + jwt = generateAuthToken({ userId }); + sinon.stub(verifyAuthToken).callsFake(() => ({ userId })); taskId = (await tasksModel.updateTask(taskData[4])).taskId; await userStatusModel.updateUserStatus(userId, idleUserStatus); @@ -696,8 +700,8 @@ describe("Task Requests", function () { activeUserId = await addUser(activeMember); oooUserId = await addUser(member2); superUserId = await addUser(superUser); - jwt = authService.generateAuthToken({ userId: superUserId }); - sinon.stub(authService, "verifyAuthToken").callsFake(() => ({ userId: superUserId })); + jwt = generateAuthToken({ userId: superUserId }); + sinon.stub(verifyAuthToken).callsFake(() => ({ userId: superUserId })); taskId = (await tasksModel.updateTask(taskData[4])).taskId; @@ -914,8 +918,8 @@ describe("Task Requests", function () { userId = await addUser(member); superUserId = await addUser(superUser); - jwt = authService.generateAuthToken({ userId: superUserId }); - sinon.stub(authService, "verifyAuthToken").callsFake(() => ({ userId: superUserId })); + jwt = generateAuthToken({ userId: superUserId }); + sinon.stub(verifyAuthToken).callsFake(() => ({ userId: superUserId })); await userStatusModel.updateUserStatus(userId, idleUserStatus); taskId = (await tasksModel.updateTask(taskData[4])).taskId; }); @@ -984,8 +988,8 @@ describe("Task Requests", function () { describe("When the user is not super user", function () { before(async function () { userId = await addUser(member); - jwt = authService.generateAuthToken({ userId }); - sinon.stub(authService, "verifyAuthToken").callsFake(() => ({ userId })); + jwt = generateAuthToken({ userId }); + sinon.stub(verifyAuthToken).callsFake(() => ({ userId })); taskId = (await tasksModel.updateTask(taskData[4])).taskId; await userStatusModel.updateUserStatus(userId, idleUserStatus); @@ -1028,8 +1032,8 @@ describe("Task Requests", function () { getUsernameStub = sinon.stub(usersUtils, "getUsername"); getUsernameStub.resolves("abc"); userId = await addUser({ ...member, id: "user123" }); - sinon.stub(authService, "verifyAuthToken").callsFake(() => ({ userId })); - jwt = authService.generateAuthToken({ userId }); + sinon.stub(verifyAuthToken).callsFake(() => ({ userId })); + jwt = generateAuthToken({ userId }); }); afterEach(async function () { @@ -1197,8 +1201,8 @@ describe("Task Requests", function () { beforeEach(async function () { superUserId = await addUser(superUser); - sinon.stub(authService, "verifyAuthToken").callsFake(() => ({ userId: superUserId })); - jwt = authService.generateAuthToken({ userId: superUserId }); + sinon.stub(verifyAuthToken).callsFake(() => ({ userId: superUserId })); + jwt = generateAuthToken({ userId: superUserId }); }); afterEach(async function () { diff --git a/test/integration/tasks.test.js b/test/integration/tasks.test.js index 5d61d48f7..56954daf2 100644 --- a/test/integration/tasks.test.js +++ b/test/integration/tasks.test.js @@ -1,37 +1,48 @@ -const chai = require("chai"); -const sinon = require("sinon"); -const { expect } = chai; -const chaiHttp = require("chai-http"); +import chai from "chai"; +import sinon from "sinon"; +import chaiHttp from "chai-http"; +import config from "config"; + +import firestore from "../../utils/firestore.js"; +import app from "../../server.js"; +import tasks from "../../models/tasks.js"; +import authService from "../../services/authService.js"; +import addUser from "../utils/addUser.js"; +import userModel from "../../models/users.js"; +import userStatusModel from "../../models/userStatus.js"; +import userData from "../fixtures/user/user.js"; +import tasksData from "../fixtures/tasks/tasks.js"; +import { DINERO, NEELAM } from "../../constants/wallets.js"; +import cleanDb from "../utils/cleanDb.js"; +import { TASK_STATUS, tasksUsersStatus } from "../../constants/tasks.js"; +import updateTaskStatus from "../fixtures/tasks/tasks1.js"; +import userStatusData from "../fixtures/userStatus/userStatus.js"; +import discordService from "../../services/discordService.js"; +import { CRON_JOB_HANDLER } from "../../constants/bot.js"; +import { logType } from "../../constants/logs.js"; +import { INTERNAL_SERVER_ERROR } from "../../constants/errorMessages.js"; +import tasksService from "../../services/tasks.js"; +import tags from "../../models/tags.js"; +import levels from "../../models/levels.js"; +import items from "../../models/items.js"; +import taskController from "../../controllers/tasks.js"; +import { createProgressDocument } from "../../models/progresses.js"; +import { stubbedModelTaskProgressData } from "../fixtures/progress/progresses.js"; +import { convertDaysToMilliseconds } from "../../utils/time.js"; +import { getDiscordMembers } from "../fixtures/discordResponse/discord-response.js"; +import { generateCronJobToken } from "../utils/generateBotToken.js"; +import { + usersData as abandonedUsersData, + tasksData as abandonedTasksData, +} from "../fixtures/abandoned-tasks/departed-users.js"; -const firestore = require("../../utils/firestore"); -const logsModel = firestore.collection("logs"); -const app = require("../../server"); -const tasks = require("../../models/tasks"); -const authService = require("../../services/authService"); -const addUser = require("../utils/addUser"); -const userModel = require("../../models/users"); -const userStatusModel = require("../../models/userStatus"); -const config = require("config"); +const { expect } = chai; const cookieName = config.get("userToken.cookieName"); -const userData = require("../fixtures/user/user")(); -const tasksData = require("../fixtures/tasks/tasks")(); -const { DINERO, NEELAM } = require("../../constants/wallets"); -const cleanDb = require("../utils/cleanDb"); -const { TASK_STATUS, tasksUsersStatus } = require("../../constants/tasks"); -const updateTaskStatus = require("../fixtures/tasks/tasks1")(); -const userStatusData = require("../fixtures/userStatus/userStatus"); +const logsModel = firestore.collection("logs"); const tasksModel = firestore.collection("tasks"); const userDBModel = firestore.collection("users"); -const discordService = require("../../services/discordService"); -const { CRON_JOB_HANDLER } = require("../../constants/bot"); -const { logType } = require("../../constants/logs"); -const { INTERNAL_SERVER_ERROR } = require("../../constants/errorMessages"); -const tasksService = require("../../services/tasks"); + chai.use(chaiHttp); -const tags = require("../../models/tags"); -const levels = require("../../models/levels"); -const items = require("../../models/items"); -const taskController = require("../../controllers/tasks"); const appOwner = userData[3]; const superUser = userData[4]; @@ -39,15 +50,6 @@ const genZUser = userData[20]; const testUser = userData[2]; let jwt, superUserJwt; -const { createProgressDocument } = require("../../models/progresses"); -const { stubbedModelTaskProgressData } = require("../fixtures/progress/progresses"); -const { convertDaysToMilliseconds } = require("../../utils/time"); -const { getDiscordMembers } = require("../fixtures/discordResponse/discord-response"); -const { generateCronJobToken } = require("../utils/generateBotToken"); -const { - usersData: abandonedUsersData, - tasksData: abandonedTasksData, -} = require("../fixtures/abandoned-tasks/departed-users"); const taskData = [ { diff --git a/test/integration/trading.test.ts b/test/integration/trading.test.ts index 44ee36274..fc52b691d 100644 --- a/test/integration/trading.test.ts +++ b/test/integration/trading.test.ts @@ -1,15 +1,15 @@ import chai from "chai"; import chaiHttp from "chai-http"; -import app from "../../server"; -import authService from "../../services/authService"; -import addUser from "../utils/addUser"; -import cleanDb from "../utils/cleanDb"; -import stocks from "../../models/stocks"; -import wallet from "../../models/wallets"; +import app from "../../server.js"; +import { generateAuthToken } from "../../services/authService.js"; +import addUser from "../utils/addUser.js"; +import cleanDb from "../utils/cleanDb.js"; +import * as stocksModel from "../../models/stocks.js"; +import * as walletModel from "../../models/wallets.js"; import sinon from "sinon"; import config from "config"; -import currencies from "../fixtures/currencies/currencies"; -import tradeService from "../../services/tradingService"; +import currencies from "../fixtures/currencies/currencies.js"; +import * as tradeService from "../../services/tradingService.js"; const cookieName: string = config.get("userToken.cookieName"); chai.use(chaiHttp); @@ -25,9 +25,9 @@ describe("POST /trade/stock/new/:userId", function () { beforeEach(async function () { userId = await addUser(); - jwt = authService.generateAuthToken({ userId }); - ({ id, stockData } = await stocks.addStock(newStockData)); - await wallet.createWallet(userId, currencies.default); + jwt = generateAuthToken({ userId }); + ({ id, stockData } = await stocksModel.addStock(newStockData)); + await walletModel.createWallet(userId, currencies.default); userStock = { stockId: id, stockName: stockData.name, diff --git a/test/integration/userStatus.test.js b/test/integration/userStatus.test.js index 972c3e2ef..2f4395a64 100644 --- a/test/integration/userStatus.test.js +++ b/test/integration/userStatus.test.js @@ -1,29 +1,28 @@ -const chai = require("chai"); -const { expect } = chai; -const chaiHttp = require("chai-http"); -const sinon = require("sinon"); - -const firestore = require("../../utils/firestore"); -const app = require("../../server"); -const authService = require("../../services/authService"); -const addUser = require("../utils/addUser"); -const cleanDb = require("../utils/cleanDb"); +import chai from "chai"; +import chaiHttp from "chai-http"; +import sinon from "sinon"; + +import firestore from "../../utils/firestore.js"; +import app from "../../server.js"; +import authService from "../../services/authService.js"; +import addUser from "../utils/addUser.js"; +import cleanDb from "../utils/cleanDb.js"; // Import fixtures -const userData = require("../fixtures/user/user")(); -const superUser = userData[4]; -const { +import userData from "../fixtures/user/user.js"; +import { userStatusDataForNewUser, userStatusDataForOooState, oooStatusDataForShortDuration, generateUserStatusData, -} = require("../fixtures/userStatus/userStatus"); +} from "../fixtures/userStatus/userStatus.js"; +import config from "config"; +import userStatusModel, { updateUserStatus } from "../../models/userStatus.js"; +import { userState } from "../../constants/userStatus.js"; +import { convertTimestampToUTCStartOrEndOfDay } from "../../utils/time.js"; -const config = require("config"); -const { updateUserStatus } = require("../../models/userStatus"); -const { userState } = require("../../constants/userStatus"); +const { expect } = chai; +const superUser = userData[4]; const cookieName = config.get("userToken.cookieName"); -const userStatusModel = require("../../models/userStatus"); -const { convertTimestampToUTCStartOrEndOfDay } = require("../../utils/time"); chai.use(chaiHttp); diff --git a/test/integration/users.test.js b/test/integration/users.test.js index 28749bad0..3e74ae577 100644 --- a/test/integration/users.test.js +++ b/test/integration/users.test.js @@ -1,53 +1,57 @@ -const chai = require("chai"); -const { expect } = chai; -const chaiHttp = require("chai-http"); - -const firestore = require("../../utils/firestore"); -const app = require("../../server"); -const authService = require("../../services/authService"); -const addUser = require("../utils/addUser"); -const profileDiffs = require("../../models/profileDiffs"); -const cleanDb = require("../utils/cleanDb"); -// Import fixtures -const userData = require("../fixtures/user/user")(); -const tasksData = require("../fixtures/tasks/tasks")(); -const profileDiffData = require("../fixtures/profileDiffs/profileDiffs")(); -const superUser = userData[4]; -const searchParamValues = require("../fixtures/user/search")(); - -const config = require("config"); -const discordDeveloperRoleId = config.get("discordDeveloperRoleId"); -const { getDiscordMembers } = require("../fixtures/discordResponse/discord-response"); -const joinData = require("../fixtures/user/join"); -const { - userStatusDataForNewUser, - userStatusDataAfterSignup, +import chai, { expect } from "chai"; +import chaiHttp from "chai-http"; +import config from "config"; +import Sinon from "sinon"; + +import { INTERNAL_SERVER_ERROR, SOMETHING_WENT_WRONG } from "../../constants/errorMessages.js"; +import { TASK_STATUS } from "../../constants/tasks.js"; +import { MAX_USERNAME_LENGTH } from "../../constants/users.js"; +import profileDiffs from "../../models/profileDiffs.js"; +import { addJoinData, addOrUpdate } from "../../models/users.js"; +import userStatusModel from "../../models/userStatus.js"; +import app from "../../server.js"; +import authService from "../../services/authService.js"; +import userService from "../../services/userService.js"; +import firestore from "../../utils/firestore.js"; +import { getDiscordMembers } from "../fixtures/discordResponse/discord-response.js"; +import profileDiffData from "../fixtures/profileDiffs/profileDiffs.js"; +import { abandonedTasksData } from "../fixtures/tasks/abandoned-tasks.js"; +import tasksData from "../fixtures/tasks/tasks.js"; +import { abandonedUsersData } from "../fixtures/user/abandoned-users.js"; +import joinData from "../fixtures/user/join.js"; +import { userPhotoVerificationData } from "../fixtures/user/photo-verification.js"; +import searchParamValues from "../fixtures/user/search.js"; +import userData from "../fixtures/user/user.js"; +import { userStatusDataAfterFillingJoinSection, -} = require("../fixtures/userStatus/userStatus"); -const { addJoinData, addOrUpdate } = require("../../models/users"); -const userStatusModel = require("../../models/userStatus"); -const { MAX_USERNAME_LENGTH } = require("../../constants/users.ts"); -const { TASK_STATUS } = require("../../constants/tasks"); -const userRoleUpdate = userData[4]; -const userRoleUnArchived = userData[13]; -const userAlreadyMember = userData[0]; -const userAlreadyNotMember = userData[13]; -const userAlreadyArchived = userData[5]; -const userAlreadyUnArchived = userData[4]; -const nonSuperUser = userData[0]; -const newUser = userData[18]; + userStatusDataAfterSignup, + userStatusDataForNewUser, +} from "../fixtures/userStatus/userStatus.js"; +import addUser from "../utils/addUser.js"; +import cleanDb from "../utils/cleanDb.js"; + +// Initialize fixtures +const userDataArray = userData(); +const tasksDataArray = tasksData(); +const searchParamValuesArray = searchParamValues(); + +const superUser = userDataArray[4]; +const userRoleUpdate = userDataArray[4]; +const userRoleUnArchived = userDataArray[13]; +const userAlreadyMember = userDataArray[0]; +const userAlreadyNotMember = userDataArray[13]; +const userAlreadyArchived = userDataArray[5]; +const userAlreadyUnArchived = userDataArray[4]; +const nonSuperUser = userDataArray[0]; +const newUser = userDataArray[18]; + +const discordDeveloperRoleId = config.get("discordDeveloperRoleId"); const cookieName = config.get("userToken.cookieName"); -const { userPhotoVerificationData } = require("../fixtures/user/photo-verification"); -const Sinon = require("sinon"); -const { INTERNAL_SERVER_ERROR, SOMETHING_WENT_WRONG } = require("../../constants/errorMessages"); + const photoVerificationModel = firestore.collection("photo-verification"); const userModel = firestore.collection("users"); const taskModel = firestore.collection("tasks"); -const { - usersData: abandonedUsersData, - tasksData: abandonedTasksData, -} = require("../fixtures/abandoned-tasks/departed-users"); -const userService = require("../../services/users"); + chai.use(chaiHttp); describe("Users", function () { @@ -110,10 +114,10 @@ describe("Users", function () { }); it("Should return verified and blocked users", async function () { - await addOrUpdate(userData[0]); - await addOrUpdate(userData[1]); - await addOrUpdate(userData[2]); - await addOrUpdate(userData[3]); + await addOrUpdate(userDataArray[0]); + await addOrUpdate(userDataArray[1]); + await addOrUpdate(userDataArray[2]); + await addOrUpdate(userDataArray[3]); const res = await chai .request(app) @@ -500,15 +504,19 @@ describe("Users", function () { let userWithOverdueApprovedTask; beforeEach(async function () { - const { userId } = await addOrUpdate(userData[0]); + const { userId } = await addOrUpdate(userDataArray[0]); await userStatusModel.updateUserStatus(userId, userStatusDataForNewUser); - await addOrUpdate(userData[1]); - await addOrUpdate(userData[2]); - await addOrUpdate(userData[3]); + await addOrUpdate(userDataArray[1]); + await addOrUpdate(userDataArray[2]); + await addOrUpdate(userDataArray[3]); - const assigneeData = { ...userData[6], discordId: getDiscordMembers[0].user.id }; + const assigneeData = { ...userDataArray[6], discordId: getDiscordMembers[0].user.id }; userWithOverdueApprovedTask = await addUser(assigneeData); - await taskModel.add({ ...tasksData[0], assignee: userWithOverdueApprovedTask, status: TASK_STATUS.APPROVED }); + await taskModel.add({ + ...tasksDataArray[0], + assignee: userWithOverdueApprovedTask, + status: TASK_STATUS.APPROVED, + }); }); afterEach(async function () { @@ -860,7 +868,7 @@ describe("Users", function () { }); it("Should return one user with given discord id and feature flag", async function () { - const discordId = userData[0].discordId; + const discordId = userDataArray[0].discordId; const res = await chai.request(app).get(`/users?dev=true&discordId=${discordId}`); expect(res).to.have.status(200); @@ -869,7 +877,7 @@ describe("Users", function () { }); it("Should throw an error when there is no feature flag", async function () { - const discordId = userData[0].discordId; + const discordId = userDataArray[0].discordId; const res = await chai.request(app).get(`/users?discordId=${discordId}`).set("cookie", `${cookieName}=${jwt}`); expect(res).to.have.status(404); expect(res.body).to.be.a("object"); @@ -1027,7 +1035,7 @@ describe("Users", function () { it("Should return one user with given id", function (done) { chai .request(app) - .get(`/users/${userData[0].username}`) + .get(`/users/${userDataArray[0].username}`) .set("cookie", `${cookieName}=${jwt}`) .end((err, res) => { if (err) { @@ -1126,7 +1134,7 @@ describe("Users", function () { it("Should return isUsernameAvailable as false as we are passing existing user", function (done) { chai .request(app) - .get(`/users/isUsernameAvailable/${userData[0].username}`) + .get(`/users/isUsernameAvailable/${userDataArray[0].username}`) .set("cookie", `${cookieName}=${jwt}`) .end((err, res) => { if (err) { @@ -1146,7 +1154,7 @@ describe("Users", function () { const lastname = "sigdar"; it("Should return unique username when passing firstname and lastname", function (done) { - addUser(userData[15]).then((availableUsernameUserId) => { + addUser(userDataArray[15]).then((availableUsernameUserId) => { const userJwt = authService.generateAuthToken({ userId: availableUsernameUserId }); chai .request(app) @@ -1293,7 +1301,7 @@ describe("Users", function () { }); it("Should return given user by id", async function () { - const { userId } = await addOrUpdate(userData[0]); + const { userId } = await addOrUpdate(userDataArray[0]); const res = await chai.request(app).get(`/users/?id=${userId}`); expect(res).to.have.status(200); expect(res.body).to.be.a("object"); @@ -1331,8 +1339,8 @@ describe("Users", function () { describe("GET /users?search", function () { beforeEach(async function () { - await addOrUpdate(userData[0]); - await addOrUpdate(userData[7]); + await addOrUpdate(userDataArray[0]); + await addOrUpdate(userDataArray[7]); }); afterEach(async function () { @@ -1343,7 +1351,7 @@ describe("Users", function () { chai .request(app) .get("/users") - .query({ search: searchParamValues.an }) + .query({ search: searchParamValuesArray.an }) .set("cookie", `${cookieName}=${jwt}`) .end((err, res) => { if (err) { @@ -1362,7 +1370,7 @@ describe("Users", function () { chai .request(app) .get("/users") - .query({ search: searchParamValues.AN }) + .query({ search: searchParamValuesArray.AN }) .set("cookie", `${cookieName}=${jwt}`) .end((err, res) => { if (err) { @@ -1373,7 +1381,7 @@ describe("Users", function () { expect(res.body.message).to.equal("Users returned successfully!"); expect(res.body.users).to.be.a("array"); res.body.users.forEach((user) => { - expect(user.username.slice(0, 2)).to.equal(searchParamValues.AN.toLowerCase()); + expect(user.username.slice(0, 2)).to.equal(searchParamValuesArray.AN.toLowerCase()); }); return done(); }); @@ -1383,7 +1391,7 @@ describe("Users", function () { chai .request(app) .get("/users") - .query({ search: searchParamValues.null }) + .query({ search: searchParamValuesArray.null }) .set("cookie", `${cookieName}=${jwt}`) .end((err, res) => { if (err) { @@ -1399,7 +1407,7 @@ describe("Users", function () { chai .request(app) .get("/users") - .query({ search: searchParamValues.number23 }) + .query({ search: searchParamValuesArray.number23 }) .set("cookie", `${cookieName}=${jwt}`) .end((err, res) => { if (err) { @@ -1410,7 +1418,7 @@ describe("Users", function () { expect(res.body.message).to.equal("Users returned successfully!"); expect(res.body.users).to.be.a("array"); res.body.users.forEach((user) => { - expect(user.username.slice(0, 2)).to.equal(`${searchParamValues.number23}`); + expect(user.username.slice(0, 2)).to.equal(`${searchParamValuesArray.number23}`); }); return done(); }); @@ -1456,7 +1464,7 @@ describe("Users", function () { chai .request(app) .get("/users") - .query({ search: searchParamValues.mu }) + .query({ search: searchParamValuesArray.mu }) .set("cookie", `${cookieName}=${jwt}`) .end((err, res) => { if (err) { @@ -2733,9 +2741,9 @@ describe("Users", function () { archived: false, in_discord: false, }; - userId1 = await addUser({ ...userData[0], roles: rolesToBeAdded }); - userId2 = await addUser({ ...userData[1], roles: rolesToBeAdded }); - userId3 = await addUser({ ...userData[2], roles: rolesToBeAdded }); + userId1 = await addUser({ ...userDataArray[0], roles: rolesToBeAdded }); + userId2 = await addUser({ ...userDataArray[1], roles: rolesToBeAdded }); + userId3 = await addUser({ ...userDataArray[2], roles: rolesToBeAdded }); }); afterEach(async function () { @@ -2789,9 +2797,9 @@ describe("Users", function () { archived: true, in_discord: false, }; - await addOrUpdate({ ...userData[0], roles }, userId1); - await addOrUpdate({ ...userData[1], roles }, userId2); - await addOrUpdate({ ...userData[2], roles }, userId3); + await addOrUpdate({ ...userDataArray[0], roles }, userId1); + await addOrUpdate({ ...userDataArray[1], roles }, userId2); + await addOrUpdate({ ...userDataArray[2], roles }, userId3); const res = await chai .request(app) @@ -2863,7 +2871,7 @@ describe("Users", function () { describe("PATCH /:userId/update-nickname", function () { beforeEach(async function () { fetchStub = Sinon.stub(global, "fetch"); - userId = await addUser(userData[0]); + userId = await addUser(userDataArray[0]); }); afterEach(async function () { @@ -2896,8 +2904,8 @@ describe("Users", function () { describe("test discord actions of nickname for unverified user", function () { beforeEach(async function () { fetchStub = Sinon.stub(global, "fetch"); - const superUser = userData[4]; - userId = await addUser(userData[2]); + const superUser = userDataArray[4]; + userId = await addUser(userDataArray[2]); superUserId = await addUser(superUser); superUserAuthToken = authService.generateAuthToken({ userId: superUserId }); }); diff --git a/test/integration/usersFilter.test.js b/test/integration/usersFilter.test.js index 32e80f5c2..136d670b3 100644 --- a/test/integration/usersFilter.test.js +++ b/test/integration/usersFilter.test.js @@ -1,23 +1,22 @@ -const chai = require("chai"); -const { expect } = chai; -const chaiHttp = require("chai-http"); +import chai from "chai"; +import chaiHttp from "chai-http"; -const app = require("../../server"); -const authService = require("../../services/authService"); -const addUser = require("../utils/addUser"); -const cleanDb = require("../utils/cleanDb"); +import app from "../../server.js"; +import authService from "../../services/authService.js"; +import addUser from "../utils/addUser.js"; +import cleanDb from "../utils/cleanDb.js"; // Import fixtures -const userData = require("../fixtures/user/user")(); -const { generateUserStatusData } = require("../fixtures/userStatus/userStatus"); - -const config = require("config"); -const { updateUserStatus } = require("../../models/userStatus"); -const { addTag } = require("../../models/tags"); -const { addLevel } = require("../../models/levels"); -const { addTagsToItem } = require("../../models/items"); -const { assertUserIds } = require("../utils/user"); -const { userState } = require("../../constants/userStatus"); +import userData from "../fixtures/user/user.js"; +import { generateUserStatusData } from "../fixtures/userStatus/userStatus.js"; +import config from "config"; +import { updateUserStatus } from "../../models/userStatus.js"; +import { addTag } from "../../models/tags.js"; +import { addLevel } from "../../models/levels.js"; +import { addTagsToItem } from "../../models/items.js"; +import { assertUserIds } from "../utils/user.js"; +import { userState } from "../../constants/userStatus.js"; +const { expect } = chai; const cookieName = config.get("userToken.cookieName"); chai.use(chaiHttp); diff --git a/test/integration/wallet.test.js b/test/integration/wallet.test.js index be03561ef..c7d3191aa 100644 --- a/test/integration/wallet.test.js +++ b/test/integration/wallet.test.js @@ -1,22 +1,20 @@ -const chai = require("chai"); -const { expect } = chai; -const chaiHttp = require("chai-http"); - -const app = require("../../server"); -const authService = require("../../services/authService"); - -const addUser = require("../utils/addUser"); -const cleanDb = require("../utils/cleanDb"); -const usersUtils = require("../../utils/users"); - -const userData = require("../fixtures/user/user")(); -const { walletBodyKeys, walletKeys, walletDataKeys } = require("../fixtures/wallet/wallet"); +import chai from "chai"; +import chaiHttp from "chai-http"; + +import app from "../../server.js"; +import authService from "../../services/authService.js"; +import addUser from "../utils/addUser.js"; +import cleanDb from "../utils/cleanDb.js"; +import usersUtils from "../../utils/users.js"; +import userData from "../fixtures/user/user.js"; +import { walletBodyKeys, walletKeys, walletDataKeys } from "../fixtures/wallet/wallet.js"; +import config from "config"; +const { expect } = chai; const defaultUser = userData[0]; const newUser = userData[3]; const superUser = userData[4]; -const config = require("config"); const cookieName = config.get("userToken.cookieName"); chai.use(chaiHttp); diff --git a/test/unit/middlewares/arts-validator.test.js b/test/unit/middlewares/arts-validator.test.js index 77ee785d9..7d2198b84 100644 --- a/test/unit/middlewares/arts-validator.test.js +++ b/test/unit/middlewares/arts-validator.test.js @@ -1,6 +1,7 @@ -const Sinon = require("sinon"); -const { createArt } = require("../../../middlewares/validators/arts"); -const { expect } = require("chai"); +import { expect } from "chai"; +import sinon from "sinon"; + +import { createArt } from "../../../middlewares/validators/arts.js"; describe("Test the arts validator", function () { it("Allows the request to pass", async function () { @@ -12,7 +13,7 @@ describe("Test the arts validator", function () { }, }; const res = {}; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); await createArt(req, res, nextSpy); expect(nextSpy.callCount).to.be.equal(1); }); @@ -28,7 +29,7 @@ describe("Test the arts validator", function () { badRequest: () => {}, }, }; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); await createArt(req, res, nextSpy); expect(nextSpy.callCount).to.be.equal(0); }); diff --git a/test/unit/middlewares/auctions-validator.test.js b/test/unit/middlewares/auctions-validator.test.js index 63fed1b54..efeffc87b 100644 --- a/test/unit/middlewares/auctions-validator.test.js +++ b/test/unit/middlewares/auctions-validator.test.js @@ -1,6 +1,7 @@ -const Sinon = require("sinon"); -const { createAuction, placeBid } = require("../../../middlewares/validators/auctions"); -const { expect } = require("chai"); +import { expect } from "chai"; +import sinon from "sinon"; + +import { createAuction, placeBid } from "../../../middlewares/validators/auctions.js"; describe("auctions validator", function () { describe("create auctions validator", function () { @@ -14,7 +15,7 @@ describe("auctions validator", function () { }, }; const res = {}; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); await createAuction(req, res, nextSpy); expect(nextSpy.calledOnce).to.be.equal(true); }); @@ -30,7 +31,7 @@ describe("auctions validator", function () { badRequest: () => {}, }, }; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); await createAuction(req, res, nextSpy).catch((err) => { expect(err).to.be.an.instanceOf(Error); }); @@ -46,7 +47,7 @@ describe("auctions validator", function () { }, }; const res = {}; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); await placeBid(req, res, nextSpy); expect(nextSpy.calledOnce).to.be.equal(true); }); @@ -62,7 +63,7 @@ describe("auctions validator", function () { badRequest: () => {}, }, }; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); await placeBid(req, res, nextSpy).catch((err) => { expect(err).to.be.an.instanceOf(Error); expect(nextSpy.callCount).to.be.equal(0); diff --git a/test/unit/middlewares/authenticate.test.js b/test/unit/middlewares/authenticate.test.js index acb011a07..fa1ad8a79 100644 --- a/test/unit/middlewares/authenticate.test.js +++ b/test/unit/middlewares/authenticate.test.js @@ -1,9 +1,10 @@ -const Sinon = require("sinon"); -const { expect } = require("chai"); -const authMiddleware = require("../../../middlewares/authenticate"); -const authService = require("../../../services/authService"); -const dataAccess = require("../../../services/dataAccessLayer"); -const config = require("config"); +import { expect } from "chai"; +import sinon from "sinon"; + +import config from "config"; +import authService from "../../../services/authService.js"; +import dataAccess from "../../../services/dataAccessLayer.js"; +import authMiddleware from "../../../middlewares/authenticate.js"; describe("Authentication Middleware", function () { let req, res, nextSpy; @@ -16,24 +17,24 @@ describe("Authentication Middleware", function () { headers: {}, }; res = { - cookie: Sinon.spy(), + cookie: sinon.spy(), boom: { - unauthorized: Sinon.spy(), - forbidden: Sinon.spy(), + unauthorized: sinon.spy(), + forbidden: sinon.spy(), }, }; - nextSpy = Sinon.spy(); + nextSpy = sinon.spy(); }); afterEach(function () { - Sinon.restore(); + sinon.restore(); }); describe("Token Verification", function () { it("should allow unrestricted user with valid token", async function () { const user = { id: "user123", roles: { restricted: false } }; - const verifyAuthTokenStub = Sinon.stub(authService, "verifyAuthToken").returns({ userId: user.id }); - const retrieveUsersStub = Sinon.stub(dataAccess, "retrieveUsers").resolves({ user }); + const verifyAuthTokenStub = sinon.stub(authService, "verifyAuthToken").returns({ userId: user.id }); + const retrieveUsersStub = sinon.stub(dataAccess, "retrieveUsers").resolves({ user }); await authMiddleware(req, res, nextSpy); @@ -53,8 +54,8 @@ describe("Authentication Middleware", function () { it("should deny restricted user access for non-GET requests", async function () { req.method = "POST"; const user = { id: "user123", roles: { restricted: true } }; - const verifyAuthTokenStub = Sinon.stub(authService, "verifyAuthToken").returns({ userId: user.id }); - const retrieveUsersStub = Sinon.stub(dataAccess, "retrieveUsers").resolves({ user }); + const verifyAuthTokenStub = sinon.stub(authService, "verifyAuthToken").returns({ userId: user.id }); + const retrieveUsersStub = sinon.stub(dataAccess, "retrieveUsers").resolves({ user }); await authMiddleware(req, res, nextSpy); @@ -73,7 +74,7 @@ describe("Authentication Middleware", function () { it("should deny access with invalid token", async function () { req.cookies[config.get("userToken.cookieName")] = "invalidToken"; - const verifyAuthTokenStub = Sinon.stub(authService, "verifyAuthToken").throws(new Error("Invalid token")); + const verifyAuthTokenStub = sinon.stub(authService, "verifyAuthToken").throws(new Error("Invalid token")); await authMiddleware(req, res, nextSpy); @@ -100,7 +101,7 @@ describe("Authentication Middleware", function () { }); it("should handle unexpected errors gracefully", async function () { - const verifyAuthTokenStub = Sinon.stub(authService, "verifyAuthToken").throws(new Error("Unexpected error")); + const verifyAuthTokenStub = sinon.stub(authService, "verifyAuthToken").throws(new Error("Unexpected error")); await authMiddleware(req, res, nextSpy); diff --git a/test/unit/middlewares/authenticateProfile.test.js b/test/unit/middlewares/authenticateProfile.test.js index 6029409f1..f0e3da5a4 100644 --- a/test/unit/middlewares/authenticateProfile.test.js +++ b/test/unit/middlewares/authenticateProfile.test.js @@ -1,7 +1,7 @@ -const chai = require("chai"); -const sinon = require("sinon"); -const { expect } = chai; -const authenticateProfile = require("../../../middlewares/authenticateProfile.js"); +import { expect } from "chai"; +import sinon from "sinon"; + +import authenticateProfile from "../../../middlewares/authenticateProfile.js"; describe("authenticateProfile Middleware", function () { let req, res, next, authenticateStub, auth; diff --git a/test/unit/middlewares/authorization.test.js b/test/unit/middlewares/authorization.test.js index 2d73592d6..b2db4c2f0 100644 --- a/test/unit/middlewares/authorization.test.js +++ b/test/unit/middlewares/authorization.test.js @@ -1,5 +1,5 @@ -const { expect } = require("chai"); -const { userHasPermission } = require("../../../middlewares/authorization"); +import { expect } from "chai"; +import { userHasPermission } from "../../../middlewares/authorization.js"; describe("userHasPermission", function () { it("user has default role and no required role is provided", function (done) { diff --git a/test/unit/middlewares/authorizeBot.test.js b/test/unit/middlewares/authorizeBot.test.js index f986d5d4b..1eb4bf616 100644 --- a/test/unit/middlewares/authorizeBot.test.js +++ b/test/unit/middlewares/authorizeBot.test.js @@ -1,8 +1,9 @@ -const authorizeBot = require("../../../middlewares/authorizeBot"); -const sinon = require("sinon"); -const expect = require("chai").expect; -const bot = require("../../utils/generateBotToken"); -const { BAD_TOKEN, CLOUDFLARE_WORKER, CRON_JOB_HANDLER } = require("../../../constants/bot"); +import { expect } from "chai"; +import sinon from "sinon"; + +import authorizeBot from "../../../middlewares/authorizeBot.js"; +import { BAD_TOKEN, CLOUDFLARE_WORKER, CRON_JOB_HANDLER } from "../../../constants/bot.js"; +import bot from "../../utils/generateBotToken.js"; describe("Middleware | Authorize Bot", function () { describe("Check authorization of bot", function (done) { diff --git a/test/unit/middlewares/cache.test.js b/test/unit/middlewares/cache.test.js index 9842908b0..b7a0bdb48 100644 --- a/test/unit/middlewares/cache.test.js +++ b/test/unit/middlewares/cache.test.js @@ -1,8 +1,8 @@ -const sinon = require("sinon"); -const { expect } = require("chai"); -const { cacheResponse, invalidateCache } = require("../../../utils/cache"); +import { expect } from "chai"; +import sinon from "sinon"; -const { dummyResponse } = require("../../fixtures/cache/cache"); +import { cacheResponse, invalidateCache } from "../../../utils/cache.js"; +import { dummyResponse } from "../../fixtures/cache/cache.js"; const responseBody = JSON.stringify(dummyResponse); diff --git a/test/unit/middlewares/challenges-validator.test.js b/test/unit/middlewares/challenges-validator.test.js index 9300fd52c..a521561df 100644 --- a/test/unit/middlewares/challenges-validator.test.js +++ b/test/unit/middlewares/challenges-validator.test.js @@ -1,6 +1,7 @@ -const Sinon = require("sinon"); -const { createChallenge } = require("../../../middlewares/validators/challenges"); -const { expect } = require("chai"); +import { expect } from "chai"; +import sinon from "sinon"; + +import { createChallenge } from "../../../middlewares/validators/challenges.js"; describe("Middleware | Validators | Challenges", function () { describe("create challenge validator", function () { @@ -14,7 +15,7 @@ describe("Middleware | Validators | Challenges", function () { }, }; const res = {}; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); await createChallenge(req, res, nextSpy); expect(nextSpy.calledOnce).to.be.equal(true); }); @@ -30,7 +31,7 @@ describe("Middleware | Validators | Challenges", function () { badRequest: () => {}, }, }; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); await createChallenge(req, res, nextSpy).catch((err) => { expect(err).to.be.an.instanceOf(Error); }); diff --git a/test/unit/middlewares/contentTypeCheck.test.js b/test/unit/middlewares/contentTypeCheck.test.js index fc87aff25..c5778bfe1 100644 --- a/test/unit/middlewares/contentTypeCheck.test.js +++ b/test/unit/middlewares/contentTypeCheck.test.js @@ -1,15 +1,13 @@ -const chai = require("chai"); -const { expect } = chai; -const chaiHttp = require("chai-http"); -const { getDiscordMembers } = require("../../fixtures/discordResponse/discord-response"); -const sinon = require("sinon"); +import chai, { expect } from "chai"; +import chaiHttp from "chai-http"; +import sinon from "sinon"; -const app = require("../../../server"); -const authService = require("../../../services/authService"); -const addUser = require("../../utils/addUser"); -const cleanDb = require("../../utils/cleanDb"); -const config = require("config"); -const cookieName = config.get("userToken.cookieName"); +import cookieName from "config"; +import app from "../../../server.js"; +import authService from "../../../services/authService.js"; +import { getDiscordMembers } from "../../fixtures/discordResponse/discord-response.js"; +import addUser from "../../utils/addUser.js"; +import cleanDb from "../../utils/cleanDb.js"; chai.use(chaiHttp); diff --git a/test/unit/middlewares/data-access-layer.test.js b/test/unit/middlewares/data-access-layer.test.js index bc3875f99..bc2d46706 100644 --- a/test/unit/middlewares/data-access-layer.test.js +++ b/test/unit/middlewares/data-access-layer.test.js @@ -1,7 +1,7 @@ -const { expect } = require("chai"); -const sinon = require("sinon"); -const { dataAccessMiddleware } = require("../../../utils/data-access"); -const { SUPERUSER } = require("../../../constants/roles"); +import { expect } from "chai"; +import sinon from "sinon"; +import { dataAccessMiddleware } from "../../../utils/data-access.js"; +import { SUPERUSER } from "../../../constants/roles.js"; describe("dataAccessMiddleware", function () { it("should remove sensitive fields from the response body based if the user does not have access", function () { diff --git a/test/unit/middlewares/devFlag.test.js b/test/unit/middlewares/devFlag.test.js index bd692ec1b..7638cf020 100644 --- a/test/unit/middlewares/devFlag.test.js +++ b/test/unit/middlewares/devFlag.test.js @@ -1,6 +1,7 @@ -const { expect } = require("chai"); -const { devFlagMiddleware } = require("../../../middlewares/devFlag"); -const sinon = require("sinon"); +import { expect } from "chai"; +import sinon from "sinon"; + +import { devFlagMiddleware } from "../../../middlewares/devFlag.js"; describe("devFlagMiddleware", function () { let req; diff --git a/test/unit/middlewares/discordactions-validators.test.js b/test/unit/middlewares/discordactions-validators.test.js index de2bed343..ca592e3cd 100644 --- a/test/unit/middlewares/discordactions-validators.test.js +++ b/test/unit/middlewares/discordactions-validators.test.js @@ -1,11 +1,12 @@ -const Sinon = require("sinon"); -const { +import { expect } from "chai"; +import sinon from "sinon"; + +import { validateGroupRoleBody, validateMemberRoleBody, validateUpdateUsersNicknameStatusBody, validateLazyLoadingParams, -} = require("../../../middlewares/validators/discordactions"); -const { expect } = require("chai"); +} from "../../../middlewares/validators/discordactions.js"; describe("Middleware | Validators | discord actions", function () { describe("validateGroupRoleBody", function () { @@ -16,7 +17,7 @@ describe("Middleware | Validators | discord actions", function () { rolename: "test", }, }; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); await validateGroupRoleBody(req, res, nextSpy); expect(nextSpy.calledOnce).to.be.equal(true); }); @@ -27,7 +28,7 @@ describe("Middleware | Validators | discord actions", function () { badRequest: () => {}, }, }; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); const req = { body: {}, }; @@ -46,7 +47,7 @@ describe("Middleware | Validators | discord actions", function () { roleid: "12345654325544565", }, }; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); const res = {}; await validateMemberRoleBody(req, res, nextSpy); expect(nextSpy.calledOnce).to.be.equal(true); @@ -58,7 +59,7 @@ describe("Middleware | Validators | discord actions", function () { badRequest: () => {}, }, }; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); const req = { body: {}, }; @@ -76,7 +77,7 @@ describe("Middleware | Validators | discord actions", function () { lastNicknameUpdate: String(Date.now()), }, }; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); const res = {}; await validateUpdateUsersNicknameStatusBody(req, res, nextSpy); expect(nextSpy.calledOnce).to.be.equal(true); @@ -88,7 +89,7 @@ describe("Middleware | Validators | discord actions", function () { lastNicknameUpdate: Date.now(), }, }; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); const res = {}; await validateUpdateUsersNicknameStatusBody(req, res, nextSpy); expect(nextSpy.calledOnce).to.be.equal(true); @@ -100,7 +101,7 @@ describe("Middleware | Validators | discord actions", function () { badRequest: () => {}, }, }; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); const req = { body: {}, }; @@ -120,7 +121,7 @@ describe("Middleware | Validators | discord actions", function () { dev: "true", }, }; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); const res = {}; await validateLazyLoadingParams(req, res, nextSpy); expect(nextSpy.calledOnce).to.be.equal(true); @@ -129,7 +130,7 @@ describe("Middleware | Validators | discord actions", function () { it("should return a bad request error when size is out of range", async function () { const res = { boom: { - badRequest: Sinon.spy(), + badRequest: sinon.spy(), }, }; const req = { @@ -137,7 +138,7 @@ describe("Middleware | Validators | discord actions", function () { size: 200, }, }; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); await validateLazyLoadingParams(req, res, nextSpy); expect(nextSpy.called).to.be.equal(false); expect(res.boom.badRequest.calledOnce).to.be.equal(true); @@ -146,7 +147,7 @@ describe("Middleware | Validators | discord actions", function () { it("should return a bad request error when page is negative", async function () { const res = { boom: { - badRequest: Sinon.spy(), + badRequest: sinon.spy(), }, }; const req = { @@ -154,7 +155,7 @@ describe("Middleware | Validators | discord actions", function () { page: -1, }, }; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); await validateLazyLoadingParams(req, res, nextSpy); expect(nextSpy.called).to.be.equal(false); expect(res.boom.badRequest.calledOnce).to.be.equal(true); @@ -163,7 +164,7 @@ describe("Middleware | Validators | discord actions", function () { it("should return a bad request error when dev has an invalid value", async function () { const res = { boom: { - badRequest: Sinon.spy(), + badRequest: sinon.spy(), }, }; const req = { @@ -171,7 +172,7 @@ describe("Middleware | Validators | discord actions", function () { dev: "invalid", }, }; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); await validateLazyLoadingParams(req, res, nextSpy); expect(nextSpy.called).to.be.equal(false); expect(res.boom.badRequest.calledOnce).to.be.equal(true); diff --git a/test/unit/middlewares/extension-request-validator.test.js b/test/unit/middlewares/extension-request-validator.test.js index 1d1d47299..be35ef0bb 100644 --- a/test/unit/middlewares/extension-request-validator.test.js +++ b/test/unit/middlewares/extension-request-validator.test.js @@ -1,12 +1,14 @@ -const Sinon = require("sinon"); -const { getExtensionRequestsValidator } = require("../../../middlewares/validators/extensionRequests"); -const { expect } = require("chai"); +import { expect } from "chai"; +import sinon from "sinon"; + +import { getExtensionRequestsValidator } from "../../../middlewares/validators/extensionRequests.js"; + describe("getExtensionRequestsValidator", function () { it("should pass the request when no values for query params is passed", async function () { const req = { query: {} }; const res = {}; - const nextMiddlewareSpy = Sinon.spy(); + const nextMiddlewareSpy = sinon.spy(); await getExtensionRequestsValidator(req, res, nextMiddlewareSpy); expect(nextMiddlewareSpy.callCount).to.be.equal(1); }); @@ -18,7 +20,7 @@ describe("getExtensionRequestsValidator", function () { }, }; const res = {}; - const nextMiddlewareSpy = Sinon.spy(); + const nextMiddlewareSpy = sinon.spy(); await getExtensionRequestsValidator(req, res, nextMiddlewareSpy); @@ -35,7 +37,7 @@ describe("getExtensionRequestsValidator", function () { }, }; const res = {}; - const nextMiddlewareSpy = Sinon.spy(); + const nextMiddlewareSpy = sinon.spy(); await getExtensionRequestsValidator(req, res, nextMiddlewareSpy); @@ -49,7 +51,7 @@ describe("getExtensionRequestsValidator", function () { }, }; const res = {}; - const nextMiddlewareSpy = Sinon.spy(); + const nextMiddlewareSpy = sinon.spy(); await getExtensionRequestsValidator(req, res, nextMiddlewareSpy); @@ -64,10 +66,10 @@ describe("getExtensionRequestsValidator", function () { }; const res = { boom: { - badRequest: Sinon.spy(), + badRequest: sinon.spy(), }, }; - const nextMiddlewareSpy = Sinon.spy(); + const nextMiddlewareSpy = sinon.spy(); await getExtensionRequestsValidator(req, res, nextMiddlewareSpy); @@ -83,10 +85,10 @@ describe("getExtensionRequestsValidator", function () { }; const res = { boom: { - badRequest: Sinon.spy(), + badRequest: sinon.spy(), }, }; - const nextMiddlewareSpy = Sinon.spy(); + const nextMiddlewareSpy = sinon.spy(); await getExtensionRequestsValidator(req, res, nextMiddlewareSpy); diff --git a/test/unit/middlewares/external-accounts-validator.test.js b/test/unit/middlewares/external-accounts-validator.test.js index a06f291cb..9a4c294cc 100644 --- a/test/unit/middlewares/external-accounts-validator.test.js +++ b/test/unit/middlewares/external-accounts-validator.test.js @@ -1,11 +1,12 @@ -const Sinon = require("sinon"); -const { +import { expect } from "chai"; +import sinon from "sinon"; + +import { externalAccountData, postExternalAccountsUsers, linkDiscord, -} = require("../../../middlewares/validators/external-accounts"); -const { EXTERNAL_ACCOUNTS_POST_ACTIONS } = require("../../../constants/external-accounts"); -const { expect } = require("chai"); +} from "../../../middlewares/validators/external-accounts.js"; +import { EXTERNAL_ACCOUNTS_POST_ACTIONS } from "../../../constants/external-accounts.js"; describe("Middleware | Validators | external accounts", function () { describe("externalAccountsData", function () { @@ -25,7 +26,7 @@ describe("Middleware | Validators | external accounts", function () { }, }; const res = {}; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); await externalAccountData(req, res, nextSpy); expect(nextSpy.calledOnce).to.be.equal(true); }); @@ -39,7 +40,7 @@ describe("Middleware | Validators | external accounts", function () { badRequest: () => {}, }, }; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); await externalAccountData(req, res, nextSpy).catch((err) => { expect(err).to.be.an.instanceOf(Error); }); @@ -53,7 +54,7 @@ describe("Middleware | Validators | external accounts", function () { query: { action: EXTERNAL_ACCOUNTS_POST_ACTIONS.DISCORD_USERS_SYNC }, }; const res = {}; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); await postExternalAccountsUsers(req, res, nextSpy); expect(nextSpy.calledOnce).to.be.equal(true); }); @@ -64,10 +65,10 @@ describe("Middleware | Validators | external accounts", function () { }; const res = { boom: { - badRequest: Sinon.spy(), + badRequest: sinon.spy(), }, }; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); await postExternalAccountsUsers(req, res, nextSpy); expect(nextSpy.calledOnce).to.be.equal(false); expect(res.boom.badRequest.callCount).to.be.equal(1); @@ -78,15 +79,15 @@ describe("Middleware | Validators | external accounts", function () { it("should call next with a valid token", async function () { const req = { params: { token: "validToken" } }; const res = {}; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); await linkDiscord(req, res, nextSpy); expect(nextSpy.calledOnce).to.be.equal(true); }); it("should throw an error when token is empty", async function () { const req = { params: { token: "" } }; - const res = { boom: { badRequest: Sinon.spy() } }; - const nextSpy = Sinon.spy(); + const res = { boom: { badRequest: sinon.spy() } }; + const nextSpy = sinon.spy(); await linkDiscord(req, res, nextSpy); expect(res.boom.badRequest.calledOnce).to.be.equal(true); }); diff --git a/test/unit/middlewares/fcmToken-validator.test.js b/test/unit/middlewares/fcmToken-validator.test.js index d7fe19f6a..b3786beb9 100644 --- a/test/unit/middlewares/fcmToken-validator.test.js +++ b/test/unit/middlewares/fcmToken-validator.test.js @@ -1,7 +1,7 @@ -const Sinon = require("sinon"); +import { expect } from "chai"; +import sinon from "sinon"; -const { expect } = require("chai"); -const { fcmTokenValidator } = require("../../../middlewares/validators/fcmToken"); +import { fcmTokenValidator } from "../../../middlewares/validators/fcmToken.js"; describe("Test the fcmToken validator", function () { it("Allows the request to pass", async function () { @@ -11,7 +11,7 @@ describe("Test the fcmToken validator", function () { }, }; const res = {}; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); await fcmTokenValidator(req, res, nextSpy); expect(nextSpy.callCount).to.be.equal(1); }); @@ -27,7 +27,7 @@ describe("Test the fcmToken validator", function () { badRequest: () => {}, }, }; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); await fcmTokenValidator(req, res, nextSpy); expect(nextSpy.callCount).to.be.equal(0); }); diff --git a/test/unit/middlewares/notify-validator.test.js b/test/unit/middlewares/notify-validator.test.js index 4adac8bfc..e29605509 100644 --- a/test/unit/middlewares/notify-validator.test.js +++ b/test/unit/middlewares/notify-validator.test.js @@ -1,7 +1,7 @@ -const Sinon = require("sinon"); +import { expect } from "chai"; +import sinon from "sinon"; -const { expect } = require("chai"); -const { notifyValidator } = require("../../../middlewares/validators/notify"); +import { notifyValidator } from "../../../middlewares/validators/notify.js"; describe("Test the notify validator", function () { it("Allows the request to pass with only user id", async function () { @@ -13,7 +13,7 @@ describe("Test the notify validator", function () { }, }; const res = {}; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); await notifyValidator(req, res, nextSpy); expect(nextSpy.callCount).to.be.equal(1); }); @@ -27,7 +27,7 @@ describe("Test the notify validator", function () { }, }; const res = {}; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); await notifyValidator(req, res, nextSpy); expect(nextSpy.callCount).to.be.equal(1); }); @@ -46,7 +46,7 @@ describe("Test the notify validator", function () { badRequest: () => {}, }, }; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); await notifyValidator(req, res, nextSpy); expect(nextSpy.callCount).to.be.equal(0); }); @@ -62,7 +62,7 @@ describe("Test the notify validator", function () { badRequest: () => {}, }, }; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); await notifyValidator(req, res, nextSpy); expect(nextSpy.callCount).to.be.equal(0); }); diff --git a/test/unit/middlewares/qrCodeAuthValidator.test.js b/test/unit/middlewares/qrCodeAuthValidator.test.js index 434385e2b..2f1a0907a 100644 --- a/test/unit/middlewares/qrCodeAuthValidator.test.js +++ b/test/unit/middlewares/qrCodeAuthValidator.test.js @@ -1,11 +1,13 @@ -const Sinon = require("sinon"); -const { +import { expect } from "chai"; +import sinon from "sinon"; + +import { validateAuthStatus, storeUserDeviceInfo, validateFetchingUserDocument, -} = require("../../../middlewares/validators/qrCodeAuth"); -const { expect } = require("chai"); -const { userDeviceInfoDataArray } = require("../../fixtures/qrCodeAuth/qrCodeAuth"); +} from "../../../middlewares/validators/qrCodeAuth.js"; +import { userDeviceInfoDataArray } from "../../fixtures/qrCodeAuth/qrCodeAuth.js"; + describe("qrCodeAuth", function () { describe("test post call validator", function () { it("Allows request to pass on valid params", async function () { @@ -17,7 +19,7 @@ describe("qrCodeAuth", function () { const res = {}; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); await storeUserDeviceInfo(req, res, nextSpy); expect(nextSpy.callCount).to.be.equal(1); }); @@ -36,7 +38,7 @@ describe("qrCodeAuth", function () { }, }; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); await storeUserDeviceInfo(req, res, nextSpy); expect(nextSpy.callCount).to.be.equal(0); }); @@ -52,7 +54,7 @@ describe("qrCodeAuth", function () { const res = {}; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); await validateAuthStatus(req, res, nextSpy); expect(nextSpy.callCount).to.be.equal(1); }); @@ -70,7 +72,7 @@ describe("qrCodeAuth", function () { }, }; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); await validateAuthStatus(req, res, nextSpy); expect(nextSpy.callCount).to.be.equal(0); }); @@ -86,7 +88,7 @@ describe("qrCodeAuth", function () { const res = {}; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); await validateFetchingUserDocument(req, res, nextSpy); expect(nextSpy.callCount).to.be.equal(1); }); @@ -105,7 +107,7 @@ describe("qrCodeAuth", function () { }, }; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); await validateFetchingUserDocument(req, res, nextSpy); expect(nextSpy.callCount).to.be.equal(0); }); diff --git a/test/unit/middlewares/rateLimiting.test.js b/test/unit/middlewares/rateLimiting.test.js index 7ab6ea6d3..508d1c4a9 100644 --- a/test/unit/middlewares/rateLimiting.test.js +++ b/test/unit/middlewares/rateLimiting.test.js @@ -1,6 +1,7 @@ -const sinon = require("sinon"); -const { TOO_MANY_REQUESTS } = require("../../../constants/rateLimiting"); -const { commonRateLimiter } = require("../../../middlewares/rateLimiting"); +import sinon from "sinon"; + +import { TOO_MANY_REQUESTS } from "../../../constants/rateLimiting.js"; +import { commonRateLimiter } from "../../../middlewares/rateLimiting.js"; function mockRequest(ipAddress) { return { diff --git a/test/unit/middlewares/security.test.js b/test/unit/middlewares/security.test.js index 9bf5cf509..f35071c9a 100644 --- a/test/unit/middlewares/security.test.js +++ b/test/unit/middlewares/security.test.js @@ -1,8 +1,7 @@ -const chai = require("chai"); -const { expect } = chai; -const chaiHttp = require("chai-http"); +import chai, { expect } from "chai"; +import chaiHttp from "chai-http"; -const app = require("../../../server"); +import app from "../../../server.js"; chai.use(chaiHttp); diff --git a/test/unit/middlewares/skipAuthorizeRolesWrapper.test.js b/test/unit/middlewares/skipAuthorizeRolesWrapper.test.js index 7c4733423..2cc048aea 100644 --- a/test/unit/middlewares/skipAuthorizeRolesWrapper.test.js +++ b/test/unit/middlewares/skipAuthorizeRolesWrapper.test.js @@ -1,7 +1,7 @@ -const chai = require("chai"); -const sinon = require("sinon"); -const { assert } = chai; -const skipAuthorizeRolesUnderFF = require("../../../middlewares/skipAuthorizeRolesWrapper"); +import { assert } from "chai"; +import sinon from "sinon"; + +import { skipAuthorizeRolesUnderFF } from "../../../middlewares/skipAuthorizeRolesWrapper.js"; describe("skipAuthorizeRolesUnderFF Middleware", function () { let req, res, next, authorizeMiddleware; diff --git a/test/unit/middlewares/subscription-validator.test.js b/test/unit/middlewares/subscription-validator.test.js index 7da180db5..614af0dad 100644 --- a/test/unit/middlewares/subscription-validator.test.js +++ b/test/unit/middlewares/subscription-validator.test.js @@ -1,6 +1,7 @@ -const Sinon = require("sinon"); -const { expect } = require("chai"); -const { validateSubscribe } = require("../../../middlewares/validators/subscription"); +import { expect } from "chai"; +import sinon from "sinon"; + +import { validateSubscribe } from "../../../middlewares/validators/subscription.js"; describe("Middleware | Validators | Subscription", function () { let req, res, nextSpy; @@ -8,10 +9,10 @@ describe("Middleware | Validators | Subscription", function () { beforeEach(function () { req = { body: {} }; res = { - status: Sinon.stub().returnsThis(), - json: Sinon.stub(), + status: sinon.stub().returnsThis(), + json: sinon.stub(), }; - nextSpy = Sinon.spy(); + nextSpy = sinon.spy(); }); it("should call next function when a valid request body is passed", async function () { diff --git a/test/unit/middlewares/task-request.test.js b/test/unit/middlewares/task-request.test.js index d5910bddc..14186ced3 100644 --- a/test/unit/middlewares/task-request.test.js +++ b/test/unit/middlewares/task-request.test.js @@ -1,7 +1,9 @@ -const Sinon = require("sinon"); -const { expect } = require("chai"); -const { postTaskRequests, getTaskRequests } = require("../../../middlewares/validators/task-requests"); -const data = require("../../fixtures/task-requests/task-requests"); +import { expect } from "chai"; +import sinon from "sinon"; + +import { postTaskRequests, getTaskRequests } from "../../../middlewares/validators/task-requests.js"; +import data from "../../fixtures/task-requests/task-requests.js"; + describe("Middleware | Validators | Task Requests", function () { describe("postTaskRequests", function () { describe("Task Assignment Requests", function () { @@ -10,7 +12,7 @@ describe("Middleware | Validators | Task Requests", function () { body: data.validAssignmentRequest, }; const res = {}; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); await postTaskRequests(req, res, nextSpy); expect(nextSpy.calledOnce).to.be.equal(true); }); @@ -20,7 +22,7 @@ describe("Middleware | Validators | Task Requests", function () { body: data.assignmentReqWithDescription, }; const res = {}; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); await postTaskRequests(req, res, nextSpy); expect(nextSpy.calledOnce).to.be.equal(true); }); @@ -30,7 +32,7 @@ describe("Middleware | Validators | Task Requests", function () { body: data.assignmentReqWithoutExtIssueId, }; const res = {}; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); await postTaskRequests(req, res, nextSpy); expect(nextSpy.calledOnce).to.be.equal(true); }); @@ -39,13 +41,13 @@ describe("Middleware | Validators | Task Requests", function () { const req = { body: data.assignmentReqWithoutProposedDeadline, }; - const badRequestSpy = Sinon.spy(); + const badRequestSpy = sinon.spy(); const res = { boom: { badRequest: badRequestSpy, }, }; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); await postTaskRequests(req, res, nextSpy); expect(badRequestSpy.calledOnce).to.be.equal(true); expect(nextSpy.callCount).to.be.equal(0); @@ -55,13 +57,13 @@ describe("Middleware | Validators | Task Requests", function () { const req = { body: data.assignmentReqWithoutTaskId, }; - const badRequestSpy = Sinon.spy(); + const badRequestSpy = sinon.spy(); const res = { boom: { badRequest: badRequestSpy, }, }; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); await postTaskRequests(req, res, nextSpy); expect(badRequestSpy.calledOnce).to.be.equal(true); expect(nextSpy.callCount).to.be.equal(0); @@ -71,13 +73,13 @@ describe("Middleware | Validators | Task Requests", function () { const req = { body: data.assignmentReqWithoutUserId, }; - const badRequestSpy = Sinon.spy(); + const badRequestSpy = sinon.spy(); const res = { boom: { badRequest: badRequestSpy, }, }; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); await postTaskRequests(req, res, nextSpy); expect(badRequestSpy.calledOnce).to.be.equal(true); expect(nextSpy.callCount).to.be.equal(0); @@ -90,7 +92,7 @@ describe("Middleware | Validators | Task Requests", function () { body: data.validCreationRequest, }; const res = {}; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); await postTaskRequests(req, res, nextSpy); expect(nextSpy.calledOnce).to.be.equal(true); }); @@ -100,7 +102,7 @@ describe("Middleware | Validators | Task Requests", function () { body: data.creationReqWithDescription, }; const res = {}; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); await postTaskRequests(req, res, nextSpy); expect(nextSpy.calledOnce).to.be.equal(true); }); @@ -109,13 +111,13 @@ describe("Middleware | Validators | Task Requests", function () { const req = { body: data.creationReqWithoutExtIssueId, }; - const badRequestSpy = Sinon.spy(); + const badRequestSpy = sinon.spy(); const res = { boom: { badRequest: badRequestSpy, }, }; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); await postTaskRequests(req, res, nextSpy); expect(badRequestSpy.calledOnce).to.be.equal(true); expect(nextSpy.callCount).to.be.equal(0); @@ -125,13 +127,13 @@ describe("Middleware | Validators | Task Requests", function () { const req = { body: data.creationReqWithoutProposedDeadline, }; - const badRequestSpy = Sinon.spy(); + const badRequestSpy = sinon.spy(); const res = { boom: { badRequest: badRequestSpy, }, }; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); await postTaskRequests(req, res, nextSpy); expect(badRequestSpy.calledOnce).to.be.equal(true); expect(nextSpy.callCount).to.be.equal(0); @@ -141,13 +143,13 @@ describe("Middleware | Validators | Task Requests", function () { const req = { body: data.creationReqWithoutUserId, }; - const badRequestSpy = Sinon.spy(); + const badRequestSpy = sinon.spy(); const res = { boom: { badRequest: badRequestSpy, }, }; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); await postTaskRequests(req, res, nextSpy); expect(badRequestSpy.calledOnce).to.be.equal(true); expect(nextSpy.callCount).to.be.equal(0); @@ -158,13 +160,13 @@ describe("Middleware | Validators | Task Requests", function () { const req = { body: data.invalidRequest, }; - const badRequestSpy = Sinon.spy(); + const badRequestSpy = sinon.spy(); const res = { boom: { badRequest: badRequestSpy, }, }; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); await postTaskRequests(req, res, nextSpy); expect(badRequestSpy.calledOnce).to.be.equal(true); expect(nextSpy.callCount).to.be.equal(0); @@ -175,7 +177,7 @@ describe("Middleware | Validators | Task Requests", function () { it("should pass the request when no values for query params are passed", async function () { const req = { query: {} }; const res = {}; - const nextMiddlewareSpy = Sinon.spy(); + const nextMiddlewareSpy = sinon.spy(); await getTaskRequests(req, res, nextMiddlewareSpy); expect(nextMiddlewareSpy.callCount).to.be.equal(1); }); @@ -187,7 +189,7 @@ describe("Middleware | Validators | Task Requests", function () { }, }; const res = {}; - const nextMiddlewareSpy = Sinon.spy(); + const nextMiddlewareSpy = sinon.spy(); await getTaskRequests(req, res, nextMiddlewareSpy); expect(nextMiddlewareSpy.callCount).to.be.equal(1); }); @@ -199,7 +201,7 @@ describe("Middleware | Validators | Task Requests", function () { }, }; const res = {}; - const nextMiddlewareSpy = Sinon.spy(); + const nextMiddlewareSpy = sinon.spy(); await getTaskRequests(req, res, nextMiddlewareSpy); expect(nextMiddlewareSpy.callCount).to.be.equal(1); }); @@ -211,7 +213,7 @@ describe("Middleware | Validators | Task Requests", function () { }, }; const res = {}; - const nextMiddlewareSpy = Sinon.spy(); + const nextMiddlewareSpy = sinon.spy(); await getTaskRequests(req, res, nextMiddlewareSpy); expect(nextMiddlewareSpy.callCount).to.be.equal(1); }); @@ -226,7 +228,7 @@ describe("Middleware | Validators | Task Requests", function () { }, }; const res = {}; - const nextMiddlewareSpy = Sinon.spy(); + const nextMiddlewareSpy = sinon.spy(); await getTaskRequests(req, res, nextMiddlewareSpy); expect(nextMiddlewareSpy.callCount).to.be.equal(1); }); @@ -240,10 +242,10 @@ describe("Middleware | Validators | Task Requests", function () { }; const res = { boom: { - badRequest: Sinon.spy(), + badRequest: sinon.spy(), }, }; - const nextMiddlewareSpy = Sinon.spy(); + const nextMiddlewareSpy = sinon.spy(); await getTaskRequests(req, res, nextMiddlewareSpy); expect(nextMiddlewareSpy.callCount).to.be.equal(0); expect(res.boom.badRequest.callCount).to.be.equal(1); @@ -257,10 +259,10 @@ describe("Middleware | Validators | Task Requests", function () { }; const res = { boom: { - badRequest: Sinon.spy(), + badRequest: sinon.spy(), }, }; - const nextMiddlewareSpy = Sinon.spy(); + const nextMiddlewareSpy = sinon.spy(); await getTaskRequests(req, res, nextMiddlewareSpy); expect(nextMiddlewareSpy.callCount).to.be.equal(0); expect(res.boom.badRequest.callCount).to.be.equal(1); @@ -274,10 +276,10 @@ describe("Middleware | Validators | Task Requests", function () { }; const res = { boom: { - badRequest: Sinon.spy(), + badRequest: sinon.spy(), }, }; - const nextMiddlewareSpy = Sinon.spy(); + const nextMiddlewareSpy = sinon.spy(); await getTaskRequests(req, res, nextMiddlewareSpy); expect(nextMiddlewareSpy.callCount).to.be.equal(0); expect(res.boom.badRequest.callCount).to.be.equal(1); @@ -291,10 +293,10 @@ describe("Middleware | Validators | Task Requests", function () { }; const res = { boom: { - badRequest: Sinon.spy(), + badRequest: sinon.spy(), }, }; - const nextMiddlewareSpy = Sinon.spy(); + const nextMiddlewareSpy = sinon.spy(); await getTaskRequests(req, res, nextMiddlewareSpy); expect(nextMiddlewareSpy.callCount).to.be.equal(0); expect(res.boom.badRequest.callCount).to.be.equal(1); @@ -308,10 +310,10 @@ describe("Middleware | Validators | Task Requests", function () { }; const res = { boom: { - badRequest: Sinon.spy(), + badRequest: sinon.spy(), }, }; - const nextMiddlewareSpy = Sinon.spy(); + const nextMiddlewareSpy = sinon.spy(); await getTaskRequests(req, res, nextMiddlewareSpy); expect(nextMiddlewareSpy.callCount).to.be.equal(0); expect(res.boom.badRequest.callCount).to.be.equal(1); @@ -325,10 +327,10 @@ describe("Middleware | Validators | Task Requests", function () { }; const res = { boom: { - badRequest: Sinon.spy(), + badRequest: sinon.spy(), }, }; - const nextMiddlewareSpy = Sinon.spy(); + const nextMiddlewareSpy = sinon.spy(); await getTaskRequests(req, res, nextMiddlewareSpy); expect(nextMiddlewareSpy.callCount).to.be.equal(0); expect(res.boom.badRequest.callCount).to.be.equal(1); diff --git a/test/unit/middlewares/tasks-validator.test.js b/test/unit/middlewares/tasks-validator.test.js index 7692387c0..76714a6db 100644 --- a/test/unit/middlewares/tasks-validator.test.js +++ b/test/unit/middlewares/tasks-validator.test.js @@ -1,19 +1,20 @@ -const Sinon = require("sinon"); -const { +import { expect } from "chai"; +import sinon from "sinon"; + +import { getTasksValidator, createTask, updateSelfTask, getUsersValidator, - updateTask: updateTaskValidator, -} = require("../../../middlewares/validators/tasks"); -const { expect } = require("chai"); -const { TASK_STATUS, tasksUsersStatus } = require("../../../constants/tasks"); + updateTask, +} from "../../../middlewares/validators/tasks.js"; +import { TASK_STATUS, tasksUsersStatus } from "../../../constants/tasks.js"; describe("getTasks validator", function () { it("should pass the request when no values for query params status is passed", async function () { const req = {}; const res = {}; - const nextMiddlewareSpy = Sinon.spy(); + const nextMiddlewareSpy = sinon.spy(); await getTasksValidator(req, res, nextMiddlewareSpy); expect(nextMiddlewareSpy.callCount).to.be.equal(1); }); @@ -25,7 +26,7 @@ describe("getTasks validator", function () { }, }; const res = {}; - const nextMiddlewareSpy = Sinon.spy(); + const nextMiddlewareSpy = sinon.spy(); await getTasksValidator(req, res, nextMiddlewareSpy); expect(nextMiddlewareSpy.callCount).to.be.equal(1); }); @@ -37,7 +38,7 @@ describe("getTasks validator", function () { }, }; const res = {}; - const nextMiddlewareSpy = Sinon.spy(); + const nextMiddlewareSpy = sinon.spy(); await getTasksValidator(req, res, nextMiddlewareSpy); expect(nextMiddlewareSpy.callCount).to.be.equal(1); }); @@ -50,10 +51,10 @@ describe("getTasks validator", function () { }; const res = { boom: { - badRequest: Sinon.spy(), + badRequest: sinon.spy(), }, }; - const nextMiddlewareSpy = Sinon.spy(); + const nextMiddlewareSpy = sinon.spy(); await getTasksValidator(req, res, nextMiddlewareSpy); expect(nextMiddlewareSpy.callCount).to.be.equal(0); }); @@ -65,7 +66,7 @@ describe("getTasks validator", function () { }, }; const res = {}; - const nextMiddlewareSpy = Sinon.spy(); + const nextMiddlewareSpy = sinon.spy(); await getTasksValidator(req, res, nextMiddlewareSpy); expect(nextMiddlewareSpy.callCount).to.be.equal(1); }); @@ -78,10 +79,10 @@ describe("getTasks validator", function () { }; const res = { boom: { - badRequest: Sinon.spy(), + badRequest: sinon.spy(), }, }; - const nextMiddlewareSpy = Sinon.spy(); + const nextMiddlewareSpy = sinon.spy(); await getTasksValidator(req, res, nextMiddlewareSpy); expect(nextMiddlewareSpy.callCount).to.be.equal(0); }); @@ -94,10 +95,10 @@ describe("getTasks validator", function () { }; const res = { boom: { - badRequest: Sinon.spy(), + badRequest: sinon.spy(), }, }; - const nextMiddlewareSpy = Sinon.spy(); + const nextMiddlewareSpy = sinon.spy(); await getTasksValidator(req, res, nextMiddlewareSpy); expect(nextMiddlewareSpy.callCount).to.be.equal(0); }); @@ -109,7 +110,7 @@ describe("getTasks validator", function () { }, }; const res = {}; - const nextMiddlewareSpy = Sinon.spy(); + const nextMiddlewareSpy = sinon.spy(); await getTasksValidator(req, res, nextMiddlewareSpy); expect(nextMiddlewareSpy.callCount).to.be.equal(1); }); @@ -122,10 +123,10 @@ describe("getTasks validator", function () { }; const res = { boom: { - badRequest: Sinon.spy(), + badRequest: sinon.spy(), }, }; - const nextMiddlewareSpy = Sinon.spy(); + const nextMiddlewareSpy = sinon.spy(); await getTasksValidator(req, res, nextMiddlewareSpy); expect(nextMiddlewareSpy.callCount).to.be.equal(0); }); @@ -138,10 +139,10 @@ describe("getTasks validator", function () { }; const res = { boom: { - badRequest: Sinon.spy(), + badRequest: sinon.spy(), }, }; - const nextMiddlewareSpy = Sinon.spy(); + const nextMiddlewareSpy = sinon.spy(); await getTasksValidator(req, res, nextMiddlewareSpy); expect(nextMiddlewareSpy.callCount).to.be.equal(0); }); @@ -153,7 +154,7 @@ describe("getTasks validator", function () { }, }; const res = {}; - const nextMiddlewareSpy = Sinon.spy(); + const nextMiddlewareSpy = sinon.spy(); await getTasksValidator(req, res, nextMiddlewareSpy); expect(nextMiddlewareSpy.callCount).to.be.equal(1); }); @@ -167,10 +168,10 @@ describe("getTasks validator", function () { }; const res = { boom: { - badRequest: Sinon.spy(), + badRequest: sinon.spy(), }, }; - const nextMiddlewareSpy = Sinon.spy(); + const nextMiddlewareSpy = sinon.spy(); await getTasksValidator(req, res, nextMiddlewareSpy); expect(nextMiddlewareSpy.callCount).to.be.equal(0); }); @@ -184,10 +185,10 @@ describe("getTasks validator", function () { }; const res = { boom: { - badRequest: Sinon.spy(), + badRequest: sinon.spy(), }, }; - const nextMiddlewareSpy = Sinon.spy(); + const nextMiddlewareSpy = sinon.spy(); await getTasksValidator(req, res, nextMiddlewareSpy); expect(nextMiddlewareSpy.callCount).to.be.equal(0); }); @@ -201,10 +202,10 @@ describe("getTasks validator", function () { }; const res = { boom: { - badRequest: Sinon.spy(), + badRequest: sinon.spy(), }, }; - const nextMiddlewareSpy = Sinon.spy(); + const nextMiddlewareSpy = sinon.spy(); await getTasksValidator(req, res, nextMiddlewareSpy); expect(nextMiddlewareSpy.callCount).to.be.equal(0); }); @@ -218,7 +219,7 @@ describe("getTasks validator", function () { }, }; const res = {}; - const nextMiddlewareSpy = Sinon.spy(); + const nextMiddlewareSpy = sinon.spy(); await getTasksValidator(req, res, nextMiddlewareSpy); expect(nextMiddlewareSpy.callCount).to.be.equal(1); }); @@ -232,7 +233,7 @@ describe("getTasks validator", function () { }, }; const res = {}; - const nextMiddlewareSpy = Sinon.spy(); + const nextMiddlewareSpy = sinon.spy(); await getTasksValidator(req, res, nextMiddlewareSpy); expect(nextMiddlewareSpy.callCount).to.be.equal(1); }); @@ -246,7 +247,7 @@ describe("getTasks validator", function () { }, }; const res = {}; - const nextMiddlewareSpy = Sinon.spy(); + const nextMiddlewareSpy = sinon.spy(); await getTasksValidator(req, res, nextMiddlewareSpy); expect(nextMiddlewareSpy.callCount).to.be.equal(1); }); @@ -261,7 +262,7 @@ describe("getTasks validator", function () { }, }; const res = {}; - const nextMiddlewareSpy = Sinon.spy(); + const nextMiddlewareSpy = sinon.spy(); await getTasksValidator(req, res, nextMiddlewareSpy); expect(nextMiddlewareSpy.callCount).to.be.equal(1); }); @@ -282,7 +283,7 @@ describe("getTasks validator", function () { }, }, }; - const nextMiddlewareSpy = Sinon.spy(); + const nextMiddlewareSpy = sinon.spy(); await getTasksValidator(req, res, nextMiddlewareSpy); expect(nextMiddlewareSpy.callCount).to.be.equal(0); }); @@ -296,7 +297,7 @@ describe("getTasks validator", function () { }, }; const res = {}; - const nextMiddlewareSpy = Sinon.spy(); + const nextMiddlewareSpy = sinon.spy(); await getTasksValidator(req, res, nextMiddlewareSpy); expect(nextMiddlewareSpy.callCount).to.be.equal(1); }); @@ -321,7 +322,7 @@ describe("getTasks validator", function () { }, }; - const nextMiddlewareSpy = Sinon.spy(); + const nextMiddlewareSpy = sinon.spy(); try { await createTask(req, res, nextMiddlewareSpy); @@ -345,7 +346,7 @@ describe("getTasks validator", function () { }, }; - const nextMiddlewareSpy = Sinon.spy(); + const nextMiddlewareSpy = sinon.spy(); try { await createTask(req, res, nextMiddlewareSpy); @@ -382,7 +383,7 @@ describe("getTasks validator", function () { }, }; - const nextMiddlewareSpy = Sinon.spy(); + const nextMiddlewareSpy = sinon.spy(); try { await createTask(req, res, nextMiddlewareSpy); @@ -415,7 +416,7 @@ describe("getTasks validator", function () { }, }, }; - const nextMiddlewareSpy = Sinon.spy(); + const nextMiddlewareSpy = sinon.spy(); try { await createTask(req, res, nextMiddlewareSpy); expect.fail("Should have thrown a bad request error"); @@ -425,94 +426,94 @@ describe("getTasks validator", function () { expect(nextMiddlewareSpy.callCount).to.be.equal(0); }); - it("should call nextMiddlewareSpy for updateTaskValidator if startedOn is null", async function () { + it("should call nextMiddlewareSpy for updateTask if startedOn is null", async function () { const req = { body: { startedOn: null, endsOn: new Date().getTime(), }, }; - const res = { boom: { badRequest: Sinon.spy() } }; - const nextMiddlewareSpy = Sinon.spy(); - await updateTaskValidator(req, res, nextMiddlewareSpy); + const res = { boom: { badRequest: sinon.spy() } }; + const nextMiddlewareSpy = sinon.spy(); + await updateTask(req, res, nextMiddlewareSpy); expect(nextMiddlewareSpy.callCount).to.be.equal(1); }); - it("should call nextMiddlewareSpy for updateTaskValidator if endsOn is null", async function () { + it("should call nextMiddlewareSpy for updateTask if endsOn is null", async function () { const req = { body: { startedOn: new Date().getTime(), endsOn: null, }, }; - const res = { boom: { badRequest: Sinon.spy() } }; - const nextMiddlewareSpy = Sinon.spy(); - await updateTaskValidator(req, res, nextMiddlewareSpy); + const res = { boom: { badRequest: sinon.spy() } }; + const nextMiddlewareSpy = sinon.spy(); + await updateTask(req, res, nextMiddlewareSpy); expect(nextMiddlewareSpy.callCount).to.be.equal(1); }); - it("should call nextMiddlewareSpy for updateTaskValidator if both startedOn and endsOn are null", async function () { + it("should call nextMiddlewareSpy for updateTask if both startedOn and endsOn are null", async function () { const req = { body: { startedOn: null, endsOn: null, }, }; - const res = { boom: { badRequest: Sinon.spy() } }; - const nextMiddlewareSpy = Sinon.spy(); - await updateTaskValidator(req, res, nextMiddlewareSpy); + const res = { boom: { badRequest: sinon.spy() } }; + const nextMiddlewareSpy = sinon.spy(); + await updateTask(req, res, nextMiddlewareSpy); expect(nextMiddlewareSpy.callCount).to.be.equal(1); }); - it("should call nextMiddlewareSpy for updateTaskValidator if both startedOn and endsOn are valid number", async function () { + it("should call nextMiddlewareSpy for updateTask if both startedOn and endsOn are valid number", async function () { const req = { body: { startedOn: new Date("2023-11-15").getTime(), endsOn: new Date("2023-11-18").getTime(), }, }; - const res = { boom: { badRequest: Sinon.spy() } }; - const nextMiddlewareSpy = Sinon.spy(); - await updateTaskValidator(req, res, nextMiddlewareSpy); + const res = { boom: { badRequest: sinon.spy() } }; + const nextMiddlewareSpy = sinon.spy(); + await updateTask(req, res, nextMiddlewareSpy); expect(nextMiddlewareSpy.callCount).to.be.equal(1); }); - it("should not call nextMiddlewareSpy for updateTaskValidator if startedOn is not null or a number", async function () { + it("should not call nextMiddlewareSpy for updateTask if startedOn is not null or a number", async function () { const req = { body: { startedOn: "December 6 2023", endsOn: new Date().getTime(), }, }; - const res = { boom: { badRequest: Sinon.spy() } }; - const nextMiddlewareSpy = Sinon.spy(); - await updateTaskValidator(req, res, nextMiddlewareSpy); + const res = { boom: { badRequest: sinon.spy() } }; + const nextMiddlewareSpy = sinon.spy(); + await updateTask(req, res, nextMiddlewareSpy); expect(nextMiddlewareSpy.callCount).to.be.equal(0); }); - it("should not call nextMiddlewareSpy for updateTaskValidator if endsOn is not null or a number", async function () { + it("should not call nextMiddlewareSpy for updateTask if endsOn is not null or a number", async function () { const req = { body: { startedOn: new Date().getTime(), endsOn: true, }, }; - const res = { boom: { badRequest: Sinon.spy() } }; - const nextMiddlewareSpy = Sinon.spy(); - await updateTaskValidator(req, res, nextMiddlewareSpy); + const res = { boom: { badRequest: sinon.spy() } }; + const nextMiddlewareSpy = sinon.spy(); + await updateTask(req, res, nextMiddlewareSpy); expect(nextMiddlewareSpy.callCount).to.be.equal(0); }); - it("should not call nextMiddlewareSpy for updateTaskValidator if both startedOn and endsOn is not null or a number", async function () { + it("should not call nextMiddlewareSpy for updateTask if both startedOn and endsOn is not null or a number", async function () { const req = { body: { startedOn: "December 6 2023", endsOn: true, }, }; - const res = { boom: { badRequest: Sinon.spy() } }; - const nextMiddlewareSpy = Sinon.spy(); - await updateTaskValidator(req, res, nextMiddlewareSpy); + const res = { boom: { badRequest: sinon.spy() } }; + const nextMiddlewareSpy = sinon.spy(); + await updateTask(req, res, nextMiddlewareSpy); expect(nextMiddlewareSpy.callCount).to.be.equal(0); }); @@ -526,7 +527,7 @@ describe("getTasks validator", function () { }, }; const res = {}; - const nextMiddlewareSpy = Sinon.spy(); + const nextMiddlewareSpy = sinon.spy(); await getUsersValidator(req, res, nextMiddlewareSpy); expect(nextMiddlewareSpy.callCount).to.be.equal(1); }); @@ -540,7 +541,7 @@ describe("getTasks validator", function () { }, }; const res = {}; - const nextMiddlewareSpy = Sinon.spy(); + const nextMiddlewareSpy = sinon.spy(); await getUsersValidator(req, res, nextMiddlewareSpy); expect(nextMiddlewareSpy.callCount).to.be.equal(1); }); @@ -552,7 +553,7 @@ describe("getTasks validator", function () { }, }; const res = {}; - const nextMiddlewareSpy = Sinon.spy(); + const nextMiddlewareSpy = sinon.spy(); await getUsersValidator(req, res, nextMiddlewareSpy); expect(nextMiddlewareSpy.callCount).to.be.equal(1); }); @@ -565,10 +566,10 @@ describe("getTasks validator", function () { }; const res = { boom: { - badRequest: Sinon.spy(), + badRequest: sinon.spy(), }, }; - const nextMiddlewareSpy = Sinon.spy(); + const nextMiddlewareSpy = sinon.spy(); await getUsersValidator(req, res, nextMiddlewareSpy); expect(nextMiddlewareSpy.callCount).to.be.equal(0); expect(res.boom.badRequest.callCount).to.be.equal(1); @@ -582,10 +583,10 @@ describe("getTasks validator", function () { }; const res = { boom: { - badRequest: Sinon.spy(), + badRequest: sinon.spy(), }, }; - const nextMiddlewareSpy = Sinon.spy(); + const nextMiddlewareSpy = sinon.spy(); await getUsersValidator(req, res, nextMiddlewareSpy); expect(nextMiddlewareSpy.callCount).to.be.equal(0); expect(res.boom.badRequest.callCount).to.be.equal(1); @@ -599,10 +600,10 @@ describe("getTasks validator", function () { }; const res = { boom: { - badRequest: Sinon.spy(), + badRequest: sinon.spy(), }, }; - const nextMiddlewareSpy = Sinon.spy(); + const nextMiddlewareSpy = sinon.spy(); await getUsersValidator(req, res, nextMiddlewareSpy); expect(nextMiddlewareSpy.callCount).to.be.equal(0); expect(res.boom.badRequest.callCount).to.be.equal(1); @@ -618,10 +619,10 @@ describe("getTasks validator", function () { }; const res = { boom: { - badRequest: Sinon.spy(), + badRequest: sinon.spy(), }, }; - const nextMiddlewareSpy = Sinon.spy(); + const nextMiddlewareSpy = sinon.spy(); await updateSelfTask(req, res, nextMiddlewareSpy); expect(nextMiddlewareSpy.callCount).to.be.equal(0); }); diff --git a/test/unit/middlewares/tasks.test.js b/test/unit/middlewares/tasks.test.js index fe738904e..d451ef912 100644 --- a/test/unit/middlewares/tasks.test.js +++ b/test/unit/middlewares/tasks.test.js @@ -1,6 +1,7 @@ -const { updateTask } = require("../../../middlewares/validators/tasks"); // Replace with the actual path to your updateTask module -const { expect } = require("chai"); -const sinon = require("sinon"); +import { expect } from "chai"; +import sinon from "sinon"; + +import { updateTask } from "../../../middlewares/validators/tasks.js"; describe("updateTask function", function () { // Helper function to create a request object with a specific body diff --git a/test/unit/middlewares/user-validator.test.js b/test/unit/middlewares/user-validator.test.js index 2e2715147..c6c8abaae 100644 --- a/test/unit/middlewares/user-validator.test.js +++ b/test/unit/middlewares/user-validator.test.js @@ -1,13 +1,15 @@ -const sinon = require("sinon"); -const { +import { expect } from "chai"; +import sinon from "sinon"; + +import { + getUsers, + updateUser, validateJoinData, validateUsersPatchHandler, validateGenerateUsernameQuery, -} = require("./../../../middlewares/validators/user"); -const joinData = require("./../../fixtures/user/join"); -const userData = require("./../../fixtures/user/user"); -const { expect } = require("chai"); -const { updateUser, getUsers } = require("./../../../middlewares/validators/user"); +} from "./../../../middlewares/validators/user.js"; +import joinData from "./../../fixtures/user/join.js"; +import userData from "./../../fixtures/user/user.js"; describe("Middleware | Validators | User", function () { describe("Create user validator for validateJoinData", function () { diff --git a/test/unit/middlewares/userStatusValidator.js b/test/unit/middlewares/userStatusValidator.js index 4635ea393..4e09ec1f1 100644 --- a/test/unit/middlewares/userStatusValidator.js +++ b/test/unit/middlewares/userStatusValidator.js @@ -1,6 +1,7 @@ -const Sinon = require("sinon"); -const { expect } = require("chai"); -const { validateGetQueryParams } = require("../../../middlewares/validators/userStatus"); +import { expect } from "chai"; +import sinon from "sinon"; + +import { validateGetQueryParams } from "../../../middlewares/validators/userStatus.js"; describe("Middleware | Validators | userStatus", function () { describe("validateRequestQuery", function () { @@ -11,7 +12,7 @@ describe("Middleware | Validators | userStatus", function () { state: "IDLE", }, }; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); await validateGetQueryParams(req, res, nextSpy); expect(nextSpy.calledOnce).to.be.equal(true); @@ -27,7 +28,7 @@ describe("Middleware | Validators | userStatus", function () { badRequest: () => {}, }, }; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); const req = { query: { taskStatus: "invalidKey", diff --git a/test/unit/middlewares/userStatusValidator.test.js b/test/unit/middlewares/userStatusValidator.test.js index 19974dcb7..650398afd 100644 --- a/test/unit/middlewares/userStatusValidator.test.js +++ b/test/unit/middlewares/userStatusValidator.test.js @@ -1,6 +1,7 @@ -const Sinon = require("sinon"); -const { expect } = require("chai"); -const { validateUserStatus } = require("../../../middlewares/validators/userStatus"); +import { expect } from "chai"; +import sinon from "sinon"; + +import { validateUserStatus } from "../../../middlewares/validators/userStatus.js"; describe("Validation Tests for Cancel OOO", function () { let req; @@ -10,10 +11,10 @@ describe("Validation Tests for Cancel OOO", function () { beforeEach(function () { res = { boom: { - badRequest: Sinon.spy(), + badRequest: sinon.spy(), }, }; - nextSpy = Sinon.spy(); + nextSpy = sinon.spy(); }); it("should validate for a valid request", async function () { diff --git a/test/unit/middlewares/users-validator.test.js b/test/unit/middlewares/users-validator.test.js index d01359507..7211e1cfc 100644 --- a/test/unit/middlewares/users-validator.test.js +++ b/test/unit/middlewares/users-validator.test.js @@ -1,6 +1,7 @@ -const Sinon = require("sinon"); -const { validateUpdateRoles, validateUserQueryParams } = require("../../../middlewares/validators/user"); -const { expect } = require("chai"); +import { expect } from "chai"; +import sinon from "sinon"; + +import { validateUpdateRoles, validateUserQueryParams } from "../../../middlewares/validators/user.js"; describe("Test the roles update validator", function () { it("Allows the request to pass with member property", async function () { @@ -10,7 +11,7 @@ describe("Test the roles update validator", function () { }, }; const res = {}; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); await validateUpdateRoles(req, res, nextSpy); expect(nextSpy.callCount).to.be.equal(1); }); @@ -23,7 +24,7 @@ describe("Test the roles update validator", function () { }, }; const res = {}; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); await validateUserQueryParams(req, res, nextSpy); expect(nextSpy.callCount).to.be.equal(1); }); @@ -35,7 +36,7 @@ describe("Test the roles update validator", function () { }, }; const res = {}; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); await validateUpdateRoles(req, res, nextSpy); expect(nextSpy.callCount).to.be.equal(1); }); @@ -50,10 +51,10 @@ describe("Test the roles update validator", function () { }; const res = { boom: { - badRequest: Sinon.stub().returns("Bad Request"), + badRequest: sinon.stub().returns("Bad Request"), }, }; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); await validateUpdateRoles(req, res, nextSpy); expect(nextSpy.callCount).to.be.equal(0); }); @@ -64,10 +65,10 @@ describe("Test the roles update validator", function () { }; const res = { boom: { - badRequest: Sinon.stub().returns("Bad Request"), + badRequest: sinon.stub().returns("Bad Request"), }, }; - const nextSpy = Sinon.spy(); + const nextSpy = sinon.spy(); await validateUpdateRoles(req, res, nextSpy); expect(nextSpy.callCount).to.be.equal(0); }); diff --git a/test/unit/models/auctions.test.js b/test/unit/models/auctions.test.js index 1b74b4cca..027fe1cdf 100644 --- a/test/unit/models/auctions.test.js +++ b/test/unit/models/auctions.test.js @@ -1,23 +1,19 @@ -const chai = require("chai"); -const sinon = require("sinon"); -const { expect } = chai; +import { expect } from "chai"; +import sinon from "sinon"; + +import cleanDb from "../../utils/cleanDb.js"; +import firestore from "../../../utils/firestore.js"; +import addUser from "../../utils/addUser.js"; +import * as auctions from "../../../models/auctions.js"; +import * as walletsQuery from "../../../models/wallets.js"; +import { auctionData } from "../../fixtures/auctions/auctions.js"; +import user from "../../fixtures/user/user.js"; +import currencyDataArray from "../../fixtures/currencies/currencies.js"; -const cleanDb = require("../../utils/cleanDb"); -const firestore = require("../../../utils/firestore"); -const addUser = require("../../utils/addUser"); - -// Import models -const auctions = require("../../../models/auctions"); -const walletsQuery = require("../../../models/wallets"); +const currencies = currencyDataArray.default; const auctionModel = firestore.collection("auctions"); const bidModel = firestore.collection("bids"); -// Import fixtures -const { auctionData } = require("../../fixtures/auctions/auctions"); -const user = require("../../fixtures/user/user")(); -const currencyDataArray = require("../../fixtures/currencies/currencies"); -const currencies = currencyDataArray.default; - const { initial_price: initialPrice, item_type: itemType, end_time: endTime, quantity } = auctionData; describe("auctions", function () { diff --git a/test/unit/models/challenges.test.js b/test/unit/models/challenges.test.js index 64362e06d..9b856f58d 100644 --- a/test/unit/models/challenges.test.js +++ b/test/unit/models/challenges.test.js @@ -1,17 +1,14 @@ -const chai = require("chai"); -const { expect } = chai; +import { expect } from "chai"; -const cleanDb = require("../../utils/cleanDb"); -const firestore = require("../../../utils/firestore"); -const addUser = require("../../utils/addUser"); +import cleanDb from "../../utils/cleanDb.js"; +import firestore from "../../../utils/firestore.js"; +import addUser from "../../utils/addUser.js"; +import * as challengeQuery from "../../../models/challenges.js"; +import userDataArray from "../../fixtures/user/user.js"; +import challengeDataArray from "../../fixtures/challenges/challenges.js"; -const challengeQuery = require("../../../models/challenges"); -const challengeModel = firestore.collection("challenges"); - -// Import fixtures -const userDataArray = require("../../fixtures/user/user")(); -const challengeDataArray = require("../../fixtures/challenges/challenges")(); const challengeData = challengeDataArray[0]; +const challengeModel = firestore.collection("challenges"); describe("Challenges", function () { let challengeId; diff --git a/test/unit/models/discordactions.test.js b/test/unit/models/discordactions.test.js index a1a721fc1..64a32e973 100644 --- a/test/unit/models/discordactions.test.js +++ b/test/unit/models/discordactions.test.js @@ -1,23 +1,17 @@ -const chai = require("chai"); -const expect = chai.expect; -const sinon = require("sinon"); -const firestore = require("../../../utils/firestore"); -const photoVerificationModel = firestore.collection("photo-verification"); -const discordRoleModel = firestore.collection("discord-roles"); -const userStatusCollection = firestore.collection("usersStatus"); -const memberRoleModel = firestore.collection("member-group-roles"); -const userModel = firestore.collection("users"); -const admin = require("firebase-admin"); -const tasksData = require("../../fixtures/tasks/tasks")(); - -const addUser = require("../../utils/addUser"); -const userStatusData = require("../../fixtures/userStatus/userStatus"); -const { getDiscordMembers } = require("../../fixtures/discordResponse/discord-response"); -const discordService = require("../../../services/discordService"); -const { TASK_STATUS } = require("../../../constants/tasks"); -const tasksModel = firestore.collection("tasks"); - -const { +import sinon from "sinon"; +import chai, { expect } from "chai"; +import admin from "firebase-admin"; + +import firestore from "../../../utils/firestore.js"; +import photoVerificationModel from "../../../models/photo-verification.js"; +import discordRoleModel from "../../../models/discord-roles.js"; +import userStatusCollection from "../../../models/usersStatus.js"; +import tasksData from "../../fixtures/tasks/tasks.js"; +import { getDiscordMembers } from "../../fixtures/discordResponse/discord-response.js"; +import discordService from "../../../services/discordService.js"; +import { TASK_STATUS } from "../../../constants/tasks.js"; +import addUser from "../../utils/addUser.js"; +import { createNewRole, getAllGroupRoles, getPaginatedGroupRolesByPage, @@ -41,8 +35,8 @@ const { getGroupRoleByName, getGroupRolesForUser, skipOnboardingUsersHavingApprovedExtensionRequest, -} = require("../../../models/discordactions"); -const { +} from "../../../models/discordactions.js"; +import { groupData, roleData, existingRole, @@ -50,22 +44,25 @@ const { groupIdle, groupIdle7d, groupOnboarding31dPlus, -} = require("../../fixtures/discordactions/discordactions"); -const cleanDb = require("../../utils/cleanDb"); -const { userPhotoVerificationData } = require("../../fixtures/user/photo-verification"); -const userData = require("../../fixtures/user/user")(); -const userStatusModel = require("../../../models/userStatus"); -const { getStatusData } = require("../../fixtures/userStatus/userStatus"); -const usersStatusData = getStatusData(); -const dataAccessLayer = require("../../../services/dataAccessLayer"); -const { ONE_DAY_IN_MS } = require("../../../constants/users"); -const { createProgressDocument } = require("../../../models/progresses"); -const { stubbedModelTaskProgressData } = require("../../fixtures/progress/progresses"); -const { convertDaysToMilliseconds } = require("../../../utils/time"); -const { generateUserStatusData } = require("../../fixtures/userStatus/userStatus"); -const { userState } = require("../../../constants/userStatus"); -const { REQUEST_TYPE, REQUEST_STATE } = require("../../../constants/requests"); -const { createRequest } = require("../../../models/requests"); +} from "../../fixtures/discordactions/discordactions.js"; +import cleanDb from "../../utils/cleanDb.js"; +import { userPhotoVerificationData } from "../../fixtures/user/photo-verification.js"; +import userData from "../../fixtures/user/user.js"; +import userStatusModel from "../../../models/userStatus.js"; +import { generateUserStatusData } from "../../fixtures/userStatus/userStatus.js"; +import dataAccessLayer from "../../../services/dataAccessLayer.js"; +import { ONE_DAY_IN_MS } from "../../../constants/users.js"; +import { createProgressDocument } from "../../../models/progresses.js"; +import { stubbedModelTaskProgressData } from "../../fixtures/progress/progresses.js"; +import { convertDaysToMilliseconds } from "../../../utils/time.js"; +import { userState } from "../../../constants/userStatus.js"; +import { REQUEST_TYPE, REQUEST_STATE } from "../../../constants/requests.js"; +import { createRequest } from "../../../models/requests.js"; +import userStatusData from "../fixtures/userStatus/userStatus.js"; + +const tasksModel = firestore.collection("tasks"); +const memberRoleModel = firestore.collection("member-group-roles"); +const userModel = firestore.collection("users"); chai.should(); @@ -571,7 +568,7 @@ describe("discordactions", function () { }); before(async function () { - length = usersStatusData.length; + length = userStatusData.length; users = userData.filter((data) => data.username && data.discordId).slice(0, length); const addedUersPromise = users.map(async (user) => { const { id } = await userModel.add({ ...user }); @@ -580,7 +577,7 @@ describe("discordactions", function () { addedUers = await Promise.all(addedUersPromise); - const addedUsersStatusPromise = usersStatusData.map(async (data, index) => { + const addedUsersStatusPromise = userStatusData.map(async (data, index) => { const { id } = addedUers[index]; const statusData = { ...data, userId: id }; const { id: userStatusId } = await userStatusCollection.add(statusData); diff --git a/test/unit/models/events.test.js b/test/unit/models/events.test.js index f33d7e1ad..620b55cdc 100644 --- a/test/unit/models/events.test.js +++ b/test/unit/models/events.test.js @@ -1,17 +1,15 @@ -const chai = require("chai"); -const { expect } = chai; +import { expect } from "chai"; -const cleanDb = require("../../utils/cleanDb"); -const firestore = require("../../../utils/firestore"); +import cleanDb from "../../utils/cleanDb.js"; +import firestore from "../../../utils/firestore.js"; +import * as eventQuery from "../../../models/events.js"; +import eventDataArray from "../../fixtures/events/events.js"; +import eventCodeDataArray from "../../fixtures/events/event-codes.js"; -const eventQuery = require("../../../models/events"); +const eventData = eventDataArray[0]; const eventModel = firestore.collection("events"); const peerModel = firestore.collection("peers"); -const eventDataArray = require("../../fixtures/events/events")(); -const eventCodeDataArray = require("../../fixtures/events/event-codes")(); -const eventData = eventDataArray[0]; - describe("Events", function () { afterEach(async function () { await cleanDb(); diff --git a/test/unit/models/external-accounts.test.js b/test/unit/models/external-accounts.test.js index 93b9a79b0..0c69c06cc 100644 --- a/test/unit/models/external-accounts.test.js +++ b/test/unit/models/external-accounts.test.js @@ -1,9 +1,7 @@ -const chai = require("chai"); -const { expect } = chai; - -const cleanDb = require("../../utils/cleanDb"); -const externalAccountsModel = require("../../../models/external-accounts"); -const externalAccountData = require("../../fixtures/external-accounts/external-accounts")(); +import { expect } from "chai"; +import cleanDb from "../../utils/cleanDb.js"; +import externalAccountsModel from "../../../models/external-accounts.js"; +import externalAccountData from "../../fixtures/external-accounts/external-accounts.js"; describe("External Accounts", function () { afterEach(async function () { diff --git a/test/unit/models/fcmToken.test.js b/test/unit/models/fcmToken.test.js index 07657799a..380cb3c12 100644 --- a/test/unit/models/fcmToken.test.js +++ b/test/unit/models/fcmToken.test.js @@ -1,8 +1,8 @@ -const chai = require("chai"); -const expect = chai.expect; -const firestore = require("../../../utils/firestore"); -const { saveFcmToken } = require("../../../models/fcmToken"); -const cleanDb = require("../../utils/cleanDb"); +import { expect } from "chai"; +import firestore from "../../../utils/firestore.js"; +import { saveFcmToken } from "../../../models/fcmToken.js"; +import cleanDb from "../../utils/cleanDb.js"; + const fcmTokenModel = firestore.collection("fcmToken"); describe("FCM token", function () { diff --git a/test/unit/models/logs.test.js b/test/unit/models/logs.test.js index bde51a63e..cda43a84b 100644 --- a/test/unit/models/logs.test.js +++ b/test/unit/models/logs.test.js @@ -1,25 +1,25 @@ -const chai = require("chai"); -const { expect } = chai; -const chaiHttp = require("chai-http"); -const cleanDb = require("../../utils/cleanDb"); -const logsQuery = require("../../../models/logs"); -const cacheData = require("../../fixtures/cloudflareCache/data"); -const logsData = require("../../fixtures/logs/archievedUsers"); -const { requestsLogs } = require("../../fixtures/logs/requests"); -const app = require("../../../server"); -const Sinon = require("sinon"); -const { INTERNAL_SERVER_ERROR } = require("../../../constants/errorMessages"); -const userData = require("../../fixtures/user/user")(); -const addUser = require("../../utils/addUser"); -const cookieName = config.get("userToken.cookieName"); -const authService = require("../../../services/authService"); -const { extensionRequestLogs } = require("../../fixtures/logs/extensionRequests"); -const { LOGS_FETCHED_SUCCESSFULLY } = require("../../../constants/logs"); -const tasks = require("../../../models/tasks"); -const tasksData = require("../../fixtures/tasks/tasks")(); +import chai, { expect } from "chai"; +import chaiHttp from "chai-http"; +import cleanDb from "../../utils/cleanDb.js"; +import logsQuery from "../../../models/logs.js"; +import cacheData from "../../fixtures/cloudflareCache/data.js"; +import logsData from "../../fixtures/logs/archievedUsers.js"; +import { requestsLogs } from "../../fixtures/logs/requests.js"; +import app from "../../../server.js"; +import Sinon from "sinon"; +import { INTERNAL_SERVER_ERROR } from "../../../constants/errorMessages.js"; +import userData from "../../fixtures/user/user.js"; +import addUser from "../../utils/addUser.js"; +import authService from "../../../services/authService.js"; +import { extensionRequestLogs } from "../../fixtures/logs/extensionRequests.js"; +import { LOGS_FETCHED_SUCCESSFULLY } from "../../../constants/logs.js"; +import tasks from "../../../models/tasks.js"; +import tasksData from "../../fixtures/tasks/tasks.js"; + chai.use(chaiHttp); const superUser = userData[4]; const userToBeMadeMember = userData[1]; +const cookieName = config.get("userToken.cookieName"); describe("Logs", function () { after(async function () { diff --git a/test/unit/models/profileDiffs.test.js b/test/unit/models/profileDiffs.test.js index 621ce5d5b..26cafaa96 100644 --- a/test/unit/models/profileDiffs.test.js +++ b/test/unit/models/profileDiffs.test.js @@ -1,8 +1,7 @@ -const chai = require("chai"); -const { expect } = chai; -const cleanDb = require("../../utils/cleanDb"); -const profileDiffsQuery = require("../../../models/profileDiffs"); -const getProfileDiffs = require("../../fixtures/profileDiffs/profileDiffs"); +import { expect } from "chai"; +import cleanDb from "../../utils/cleanDb.js"; +import profileDiffsQuery from "../../../models/profileDiffs.js"; +import { getProfileDiffs } from "../../fixtures/profileDiffs/profileDiffs.js"; describe("profileDiffs", function () { afterEach(async function () { diff --git a/test/unit/models/progresses.test.js b/test/unit/models/progresses.test.js index 2ee7f2ab8..d8f5c1d73 100644 --- a/test/unit/models/progresses.test.js +++ b/test/unit/models/progresses.test.js @@ -1,18 +1,17 @@ -const chai = require("chai"); -const sinon = require("sinon"); -const { expect } = chai; -const cleanDb = require("../../utils/cleanDb"); -const { addUserDetailsToProgressDocs, getPaginatedProgressDocument } = require("../../../models/progresses"); -const fireStore = require("../../../utils/firestore"); -const progressesCollection = fireStore.collection("progresses"); -const { stubbedModelTaskProgressData, stubbedModelProgressData } = require("../../fixtures/progress/progresses"); -const addUser = require("../../utils/addUser"); -const userDataArray = require("../../fixtures/user/user")(); -const { removeSensitiveInfo } = require("../../../services/dataAccessLayer"); -const { - PROGRESSES_RESPONSE_MESSAGES: { PROGRESS_DOCUMENT_NOT_FOUND }, -} = require("../../../constants/progresses"); -const users = require("../../../models/users"); +import { expect } from "chai"; +import sinon from "sinon"; +import cleanDb from "../../utils/cleanDb.js"; +import { addUserDetailsToProgressDocs, getPaginatedProgressDocument } from "../../../models/progresses.js"; +import firestore from "../../../utils/firestore.js"; +import { PROGRESSES_RESPONSE_MESSAGES } from "../../../constants/progresses.js"; +import { stubbedModelTaskProgressData, stubbedModelProgressData } from "../../fixtures/progress/progresses.js"; +import addUser from "../../utils/addUser.js"; +import userDataArray from "../../fixtures/user/user.js"; +import { removeSensitiveInfo } from "../../../services/dataAccessLayer.js"; +import users from "../../../models/users.js"; + +const progressesCollection = firestore.collection("progresses"); + describe("progressModel", function () { afterEach(async function () { await cleanDb(); @@ -69,7 +68,7 @@ describe("progressModel", function () { }); throw new Error("Test failed: expected a NotFound error to be thrown."); } catch (err) { - expect(err.message).to.equal(PROGRESS_DOCUMENT_NOT_FOUND); + expect(err.message).to.equal(PROGRESSES_RESPONSE_MESSAGES.PROGRESS_DOCUMENT_NOT_FOUND); } }); diff --git a/test/unit/models/qrCodeAuth.test.js b/test/unit/models/qrCodeAuth.test.js index 2b961fa46..4551d8bbd 100644 --- a/test/unit/models/qrCodeAuth.test.js +++ b/test/unit/models/qrCodeAuth.test.js @@ -1,13 +1,12 @@ -const chai = require("chai"); -const { expect } = chai; +import { expect } from "chai"; +import cleanDb from "../../utils/cleanDb.js"; +import firestore from "../../../utils/firestore.js"; +import qrCodeAuth from "../../../models/qrCodeAuth.js"; +import { userDeviceInfoDataArray } from "../../fixtures/qrCodeAuth/qrCodeAuth.js"; +import users from "../../../models/users.js"; +import userDataArray from "../../fixtures/user/user.js"; -const cleanDb = require("../../utils/cleanDb"); -const firestore = require("../../../utils/firestore"); -const qrCodeAuth = require("../../../models/qrCodeAuth"); -const { userDeviceInfoDataArray } = require("../../fixtures/qrCodeAuth/qrCodeAuth"); const qrCodeAuthModel = firestore.collection("QrCodeAuth"); -const users = require("../../../models/users"); -const userDataArray = require("../../fixtures/user/user")(); /** * Test the model functions and validate the data stored */ diff --git a/test/unit/models/recruiters.test.js b/test/unit/models/recruiters.test.js index e08e1ca8e..c9a0b99d5 100644 --- a/test/unit/models/recruiters.test.js +++ b/test/unit/models/recruiters.test.js @@ -2,17 +2,15 @@ * This eslint rule is disabled because of https://github.com/nodesecurity/eslint-plugin-security/issues/21 * It gives linting errors in testing the DB data with keys from fixtures */ -/* eslint-disable security/detect-object-injection */ -const chai = require("chai"); -const { expect } = chai; +import { expect } from "chai"; +import cleanDb from "../../utils/cleanDb.js"; +import recruiters from "../../../models/recruiters.js"; +import firestore from "../../../utils/firestore.js"; +import { recruiterDataArray } from "../../fixtures/recruiter/recruiter.js"; +import userDataArray from "../../fixtures/user/user.js"; +import addUser from "../../utils/addUser.js"; -const cleanDb = require("../../utils/cleanDb"); -const recruiters = require("../../../models/recruiters"); -const firestore = require("../../../utils/firestore"); const recruiterModel = firestore.collection("recruiters"); -const { recruiterDataArray } = require("../../fixtures/recruiter/recruiter"); -const userDataArray = require("../../fixtures/user/user")(); -const addUser = require("../../utils/addUser"); describe("Recruiters", function () { beforeEach(async function () { diff --git a/test/unit/models/task-requests.test.js b/test/unit/models/task-requests.test.js index 306005594..39a32fd6a 100644 --- a/test/unit/models/task-requests.test.js +++ b/test/unit/models/task-requests.test.js @@ -1,8 +1,8 @@ -const chai = require("chai"); -const sinon = require("sinon"); -const { expect } = chai; -const assert = require("chai").assert; -const { +import { expect } from "chai"; +import sinon from "sinon"; +import assert from "chai.assert"; + +import { createRequest, fetchTaskRequests, approveTaskRequest, @@ -12,25 +12,27 @@ const { removeOldField, addUsersCountAndCreatedAt, rejectTaskRequest, -} = require("./../../../models/taskRequests"); -const { +} from "./../../../models/taskRequests.js"; +import { TASK_REQUEST_TYPE, TASK_REQUEST_STATUS, TASK_REQUEST_ERROR_MESSAGE, -} = require("./../../../constants/taskRequests"); +} from "./../../../constants/taskRequests.js"; -const mockData = require("../../fixtures/task-requests/task-requests"); -const firestore = require("../../../utils/firestore"); -const taskRequestsCollection = firestore.collection("taskRequests"); -const cleanDb = require("../../utils/cleanDb"); -const userModel = require("../../../models/users"); -const tasksModel = require("../../../models/tasks"); -const usersService = require("../../../services/dataAccessLayer"); +import mockData from "../../fixtures/task-requests/task-requests.js"; +import firestore from "../../../utils/firestore.js"; + +import cleanDb from "../../utils/cleanDb.js"; +import userModel from "../../../models/users.js"; +import tasksModel from "../../../models/tasks.js"; +import usersService from "../../../services/dataAccessLayer.js"; + +import { TASK_STATUS, DEFAULT_TASK_PRIORITY } from "../../../constants/tasks.js"; +import tasksData from "../../fixtures/tasks/tasks.js"; +import userData from "../../fixtures/user/user.js"; const tasksCollection = firestore.collection("tasks"); -const { TASK_STATUS, DEFAULT_TASK_PRIORITY } = require("../../../constants/tasks"); -const tasksData = require("../../fixtures/tasks/tasks")(); -const userData = require("../../fixtures/user/user")(); +const taskRequestsCollection = firestore.collection("taskRequests"); describe("Task requests | models", function () { afterEach(async function () { diff --git a/test/unit/models/taskBasedStatusUpdate.test.js b/test/unit/models/taskBasedStatusUpdate.test.js index df149aa26..51c38126d 100644 --- a/test/unit/models/taskBasedStatusUpdate.test.js +++ b/test/unit/models/taskBasedStatusUpdate.test.js @@ -1,22 +1,23 @@ -const chai = require("chai"); -const sinon = require("sinon"); -const { expect } = chai; -const firestore = require("../../../utils/firestore"); -const userStatusModel = firestore.collection("usersStatus"); -const tasksModel = firestore.collection("tasks"); -const { +import { expect } from "chai"; +import sinon from "sinon"; +import firestore from "../../../utils/firestore.js"; + +import { updateStatusOnTaskCompletion, updateUserStatusOnNewTaskAssignment, updateUserStatusOnTaskUpdate, batchUpdateUsersStatus, getTaskBasedUsersStatus, -} = require("../../../models/userStatus"); -const cleanDb = require("../../utils/cleanDb"); -const addUser = require("../../utils/addUser"); -const { userState } = require("../../../constants/userStatus"); -const userData = require("../../fixtures/user/user"); -const allTasks = require("../../fixtures/tasks/tasks"); -const { generateStatusDataForState } = require("../../fixtures/userStatus/userStatus"); +} from "../../../models/userStatus.js"; +import cleanDb from "../../utils/cleanDb.js"; +import addUser from "../../utils/addUser.js"; +import { userState } from "../../../constants/userStatus.js"; +import userData from "../../fixtures/user/user.js"; +import allTasks from "../../fixtures/tasks/tasks.js"; +import { generateStatusDataForState } from "../../fixtures/userStatus/userStatus.js"; + +const userStatusModel = firestore.collection("usersStatus"); +const tasksModel = firestore.collection("tasks"); describe("Update Status based on task update", function () { describe("Tests for the Model Function to Update Status Based on Task Completion", function () { diff --git a/test/unit/models/tasks.test.js b/test/unit/models/tasks.test.js index 0041c45e7..eb240080f 100644 --- a/test/unit/models/tasks.test.js +++ b/test/unit/models/tasks.test.js @@ -4,23 +4,23 @@ */ /* eslint-disable security/detect-object-injection */ -const chai = require("chai"); -const sinon = require("sinon"); -const { expect } = chai; -const cleanDb = require("../../utils/cleanDb"); -const tasksData = require("../../fixtures/tasks/tasks")(); -const tasks = require("../../../models/tasks"); -const { addDependency, updateTask, getBuiltTasks } = require("../../../models/tasks"); -const firestore = require("../../../utils/firestore"); -const { TASK_STATUS } = require("../../../constants/tasks"); +import { expect } from "chai"; +import sinon from "sinon"; +import cleanDb from "../../utils/cleanDb.js"; +import tasksData from "../../fixtures/tasks/tasks.js"; +import * as tasks from "../../../models/tasks.js"; +import { addDependency, updateTask, getBuiltTasks } from "../../../models/tasks.js"; +import firestore from "../../../utils/firestore.js"; +import { TASK_STATUS } from "../../../constants/tasks.js"; +import userData from "../../fixtures/user/user.js"; +import addUser from "../../utils/addUser.js"; +import { + usersData as abandonedUsersData, + tasksData as abandonedTasksData, +} from "../../fixtures/abandoned-tasks/departed-users.js"; + const dependencyModel = firestore.collection("TaskDependencies"); const tasksModel = firestore.collection("tasks"); -const userData = require("../../fixtures/user/user"); -const addUser = require("../../utils/addUser"); -const { - usersData: abandonedUsersData, - tasksData: abandonedTasksData, -} = require("../../fixtures/abandoned-tasks/departed-users"); describe("tasks", function () { afterEach(async function () { diff --git a/test/unit/models/userStatus.js b/test/unit/models/userStatus.test.ts similarity index 84% rename from test/unit/models/userStatus.js rename to test/unit/models/userStatus.test.ts index d537ce829..e0136ecf5 100644 --- a/test/unit/models/userStatus.js +++ b/test/unit/models/userStatus.test.ts @@ -1,16 +1,16 @@ -import { userFutureStatusData } from "../../fixtures/userFutureStatus/userFutureStatusData"; -const chai = require("chai"); -const sinon = require("sinon"); -const { NotFound, Forbidden } = require("http-errors"); -const { expect } = chai; -const firestore = require("../../../utils/firestore"); +import { userFutureStatusData } from "../../fixtures/userFutureStatus/userFutureStatusData.js"; +import { expect } from "chai"; +import sinon from "sinon"; +import { NotFound, Forbidden } from "http-errors"; +import firestore from "../../../utils/firestore.js"; +import { cancelOooStatus, addFutureStatus } from "../../../models/userStatus.js"; +import cleanDb from "../../utils/cleanDb.js"; +import addUser from "../../utils/addUser.js"; +import { userState } from "../../../constants/userStatus.js"; +import { generateStatusDataForCancelOOO, generateDefaultFutureStatus } from "../../fixtures/userStatus/userStatus.js"; + const userStatusModel = firestore.collection("usersStatus"); const tasksModel = firestore.collection("tasks"); -const { cancelOooStatus, addFutureStatus } = require("../../../models/userStatus"); -const cleanDb = require("../../utils/cleanDb"); -const addUser = require("../../utils/addUser"); -const { userState } = require("../../../constants/userStatus"); -const { generateStatusDataForCancelOOO, generateDefaultFutureStatus } = require("../../fixtures/userStatus/userStatus"); describe("tasks", function () { let userId; diff --git a/test/unit/models/users.test.js b/test/unit/models/users.test.ts similarity index 89% rename from test/unit/models/users.test.js rename to test/unit/models/users.test.ts index 3e4cdded1..8ca28c140 100644 --- a/test/unit/models/users.test.js +++ b/test/unit/models/users.test.ts @@ -1,27 +1,27 @@ +// @ts-nocheck + /** * This eslint rule is disabled because of https://github.com/nodesecurity/eslint-plugin-security/issues/21 * It gives linting errors in testing the DB data with keys from fixtures */ /* eslint-disable security/detect-object-injection */ -const chai = require("chai"); -const sinon = require("sinon"); -const { expect } = chai; -const cleanDb = require("../../utils/cleanDb"); -const users = require("../../../models/users"); -const firestore = require("../../../utils/firestore"); -const { userPhotoVerificationData, newUserPhotoVerificationData } = require("../../fixtures/user/photo-verification"); -const { generateStatusDataForState } = require("../../fixtures/userStatus/userStatus"); +import { expect } from "chai"; +import sinon from "sinon"; +import * as users from "../../../models/users.js"; +import firestore from "../../../utils/firestore.js"; +import cleanDb from "../../utils/cleanDb.js"; +import addUser from "../../utils/addUser.js"; +import { userState } from "../../../constants/userStatus.js"; +import joinData from "../../fixtures/user/join.js"; +import userDataArray from "../../fixtures/user/user.js"; +import { generateStatusDataForState } from "../../fixtures/userStatus/userStatus.js"; +import { usersData as abandonedUsersData } from "../../fixtures/abandoned-tasks/departed-users.js"; + const userModel = firestore.collection("users"); const userStatusModel = firestore.collection("usersStatus"); const joinModel = firestore.collection("applicants"); -const userDataArray = require("../../fixtures/user/user")(); -const joinData = require("../../fixtures/user/join")(); const photoVerificationModel = firestore.collection("photo-verification"); -const userData = require("../../fixtures/user/user"); -const addUser = require("../../utils/addUser"); -const { userState } = require("../../../constants/userStatus"); -const { usersData: abandonedUsersData } = require("../../fixtures/abandoned-tasks/departed-users"); /** * Test the model functions and validate the data stored */ @@ -33,13 +33,13 @@ describe("users", function () { describe("addOrUpdate", function () { it("should add the user collection and set the flag incompleteUserDetails and isNewUser and in_discord", async function () { - const userData = userDataArray[0]; - const { isNewUser, userId } = await users.addOrUpdate(userData); + const userDetails = userDataArray[0]; + const { isNewUser, userId } = await users.addOrUpdate(userDetails[0], null, false); const data = (await userModel.doc(userId).get()).data(); - Object.keys(userData).forEach((key) => { - expect(userData[key]).to.deep.equal(data[key]); + Object.keys(userDetails).forEach((key) => { + expect(userDetails[key]).to.deep.equal(data[key]); }); expect(data.incompleteUserDetails).to.equal(true); @@ -48,13 +48,13 @@ describe("users", function () { }); it("should update the user collection and unset the flag isNewUser", async function () { - const userData = userDataArray[0]; + const userDetails = userDataArray()[0]; // Add the user the first time - const { isNewUser } = await users.addOrUpdate(userData); + const { isNewUser } = await users.addOrUpdate(userDetails[0], null, false); // Update the user with same data - const { isNewUser: updatedIsNewUserFlag } = await users.addOrUpdate(userData); + const { isNewUser: updatedIsNewUserFlag } = await users.addOrUpdate(userDetails[0], null, false); expect(isNewUser).to.equal(true); expect(updatedIsNewUserFlag).to.equal(false); @@ -84,51 +84,55 @@ describe("users", function () { }); it("should return the user information when github username is passed", async function () { - const userData = userDataArray[0]; - await users.addOrUpdate(userData); + const userDetails = userDataArray[0]; + await users.addOrUpdate(userDetails[0], null, false); const githubUsername = "ankur"; const { user, userExists } = await users.fetchUser({ githubUsername }); + expect(user).to.haveOwnProperty("id"); expect(user).to.haveOwnProperty("username"); expect(user).to.haveOwnProperty("first_name"); expect(user).to.haveOwnProperty("last_name"); - expect(user.first_name).to.equal(userData.first_name); - expect(user.last_name).to.equal(userData.last_name); + expect(user.first_name).to.equal(userDetails.first_name); + expect(user.last_name).to.equal(userDetails.last_name); expect(userExists).to.equal(true); }); it("It should have created_At and updated_At fields", async function () { - const userData = userDataArray[15]; - await users.addOrUpdate(userData); + const userDetails = userDataArray[15]; + await users.addOrUpdate(userDetails[0], null, false); const githubUsername = "sahsisunny"; const { user, userExists } = await users.fetchUser({ githubUsername }); + expect(user).to.haveOwnProperty("created_at"); expect(user).to.haveOwnProperty("updated_at"); expect(userExists).to.equal(true); }); it("It should have github_created_at fields", async function () { - const userData = userDataArray[0]; - await users.addOrUpdate(userData); + const userDetails = userDataArray[0]; + await users.addOrUpdate(userDetails[0], null, false); const githubUsername = "ankur"; const { user } = await users.fetchUser({ githubUsername }); + expect(user).to.haveOwnProperty("github_created_at"); }); it("it should filter out the id field while updating profileDiff", async function () { - const userData = userDataArray[0]; - const { userId } = await users.addOrUpdate(userData); + const userDetails = userDataArray[0]; + const { userId } = await users.addOrUpdate(userDetails[0], null, false); const profileDiff = { id: "random-id", diff: "random-diff" }; - await users.addOrUpdate(profileDiff, userId); + await users.addOrUpdate(profileDiff, userId, false); const data = (await userModel.doc(userId).get()).data(); + expect(data).to.haveOwnProperty("diff"); expect(data.id).not.equal("random-id"); }); it("it should update profileDiff even if it is deeply nested", async function () { - const userData = userDataArray[0]; - const { userId } = await users.addOrUpdate(userData); + const userDetails = userDataArray[0]; + const { userId } = await users.addOrUpdate(userDetails[0], null, false); const profileDiffs = { level1: { level2: { @@ -150,7 +154,7 @@ describe("users", function () { }, }, }; - await users.addOrUpdate(profileDiffs, userId); + await users.addOrUpdate(profileDiffs, userId, false); const data = (await userModel.doc(userId).get()).data(); expect(data) .to.have.nested.property("level1.level2.level3.level4.level5.level6.level7.level8.level9.level10") @@ -184,10 +188,10 @@ describe("users", function () { }); describe("fetch user details based on discord id", function () { - let [userId0] = []; + let userId0: string; beforeEach(async function () { - const userArr = userData(); + const userArr = userDataArray(); userId0 = await addUser(userArr[0]); await userStatusModel.doc("userStatus000").set(generateStatusDataForState(userId0, userState.IDLE)); }); @@ -343,7 +347,7 @@ describe("users", function () { beforeEach(async function () { const addUsersPromises = []; userDataArray.forEach((user) => { - const userData = { + const userDataArray = { ...user, roles: { ...user.roles, @@ -351,7 +355,7 @@ describe("users", function () { archived: false, }, }; - addUsersPromises.push(userModel.add(userData)); + addUsersPromises.push(userModel.add(userDataArray)); }); await Promise.all(addUsersPromises); @@ -370,9 +374,9 @@ describe("users", function () { .get(); updatedUsers.forEach((user) => { - const userData = user.data(); - expect(userData.roles.in_discord).to.be.equal(false); - expect(userData.roles.archived).to.be.equal(true); + const userDataArray = user.data(); + expect(userDataArray.roles.in_discord).to.be.equal(false); + expect(userDataArray.roles.archived).to.be.equal(true); }); }); @@ -398,9 +402,9 @@ describe("users", function () { .get(); updatedUsers.forEach((user) => { - const userData = user.data(); - expect(userData.roles.in_discord).to.be.equal(false); - expect(userData.roles.archived).to.be.not.equal(true); + const userDataArray = user.data(); + expect(userDataArray.roles.in_discord).to.be.equal(false); + expect(userDataArray.roles.archived).to.be.not.equal(true); }); }); }); @@ -433,7 +437,7 @@ describe("users", function () { let [userId0, userId1, userId2] = []; beforeEach(async function () { - const userArr = userData(); + const userArr = userDataArray(); userId0 = await addUser(userArr[0]); userId1 = await addUser(userArr[1]); userId2 = await addUser(userArr[2]); @@ -553,7 +557,7 @@ describe("users", function () { }); it("should fetch users with modified roles : []", async function () { - const superUser = { ...userData()[4], disabled_roles: [] }; + const superUser = { ...userDataArray()[4], disabled_roles: [] }; const userId = await addUser(superUser); const userDoc = await users.fetchUser({ userId }); @@ -562,7 +566,7 @@ describe("users", function () { }); it("should fetch users with modified roles : super_user", async function () { - const superUser = { ...userData()[4], disabled_roles: ["super_user"] }; + const superUser = { ...userDataArray()[4], disabled_roles: ["super_user"] }; const userId = await addUser(superUser); const userDoc = await users.fetchUser({ userId }); @@ -571,7 +575,7 @@ describe("users", function () { }); it("should fetch users with modified roles : member", async function () { - const memberUser = { ...userData()[6], disabled_roles: ["member"] }; + const memberUser = { ...userDataArray()[6], disabled_roles: ["member"] }; const userId = await addUser(memberUser); const userDoc = await users.fetchUser({ userId }); @@ -581,9 +585,9 @@ describe("users", function () { it("should fetch users with modified roles : super_user & member", async function () { const userWithBothRoles = { - ...userData()[4], + ...userDataArray()[4], disabled_roles: ["super_user", "member"], - roles: { ...userData()[4].roles, member: true }, + roles: { ...userDataArray()[4].roles, member: true }, }; const userId = await addUser(userWithBothRoles); @@ -620,7 +624,7 @@ describe("users", function () { it("should return an empty array if there are no departed users in the database", async function () { await cleanDb(); - const activeUser = abandonedUsersData[2]; + const activeUser = [2]; await userModel.add(activeUser); const result = await users.fetchPaginatedUsers({ departed: "true" }); diff --git a/test/unit/models/wallet.test.js b/test/unit/models/wallet.test.ts similarity index 87% rename from test/unit/models/wallet.test.js rename to test/unit/models/wallet.test.ts index b8fa86381..4b41e2b81 100644 --- a/test/unit/models/wallet.test.js +++ b/test/unit/models/wallet.test.ts @@ -1,14 +1,13 @@ -const chai = require("chai"); -const { expect } = chai; +import { expect } from "chai"; +import firestore from "../../../utils/firestore.js"; +import addUser from "../../utils/addUser.js"; +import cleanDb from "../../utils/cleanDb.js"; -const cleanDb = require("../../utils/cleanDb"); -const firestore = require("../../../utils/firestore"); -const addUser = require("../../utils/addUser"); +import * as walletQuery from "../../../models/wallets.js"; +import currencies from "../../fixtures/currencies/currencies.js"; +import userDataArray from "../../fixtures/user/user.js"; const walletModel = firestore.collection("wallets"); -const walletQuery = require("../../../models/wallets"); -const currencies = require("../../fixtures/currencies/currencies"); -const userDataArray = require("../../fixtures/user/user")(); describe("wallets", function () { let userId; diff --git a/test/unit/services/authService.test.js b/test/unit/services/authService.test.js index fbadbabcb..cbcc4f14d 100644 --- a/test/unit/services/authService.test.js +++ b/test/unit/services/authService.test.js @@ -1,16 +1,15 @@ -const chai = require("chai"); -const { expect } = chai; -const chaiHttp = require("chai-http"); - -const authService = require("../../../services/authService"); +import * as chai from "chai"; +import chaiHttp from "chai-http"; +import { expect } from "chai"; +import { generateAuthToken, verifyAuthToken, decodeAuthToken } from "../../../services/authService.js"; chai.use(chaiHttp); describe("authService", function () { it("should validate the generated JWT", function (done) { const payload = { userId: 1 }; - const jwt = authService.generateAuthToken(payload); - const decodedValue = authService.verifyAuthToken(jwt); + const jwt = generateAuthToken(payload); + const decodedValue = verifyAuthToken(jwt); expect(decodedValue).to.have.all.keys("userId", "iat", "exp"); expect(decodedValue.userId).to.equal(payload.userId); @@ -20,8 +19,8 @@ describe("authService", function () { it("should decode the generated JWT", function (done) { const payload = { userId: 1 }; - const jwt = authService.generateAuthToken(payload); - const decodedValue = authService.decodeAuthToken(jwt); + const jwt = generateAuthToken(payload); + const decodedValue = decodeAuthToken(jwt); expect(decodedValue).to.have.all.keys("userId", "iat", "exp"); expect(decodedValue.userId).to.equal(payload.userId); diff --git a/test/unit/services/dataAccessLayer.test.js b/test/unit/services/dataAccessLayer.test.js index b55c8475f..098595cd5 100644 --- a/test/unit/services/dataAccessLayer.test.js +++ b/test/unit/services/dataAccessLayer.test.js @@ -1,11 +1,12 @@ -const chai = require("chai"); -const chaiHttp = require("chai-http"); +import sinon from "sinon"; +import * as chai from "chai"; +import chaiHttp from "chai-http"; -const userQuery = require("../../../models/users"); -const members = require("../../../models/members"); -const sinon = require("sinon"); +import userQuery from "../../../models/users.js"; +import members from "../../../models/members.js"; +import { KEYS_NOT_ALLOWED, ACCESS_LEVEL } from "../../../constants/userDataLevels.js"; -const { +import { retrieveUsers, removeSensitiveInfo, retrieveDiscordUsers, @@ -14,11 +15,8 @@ const { retreiveFilteredUsers, levelSpecificAccess, fetchUsersForKeyValues, -} = require("../../../services/dataAccessLayer"); - -const { KEYS_NOT_ALLOWED, ACCESS_LEVEL } = require("../../../constants/userDataLevels"); - -const userData = require("../../fixtures/user/user")(); +} from "../../../services/dataAccessLayer.js"; +import userData from "../../fixtures/user/user.js"; chai.use(chaiHttp); const expect = chai.expect; diff --git a/test/unit/services/discordMembersService.test.js b/test/unit/services/discordMembersService.test.js index e2fa596fd..9486741d0 100644 --- a/test/unit/services/discordMembersService.test.js +++ b/test/unit/services/discordMembersService.test.js @@ -1,7 +1,7 @@ -const chai = require("chai"); -const chaiHttp = require("chai-http"); -const sinon = require("sinon"); -const { getDiscordMemberDetails } = require("../../../services/discordMembersService"); +import * as chai from "chai"; +import chaiHttp from "chai-http"; +import sinon from "sinon"; +import { getDiscordMemberDetails } from "../../../services/discordMembersService.js"; chai.use(chaiHttp); const expect = chai.expect; diff --git a/test/unit/services/discordService.test.js b/test/unit/services/discordService.test.js index 5f51955a0..20a46c2e8 100644 --- a/test/unit/services/discordService.test.js +++ b/test/unit/services/discordService.test.js @@ -1,19 +1,19 @@ -const { expect } = require("chai"); -const firestore = require("../../../utils/firestore"); -const { +import { expect } from "chai"; +import firestore from "../../../utils/firestore.js"; +import { setInDiscordFalseScript, addRoleToUser, getDiscordMembers, removeRoleFromUser, setUserDiscordNickname, deleteGroupRoleFromDiscord, -} = require("../../../services/discordService"); -const { fetchAllUsers } = require("../../../models/users"); -const Sinon = require("sinon"); +} from "../../../services/discordService.js"; +import { fetchAllUsers } from "../../../models/users.js"; +import Sinon from "sinon"; +import userDataArray from "../../fixtures/user/user.js"; +import discordMembersArray from "../../fixtures/discordResponse/discord-response.js"; + const userModel = firestore.collection("users"); -const userDataArray = require("../../fixtures/user/user")(); -const discordMembersArray = require("../../fixtures/discordResponse/discord-response"); -// const { func } = require("joi"); let fetchStub; describe("Discord services", function () { describe("setInDiscordFalseScript", function () { diff --git a/test/unit/services/generateAuthToken.test.js b/test/unit/services/generateAuthToken.test.js index 588cdcdf7..445b7e51f 100644 --- a/test/unit/services/generateAuthToken.test.js +++ b/test/unit/services/generateAuthToken.test.js @@ -1,5 +1,5 @@ -const { expect } = require("chai"); -const { generateAuthToken } = require("../../../services/authService"); +import { expect } from "chai"; +import { generateAuthToken } from "../../../services/authService.js"; describe("RDS-session cookie as a unique token", function () { it("should generate cookie as token", function () { diff --git a/test/unit/services/getFcmTokenFromUserId.test.js b/test/unit/services/getFcmTokenFromUserId.test.js index 76f8b9ab5..04c2dd329 100644 --- a/test/unit/services/getFcmTokenFromUserId.test.js +++ b/test/unit/services/getFcmTokenFromUserId.test.js @@ -1,8 +1,7 @@ -const chai = require("chai"); -const expect = chai.expect; -const { saveFcmToken } = require("../../../models/fcmToken"); -const cleanDb = require("../../utils/cleanDb"); -const { getFcmTokenFromUserId } = require("../../../services/getFcmTokenFromUserId"); +import { expect } from "chai"; +import { saveFcmToken } from "../../../models/fcmToken.js"; +import cleanDb from "../../utils/cleanDb.js"; +import { getFcmTokenFromUserId } from "../../../services/getFcmTokenFromUserId.js"; describe("FCM token services", function () { describe("Get FCM token from user id", function () { diff --git a/test/unit/services/getUserIdsFromRoleId.test.js b/test/unit/services/getUserIdsFromRoleId.test.js index 92cbcd3ee..2c466ea12 100644 --- a/test/unit/services/getUserIdsFromRoleId.test.js +++ b/test/unit/services/getUserIdsFromRoleId.test.js @@ -1,8 +1,7 @@ -const chai = require("chai"); -const expect = chai.expect; -const cleanDb = require("../../utils/cleanDb"); -const { addGroupRoleToMember } = require("../../../models/discordactions"); -const { getUserIdsFromRoleId } = require("../../../services/getUserIdsFromRoleId"); +import { expect } from "chai"; +import cleanDb from "../../utils/cleanDb.js"; +import { addGroupRoleToMember } from "../../../models/discordactions.js"; +import { getUserIdsFromRoleId } from "../../../services/getUserIdsFromRoleId.js"; describe("FCM token services", function () { describe("get user id from role id", function () { diff --git a/test/unit/services/githubService.test.js b/test/unit/services/githubService.test.js index 60e27ded2..aba8be0f3 100644 --- a/test/unit/services/githubService.test.js +++ b/test/unit/services/githubService.test.js @@ -1,14 +1,12 @@ -const chai = require("chai"); -const sinon = require("sinon"); -const { expect } = chai; +import { expect } from "chai"; +import sinon from "sinon"; +import axios from "../../../utils/fetch.js"; +import githubService from "../../../services/githubService.js"; +import githubUserInfo from "../../fixtures/auth/githubUserInfo.js"; +import { prDates } from "../../fixtures/pullrequests/pullrequests.js"; +import cleanDb from "../../utils/cleanDb.js"; +import addUser from "../../utils/addUser.js"; -const cleanDb = require("../../utils/cleanDb"); -const addUser = require("../../utils/addUser"); -const axios = require("../../../utils/fetch"); - -const githubService = require("../../../services/githubService"); -const githubUserInfo = require("../../fixtures/auth/githubUserInfo")(); -const { prDates } = require("../../fixtures/pullrequests/pullrequests"); describe("githubService", function () { beforeEach(async function () { sinon.stub(axios, "fetch").returnsArg(0); diff --git a/test/unit/services/tasks.test.js b/test/unit/services/tasks.test.js index 7fb6d0a3e..ec22447d3 100644 --- a/test/unit/services/tasks.test.js +++ b/test/unit/services/tasks.test.js @@ -1,18 +1,13 @@ -const Sinon = require("sinon"); -const { expect } = require("chai"); - -const firestore = require("../../../utils/firestore"); +import { expect } from "chai"; +import Sinon from "sinon"; +import firestore from "../../../utils/firestore.js"; +import cleanDb from "../../utils/cleanDb.js"; +import taskDataArray from "../../fixtures/tasks/tasks.js"; +import { fetchOrphanedTasks } from "../../../services/tasks.js"; +import { usersData, tasksData } from "../../fixtures/abandoned-tasks/departed-users.js"; +import * as tasks from "../../../models/tasks.js"; const tasksModel = firestore.collection("tasks"); const userModel = firestore.collection("users"); -const cleanDb = require("../../utils/cleanDb"); -const taskDataArray = require("../../fixtures/tasks/tasks")(); -const { fetchOrphanedTasks } = require("../../../services/tasks"); -const { - usersData: abandonedUsersData, - tasksData: abandonedTasksData, -} = require("../../fixtures/abandoned-tasks/departed-users"); -const { updateTaskStatusToDone } = require("../../../models/tasks"); -const tasksQuery = require("../../../models/tasks"); describe("Tasks services", function () { describe("task status COMPLETED to DONE in bulk", function () { @@ -50,7 +45,7 @@ describe("Tasks services", function () { }); it("successfully updated task status COMPLETED To DONE", async function () { - const res = await updateTaskStatusToDone(tasks); + const res = await tasks.updateTaskStatusToDone(tasks); expect(res).to.deep.equal({ totalUpdatedStatus: 15, @@ -69,7 +64,7 @@ describe("Tasks services", function () { }, }); - const res = await updateTaskStatusToDone(tasks); + const res = await tasks.updateTaskStatusToDone(tasks); expect(res).to.deep.equal({ totalUpdatedStatus: 0, @@ -84,10 +79,10 @@ describe("Tasks services", function () { beforeEach(async function () { await cleanDb(); - const userPromises = abandonedUsersData.map((user) => userModel.doc(user.id).set(user)); + const userPromises = usersData.map((user) => userModel.doc(user.id).set(user)); await Promise.all(userPromises); - const taskPromises = abandonedTasksData.map((task) => tasksModel.add(task)); + const taskPromises = tasksData.map((task) => tasksModel.add(task)); await Promise.all(taskPromises); }); @@ -120,10 +115,10 @@ describe("Tasks services", function () { it("should handle case when no users are archived", async function () { await cleanDb(); - const activeUser = abandonedUsersData[2]; + const activeUser = usersData[2]; await userModel.add(activeUser); - const activeTask = abandonedTasksData[3]; + const activeTask = tasksData[3]; await tasksModel.add(activeTask); const orphanedTasks = await fetchOrphanedTasks(); @@ -132,7 +127,7 @@ describe("Tasks services", function () { }); it("should handle errors gracefully if getUsersWithIncompleteTasks fails", async function () { - Sinon.stub(tasksQuery, "fetchIncompleteTasksByUserIds").throws(new Error("Database query failed")); + Sinon.stub(tasks, "fetchIncompleteTasksByUserIds").throws(new Error("Database query failed")); try { await fetchOrphanedTasks(); diff --git a/test/unit/services/users.test.js b/test/unit/services/users.test.js index 148cb7916..64d1d27bc 100644 --- a/test/unit/services/users.test.js +++ b/test/unit/services/users.test.js @@ -1,18 +1,15 @@ -const Sinon = require("sinon"); -const { expect } = require("chai"); +import { expect } from "chai"; +import Sinon from "sinon"; +import firestore from "../../../utils/firestore.js"; +import cleanDb from "../../utils/cleanDb.js"; +import userDataArray from "../../fixtures/user/user.js"; +import { generateUniqueUsername, getUsersWithIncompleteTasks } from "../../../services/users.js"; +import { addOrUpdate, archiveUsers } from "../../../models/users.js"; +import { usersData, tasksData } from "../../fixtures/abandoned-tasks/departed-users.js"; +import tasks from "../../../models/tasks.js"; -const firestore = require("../../../utils/firestore"); const userModel = firestore.collection("users"); const tasksModel = firestore.collection("tasks"); -const cleanDb = require("../../utils/cleanDb"); -const userDataArray = require("../../fixtures/user/user")(); -const { generateUniqueUsername, getUsersWithIncompleteTasks } = require("../../../services/users"); -const { addOrUpdate, archiveUsers } = require("../../../models/users"); -const { - usersData: abandonedUsersData, - tasksData: abandonedTasksData, -} = require("../../fixtures/abandoned-tasks/departed-users"); -const tasks = require("../../../models/tasks"); describe("Users services", function () { describe("archive inactive discord users in bulk", function () { @@ -111,7 +108,7 @@ describe("Users services", function () { beforeEach(async function () { await cleanDb(); - const taskPromises = abandonedTasksData.map((task) => tasksModel.add(task)); + const taskPromises = tasksData.map((task) => tasksModel.add(task)); await Promise.all(taskPromises); }); @@ -120,7 +117,7 @@ describe("Users services", function () { }); it("should fetch users with abandoned tasks", async function () { - const users = abandonedUsersData.slice(0, 2); + const users = usersData.slice(0, 2); const usersWithAbandonedTasks = await getUsersWithIncompleteTasks(users); expect(usersWithAbandonedTasks).to.be.an("array"); @@ -128,7 +125,7 @@ describe("Users services", function () { }); it("should not include user who are present in discord or not archived", async function () { - const users = abandonedUsersData.slice(0, 2); + const users = usersData.slice(0, 2); const result = await getUsersWithIncompleteTasks(users); result.forEach((user) => { @@ -140,7 +137,7 @@ describe("Users services", function () { it("should return an empty array if there are no users with abandoned tasks", async function () { await cleanDb(); - const activeTask = abandonedTasksData[3]; + const activeTask = tasksData[3]; await tasksModel.add(activeTask); const result = await getUsersWithIncompleteTasks([]); @@ -149,7 +146,7 @@ describe("Users services", function () { }); it("should throw an error if fetchIncompleteTaskForUser fails", async function () { - const users = abandonedUsersData.slice(0, 2); + const users = usersData.slice(0, 2); Sinon.stub(tasks, "fetchIncompleteTasksByUserIds").throws(new Error("Database query failed")); try { diff --git a/test/unit/utils/cache.test.js b/test/unit/utils/cache.test.js index 9d78c67e1..c2c74f0ff 100644 --- a/test/unit/utils/cache.test.js +++ b/test/unit/utils/cache.test.js @@ -1,5 +1,5 @@ -const { expect } = require("chai"); -const { cachedKeysStore } = require("../../../utils/cache"); +import { expect } from "chai"; +import { cachedKeysStore } from "../../../utils/cache.js"; describe("cachedKeysStore", function () { let keyStore; diff --git a/test/unit/utils/customWordCountValidator.test.js b/test/unit/utils/customWordCountValidator.test.js index c2f504433..24ea66634 100644 --- a/test/unit/utils/customWordCountValidator.test.js +++ b/test/unit/utils/customWordCountValidator.test.js @@ -1,5 +1,5 @@ -const { expect } = require("chai"); -const { customWordCountValidator } = require("./../../../utils/customWordCountValidator"); +import { expect } from "chai"; +import { customWordCountValidator } from "./../../../utils/customWordCountValidator.js"; describe("customWordCountValidator", function () { it("should return an error if the word count is less than the desired count", function () { diff --git a/test/unit/utils/data-access.test.js b/test/unit/utils/data-access.test.js index 42f1b1d06..5b67010af 100644 --- a/test/unit/utils/data-access.test.js +++ b/test/unit/utils/data-access.test.js @@ -1,5 +1,5 @@ -const { expect } = require("chai"); -const { removeObjectField } = require("../../../utils/data-access"); +import { expect } from "chai"; +import { removeObjectField } from "../../../utils/data-access.js"; describe("removeObjectField", function () { it("should remove a field from a nested object", function () { diff --git a/test/unit/utils/events.test.js b/test/unit/utils/events.test.js index 527c849ff..8a925c102 100644 --- a/test/unit/utils/events.test.js +++ b/test/unit/utils/events.test.js @@ -1,5 +1,5 @@ -const { expect } = require("chai"); -const { removeUnwantedProperties } = require("../../../utils/events"); +import { expect } from "chai"; +import { removeUnwantedProperties } from "../../../utils/events.js"; describe("removeUnwantedProperties", function () { it("should remove unwanted properties from an object", function () { diff --git a/test/unit/utils/generateAuthTokenForCloudflare.test.js b/test/unit/utils/generateAuthTokenForCloudflare.test.js index e6eb82a0a..f1113cabc 100644 --- a/test/unit/utils/generateAuthTokenForCloudflare.test.js +++ b/test/unit/utils/generateAuthTokenForCloudflare.test.js @@ -1,5 +1,5 @@ -const { expect } = require("chai"); -const { generateAuthTokenForCloudflare } = require("../../../utils/discord-actions"); +import { expect } from "chai"; +import { generateAuthTokenForCloudflare } from "../../../utils/discord-actions.js"; describe("test generate auth token for cloudflare", function () { it("generates auth token", function () { diff --git a/test/unit/utils/genrateCloudFlareHeaders.test.js b/test/unit/utils/genrateCloudFlareHeaders.test.js index 1e0058ada..e10523e9f 100644 --- a/test/unit/utils/genrateCloudFlareHeaders.test.js +++ b/test/unit/utils/genrateCloudFlareHeaders.test.js @@ -1,5 +1,5 @@ -const { expect } = require("chai"); -const { generateCloudFlareHeaders } = require("../../../utils/discord-actions"); +import { expect } from "chai"; +import { generateCloudFlareHeaders } from "../../../utils/discord-actions.js"; describe("generateCloudFlareHeaders", function () { it("generates headers with property Content-Type and Authorization", function () { diff --git a/test/unit/utils/helper.test.js b/test/unit/utils/helper.test.js index 83ee8f054..c2c0d4b1e 100644 --- a/test/unit/utils/helper.test.js +++ b/test/unit/utils/helper.test.js @@ -1,12 +1,11 @@ -const chai = require("chai"); -const { +import { expect } from "chai"; +import { getDateTimeRangeForPRs, getQualifiers, getPaginatedLink, findSubscribedGroupIds, -} = require("../../../utils/helper"); -const { TASK_STATUS, TASK_SIZE } = require("../../../constants/tasks"); -const { expect } = chai; +} from "../../../utils/helper.js"; +import { TASK_STATUS, TASK_SIZE } from "../../../constants/tasks.js"; describe("helper", function () { describe("getDateTimeRangeForPRs", function () { diff --git a/test/unit/utils/logs.test.js b/test/unit/utils/logs.test.js index c9a995a8a..2453fc444 100644 --- a/test/unit/utils/logs.test.js +++ b/test/unit/utils/logs.test.js @@ -1,5 +1,5 @@ -const { expect } = require("chai"); -const { formatLogsForFeed, mapify } = require("../../../utils/logs"); +import { expect } from "chai"; +import { formatLogsForFeed, mapify } from "../../../utils/logs.js"; describe("logs utils", function () { describe("formatLogsForFeed", function () { diff --git a/test/unit/utils/parseSearchQuery.test.js b/test/unit/utils/parseSearchQuery.test.js index 347d752e2..40eba8c17 100644 --- a/test/unit/utils/parseSearchQuery.test.js +++ b/test/unit/utils/parseSearchQuery.test.js @@ -1,5 +1,5 @@ -const { expect } = require("chai"); -const { parseSearchQuery } = require("../../../utils/tasks"); +import { expect } from "chai"; +import { parseSearchQuery } from "../../../utils/tasks.js"; describe("parseSearchQuery", function () { it("should parse a valid query string", function () { diff --git a/test/unit/utils/progresses.test.js b/test/unit/utils/progresses.test.js index a5c7277cc..5b0495493 100644 --- a/test/unit/utils/progresses.test.js +++ b/test/unit/utils/progresses.test.js @@ -1,14 +1,12 @@ -const chai = require("chai"); -const { expect } = chai; -const sinon = require("sinon"); -const cleanDb = require("../../utils/cleanDb"); -const { buildQueryToFetchPaginatedDocs, getPaginatedProgressDocs } = require("../../../utils/progresses"); -const fireStore = require("../../../utils/firestore"); +import { expect } from "chai"; +import sinon from "sinon"; +import fireStore from "../../../utils/firestore.js"; +import { buildQueryToFetchPaginatedDocs, getPaginatedProgressDocs } from "../../../utils/progresses.js"; +import { stubbedModelProgressData, stubbedModelTaskProgressData } from "../../fixtures/progress/progresses.js"; +import cleanDb from "../../utils/cleanDb.js"; +import { PROGRESSES_RESPONSE_MESSAGES } from "../../../constants/progresses.js"; + const progressesCollection = fireStore.collection("progresses"); -const { stubbedModelTaskProgressData, stubbedModelProgressData } = require("../../fixtures/progress/progresses"); -const { - PROGRESSES_RESPONSE_MESSAGES: { PROGRESS_DOCUMENT_NOT_FOUND }, -} = require("../../../constants/progresses"); describe("Utils | Progresses", function () { afterEach(async function () { @@ -131,7 +129,7 @@ describe("Utils | Progresses", function () { await getPaginatedProgressDocs(query); throw new Error("Test failed: expected a NotFound error to be thrown."); } catch (err) { - expect(err.message).to.equal(PROGRESS_DOCUMENT_NOT_FOUND); + expect(err.message).to.equal(PROGRESSES_RESPONSE_MESSAGES.PROGRESS_DOCUMENT_NOT_FOUND); } }); diff --git a/test/unit/utils/queryParser.test.js b/test/unit/utils/queryParser.test.js index 562034c74..2d847af5a 100644 --- a/test/unit/utils/queryParser.test.js +++ b/test/unit/utils/queryParser.test.js @@ -1,5 +1,5 @@ -const { expect } = require("chai"); -const { parseQueryParams } = require("../../../utils/queryParser"); +import { expect } from "chai"; +import { parseQueryParams } from "../../../utils/queryParser.js"; describe("parseQueryParams", function () { it("parses query parameters correctly", function () { diff --git a/test/unit/utils/remvoeDiscordRoleFromUser.test.ts b/test/unit/utils/remvoeDiscordRoleFromUser.test.ts index 1fde9027c..50b045b4e 100644 --- a/test/unit/utils/remvoeDiscordRoleFromUser.test.ts +++ b/test/unit/utils/remvoeDiscordRoleFromUser.test.ts @@ -1,7 +1,7 @@ import chai from "chai"; import Sinon from "sinon"; import { logType } from "../../../constants/logs"; -import discordActions from "../../../models/discordactions"; +import * as discordActions from "../../../models/discordactions"; import { addLog } from "../../../models/logs"; import firestore from "../../../utils/firestore"; import { removeDiscordRoleFromUser } from "../../../utils/removeDiscordRoleFromUser"; diff --git a/test/unit/utils/rqlQueryParser.test.js b/test/unit/utils/rqlQueryParser.test.js index 101fb1fb2..3618c29b2 100644 --- a/test/unit/utils/rqlQueryParser.test.js +++ b/test/unit/utils/rqlQueryParser.test.js @@ -1,6 +1,7 @@ -import { Operators, QueryTypes } from "../../../typeDefinitions/rqlParser"; -const { expect } = require("chai"); -const { RQLQueryParser } = require("../../../utils/RQLParser"); +import { Operators, QueryTypes } from "../../../typeDefinitions/rqlParser.js"; +import { RQLQueryParser } from "../../../utils/RQLParser.js"; +import { expect } from "chai"; + describe("RQLQueryParser", function () { it("should parse filter queries", function () { const queryString = "key:value"; diff --git a/test/unit/utils/sendTaskUpdate.test.js b/test/unit/utils/sendTaskUpdate.test.js index c8f9fcc6a..ae4781d09 100644 --- a/test/unit/utils/sendTaskUpdate.test.js +++ b/test/unit/utils/sendTaskUpdate.test.js @@ -1,7 +1,6 @@ -import chai from "chai"; +import { expect } from "chai"; import sinon from "sinon"; -import { sendTaskUpdate } from "../../../utils/sendTaskUpdate"; -const { expect } = chai; +import { sendTaskUpdate } from "../../../utils/sendTaskUpdate.js"; describe("sendTaskUpdate function", function () { let fetchMock; diff --git a/test/unit/utils/taskBasedStatusUpdates.test.js b/test/unit/utils/taskBasedStatusUpdates.test.js index b589703af..9db7af2f8 100644 --- a/test/unit/utils/taskBasedStatusUpdates.test.js +++ b/test/unit/utils/taskBasedStatusUpdates.test.js @@ -1,9 +1,8 @@ -const chai = require("chai"); -const sinon = require("sinon"); -const { NotFound } = require("http-errors"); -const { expect } = chai; -const { userState } = require("../../../constants/userStatus"); -const { +import { expect } from "chai"; +import sinon from "sinon"; +import { NotFound } from "http-errors"; +import { userState } from "../../../constants/userStatus.js"; +import { generateAlreadyExistingStatusResponse, getUserIdFromUserName, checkIfUserHasLiveTasks, @@ -12,7 +11,7 @@ const { updateCurrentStatusToState, updateFutureStatusToState, getNextDayTimeStamp, -} = require("../../../utils/userStatus"); +} from "../../../utils/userStatus.js"; describe("Task Based User Status Update Util Functions", function () { it('should return an object with status "success" and message that the state is already in that state', function () { diff --git a/test/unit/utils/tasks.test.js b/test/unit/utils/tasks.test.js index 942e5b340..db817d68c 100644 --- a/test/unit/utils/tasks.test.js +++ b/test/unit/utils/tasks.test.js @@ -1,7 +1,7 @@ -const { expect } = require("chai"); -const { transformTasksUsersQuery } = require("../../../utils/tasks"); -const { RQLQueryParser } = require("../../../utils/RQLParser"); -const { tasksUsersStatus } = require("../../../constants/tasks"); +import { expect } from "chai"; +import { transformTasksUsersQuery } from "../../../utils/tasks.js"; +import { RQLQueryParser } from "../../../utils/RQLParser.js"; +import { tasksUsersStatus } from "../../../constants/tasks.js"; describe("Utils | Tasks", function () { describe("transformTasksUsersQuery", function () { diff --git a/test/unit/utils/time.test.js b/test/unit/utils/time.test.js index 22637ddb8..9500be39e 100644 --- a/test/unit/utils/time.test.js +++ b/test/unit/utils/time.test.js @@ -1,11 +1,8 @@ -const chai = require("chai"); -const sinon = require("sinon"); -const { expect } = chai; - -const cleanDb = require("../../utils/cleanDb"); -const timeUtils = require("../../../utils/time"); - -const timeData = require("../../fixtures/time/time"); +import { expect } from "chai"; +import sinon from "sinon"; +import cleanDb from "../../utils/cleanDb.js"; +import timeUtils from "../../../utils/time.js"; +import timeData from "../../fixtures/time/time.js"; describe("time", function () { afterEach(async function () { diff --git a/test/unit/utils/transformQuery.test.js b/test/unit/utils/transformQuery.test.js index d2e474397..596344544 100644 --- a/test/unit/utils/transformQuery.test.js +++ b/test/unit/utils/transformQuery.test.js @@ -1,6 +1,6 @@ -const { expect } = require("chai"); -const { transformQuery } = require("../../../utils/tasks"); -const { MAPPED_TASK_STATUS, TASK_STATUS } = require("../../../constants/tasks"); +import { expect } from "chai"; +import { transformQuery } from "../../../utils/tasks.js"; +import { MAPPED_TASK_STATUS, TASK_STATUS } from "../../../constants/tasks.js"; describe("transformQuery", function () { it("should transfrom status to it's mapped value", function () { diff --git a/test/unit/utils/userStatus.test.js b/test/unit/utils/userStatus.test.js index 9b3457367..302199cab 100644 --- a/test/unit/utils/userStatus.test.js +++ b/test/unit/utils/userStatus.test.js @@ -1,11 +1,10 @@ -const chai = require("chai"); -const { expect } = chai; -const { generateNewStatus, checkIfUserHasLiveTasks, convertTimestampsToUTC } = require("../../../utils/userStatus"); -const { userState } = require("../../../constants/userStatus"); -const { +import { expect } from "chai"; +import { generateNewStatus, checkIfUserHasLiveTasks, convertTimestampsToUTC } from "../../../utils/userStatus.js"; +import { userState } from "../../../constants/userStatus.js"; +import { OutputFixtureForFnConvertTimestampsToUTC, inputFixtureForFnConvertTimestampsToUTC, -} = require("../../fixtures/userStatus/userStatus"); +} from "../../fixtures/userStatus/userStatus.js"; describe("User Status Functions", function () { describe("generateNewStatus", function () { diff --git a/test/unit/utils/userStatusValidator.test.js b/test/unit/utils/userStatusValidator.test.js index d3cbfe87b..8ca709cd4 100644 --- a/test/unit/utils/userStatusValidator.test.js +++ b/test/unit/utils/userStatusValidator.test.js @@ -1,6 +1,6 @@ -const Sinon = require("sinon"); -const { expect } = require("chai"); -const { validateMassUpdate } = require("../../../middlewares/validators/userStatus"); +import Sinon from "sinon"; +import { expect } from "chai"; +import { validateMassUpdate } from "../../../middlewares/validators/userStatus.js"; describe("Middleware | Validators | massUpdateUserStatus", function () { describe("validateMassUpdate", function () { diff --git a/test/unit/utils/users.test.js b/test/unit/utils/users.test.js index d2e2198a7..0a1ab5326 100644 --- a/test/unit/utils/users.test.js +++ b/test/unit/utils/users.test.js @@ -1,16 +1,16 @@ -const chai = require("chai"); -const { expect } = chai; - -const usersUtils = require("../../../utils/users"); -const cleanDb = require("../../utils/cleanDb"); -const addUser = require("../../utils/addUser"); -const { filteredPRs } = require("../../fixtures/pullrequests/pullrequests"); -const { months, discordNicknameLength } = require("../../../constants/users"); -const userData = require("../../fixtures/user/user")()[0]; -const sinon = require("sinon"); -const firestore = require("../../../utils/firestore"); +import { expect } from "chai"; + +import sinon from "sinon"; +import { discordNicknameLength, months } from "../../../constants/users.js"; +import dataAccessLayer from "../../../services/dataAccessLayer.js"; +import firestore from "../../../utils/firestore.js"; +import usersUtils from "../../../utils/users.js"; +import { filteredPRs } from "../../fixtures/pullrequests/pullrequests.js"; +import userData from "../../fixtures/user/user.js"; +import addUser from "../../utils/addUser.js"; +import cleanDb from "../../utils/cleanDb.js"; + const userModel = firestore.collection("users"); -const dataAccessLayer = require("../../../services/dataAccessLayer"); /** * Test the utils functions and validate the data returned diff --git a/test/utils/addProfileDiffs.js b/test/utils/addProfileDiffs.js index 6cea92b77..b5c5106dd 100644 --- a/test/utils/addProfileDiffs.js +++ b/test/utils/addProfileDiffs.js @@ -1,9 +1,9 @@ -const firestore = require("../../utils/firestore"); -const profileDiffsModel = firestore.collection("profileDiffs"); +import firestore from "../../utils/firestore.js"; +import getProfileDiffs from "../fixtures/profileDiffs/profileDiffs.js"; -const getProfileDiffs = require("../fixtures/profileDiffs/profileDiffs"); +const profileDiffsModel = firestore.collection("profileDiffs"); -module.exports = async (userId) => { +export default async (userId) => { const PROFILE_DIFFS = getProfileDiffs(); const addPromises = PROFILE_DIFFS.map((profileDiff) => profileDiffsModel.add({ ...profileDiff, userId })); await Promise.all(addPromises); diff --git a/test/utils/addUser.js b/test/utils/addUser.js index f28216880..93daf850b 100644 --- a/test/utils/addUser.js +++ b/test/utils/addUser.js @@ -1,14 +1,14 @@ -const users = require("../../models/users"); +import users from "../../models/users.js"; // Import fixtures -const userData = require("../fixtures/user/user")(); +import userData from "../fixtures/user/user.js"; /** * File to be required in every test file where userId is required to generate the JWT * * @return {Promise} userId - userId for the added user */ -module.exports = async (user) => { +export default async (user) => { const isValid = user && Object.keys(user).length !== 0 && user.constructor === Object; // Use the user data sent as arguments, else use data from fixtures user = isValid ? user : userData[0]; diff --git a/test/utils/cleanDb.js b/test/utils/cleanDb.js index d012fdc2d..8e7292965 100644 --- a/test/utils/cleanDb.js +++ b/test/utils/cleanDb.js @@ -1,12 +1,12 @@ -const config = require("config"); -const { fetch } = require("../../utils/fetch"); -const firebaseConfig = require("../../firebase.json"); +import config from "config"; +import firebaseConfig from "../../firebase.json"; +import { fetch } from "../../utils/fetch.js"; /** * Deletes all data from firestore emulator running locally. * To be used during tests for deleting the data as required. */ -module.exports = async () => { +export default async () => { const credentialsObject = JSON.parse(config.firestore); const projectId = credentialsObject.project_id; diff --git a/test/utils/deleteRoles.js b/test/utils/deleteRoles.js index 408165f23..4176f3f52 100644 --- a/test/utils/deleteRoles.js +++ b/test/utils/deleteRoles.js @@ -1,4 +1,6 @@ -const firestore = require("../../utils/firestore"); +import firestore from "../../utils/firestore.js"; +import logger from "../../utils/logger.js"; + const userCollection = firestore.collection("users"); /** @@ -7,7 +9,7 @@ const userCollection = firestore.collection("users"); * @param {string[]} rolesToBeDeleted - roles to be deleted * @return {boolean} success - are roles deleted or not */ -module.exports = async (userId, rolesToBeDeleted = []) => { +export default async (userId, rolesToBeDeleted = []) => { if (!userId) { logger.info("User id is required to delete roles"); return false; diff --git a/test/utils/deleteRolesObject.js b/test/utils/deleteRolesObject.js index 0359c317f..97c86ac1f 100644 --- a/test/utils/deleteRolesObject.js +++ b/test/utils/deleteRolesObject.js @@ -1,4 +1,6 @@ -const firestore = require("../../utils/firestore"); +import firestore from "../../utils/firestore.js"; +import logger from "../../utils/logger.js"; + const userCollection = firestore.collection("users"); /** @@ -6,7 +8,7 @@ const userCollection = firestore.collection("users"); * @param {string} userId - to identify the user whose roles are to be deleted * @return {boolean} success - are roles deleted or not */ -module.exports = async (userId) => { +export default async (userId) => { if (!userId) { logger.info("User id is required to delete roles object"); return false; diff --git a/test/utils/generateBotToken.js b/test/utils/generateBotToken.js index 11259058a..731f02506 100644 --- a/test/utils/generateBotToken.js +++ b/test/utils/generateBotToken.js @@ -1,4 +1,5 @@ -const jwt = require("jsonwebtoken"); +import jwt from "jsonwebtoken"; +import config from "config"; /** * Generates the JWT @@ -6,19 +7,17 @@ const jwt = require("jsonwebtoken"); * @param payload {Object} - Payload to be added in the JWT * @return {String} - Generated JWT */ -const generateToken = (data) => { +export const generateToken = (data) => { return jwt.sign(data, config.get("botToken.botPrivateKey"), { algorithm: "RS256", expiresIn: "1m", }); }; -const generateCronJobToken = (data) => { +export const generateCronJobToken = (data) => { const token = jwt.sign(data, config.get("cronJobHandler.privateKey"), { algorithm: "RS256", expiresIn: "1m", }); return token; }; - -module.exports = { generateToken, generateCronJobToken }; diff --git a/test/utils/github.js b/test/utils/github.js index 3b0c61c0d..c4c837dbb 100644 --- a/test/utils/github.js +++ b/test/utils/github.js @@ -1,3 +1,5 @@ +import config from "config"; + const defaultClientId = config.get("githubOauth.clientId"); const baseURL = config.get("services.rdsApi.baseUrl"); @@ -19,4 +21,4 @@ const generateGithubAuthRedirectUrl = function ({ return `${encodedUrl}&client_id=${clientId}`; }; -module.exports = { generateGithubAuthRedirectUrl }; +export { generateGithubAuthRedirectUrl }; diff --git a/test/utils/googleauth.js b/test/utils/googleauth.js index 4c4c5d847..81fb8029a 100644 --- a/test/utils/googleauth.js +++ b/test/utils/googleauth.js @@ -1,7 +1,9 @@ +import config from "config"; +import sinon from "sinon"; +import passport from "passport"; + const defaultClientId = config.get("googleOauth.clientId"); const baseURL = config.get("services.rdsApi.baseUrl"); -const sinon = require("sinon"); -const passport = require("passport"); const generateGoogleAuthRedirectUrl = function ({ baseUrl = "https://accounts.google.com/o/oauth2/v2/auth", @@ -28,4 +30,4 @@ const stubPassportAuthenticate = function (userData, token = "accessToken") { }); }; -module.exports = { generateGoogleAuthRedirectUrl, stubPassportAuthenticate }; +export { generateGoogleAuthRedirectUrl, stubPassportAuthenticate }; diff --git a/test/utils/user.ts b/test/utils/user.ts index 5cc453ca8..07c3b3512 100644 --- a/test/utils/user.ts +++ b/test/utils/user.ts @@ -6,4 +6,4 @@ function assertUserIds(users: any, ids: any) { expect(users.some((user: { id: any }) => user.id === id)).to.be.true; }); } -module.exports = { assertUserIds }; +export default { assertUserIds }; diff --git a/tsconfig.json b/tsconfig.json index 27d285024..214dd97e3 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -11,7 +11,7 @@ // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ /* Language and Environment */ - "target": "es2016" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, + "target": "es2022" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ // "jsx": "preserve", /* Specify what JSX code is generated. */ // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ @@ -25,7 +25,7 @@ // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ /* Modules */ - "module": "commonjs" /* Specify what module code is generated. */, + "module": "es2022" /* Specify what module code is generated. */, // "rootDir": "./", /* Specify the root folder within your source files. */ "moduleResolution": "node" /* Specify how TypeScript looks up a file from a given module specifier. */, // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ @@ -39,7 +39,7 @@ // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ - // "resolveJsonModule": true, /* Enable importing .json files. */ + "resolveJsonModule": true, /* Enable importing .json files. */ // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ @@ -76,8 +76,8 @@ /* Interop Constraints */ // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ - // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ - "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */, + "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + // "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */, // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, diff --git a/utils/RQLParser.ts b/utils/RQLParser.ts index b8199baa9..070ed18fa 100644 --- a/utils/RQLParser.ts +++ b/utils/RQLParser.ts @@ -4,7 +4,8 @@ import { Operators, Queries, QueryTypes, -} from "../typeDefinitions/rqlParser"; +} from "../typeDefinitions/rqlParser.js"; +import logger from "./logger.js"; const KEY_VALUE_PAIR_DELIMITER_PATTERN = /\s+/; const KEY_VALUE_DELIMITER = ":"; diff --git a/utils/application.ts b/utils/application.ts index 8eff73c63..d82c3eef7 100644 --- a/utils/application.ts +++ b/utils/application.ts @@ -30,4 +30,4 @@ const getUserApplicationObject = (rawData: applicationPayload, userId: string, c return data; }; -module.exports = { getUserApplicationObject } +export default { getUserApplicationObject } diff --git a/utils/array.js b/utils/array.js index 5be4c3a7c..32ad0eafb 100644 --- a/utils/array.js +++ b/utils/array.js @@ -32,7 +32,4 @@ function arraysHaveCommonItem(array1, array2) { return array1.some((value) => array2.includes(value)); } -module.exports = { - chunks, - arraysHaveCommonItem, -}; +export { chunks, arraysHaveCommonItem }; diff --git a/utils/badges.js b/utils/badges.js index 807447eb5..50521ca8b 100644 --- a/utils/badges.js +++ b/utils/badges.js @@ -1,4 +1,5 @@ -const firestore = require("./firestore"); +import firestore from "./firestore.js"; + const userBadgeModel = firestore.collection("userBadges"); /** @@ -57,8 +58,4 @@ async function assignOrRemoveBadgesInBulk({ userId, array, isRemove = false }) { return await bulkWriter.close(); } -module.exports = { - convertFirebaseDocumentToBadgeDocument, - convertFirebaseTimestampToDateTime, - assignOrRemoveBadgesInBulk, -}; +export { convertFirebaseDocumentToBadgeDocument, convertFirebaseTimestampToDateTime, assignOrRemoveBadgesInBulk }; diff --git a/utils/cache.js b/utils/cache.js index 44bde1147..b42f98ef1 100644 --- a/utils/cache.js +++ b/utils/cache.js @@ -1,3 +1,5 @@ +import logger from "./logger.js"; + const CACHE_EXPIRY_TIME_MIN = 0.1; const CACHE_SIZE_MB = 10; const minutesToMilliseconds = (minutes) => minutes * 60000; @@ -71,6 +73,7 @@ const cachePool = (opt = { maximumSize: CACHE_SIZE_MB }) => { return { get, set, evict, hits, cacheStore }; }; + /** * A MultiMap implementation where each key maps to set of unique values. * It internally uses Map to store keys and values and to save multiple values it uses Set. Map> @@ -105,6 +108,7 @@ const cachedKeysStore = () => { keyStore.set(modelKey, set); } }; + /** * removes the given key(modelKey) and all of its associated values * @param {string} modelKey key for the map @@ -231,4 +235,4 @@ const invalidateCache = (options = {}) => { }; }; -module.exports = { cacheResponse, invalidateCache, generateCacheKey, cachedKeysStore }; +export { cacheResponse, invalidateCache, generateCacheKey, cachedKeysStore, pool, cachedKeys }; diff --git a/utils/cloudinary.js b/utils/cloudinary.js index 4e35e1e25..e89bba112 100644 --- a/utils/cloudinary.js +++ b/utils/cloudinary.js @@ -1,5 +1,5 @@ -const cloudinary = require("cloudinary").v2; -const config = require("config"); +import { v2 as cloudinary } from "cloudinary"; +import config from "config"; cloudinary.config(config.get("cloudinary")); @@ -8,6 +8,4 @@ const upload = async (file, options = {}) => { return response; }; -module.exports = { - upload, -}; +export { upload }; diff --git a/utils/customWordCountValidator.js b/utils/customWordCountValidator.js index dc5dd8532..5616886fb 100644 --- a/utils/customWordCountValidator.js +++ b/utils/customWordCountValidator.js @@ -15,6 +15,4 @@ const customWordCountValidator = (value, helpers, wordCount) => { return value; }; -module.exports = { - customWordCountValidator, -}; +export { customWordCountValidator }; diff --git a/utils/data-access.js b/utils/data-access.js index ad7fa6019..e4cf83ec8 100644 --- a/utils/data-access.js +++ b/utils/data-access.js @@ -1,3 +1,5 @@ +import logger from "./logger.js"; + /** * Middleware function for removing sensitive fields from the response object * based on user roles and predefined rules. @@ -108,7 +110,4 @@ function removeObjectField(path, object) { } } -module.exports = { - removeObjectField, - dataAccessMiddleware, -}; +export { removeObjectField, dataAccessMiddleware }; diff --git a/utils/discord-actions.js b/utils/discord-actions.js index 1a14f70e1..ae116db37 100644 --- a/utils/discord-actions.js +++ b/utils/discord-actions.js @@ -1,6 +1,8 @@ -const jwt = require("jsonwebtoken"); -const config = require("config"); -const { getDiscordMemberDetails } = require("../services/discordMembersService"); +import jwt from "jsonwebtoken"; +import config from "config"; +import { getDiscordMemberDetails } from "../services/discordMembersService.js"; +import logger from "./logger.js"; + const DISCORD_BASE_URL = config.get("services.discordBot.baseUrl"); const RDS_SERVERLESS_PRIVATE_KEY = config.get("rdsServerlessBot.rdsServerLessPrivateKey"); const RDS_SERVERLESS_TTL = config.get("rdsServerlessBot.ttl"); @@ -72,7 +74,7 @@ const generateDiscordInviteLink = async () => { } }; -module.exports = { +export { generateDiscordProfileImageUrl, generateAuthTokenForCloudflare, generateCloudFlareHeaders, diff --git a/utils/events.js b/utils/events.js index ee4e01fe9..8a337a574 100644 --- a/utils/events.js +++ b/utils/events.js @@ -22,6 +22,4 @@ const removeUnwantedProperties = (propertiesToRemove, data) => { return cleanData; }; -module.exports = { - removeUnwantedProperties, -}; +export { removeUnwantedProperties }; diff --git a/utils/extensionRequests.js b/utils/extensionRequests.js index eacbc9991..823a430e3 100644 --- a/utils/extensionRequests.js +++ b/utils/extensionRequests.js @@ -1,4 +1,5 @@ -const { getUsername } = require("./users"); +import { getUsername } from "./users.js"; + const buildExtensionRequests = (extensionRequests, initialArray = []) => { if (!extensionRequests.empty) { extensionRequests.forEach((extensionRequests) => { @@ -66,9 +67,4 @@ const generateNextLink = (nextPageParams) => { return nextLink; }; -module.exports = { - buildExtensionRequests, - formatExtensionRequest, - transformQuery, - generateNextLink, -}; +export { buildExtensionRequests, formatExtensionRequest, transformQuery, generateNextLink }; diff --git a/utils/fetch.js b/utils/fetch.js index 9204fd395..1aca581e5 100644 --- a/utils/fetch.js +++ b/utils/fetch.js @@ -1,33 +1,23 @@ -const axios = require("axios"); +import axios from "axios"; +import logger from "./logger.js"; /** * Used for network calls * * @param url {String} - API Endpoint URL - * @param [method = 'get'] {String} - API Call Method (GET, POST etc.) - optional - * @param [params = null] {Object} - Query Params for the API call - optional - * @param [data = null] {Object} - Body to be sent - optional - * @param [headers = null] {Object} - Headers to be sent - optional - * @param [options = null] {Object} - Options to be sent via axios - optional + * @param options {Object} - Options for the API call including method, params, data, headers, etc. */ - -const fetch = async (url, method = "get", params = null, data = null, headers = null, options = null) => { +const fetch = async (url, options = {}) => { try { const response = await axios({ - method, url, - params, - data, - headers, ...options, }); - return response; + return response.data; } catch (err) { logger.error("Something went wrong. Please contact admin", err); throw err; } }; -module.exports = { - fetch, -}; +export { fetch }; diff --git a/utils/fetchMultiplePageResults.js b/utils/fetchMultiplePageResults.js index deb9c9624..4050a2dbd 100644 --- a/utils/fetchMultiplePageResults.js +++ b/utils/fetchMultiplePageResults.js @@ -1,4 +1,4 @@ -const githubService = require("../services/githubService"); +import { extractPRdetails } from "../services/githubService.js"; const fetchMultiplePageResults = async (callbackFn, params) => { let page = 1; @@ -6,7 +6,7 @@ const fetchMultiplePageResults = async (callbackFn, params) => { do { const { data } = await callbackFn({ page, ...params }); - const currentPRs = githubService.extractPRdetails(data); + const currentPRs = extractPRdetails(data); allPRs.push(...currentPRs); page++; } while (allPRs.length === 100 && allPRs.length > 0); @@ -14,6 +14,4 @@ const fetchMultiplePageResults = async (callbackFn, params) => { return allPRs; }; -module.exports = { - fetchMultiplePageResults, -}; +export { fetchMultiplePageResults }; diff --git a/utils/firestore.js b/utils/firestore.js index 41e8dc713..f741a04c5 100644 --- a/utils/firestore.js +++ b/utils/firestore.js @@ -1,5 +1,5 @@ -const admin = require("firebase-admin"); -const config = require("config"); +import admin from "firebase-admin"; +import config from "config"; // Firestore config needs to contain the credentials as a string instead of JS object, // because we will be setting it as an environment variable during deployment @@ -11,4 +11,4 @@ admin.initializeApp({ const db = admin.firestore(); -module.exports = db; +export default db; diff --git a/utils/helper.js b/utils/helper.js index b0ab267d0..5b73b2041 100644 --- a/utils/helper.js +++ b/utils/helper.js @@ -1,4 +1,4 @@ -const { TASK_SIZE } = require("../constants/tasks"); +import { TASK_SIZE } from "../constants/tasks.js"; /** * Returns an object containing key value pairs of qualifiers with their values @@ -88,9 +88,4 @@ function findSubscribedGroupIds(discordId, groupToUserMappings = []) { return subscribedGroupIds; } -module.exports = { - getQualifiers, - getDateTimeRangeForPRs, - getPaginatedLink, - findSubscribedGroupIds, -}; +export { getQualifiers, getDateTimeRangeForPRs, getPaginatedLink, findSubscribedGroupIds }; diff --git a/utils/logger.ts b/utils/logger.ts index db3f2325c..1b8b0e995 100644 --- a/utils/logger.ts +++ b/utils/logger.ts @@ -1,5 +1,7 @@ -const winston = require("winston"); -const config = require("config"); +import winston from 'winston'; +import config from 'config'; +import { Stream } from 'morgan'; + // define the custom settings for each transport (file, console) const options = { file: { @@ -21,9 +23,7 @@ const options = { }; // instantiate a new Winston Logger with the settings defined above -// eslint-disable-line new-cap -/* eslint new-cap: ["error", { "properties": false }] */ -const logger = new winston.createLogger({ +const logger = winston.createLogger({ /** * Application defaults: * - File logs enabled in: [production, staging] @@ -40,11 +40,13 @@ const logger = new winston.createLogger({ }); // create a stream object with a 'write' function that will be used by `morgan` -logger.stream = { - write: function (message, encoding) { +const stream: Stream = { + write: function (message: string, encoding: string) { // use the 'info' log level so the output will be picked up by both transports (file and console) logger.info(message); }, }; -module.exports = logger; +logger.stream = stream; + +export default logger; diff --git a/utils/logs.js b/utils/logs.js index 94d5a10b0..d9287f0f9 100644 --- a/utils/logs.js +++ b/utils/logs.js @@ -1,9 +1,11 @@ -const admin = require("firebase-admin"); -const { logType } = require("../constants/logs"); -const usersService = require("../services/dataAccessLayer"); -const firestore = require("./firestore"); +import admin from "firebase-admin"; +import { logType } from "../constants/logs.js"; +import * as usersService from "../services/dataAccessLayer.js"; +import firestore from "./firestore.js"; +import lodash from "lodash"; + const tasksModel = firestore.collection("tasks"); -const { _ } = require("lodash"); + async function getUsersListFromLogs(allLogs) { const userIds = new Set(); for (const log of allLogs) { @@ -118,7 +120,7 @@ function formatTaskRequestsLogs(logsSnapshot, usersMap, tasksMap) { taskTitle: tasksMap[body.taskId]?.title, proposedStartDate: formattedData.users[0].proposedStartDate, proposedDeadline: formattedData.users[0].proposedDeadline, - ..._.omit(formattedData, "users"), + ...lodash.omit(formattedData, "users"), }; } @@ -151,10 +153,4 @@ function convertTimestamp(timestamp) { return seconds + Math.floor(nanoseconds / 10000000); } -module.exports = { - mapify, - convertTimestamp, - getTasksFromLogs, - formatLogsForFeed, - getUsersListFromLogs, -}; +export { mapify, convertTimestamp, getTasksFromLogs, formatLogsForFeed, getUsersListFromLogs }; diff --git a/utils/monitor.js b/utils/monitor.js index 3f4181ceb..32e2e14fb 100644 --- a/utils/monitor.js +++ b/utils/monitor.js @@ -1,8 +1,9 @@ -const { NotFound } = require("http-errors"); -const fireStore = require("./firestore"); -const trackedProgressesCollection = fireStore.collection("trackedProgresses"); -const { RESPONSE_MESSAGES } = require("../constants/monitor"); +import httpError from "http-errors"; +import fireStore from "./firestore.js"; +import { RESPONSE_MESSAGES } from "../constants/monitor.js"; + const { RESOURCE_NOT_FOUND } = RESPONSE_MESSAGES; +const trackedProgressesCollection = fireStore.collection("trackedProgresses"); /** * Builds a Firestore query based on the provided query parameters. @@ -42,12 +43,12 @@ const buildQueryForFetchingDocsOfType = (queryParams) => { * Retrieves progress documents from Firestore based on the given query. * @param {Query} query - A Firestore query object for fetching progress documents. * @returns {Array.} An array of objects representing the retrieved tracked progress documents. Each object contains the document ID and its data. - * @throws {NotFound} If no progress documents are found based on the given query. + * @throws {httpError.NotFound} If no progress documents are found based on the given query. */ const getTrackedProgressDocs = async (query) => { const progressesDocs = await query.get(); if (!progressesDocs.size) { - throw new NotFound(RESOURCE_NOT_FOUND); + throw new httpError.NotFound(RESOURCE_NOT_FOUND); } const docsData = []; progressesDocs.forEach((doc) => { @@ -56,8 +57,4 @@ const getTrackedProgressDocs = async (query) => { return docsData; }; -module.exports = { - buildQueryByTypeId, - buildQueryForFetchingDocsOfType, - getTrackedProgressDocs, -}; +export { buildQueryByTypeId, buildQueryForFetchingDocsOfType, getTrackedProgressDocs }; diff --git a/utils/multer.js b/utils/multer.js deleted file mode 100644 index 7d96718dc..000000000 --- a/utils/multer.js +++ /dev/null @@ -1,45 +0,0 @@ -const multer = require("multer"); -const multerConstant = require("../constants/multer"); -const errorMessage = require("../constants/errorMessages"); -const multerMemoryStorage = multer.memoryStorage(); - -const MB_1 = multerConstant.FILE_SIZE_1MB; -const profileFileSize = multerConstant.PROFILE_FILE_SIZE; - -const fileFilterImagesOnly = (req, file, cb) => { - const mimetype = file.mimetype; - const allowedMimeTypes = ["image/png", "image/jpeg"]; - const isMimeTypeAllowed = allowedMimeTypes.includes(mimetype); - if (isMimeTypeAllowed) { - return cb(null, true); - } - return cb(new multer.MulterError("TYPE_UNSUPPORTED_FILE"), false); -}; - -const upload = multer({ - storage: multerMemoryStorage, - limits: { fileSize: profileFileSize }, - fileFilter: fileFilterImagesOnly, -}); - -const multerErrorHandling = (err, req, res, next) => { - if (err.code === "LIMIT_FILE_SIZE") { - res.boom.entityTooLarge(errorMessage.FILE_TOO_LARGE(profileFileSize / MB_1)); - } else if (err.code === "LIMIT_UNEXPECTED_FILE") { - res.boom.badData(errorMessage.ONLY_ONE_FILE_ALLOWED); - } else if (err.code === "TYPE_UNSUPPORTED_FILE") { - res.boom.unsupportedMediaType(errorMessage.ONLY_IMAGE_SUPPORTED); - } else { - res.boom.badImplementation(errorMessage.INTERNAL_SERVER_ERROR); - } -}; - -const isMulterError = (err) => { - return err instanceof multer.MulterError; -}; - -module.exports = { - upload, - multerErrorHandling, - isMulterError, -}; diff --git a/utils/multer.ts b/utils/multer.ts new file mode 100644 index 000000000..91fa5105d --- /dev/null +++ b/utils/multer.ts @@ -0,0 +1,38 @@ +import multer from "multer"; +import { FILE_SIZE_1MB, PROFILE_FILE_SIZE } from "../constants/multer.js"; +import { FILE_TOO_LARGE, ONLY_ONE_FILE_ALLOWED, ONLY_IMAGE_SUPPORTED, INTERNAL_SERVER_ERROR } from "../constants/errorMessages.js"; + +const multerMemoryStorage = multer.memoryStorage(); + +const fileFilterImagesOnly = (req, file, cb) => { + const mimetype = file.mimetype; + const allowedMimeTypes = ["image/png", "image/jpeg"]; + const isMimeTypeAllowed = allowedMimeTypes.includes(mimetype); + if (isMimeTypeAllowed) { + return cb(null, true); + } + return cb(new multer.MulterError("TYPE_UNSUPPORTED_FILE"), false); +}; + +export const upload = multer({ + storage: multerMemoryStorage, + limits: { fileSize: PROFILE_FILE_SIZE }, + fileFilter: fileFilterImagesOnly, +}); + +// TODO: Add type for req, res, next +export const multerErrorHandling = (err: any, req: any, res: any, next: any) => { + if (err.code === "LIMIT_FILE_SIZE") { + res.boom.entityTooLarge(FILE_TOO_LARGE(PROFILE_FILE_SIZE / FILE_SIZE_1MB)); + } else if (err.code === "LIMIT_UNEXPECTED_FILE") { + res.boom.badData(ONLY_ONE_FILE_ALLOWED); + } else if (err.code === "TYPE_UNSUPPORTED_FILE") { + res.boom.unsupportedMediaType(ONLY_IMAGE_SUPPORTED); + } else { + res.boom.badImplementation(INTERNAL_SERVER_ERROR); + } +}; + +export const isMulterError = (err) => { + return err instanceof multer.MulterError; +}; diff --git a/utils/obfuscate.js b/utils/obfuscate.js index 92e0aeea3..b85244ef5 100644 --- a/utils/obfuscate.js +++ b/utils/obfuscate.js @@ -6,7 +6,4 @@ const obfuscateMail = (email) => { return email.slice(0, 2) + email.slice(2, email.length - 2).replace(/./g, "*") + email.slice(email.length - 2); }; -module.exports = { - obfuscatePhone, - obfuscateMail, -}; +export { obfuscatePhone, obfuscateMail }; diff --git a/utils/profileDiffs.js b/utils/profileDiffs.js index eb008ee57..7e8eb4b28 100644 --- a/utils/profileDiffs.js +++ b/utils/profileDiffs.js @@ -9,6 +9,4 @@ const generateNextLink = (nextPageParams) => { return nextLink; }; -module.exports = { - generateNextLink, -}; +export { generateNextLink }; diff --git a/utils/progresses.js b/utils/progresses.js index 629f90a1f..fa3f13d0d 100644 --- a/utils/progresses.js +++ b/utils/progresses.js @@ -1,17 +1,17 @@ -const { NotFound } = require("http-errors"); -const { fetchTask } = require("../models/tasks"); -const { fetchUser } = require("../models/users"); -const fireStore = require("../utils/firestore"); -const progressesModel = fireStore.collection("progresses"); - -const { - PROGRESSES_RESPONSE_MESSAGES: { PROGRESS_DOCUMENT_NOT_FOUND }, +import httpError from "http-errors"; +import taskModel from "../models/tasks.js"; +import { fetchUser } from "../models/users.js"; +import fireStore from "../utils/firestore.js"; +import { + PROGRESSES_RESPONSE_MESSAGES, MILLISECONDS_IN_DAY, PROGRESS_VALID_SORT_FIELDS, PROGRESSES_PAGE_SIZE, PROGRESSES_SIZE, -} = require("../constants/progresses"); -const { convertTimestampToUTCStartOrEndOfDay } = require("./time"); +} from "../constants/progresses.js"; +import { convertTimestampToUTCStartOrEndOfDay } from "./time.js"; + +const { PROGRESS_DOCUMENT_NOT_FOUND } = PROGRESSES_RESPONSE_MESSAGES; const progressesCollection = fireStore.collection("progresses"); /** @@ -48,13 +48,13 @@ const buildQueryForPostingProgress = ({ type, userId, taskId }) => { * * @async * @param {string} userId - The ID of the user to check for existence. - * @throws {NotFound} If the user with the given ID does not exist. + * @throws {httpError.NotFound} If the user with the given ID does not exist. * @returns {Promise} A promise that resolves if the user exists and rejects with a `NotFound` error if the user does not exist. */ const assertUserExists = async (userId) => { const { userExists } = await fetchUser({ userId }); if (!userExists) { - throw new NotFound(`User with id ${userId} does not exist.`); + throw new httpError.NotFound(`User with id ${userId} does not exist.`); } }; @@ -63,13 +63,13 @@ const assertUserExists = async (userId) => { * * @async * @param {string} taskData - The ID of the task to check for existence. - * @throws {NotFound} If the task with the given ID does not exist. + * @throws {httpError.NotFound} If the task with the given ID does not exist. * @returns {Promise} A promise that resolves if the task exists and rejects with a `NotFound` error if the task does not exist. */ const assertTaskExists = async (taskId) => { - const { taskData } = await fetchTask(taskId); + const { taskData } = await taskModel.fetchTask(taskId); if (!taskData) { - throw new NotFound(`Task with id ${taskId} does not exist.`); + throw new httpError.NotFound(`Task with id ${taskId} does not exist.`); } return taskData.title; }; @@ -81,7 +81,7 @@ const assertTaskExists = async (taskId) => { * @param {Object} queryParams - An object containing the query parameters. * @param {string} [queryParams.userId] - (Optional) The ID of the user to check for existence. * @param {string} [queryParams.taskId] - (Optional) The ID of the task to check for existence. - * @throws {NotFound} If neither a user nor a task with the given ID exists in the system. + * @throws {httpError.NotFound} If neither a user nor a task with the given ID exists in the system. * @returns {Promise} A promise that resolves if either the user or the task exists and rejects with a `NotFound` error if neither exists. */ const assertUserOrTaskExists = async (queryParams) => { @@ -162,12 +162,12 @@ const buildQueryToFetchPaginatedDocs = async (queryParams) => { * Retrieves progress documents from Firestore based on the given query. * @param {Query} query - A Firestore query object for fetching progress documents. * @returns {Array.} An array of objects representing the retrieved progress documents. Each object contains the document ID and its data. - * @throws {NotFound} If no progress documents are found based on the given query. + * @throws {httpError.NotFound} If no progress documents are found based on the given query. */ const getProgressDocs = async (query) => { const progressesDocs = await query.get(); if (!progressesDocs.size) { - throw new NotFound(PROGRESS_DOCUMENT_NOT_FOUND); + throw new httpError.NotFound(PROGRESS_DOCUMENT_NOT_FOUND); } const docsData = []; progressesDocs.forEach((doc) => { @@ -183,12 +183,12 @@ const getProgressDocs = async (query) => { * @returns {Array.} An array of objects representing the retrieved progress documents. * Each object contains the document ID (`id`) and its associated data. * - * @throws {NotFound} If no progress documents are found and no page number is specified. + * @throws {httpError.NotFound} If no progress documents are found and no page number is specified. */ const getPaginatedProgressDocs = async (query, page) => { const progressesDocs = await query.get(); if (!page && !progressesDocs.size) { - throw new NotFound(PROGRESS_DOCUMENT_NOT_FOUND); + throw new httpError.NotFound(PROGRESS_DOCUMENT_NOT_FOUND); } if (!progressesDocs.size) { return []; @@ -238,7 +238,7 @@ const getProgressRecords = async (query, queryParams) => { const docsData = {}; const queryResult = await query.get(); if (!queryResult.size) { - throw new NotFound(PROGRESS_DOCUMENT_NOT_FOUND); + throw new httpError.NotFound(PROGRESS_DOCUMENT_NOT_FOUND); } const progressesDocs = queryResult.docs; progressesDocs.forEach((doc) => { @@ -279,25 +279,26 @@ const buildQueryToSearchProgressByDay = (pathParams) => { }; const buildProgressQueryForMissedUpdates = (taskId, startTimestamp, endTimestamp) => { - return progressesModel + return progressesCollection .where("type", "==", "task") .where("taskId", "==", taskId) .where("date", ">=", convertTimestampToUTCStartOrEndOfDay(startTimestamp)) .where("date", "<=", convertTimestampToUTCStartOrEndOfDay(endTimestamp, true)) .count(); }; -module.exports = { + +export { getProgressDateTimestamp, buildQueryForPostingProgress, assertUserExists, assertTaskExists, assertUserOrTaskExists, buildQueryToFetchDocs, + buildQueryToFetchPaginatedDocs, getProgressDocs, getPaginatedProgressDocs, buildRangeProgressQuery, getProgressRecords, buildQueryToSearchProgressByDay, buildProgressQueryForMissedUpdates, - buildQueryToFetchPaginatedDocs, }; diff --git a/utils/pullRequests.js b/utils/pullRequests.js index 91efc577c..20ff12be2 100644 --- a/utils/pullRequests.js +++ b/utils/pullRequests.js @@ -1,6 +1,11 @@ -const { fetchMultiplePageResults } = require("./fetchMultiplePageResults"); -const { getDateTimeRangeForPRs } = require("./helper"); -const githubService = require("../services/githubService"); +import { fetchMultiplePageResults } from "./fetchMultiplePageResults.js"; +import { getDateTimeRangeForPRs } from "./helper.js"; +import * as githubService from "../services/githubService.js"; + +const ORDER_TYPE = { + ASC: "asc", + DESC: "desc", +}; const getFilteredPRsOrIssues = async (qualifiers) => { let allPRs = []; @@ -54,12 +59,4 @@ const getFilteredPRsOrIssues = async (qualifiers) => { return allPRs; }; -const ORDER_TYPE = { - ASC: "asc", - DESC: "desc", -}; - -module.exports = { - getFilteredPRsOrIssues, - ORDER_TYPE, -}; +export { getFilteredPRsOrIssues, ORDER_TYPE }; diff --git a/utils/queryParser.js b/utils/queryParser.js index 2a5ee3778..24a3617dd 100644 --- a/utils/queryParser.js +++ b/utils/queryParser.js @@ -1,3 +1,5 @@ +import logger from "./logger.js"; + /** * Parses the query params and returns a key value object * @@ -48,4 +50,4 @@ const parseQueryParams = (queryString) => { return {}; }; -module.exports = { parseQueryParams }; +export { parseQueryParams }; diff --git a/utils/rateLimiting.js b/utils/rateLimiting.js index 50bebea69..de7f8e6ed 100644 --- a/utils/rateLimiting.js +++ b/utils/rateLimiting.js @@ -8,6 +8,4 @@ function getRetrySeconds(msBeforeNext, fallbackValue = 1) { return Math.round(msBeforeNext / 1000) || fallbackValue; } -module.exports = { - getRetrySeconds, -}; +export { getRetrySeconds }; diff --git a/utils/removeDiscordRoleFromUser.ts b/utils/removeDiscordRoleFromUser.ts index 78b45df33..491b106f3 100644 --- a/utils/removeDiscordRoleFromUser.ts +++ b/utils/removeDiscordRoleFromUser.ts @@ -1,8 +1,9 @@ -import { logType } from "../constants/logs"; -import discordActions from "../models/discordactions"; -import { addLog } from "../models/logs"; -import discordServices from "../services/discordService"; -import { userData } from "../types/global"; +import { logType } from "../constants/logs.js"; +import * as discordActions from "../models/discordactions.js"; +import { addLog } from "../models/logs.js"; +import * as discordServices from "../services/discordService.js"; +import { userData } from "../types/global.js"; +import logger from "./logger.js"; /** * Removes a Discord role from a user using Discord Id. diff --git a/utils/sendTaskUpdate.js b/utils/sendTaskUpdate.js index 24b78a78f..f40269339 100644 --- a/utils/sendTaskUpdate.js +++ b/utils/sendTaskUpdate.js @@ -1,4 +1,7 @@ import { generateCloudFlareHeaders } from "../utils/discord-actions.js"; +import config from "config"; +import logger from "./logger.js"; + const DISCORD_BASE_URL = config.get("services.discordBot.baseUrl"); export const sendTaskUpdate = async (completed, blockers, planned, userName, taskId, taskTitle) => { diff --git a/utils/task-requests.ts b/utils/task-requests.ts index 9d55407bb..68f591283 100644 --- a/utils/task-requests.ts +++ b/utils/task-requests.ts @@ -1,7 +1,6 @@ import { TaskRequestType } from "../typeDefinitions/task-requests"; import { User } from "../typeDefinitions/users"; - -import usersService from "../services/dataAccessLayer"; +import * as usersService from "../services/dataAccessLayer.js"; import admin from "firebase-admin"; const generateLink = (queries: { [key: string]: string }): string => { @@ -43,9 +42,9 @@ const transformTaskRequests = async (taskRequestsList: TaskRequestType[]) => { taskRequestsList.forEach((data) => { data.users = data.users.map((userData) => { const user = usersMap.get(userData.userId); - const username = user?.username - const firstName = user?.first_name - const lastName = user?.last_name + const username = user?.username; + const firstName = user?.first_name; + const lastName = user?.last_name; const picture = user?.picture; return { ...userData, username, first_name: firstName, last_name: lastName, picture }; @@ -53,7 +52,7 @@ const transformTaskRequests = async (taskRequestsList: TaskRequestType[]) => { }); }; -module.exports = { +export { generateLink, buildTaskRequests, transformTaskRequests, diff --git a/utils/tasks.js b/utils/tasks.js index 07164631d..f6c45b84a 100644 --- a/utils/tasks.js +++ b/utils/tasks.js @@ -1,8 +1,9 @@ -const { getUsername, getUserId, getParticipantUsernames, getParticipantUserIds } = require("./users"); -const { TASK_TYPE, MAPPED_TASK_STATUS, COMPLETED_TASK_STATUS, TASK_STATUS } = require("../constants/tasks"); -const fireStore = require("../utils/firestore"); +import { getUsername, getUserId, getParticipantUsernames, getParticipantUserIds } from "./users.js"; +import { TASK_TYPE, MAPPED_TASK_STATUS, COMPLETED_TASK_STATUS, TASK_STATUS } from "../constants/tasks.js"; +import fireStore from "./firestore.js"; +import { daysOfWeek } from "../constants/constants.js"; + const tasksModel = fireStore.collection("tasks"); -const { daysOfWeek } = require("../constants/constants"); const fromFirestoreData = async (task) => { if (!task) { @@ -146,7 +147,7 @@ const transformTasksUsersQuery = (queries) => { return { dateGap: transformedDateGap, status: transformedStatus, size: transformedSize, weekdayList, dateList }; }; -module.exports = { +export { fromFirestoreData, toFirestoreData, buildTasks, diff --git a/utils/time.js b/utils/time.js index f2ca9a6c0..9e17b2cc3 100644 --- a/utils/time.js +++ b/utils/time.js @@ -91,7 +91,7 @@ const getCurrentEpochTime = () => { return Math.round(Date.now() / 1000); }; -module.exports = { +export { convertDaysToMilliseconds, convertHoursToMilliseconds, convertMinutesToMilliseconds, diff --git a/utils/userStatus.js b/utils/userStatus.js index d6e353887..c21320340 100644 --- a/utils/userStatus.js +++ b/utils/userStatus.js @@ -1,6 +1,7 @@ -const { NotFound } = require("http-errors"); -const { userState } = require("../constants/userStatus"); -const { convertTimestampToUTCStartOrEndOfDay } = require("./time"); +import httpError from "http-errors"; +import { userState } from "../constants/userStatus.js"; +import { convertTimestampToUTCStartOrEndOfDay } from "./time.js"; +import logger from "./logger.js"; /* returns the User Id based on the route path * @param req {Object} : Express request object @@ -241,7 +242,7 @@ const createUserStatusWithState = async (userId, collection, state) => { /** * Retrieves the user ID based on the given username. * @param {string} userName - The username to search for. - * @param {FireStore Object} usersCollection - The FireStore Collection to search for. + * @param {FireStore Object} usersCollundection - The FireStore Collection to search for. * @returns {Promise} - The user ID corresponding to the given username. * @throws {Error} - If there is an error retrieving the user snapshot. * @throws {NotFound} - If the username could not be found. @@ -255,7 +256,7 @@ async function getUserIdFromUserName(userName, usersCollection) { throw new Error(`Something went wrong. The User ${userName} couldn't be verified.`); } if (!userSnapShot.size) { - throw new NotFound(`Something went wrong. Username ${userName} could not be found.`); + throw new httpError.NotFound(`Something went wrong. Username ${userName} could not be found.`); } const [userDoc] = userSnapShot.docs; return userDoc.id; @@ -352,11 +353,12 @@ const convertTimestampsToUTC = (obj) => { return obj; }; -module.exports = { +export { getUserIdBasedOnRoute, getTomorrowTimeStamp, getTodayTimeStamp, filterStatusData, + generateNewStatus, generateAlreadyExistingStatusResponse, updateCurrentStatusToState, updateFutureStatusToState, @@ -364,7 +366,6 @@ module.exports = { getUserIdFromUserName, checkIfUserHasLiveTasks, generateErrorResponse, - generateNewStatus, getNextDayTimeStamp, getFilteredPaginationLink, convertTimestampsToUTC, diff --git a/utils/username.ts b/utils/username.ts index 3eb48c75f..51f47ad5b 100644 --- a/utils/username.ts +++ b/utils/username.ts @@ -1,4 +1,4 @@ -const { MAX_USERNAME_LENGTH } = require("../constants/users"); +import { MAX_USERNAME_LENGTH } from "../constants/users.js"; /** * Formats a username by sanitizing the first and last names (removing non-alphabetical characters), diff --git a/utils/users.js b/utils/users.js index 387aadc58..de8d19208 100644 --- a/utils/users.js +++ b/utils/users.js @@ -1,9 +1,12 @@ -const firestore = require("../utils/firestore"); +import firestore from "../utils/firestore.js"; +import { months, discordNicknameLength } from "../constants/users.js"; +import * as dataAccessLayer from "../services/dataAccessLayer.js"; +import * as discordService from "../services/discordService.js"; +import { ROLES } from "../constants/roles.js"; +import logger from "./logger.js"; + const userModel = firestore.collection("users"); -const { months, discordNicknameLength } = require("../constants/users"); -const dataAccessLayer = require("../services/dataAccessLayer"); -const discordService = require("../services/discordService"); -const ROLES = require("../constants/roles"); + const addUserToDBForTest = async (userData) => { await userModel.add(userData); }; @@ -291,18 +294,18 @@ const updateNickname = async (userId, status = {}) => { } }; -module.exports = { +export { addUserToDBForTest, getUserId, getUsername, getFullName, - getParticipantUserIds, + getUsernameElseUndefined, + getUserIdElseUndefined, getParticipantUsernames, + getParticipantUserIds, getLowestLevelSkill, getPaginationLink, getUsernamesFromPRs, - getUsernameElseUndefined, - getUserIdElseUndefined, getRoleToUpdate, parseSearchQuery, generateOOONickname, diff --git a/utils/verifyAuthToken.ts b/utils/verifyAuthToken.ts index 363a67e12..9ca65ce86 100644 --- a/utils/verifyAuthToken.ts +++ b/utils/verifyAuthToken.ts @@ -1,5 +1,7 @@ import jwt from "jsonwebtoken"; -const externalServicePublicKey = config.get("externalServices.EXTERNAL_SERVICE_PUBLIC_KEY"); +import config from "config"; + +const externalServicePublicKey = config.get("externalServices.EXTERNAL_SERVICE_PUBLIC_KEY") as string; export const verifyAuthToken = async (token: string) => { try { diff --git a/yarn.lock b/yarn.lock index 027e73056..4817f0e83 100644 --- a/yarn.lock +++ b/yarn.lock @@ -59,590 +59,502 @@ tslib "^2.6.2" "@aws-sdk/client-identitystore@^3.665.0": - version "3.665.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-identitystore/-/client-identitystore-3.665.0.tgz#c234ba661ab1cfb4da138b66e595942e588e656e" - integrity sha512-KeTKgvYJyYX0TiRzkmPpTdCZdVnenXMeOd0+OlLcOzk1+LSXXYN/Z3RNezeUR7GzkdZ/mApBJXXP5ZpN0oiDMg== + version "3.803.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-identitystore/-/client-identitystore-3.803.0.tgz#de32380c40eb9ea79d4ee606ebe53432048f0c62" + integrity sha512-2KYkTmOI7XClQfdcav5yernscrLkHmFvh6RlfId8VeMSokLL13JcsZwpgIN+MUux/VxbaVEnaYBw32k9zfpI9w== dependencies: "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/client-sso-oidc" "3.665.0" - "@aws-sdk/client-sts" "3.665.0" - "@aws-sdk/core" "3.665.0" - "@aws-sdk/credential-provider-node" "3.665.0" - "@aws-sdk/middleware-host-header" "3.664.0" - "@aws-sdk/middleware-logger" "3.664.0" - "@aws-sdk/middleware-recursion-detection" "3.664.0" - "@aws-sdk/middleware-user-agent" "3.664.0" - "@aws-sdk/region-config-resolver" "3.664.0" - "@aws-sdk/types" "3.664.0" - "@aws-sdk/util-endpoints" "3.664.0" - "@aws-sdk/util-user-agent-browser" "3.664.0" - "@aws-sdk/util-user-agent-node" "3.664.0" - "@smithy/config-resolver" "^3.0.9" - "@smithy/core" "^2.4.7" - "@smithy/fetch-http-handler" "^3.2.9" - "@smithy/hash-node" "^3.0.7" - "@smithy/invalid-dependency" "^3.0.7" - "@smithy/middleware-content-length" "^3.0.9" - "@smithy/middleware-endpoint" "^3.1.4" - "@smithy/middleware-retry" "^3.0.22" - "@smithy/middleware-serde" "^3.0.7" - "@smithy/middleware-stack" "^3.0.7" - "@smithy/node-config-provider" "^3.1.8" - "@smithy/node-http-handler" "^3.2.4" - "@smithy/protocol-http" "^4.1.4" - "@smithy/smithy-client" "^3.3.6" - "@smithy/types" "^3.5.0" - "@smithy/url-parser" "^3.0.7" - "@smithy/util-base64" "^3.0.0" - "@smithy/util-body-length-browser" "^3.0.0" - "@smithy/util-body-length-node" "^3.0.0" - "@smithy/util-defaults-mode-browser" "^3.0.22" - "@smithy/util-defaults-mode-node" "^3.0.22" - "@smithy/util-endpoints" "^2.1.3" - "@smithy/util-middleware" "^3.0.7" - "@smithy/util-retry" "^3.0.7" - "@smithy/util-utf8" "^3.0.0" + "@aws-sdk/core" "3.799.0" + "@aws-sdk/credential-provider-node" "3.803.0" + "@aws-sdk/middleware-host-header" "3.775.0" + "@aws-sdk/middleware-logger" "3.775.0" + "@aws-sdk/middleware-recursion-detection" "3.775.0" + "@aws-sdk/middleware-user-agent" "3.799.0" + "@aws-sdk/region-config-resolver" "3.775.0" + "@aws-sdk/types" "3.775.0" + "@aws-sdk/util-endpoints" "3.787.0" + "@aws-sdk/util-user-agent-browser" "3.775.0" + "@aws-sdk/util-user-agent-node" "3.799.0" + "@smithy/config-resolver" "^4.1.0" + "@smithy/core" "^3.3.0" + "@smithy/fetch-http-handler" "^5.0.2" + "@smithy/hash-node" "^4.0.2" + "@smithy/invalid-dependency" "^4.0.2" + "@smithy/middleware-content-length" "^4.0.2" + "@smithy/middleware-endpoint" "^4.1.1" + "@smithy/middleware-retry" "^4.1.2" + "@smithy/middleware-serde" "^4.0.3" + "@smithy/middleware-stack" "^4.0.2" + "@smithy/node-config-provider" "^4.0.2" + "@smithy/node-http-handler" "^4.0.4" + "@smithy/protocol-http" "^5.1.0" + "@smithy/smithy-client" "^4.2.1" + "@smithy/types" "^4.2.0" + "@smithy/url-parser" "^4.0.2" + "@smithy/util-base64" "^4.0.0" + "@smithy/util-body-length-browser" "^4.0.0" + "@smithy/util-body-length-node" "^4.0.0" + "@smithy/util-defaults-mode-browser" "^4.0.9" + "@smithy/util-defaults-mode-node" "^4.0.9" + "@smithy/util-endpoints" "^3.0.2" + "@smithy/util-middleware" "^4.0.2" + "@smithy/util-retry" "^4.0.3" + "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/client-sso-oidc@3.665.0": - version "3.665.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.665.0.tgz#d933f79a23aa5afbf9dddfc2685049ebff4b11d1" - integrity sha512-FQ2YyM9/6y3clWkf3d60/W4c/HZy61hbfIsR4KIh8aGOifwfIx/UpZQ61pCr/TXTNqbaAVU2/sK+J1zFkGEoLw== +"@aws-sdk/client-sso@3.803.0": + version "3.803.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.803.0.tgz#16a4611e279694effcbb65d9d65ed1d64c635855" + integrity sha512-TT3BRD1yiL3IGXBKfq560vvEdyOJtJr8bp+R82dD6P0IoS8aFcNtF822BOJy7CqvxksOc3hQKLaPVzE82gE8Ow== dependencies: "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "3.665.0" - "@aws-sdk/credential-provider-node" "3.665.0" - "@aws-sdk/middleware-host-header" "3.664.0" - "@aws-sdk/middleware-logger" "3.664.0" - "@aws-sdk/middleware-recursion-detection" "3.664.0" - "@aws-sdk/middleware-user-agent" "3.664.0" - "@aws-sdk/region-config-resolver" "3.664.0" - "@aws-sdk/types" "3.664.0" - "@aws-sdk/util-endpoints" "3.664.0" - "@aws-sdk/util-user-agent-browser" "3.664.0" - "@aws-sdk/util-user-agent-node" "3.664.0" - "@smithy/config-resolver" "^3.0.9" - "@smithy/core" "^2.4.7" - "@smithy/fetch-http-handler" "^3.2.9" - "@smithy/hash-node" "^3.0.7" - "@smithy/invalid-dependency" "^3.0.7" - "@smithy/middleware-content-length" "^3.0.9" - "@smithy/middleware-endpoint" "^3.1.4" - "@smithy/middleware-retry" "^3.0.22" - "@smithy/middleware-serde" "^3.0.7" - "@smithy/middleware-stack" "^3.0.7" - "@smithy/node-config-provider" "^3.1.8" - "@smithy/node-http-handler" "^3.2.4" - "@smithy/protocol-http" "^4.1.4" - "@smithy/smithy-client" "^3.3.6" - "@smithy/types" "^3.5.0" - "@smithy/url-parser" "^3.0.7" - "@smithy/util-base64" "^3.0.0" - "@smithy/util-body-length-browser" "^3.0.0" - "@smithy/util-body-length-node" "^3.0.0" - "@smithy/util-defaults-mode-browser" "^3.0.22" - "@smithy/util-defaults-mode-node" "^3.0.22" - "@smithy/util-endpoints" "^2.1.3" - "@smithy/util-middleware" "^3.0.7" - "@smithy/util-retry" "^3.0.7" - "@smithy/util-utf8" "^3.0.0" + "@aws-sdk/core" "3.799.0" + "@aws-sdk/middleware-host-header" "3.775.0" + "@aws-sdk/middleware-logger" "3.775.0" + "@aws-sdk/middleware-recursion-detection" "3.775.0" + "@aws-sdk/middleware-user-agent" "3.799.0" + "@aws-sdk/region-config-resolver" "3.775.0" + "@aws-sdk/types" "3.775.0" + "@aws-sdk/util-endpoints" "3.787.0" + "@aws-sdk/util-user-agent-browser" "3.775.0" + "@aws-sdk/util-user-agent-node" "3.799.0" + "@smithy/config-resolver" "^4.1.0" + "@smithy/core" "^3.3.0" + "@smithy/fetch-http-handler" "^5.0.2" + "@smithy/hash-node" "^4.0.2" + "@smithy/invalid-dependency" "^4.0.2" + "@smithy/middleware-content-length" "^4.0.2" + "@smithy/middleware-endpoint" "^4.1.1" + "@smithy/middleware-retry" "^4.1.2" + "@smithy/middleware-serde" "^4.0.3" + "@smithy/middleware-stack" "^4.0.2" + "@smithy/node-config-provider" "^4.0.2" + "@smithy/node-http-handler" "^4.0.4" + "@smithy/protocol-http" "^5.1.0" + "@smithy/smithy-client" "^4.2.1" + "@smithy/types" "^4.2.0" + "@smithy/url-parser" "^4.0.2" + "@smithy/util-base64" "^4.0.0" + "@smithy/util-body-length-browser" "^4.0.0" + "@smithy/util-body-length-node" "^4.0.0" + "@smithy/util-defaults-mode-browser" "^4.0.9" + "@smithy/util-defaults-mode-node" "^4.0.9" + "@smithy/util-endpoints" "^3.0.2" + "@smithy/util-middleware" "^4.0.2" + "@smithy/util-retry" "^4.0.3" + "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/client-sso@3.665.0": - version "3.665.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.665.0.tgz#d8fff846995cfc2d3c0631a0774138395aa57ce2" - integrity sha512-zje+oaIiyviDv5dmBWhGHifPTb0Idq/HatNPy+VEiwo2dxcQBexibD5CQE5e8CWZK123Br/9DHft+iNKdiY5bA== - dependencies: - "@aws-crypto/sha256-browser" "5.2.0" - "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "3.665.0" - "@aws-sdk/middleware-host-header" "3.664.0" - "@aws-sdk/middleware-logger" "3.664.0" - "@aws-sdk/middleware-recursion-detection" "3.664.0" - "@aws-sdk/middleware-user-agent" "3.664.0" - "@aws-sdk/region-config-resolver" "3.664.0" - "@aws-sdk/types" "3.664.0" - "@aws-sdk/util-endpoints" "3.664.0" - "@aws-sdk/util-user-agent-browser" "3.664.0" - "@aws-sdk/util-user-agent-node" "3.664.0" - "@smithy/config-resolver" "^3.0.9" - "@smithy/core" "^2.4.7" - "@smithy/fetch-http-handler" "^3.2.9" - "@smithy/hash-node" "^3.0.7" - "@smithy/invalid-dependency" "^3.0.7" - "@smithy/middleware-content-length" "^3.0.9" - "@smithy/middleware-endpoint" "^3.1.4" - "@smithy/middleware-retry" "^3.0.22" - "@smithy/middleware-serde" "^3.0.7" - "@smithy/middleware-stack" "^3.0.7" - "@smithy/node-config-provider" "^3.1.8" - "@smithy/node-http-handler" "^3.2.4" - "@smithy/protocol-http" "^4.1.4" - "@smithy/smithy-client" "^3.3.6" - "@smithy/types" "^3.5.0" - "@smithy/url-parser" "^3.0.7" - "@smithy/util-base64" "^3.0.0" - "@smithy/util-body-length-browser" "^3.0.0" - "@smithy/util-body-length-node" "^3.0.0" - "@smithy/util-defaults-mode-browser" "^3.0.22" - "@smithy/util-defaults-mode-node" "^3.0.22" - "@smithy/util-endpoints" "^2.1.3" - "@smithy/util-middleware" "^3.0.7" - "@smithy/util-retry" "^3.0.7" - "@smithy/util-utf8" "^3.0.0" - tslib "^2.6.2" - -"@aws-sdk/client-sts@3.665.0": - version "3.665.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.665.0.tgz#1b2b71841c1da810091b8ac79346c30f01d8897c" - integrity sha512-/OQEaWB1euXhZ/hV+wetDw1tynlrkNKzirzoiFuJ1EQsiIb9Ih/qjUF9KLdF1+/bXbnGu5YvIaAx80YReUchjg== - dependencies: - "@aws-crypto/sha256-browser" "5.2.0" - "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/client-sso-oidc" "3.665.0" - "@aws-sdk/core" "3.665.0" - "@aws-sdk/credential-provider-node" "3.665.0" - "@aws-sdk/middleware-host-header" "3.664.0" - "@aws-sdk/middleware-logger" "3.664.0" - "@aws-sdk/middleware-recursion-detection" "3.664.0" - "@aws-sdk/middleware-user-agent" "3.664.0" - "@aws-sdk/region-config-resolver" "3.664.0" - "@aws-sdk/types" "3.664.0" - "@aws-sdk/util-endpoints" "3.664.0" - "@aws-sdk/util-user-agent-browser" "3.664.0" - "@aws-sdk/util-user-agent-node" "3.664.0" - "@smithy/config-resolver" "^3.0.9" - "@smithy/core" "^2.4.7" - "@smithy/fetch-http-handler" "^3.2.9" - "@smithy/hash-node" "^3.0.7" - "@smithy/invalid-dependency" "^3.0.7" - "@smithy/middleware-content-length" "^3.0.9" - "@smithy/middleware-endpoint" "^3.1.4" - "@smithy/middleware-retry" "^3.0.22" - "@smithy/middleware-serde" "^3.0.7" - "@smithy/middleware-stack" "^3.0.7" - "@smithy/node-config-provider" "^3.1.8" - "@smithy/node-http-handler" "^3.2.4" - "@smithy/protocol-http" "^4.1.4" - "@smithy/smithy-client" "^3.3.6" - "@smithy/types" "^3.5.0" - "@smithy/url-parser" "^3.0.7" - "@smithy/util-base64" "^3.0.0" - "@smithy/util-body-length-browser" "^3.0.0" - "@smithy/util-body-length-node" "^3.0.0" - "@smithy/util-defaults-mode-browser" "^3.0.22" - "@smithy/util-defaults-mode-node" "^3.0.22" - "@smithy/util-endpoints" "^2.1.3" - "@smithy/util-middleware" "^3.0.7" - "@smithy/util-retry" "^3.0.7" - "@smithy/util-utf8" "^3.0.0" - tslib "^2.6.2" - -"@aws-sdk/core@3.665.0": - version "3.665.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.665.0.tgz#388249e5114291cec88d07188c6a707957bdd4dc" - integrity sha512-nqmNNf7Ml7qDXTIisDv+OYe/rl3nAW4cmR+HxrOCWdhTHe8xRdR5c45VPoh8nv1KIry5xtd+iqPrzzjydes+Og== - dependencies: - "@aws-sdk/types" "3.664.0" - "@smithy/core" "^2.4.7" - "@smithy/node-config-provider" "^3.1.8" - "@smithy/property-provider" "^3.1.7" - "@smithy/protocol-http" "^4.1.4" - "@smithy/signature-v4" "^4.2.0" - "@smithy/smithy-client" "^3.3.6" - "@smithy/types" "^3.5.0" - "@smithy/util-middleware" "^3.0.7" +"@aws-sdk/core@3.799.0": + version "3.799.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.799.0.tgz#383f903ede137df108dcd5f817074515d2b1242e" + integrity sha512-hkKF3Zpc6+H8GI1rlttYVRh9uEE77cqAzLmLpY3iu7sql8cZgPERRBfaFct8p1SaDyrksLNiboD1vKW58mbsYg== + dependencies: + "@aws-sdk/types" "3.775.0" + "@smithy/core" "^3.3.0" + "@smithy/node-config-provider" "^4.0.2" + "@smithy/property-provider" "^4.0.2" + "@smithy/protocol-http" "^5.1.0" + "@smithy/signature-v4" "^5.1.0" + "@smithy/smithy-client" "^4.2.1" + "@smithy/types" "^4.2.0" + "@smithy/util-middleware" "^4.0.2" fast-xml-parser "4.4.1" tslib "^2.6.2" -"@aws-sdk/credential-provider-env@3.664.0": - version "3.664.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.664.0.tgz#62e81a883f9b94e593ed31a21f91d6026aba73ee" - integrity sha512-95rE+9Voaco0nmKJrXqfJAxSSkSWqlBy76zomiZrUrv7YuijQtHCW8jte6v6UHAFAaBzgFsY7QqBxs15u9SM7g== +"@aws-sdk/credential-provider-env@3.799.0": + version "3.799.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.799.0.tgz#d933265b54b18ef1232762c318ff0d75bc7785f9" + integrity sha512-vT/SSWtbUIOW/U21qgEySmmO44SFWIA7WeQPX1OrI8WJ5n7OEI23JWLHjLvHTkYmuZK6z1rPcv7HzRgmuGRibA== dependencies: - "@aws-sdk/types" "3.664.0" - "@smithy/property-provider" "^3.1.7" - "@smithy/types" "^3.5.0" + "@aws-sdk/core" "3.799.0" + "@aws-sdk/types" "3.775.0" + "@smithy/property-provider" "^4.0.2" + "@smithy/types" "^4.2.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-http@3.664.0": - version "3.664.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.664.0.tgz#457e0c081b3f91315f5f1c3ce4f9b625ef085787" - integrity sha512-svaPwVfWV3g/qjd4cYHTUyBtkdOwcVjC+tSj6EjoMrpZwGUXcCbYe04iU0ARZ6tuH/u3vySbTLOGjSa7g8o9Qw== - dependencies: - "@aws-sdk/types" "3.664.0" - "@smithy/fetch-http-handler" "^3.2.9" - "@smithy/node-http-handler" "^3.2.4" - "@smithy/property-provider" "^3.1.7" - "@smithy/protocol-http" "^4.1.4" - "@smithy/smithy-client" "^3.3.6" - "@smithy/types" "^3.5.0" - "@smithy/util-stream" "^3.1.9" +"@aws-sdk/credential-provider-http@3.799.0": + version "3.799.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.799.0.tgz#9286235bb30c4f22fbeac0ecf2fe5e5f99aaa282" + integrity sha512-2CjBpOWmhaPAExOgHnIB5nOkS5ef+mfRlJ1JC4nsnjAx0nrK4tk0XRE0LYz11P3+ue+a86cU8WTmBo+qjnGxPQ== + dependencies: + "@aws-sdk/core" "3.799.0" + "@aws-sdk/types" "3.775.0" + "@smithy/fetch-http-handler" "^5.0.2" + "@smithy/node-http-handler" "^4.0.4" + "@smithy/property-provider" "^4.0.2" + "@smithy/protocol-http" "^5.1.0" + "@smithy/smithy-client" "^4.2.1" + "@smithy/types" "^4.2.0" + "@smithy/util-stream" "^4.2.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-ini@3.665.0": - version "3.665.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.665.0.tgz#a7a40a0867639b1a4dea9a38d6b25fcead660a96" - integrity sha512-CSWBV5GqCkK78TTXq6qx40MWCt90t8rS/O7FIR4nbmoUhG/DysaC1G0om1fSx6k+GWcvIIIsSvD4hdbh8FRWKA== - dependencies: - "@aws-sdk/credential-provider-env" "3.664.0" - "@aws-sdk/credential-provider-http" "3.664.0" - "@aws-sdk/credential-provider-process" "3.664.0" - "@aws-sdk/credential-provider-sso" "3.665.0" - "@aws-sdk/credential-provider-web-identity" "3.664.0" - "@aws-sdk/types" "3.664.0" - "@smithy/credential-provider-imds" "^3.2.4" - "@smithy/property-provider" "^3.1.7" - "@smithy/shared-ini-file-loader" "^3.1.8" - "@smithy/types" "^3.5.0" +"@aws-sdk/credential-provider-ini@3.803.0": + version "3.803.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.803.0.tgz#5f831e53cf475756052aba81b128d66d8ba5a52f" + integrity sha512-XtbFftJex18GobpRWJxg5V7stVwvmV2gdBYW+zRM0YW6NZAR4NP/4vcc9ktM3++BWW5OF4Kvl7Nu7N4mAzRHmw== + dependencies: + "@aws-sdk/core" "3.799.0" + "@aws-sdk/credential-provider-env" "3.799.0" + "@aws-sdk/credential-provider-http" "3.799.0" + "@aws-sdk/credential-provider-process" "3.799.0" + "@aws-sdk/credential-provider-sso" "3.803.0" + "@aws-sdk/credential-provider-web-identity" "3.803.0" + "@aws-sdk/nested-clients" "3.803.0" + "@aws-sdk/types" "3.775.0" + "@smithy/credential-provider-imds" "^4.0.2" + "@smithy/property-provider" "^4.0.2" + "@smithy/shared-ini-file-loader" "^4.0.2" + "@smithy/types" "^4.2.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-node@3.665.0": - version "3.665.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.665.0.tgz#bc8ea541fe0a5e9cbd29564a43abb6a9ea5e3edd" - integrity sha512-cmJfVi4IM0WaKMQvPXhiS5mdIZyCoa04I3D+IEKpD2GAuVZa6tgwqfPyaApFDLjyedGGNFkC4MRgAjCcCl4WFg== - dependencies: - "@aws-sdk/credential-provider-env" "3.664.0" - "@aws-sdk/credential-provider-http" "3.664.0" - "@aws-sdk/credential-provider-ini" "3.665.0" - "@aws-sdk/credential-provider-process" "3.664.0" - "@aws-sdk/credential-provider-sso" "3.665.0" - "@aws-sdk/credential-provider-web-identity" "3.664.0" - "@aws-sdk/types" "3.664.0" - "@smithy/credential-provider-imds" "^3.2.4" - "@smithy/property-provider" "^3.1.7" - "@smithy/shared-ini-file-loader" "^3.1.8" - "@smithy/types" "^3.5.0" +"@aws-sdk/credential-provider-node@3.803.0": + version "3.803.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.803.0.tgz#bcfd9638f7f8e8a1b78fc2c58346daf7f67389e2" + integrity sha512-lPdRYbjxwmv7gRqbaEe1Y1Yl5fD4c43AuK3P31eKjf1j41hZEQ0dg9a9KLk7i6ehEoVsxewnJrvbC2pVoYrCmQ== + dependencies: + "@aws-sdk/credential-provider-env" "3.799.0" + "@aws-sdk/credential-provider-http" "3.799.0" + "@aws-sdk/credential-provider-ini" "3.803.0" + "@aws-sdk/credential-provider-process" "3.799.0" + "@aws-sdk/credential-provider-sso" "3.803.0" + "@aws-sdk/credential-provider-web-identity" "3.803.0" + "@aws-sdk/types" "3.775.0" + "@smithy/credential-provider-imds" "^4.0.2" + "@smithy/property-provider" "^4.0.2" + "@smithy/shared-ini-file-loader" "^4.0.2" + "@smithy/types" "^4.2.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-process@3.664.0": - version "3.664.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.664.0.tgz#d5ae17d404440855733a9eb0167ee8db168b7814" - integrity sha512-sQicIw/qWTsmMw8EUQNJXdrWV5SXaZc2zGdCQsQxhR6wwNO2/rZ5JmzdcwUADmleBVyPYk3KGLhcofF/qXT2Ng== +"@aws-sdk/credential-provider-process@3.799.0": + version "3.799.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.799.0.tgz#34e8b3d7c889bbb87dfe7c171255a8b99a34df25" + integrity sha512-g8jmNs2k98WNHMYcea1YKA+7ao2Ma4w0P42Dz4YpcI155pQHxHx25RwbOG+rsAKuo3bKwkW53HVE/ZTKhcWFgw== dependencies: - "@aws-sdk/types" "3.664.0" - "@smithy/property-provider" "^3.1.7" - "@smithy/shared-ini-file-loader" "^3.1.8" - "@smithy/types" "^3.5.0" + "@aws-sdk/core" "3.799.0" + "@aws-sdk/types" "3.775.0" + "@smithy/property-provider" "^4.0.2" + "@smithy/shared-ini-file-loader" "^4.0.2" + "@smithy/types" "^4.2.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-sso@3.665.0": - version "3.665.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.665.0.tgz#9ba6ea31122d863442fe7c2e9a3004dcb04f15ed" - integrity sha512-Xe8WW4r70bsetGQG3azFeK/gd+Q4OmNiidtRrG64y/V9TIvIqc7Y/yUZNhEgFkpG19o188VmXg/ulnG3E+MvLg== - dependencies: - "@aws-sdk/client-sso" "3.665.0" - "@aws-sdk/token-providers" "3.664.0" - "@aws-sdk/types" "3.664.0" - "@smithy/property-provider" "^3.1.7" - "@smithy/shared-ini-file-loader" "^3.1.8" - "@smithy/types" "^3.5.0" +"@aws-sdk/credential-provider-sso@3.803.0": + version "3.803.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.803.0.tgz#8a0a48a9acaab8f4e5c172427cc476a2f3513aaa" + integrity sha512-HEAcxSHrHxVekGnZqjFrkqdYAf4jFiZIMhuh0jqiqY6A4udEyXy1V623HVcTz/XXj6UBRnyD+zmOmlbzBvkfQg== + dependencies: + "@aws-sdk/client-sso" "3.803.0" + "@aws-sdk/core" "3.799.0" + "@aws-sdk/token-providers" "3.803.0" + "@aws-sdk/types" "3.775.0" + "@smithy/property-provider" "^4.0.2" + "@smithy/shared-ini-file-loader" "^4.0.2" + "@smithy/types" "^4.2.0" tslib "^2.6.2" -"@aws-sdk/credential-provider-web-identity@3.664.0": - version "3.664.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.664.0.tgz#46b79cdae6adb3c7d8da966eeef06124a31e065b" - integrity sha512-10ltP1BfSKRJVXd8Yr5oLbo+VSDskWbps0X3szSsxTk0Dju1xvkz7hoIjylWLvtGbvQ+yb2pmsJYKCudW/4DJg== +"@aws-sdk/credential-provider-web-identity@3.803.0": + version "3.803.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.803.0.tgz#9612bd4e2a2bdf2d3826f18b2138f8bd996605bb" + integrity sha512-oChnEpwI25OW4GPvhI1VnXM3IQEkDhESGFZd5JHzJDHyvSF2NU58V86jkJyaa4H4X25IbGaThuulNI5xCOngjw== dependencies: - "@aws-sdk/types" "3.664.0" - "@smithy/property-provider" "^3.1.7" - "@smithy/types" "^3.5.0" + "@aws-sdk/core" "3.799.0" + "@aws-sdk/nested-clients" "3.803.0" + "@aws-sdk/types" "3.775.0" + "@smithy/property-provider" "^4.0.2" + "@smithy/types" "^4.2.0" tslib "^2.6.2" -"@aws-sdk/middleware-host-header@3.664.0": - version "3.664.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.664.0.tgz#14ea7fabe0f5a31ee399bb243981c951ab902560" - integrity sha512-4tCXJ+DZWTq38eLmFgnEmO8X4jfWpgPbWoCyVYpRHCPHq6xbrU65gfwS9jGx25L4YdEce641ChI9TKLryuUgRA== +"@aws-sdk/middleware-host-header@3.775.0": + version "3.775.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.775.0.tgz#1bf8160b8f4f96ba30c19f9baa030a6c9bd5f94d" + integrity sha512-tkSegM0Z6WMXpLB8oPys/d+umYIocvO298mGvcMCncpRl77L9XkvSLJIFzaHes+o7djAgIduYw8wKIMStFss2w== dependencies: - "@aws-sdk/types" "3.664.0" - "@smithy/protocol-http" "^4.1.4" - "@smithy/types" "^3.5.0" + "@aws-sdk/types" "3.775.0" + "@smithy/protocol-http" "^5.1.0" + "@smithy/types" "^4.2.0" tslib "^2.6.2" -"@aws-sdk/middleware-logger@3.664.0": - version "3.664.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.664.0.tgz#74f47c10732b873c1f097c909b9df46babeacda4" - integrity sha512-eNykMqQuv7eg9pAcaLro44fscIe1VkFfhm+gYnlxd+PH6xqapRki1E68VHehnIptnVBdqnWfEqLUSLGm9suqhg== +"@aws-sdk/middleware-logger@3.775.0": + version "3.775.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.775.0.tgz#df1909d441cd4bade8d6c7d24c41532808db0e81" + integrity sha512-FaxO1xom4MAoUJsldmR92nT1G6uZxTdNYOFYtdHfd6N2wcNaTuxgjIvqzg5y7QIH9kn58XX/dzf1iTjgqUStZw== dependencies: - "@aws-sdk/types" "3.664.0" - "@smithy/types" "^3.5.0" + "@aws-sdk/types" "3.775.0" + "@smithy/types" "^4.2.0" tslib "^2.6.2" -"@aws-sdk/middleware-recursion-detection@3.664.0": - version "3.664.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.664.0.tgz#0564b857c4501e2de5a2c3d78d3a5f29fad1307b" - integrity sha512-jq27WMZhm+dY8BWZ9Ipy3eXtZj0lJzpaKQE3A3tH5AOIlUV/gqrmnJ9CdqVVef4EJsq9Yil4ZzQjKKmPsxveQg== +"@aws-sdk/middleware-recursion-detection@3.775.0": + version "3.775.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.775.0.tgz#36a40f467754d7c86424d12ef45c05e96ce3475b" + integrity sha512-GLCzC8D0A0YDG5u3F5U03Vb9j5tcOEFhr8oc6PDk0k0vm5VwtZOE6LvK7hcCSoAB4HXyOUM0sQuXrbaAh9OwXA== dependencies: - "@aws-sdk/types" "3.664.0" - "@smithy/protocol-http" "^4.1.4" - "@smithy/types" "^3.5.0" + "@aws-sdk/types" "3.775.0" + "@smithy/protocol-http" "^5.1.0" + "@smithy/types" "^4.2.0" + tslib "^2.6.2" + +"@aws-sdk/middleware-user-agent@3.799.0": + version "3.799.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.799.0.tgz#e120e6e1341bcba5427cee0385172170e4615186" + integrity sha512-TropQZanbOTxa+p+Nl4fWkzlRhgFwDfW+Wb6TR3jZN7IXHNlPpgGFpdrgvBExhW/RBhqr+94OsR8Ou58lp3hhA== + dependencies: + "@aws-sdk/core" "3.799.0" + "@aws-sdk/types" "3.775.0" + "@aws-sdk/util-endpoints" "3.787.0" + "@smithy/core" "^3.3.0" + "@smithy/protocol-http" "^5.1.0" + "@smithy/types" "^4.2.0" tslib "^2.6.2" -"@aws-sdk/middleware-user-agent@3.664.0": - version "3.664.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.664.0.tgz#06827a880095ddf34361662df359bdc97de6f00e" - integrity sha512-Kp5UwXwayO6d472nntiwgrxqay2KS9ozXNmKjQfDrUWbEzvgKI+jgKNMia8MMnjSxYoBGpQ1B8NGh8a6KMEJJg== +"@aws-sdk/nested-clients@3.803.0": + version "3.803.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/nested-clients/-/nested-clients-3.803.0.tgz#aa5852a9c8b48bcad903ac841952b93ffd0bd3b3" + integrity sha512-wiWiYaFQxK2u37G9IOXuWkHelEbU8ulLxdHpoPf0TSu/1boqLW7fcofuZATAvFcvigQx3oebwO8G4c/mmixTTw== dependencies: - "@aws-sdk/types" "3.664.0" - "@aws-sdk/util-endpoints" "3.664.0" - "@smithy/core" "^2.4.7" - "@smithy/protocol-http" "^4.1.4" - "@smithy/types" "^3.5.0" + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "3.799.0" + "@aws-sdk/middleware-host-header" "3.775.0" + "@aws-sdk/middleware-logger" "3.775.0" + "@aws-sdk/middleware-recursion-detection" "3.775.0" + "@aws-sdk/middleware-user-agent" "3.799.0" + "@aws-sdk/region-config-resolver" "3.775.0" + "@aws-sdk/types" "3.775.0" + "@aws-sdk/util-endpoints" "3.787.0" + "@aws-sdk/util-user-agent-browser" "3.775.0" + "@aws-sdk/util-user-agent-node" "3.799.0" + "@smithy/config-resolver" "^4.1.0" + "@smithy/core" "^3.3.0" + "@smithy/fetch-http-handler" "^5.0.2" + "@smithy/hash-node" "^4.0.2" + "@smithy/invalid-dependency" "^4.0.2" + "@smithy/middleware-content-length" "^4.0.2" + "@smithy/middleware-endpoint" "^4.1.1" + "@smithy/middleware-retry" "^4.1.2" + "@smithy/middleware-serde" "^4.0.3" + "@smithy/middleware-stack" "^4.0.2" + "@smithy/node-config-provider" "^4.0.2" + "@smithy/node-http-handler" "^4.0.4" + "@smithy/protocol-http" "^5.1.0" + "@smithy/smithy-client" "^4.2.1" + "@smithy/types" "^4.2.0" + "@smithy/url-parser" "^4.0.2" + "@smithy/util-base64" "^4.0.0" + "@smithy/util-body-length-browser" "^4.0.0" + "@smithy/util-body-length-node" "^4.0.0" + "@smithy/util-defaults-mode-browser" "^4.0.9" + "@smithy/util-defaults-mode-node" "^4.0.9" + "@smithy/util-endpoints" "^3.0.2" + "@smithy/util-middleware" "^4.0.2" + "@smithy/util-retry" "^4.0.3" + "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/region-config-resolver@3.664.0": - version "3.664.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/region-config-resolver/-/region-config-resolver-3.664.0.tgz#69e65abae7338e677f6be0c7c43ee622411c1304" - integrity sha512-o/B8dg8K+9714RGYPgMxZgAChPe/MTSMkf/eHXTUFHNik5i1HgVKfac22njV2iictGy/6GhpFsKa1OWNYAkcUg== +"@aws-sdk/region-config-resolver@3.775.0": + version "3.775.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/region-config-resolver/-/region-config-resolver-3.775.0.tgz#592b52498e68501fe46480be3dfb185e949d1eab" + integrity sha512-40iH3LJjrQS3LKUJAl7Wj0bln7RFPEvUYKFxtP8a+oKFDO0F65F52xZxIJbPn6sHkxWDAnZlGgdjZXM3p2g5wQ== dependencies: - "@aws-sdk/types" "3.664.0" - "@smithy/node-config-provider" "^3.1.8" - "@smithy/types" "^3.5.0" - "@smithy/util-config-provider" "^3.0.0" - "@smithy/util-middleware" "^3.0.7" + "@aws-sdk/types" "3.775.0" + "@smithy/node-config-provider" "^4.0.2" + "@smithy/types" "^4.2.0" + "@smithy/util-config-provider" "^4.0.0" + "@smithy/util-middleware" "^4.0.2" tslib "^2.6.2" -"@aws-sdk/token-providers@3.664.0": - version "3.664.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.664.0.tgz#edeb10bf273960c8ef7172d78c0bb41a0c73d350" - integrity sha512-dBAvXW2/6bAxidvKARFxyCY2uCynYBKRFN00NhS1T5ggxm3sUnuTpWw1DTjl02CVPkacBOocZf10h8pQbHSK8w== +"@aws-sdk/token-providers@3.803.0": + version "3.803.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.803.0.tgz#ba0f6b2919521125cf9c280bc3de1135c4e47e25" + integrity sha512-lDbMgVjWWEPT7a6lLaAEPPljwOeLTjPX2sJ7MoDICpQotg4Yd8cQfX3nqScSyLAGSc7Rq/21UPnPoij/E0K3lg== dependencies: - "@aws-sdk/types" "3.664.0" - "@smithy/property-provider" "^3.1.7" - "@smithy/shared-ini-file-loader" "^3.1.8" - "@smithy/types" "^3.5.0" + "@aws-sdk/nested-clients" "3.803.0" + "@aws-sdk/types" "3.775.0" + "@smithy/property-provider" "^4.0.2" + "@smithy/shared-ini-file-loader" "^4.0.2" + "@smithy/types" "^4.2.0" tslib "^2.6.2" -"@aws-sdk/types@3.664.0", "@aws-sdk/types@^3.222.0": - version "3.664.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.664.0.tgz#e6de1c0a2cdfe4f1e43271223dc0b55e613ced58" - integrity sha512-+GtXktvVgpreM2b+NJL9OqZGsOzHwlCUrO8jgQUvH/yA6Kd8QO2YFhQCp0C9sSzTteZJVqGBu8E0CQurxJHPbw== +"@aws-sdk/types@3.775.0", "@aws-sdk/types@^3.222.0": + version "3.775.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.775.0.tgz#09863a9e68c080947db7c3d226d1c56b8f0f5150" + integrity sha512-ZoGKwa4C9fC9Av6bdfqcW6Ix5ot05F/S4VxWR2nHuMv7hzfmAjTOcUiWT7UR4hM/U0whf84VhDtXN/DWAk52KA== dependencies: - "@smithy/types" "^3.5.0" + "@smithy/types" "^4.2.0" tslib "^2.6.2" -"@aws-sdk/util-endpoints@3.664.0": - version "3.664.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.664.0.tgz#cad1195e9b6af74f61bcad4c71d7b820e7deae8c" - integrity sha512-KrXoHz6zmAahVHkyWMRT+P6xJaxItgmklxEDrT+npsUB4d5C/lhw16Crcp9TDi828fiZK3GYKRAmmNhvmzvBNg== +"@aws-sdk/util-endpoints@3.787.0": + version "3.787.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.787.0.tgz#1398f0bd87f19e615ae920c73e16d9d5e5cb76d1" + integrity sha512-fd3zkiOkwnbdbN0Xp9TsP5SWrmv0SpT70YEdbb8wAj2DWQwiCmFszaSs+YCvhoCdmlR3Wl9Spu0pGpSAGKeYvQ== dependencies: - "@aws-sdk/types" "3.664.0" - "@smithy/types" "^3.5.0" - "@smithy/util-endpoints" "^2.1.3" + "@aws-sdk/types" "3.775.0" + "@smithy/types" "^4.2.0" + "@smithy/util-endpoints" "^3.0.2" tslib "^2.6.2" "@aws-sdk/util-locate-window@^3.0.0": - version "3.568.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-locate-window/-/util-locate-window-3.568.0.tgz#2acc4b2236af0d7494f7e517401ba6b3c4af11ff" - integrity sha512-3nh4TINkXYr+H41QaPelCceEB2FXP3fxp93YZXB/kqJvX0U9j0N0Uk45gvsjmEPzG8XxkPEeLIfT2I1M7A6Lig== + version "3.723.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-locate-window/-/util-locate-window-3.723.0.tgz#174551bfdd2eb36d3c16e7023fd7e7ee96ad0fa9" + integrity sha512-Yf2CS10BqK688DRsrKI/EO6B8ff5J86NXe4C+VCysK7UOgN0l1zOTeTukZ3H8Q9tYYX3oaF1961o8vRkFm7Nmw== dependencies: tslib "^2.6.2" -"@aws-sdk/util-user-agent-browser@3.664.0": - version "3.664.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.664.0.tgz#d22da782154df1b3d6b60e89103554c07673e3b2" - integrity sha512-c/PV3+f1ss4PpskHbcOxTZ6fntV2oXy/xcDR9nW+kVaz5cM1G702gF0rvGLKPqoBwkj2rWGe6KZvEBeLzynTUQ== +"@aws-sdk/util-user-agent-browser@3.775.0": + version "3.775.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.775.0.tgz#b69a1a5548ccc6db1acb3ec115967593ece927a1" + integrity sha512-txw2wkiJmZKVdDbscK7VBK+u+TJnRtlUjRTLei+elZg2ADhpQxfVAQl436FUeIv6AhB/oRHW6/K/EAGXUSWi0A== dependencies: - "@aws-sdk/types" "3.664.0" - "@smithy/types" "^3.5.0" + "@aws-sdk/types" "3.775.0" + "@smithy/types" "^4.2.0" bowser "^2.11.0" tslib "^2.6.2" -"@aws-sdk/util-user-agent-node@3.664.0": - version "3.664.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.664.0.tgz#3699b1a959fb6781e627d6303b18cdbd41f1b90d" - integrity sha512-l/m6KkgrTw1p/VTJTk0IoP9I2OnpWp3WbBgzxoNeh9cUcxTufIn++sBxKj5hhDql57LKWsckScG/MhFuH0vZZA== +"@aws-sdk/util-user-agent-node@3.799.0": + version "3.799.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.799.0.tgz#8d0794add4efc79830143277f5faa27f16531c7a" + integrity sha512-iXBk38RbIWPF5Nq9O4AnktORAzXovSVqWYClvS1qbE7ILsnTLJbagU9HlU25O2iV5COVh1qZkwuP5NHQ2yTEyw== dependencies: - "@aws-sdk/middleware-user-agent" "3.664.0" - "@aws-sdk/types" "3.664.0" - "@smithy/node-config-provider" "^3.1.8" - "@smithy/types" "^3.5.0" + "@aws-sdk/middleware-user-agent" "3.799.0" + "@aws-sdk/types" "3.775.0" + "@smithy/node-config-provider" "^4.0.2" + "@smithy/types" "^4.2.0" tslib "^2.6.2" -"@babel/code-frame@^7.12.13", "@babel/code-frame@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" - integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== +"@babel/code-frame@^7.12.13", "@babel/code-frame@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.27.1.tgz#200f715e66d52a23b221a9435534a91cc13ad5be" + integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== dependencies: - "@babel/highlight" "^7.24.7" - picocolors "^1.0.0" + "@babel/helper-validator-identifier" "^7.27.1" + js-tokens "^4.0.0" + picocolors "^1.1.1" -"@babel/compat-data@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.7.tgz#d23bbea508c3883ba8251fb4164982c36ea577ed" - integrity sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw== +"@babel/compat-data@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.27.1.tgz#db7cf122745e0a332c44e847ddc4f5e5221a43f6" + integrity sha512-Q+E+rd/yBzNQhXkG+zQnF58e4zoZfBedaxwzPmicKsiK3nt8iJYrSrDbjwFFDGC4f+rPafqRaPH6TsDoSvMf7A== "@babel/core@^7.7.5": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.7.tgz#b676450141e0b52a3d43bc91da86aa608f950ac4" - integrity sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g== + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.27.1.tgz#89de51e86bd12246003e3524704c49541b16c3e6" + integrity sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.24.7" - "@babel/generator" "^7.24.7" - "@babel/helper-compilation-targets" "^7.24.7" - "@babel/helper-module-transforms" "^7.24.7" - "@babel/helpers" "^7.24.7" - "@babel/parser" "^7.24.7" - "@babel/template" "^7.24.7" - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.27.1" + "@babel/helper-compilation-targets" "^7.27.1" + "@babel/helper-module-transforms" "^7.27.1" + "@babel/helpers" "^7.27.1" + "@babel/parser" "^7.27.1" + "@babel/template" "^7.27.1" + "@babel/traverse" "^7.27.1" + "@babel/types" "^7.27.1" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.7.tgz#1654d01de20ad66b4b4d99c135471bc654c55e6d" - integrity sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA== +"@babel/generator@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.27.1.tgz#862d4fad858f7208edd487c28b58144036b76230" + integrity sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w== dependencies: - "@babel/types" "^7.24.7" + "@babel/parser" "^7.27.1" + "@babel/types" "^7.27.1" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" - jsesc "^2.5.1" + jsesc "^3.0.2" -"@babel/helper-compilation-targets@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz#4eb6c4a80d6ffeac25ab8cd9a21b5dfa48d503a9" - integrity sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg== +"@babel/helper-compilation-targets@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.1.tgz#eac1096c7374f161e4f33fc8ae38f4ddf122087a" + integrity sha512-2YaDd/Rd9E598B5+WIc8wJPmWETiiJXFYVE60oX8FDohv7rAUU3CQj+A1MgeEmcsk2+dQuEjIe/GDvig0SqL4g== dependencies: - "@babel/compat-data" "^7.24.7" - "@babel/helper-validator-option" "^7.24.7" - browserslist "^4.22.2" + "@babel/compat-data" "^7.27.1" + "@babel/helper-validator-option" "^7.27.1" + browserslist "^4.24.0" lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-environment-visitor@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz#4b31ba9551d1f90781ba83491dd59cf9b269f7d9" - integrity sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ== - dependencies: - "@babel/types" "^7.24.7" - -"@babel/helper-function-name@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz#75f1e1725742f39ac6584ee0b16d94513da38dd2" - integrity sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA== - dependencies: - "@babel/template" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/helper-hoist-variables@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz#b4ede1cde2fd89436397f30dc9376ee06b0f25ee" - integrity sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ== - dependencies: - "@babel/types" "^7.24.7" - -"@babel/helper-module-imports@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b" - integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA== - dependencies: - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/helper-module-transforms@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz#31b6c9a2930679498db65b685b1698bfd6c7daf8" - integrity sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ== - dependencies: - "@babel/helper-environment-visitor" "^7.24.7" - "@babel/helper-module-imports" "^7.24.7" - "@babel/helper-simple-access" "^7.24.7" - "@babel/helper-split-export-declaration" "^7.24.7" - "@babel/helper-validator-identifier" "^7.24.7" - -"@babel/helper-simple-access@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz#bcade8da3aec8ed16b9c4953b74e506b51b5edb3" - integrity sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg== - dependencies: - "@babel/traverse" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/helper-split-export-declaration@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz#83949436890e07fa3d6873c61a96e3bbf692d856" - integrity sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA== - dependencies: - "@babel/types" "^7.24.7" - -"@babel/helper-string-parser@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz#4d2d0f14820ede3b9807ea5fc36dfc8cd7da07f2" - integrity sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg== - -"@babel/helper-validator-identifier@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" - integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== - -"@babel/helper-validator-option@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz#24c3bb77c7a425d1742eec8fb433b5a1b38e62f6" - integrity sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw== - -"@babel/helpers@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.7.tgz#aa2ccda29f62185acb5d42fb4a3a1b1082107416" - integrity sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg== - dependencies: - "@babel/template" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/highlight@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" - integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== - dependencies: - "@babel/helper-validator-identifier" "^7.24.7" - chalk "^2.4.2" - js-tokens "^4.0.0" - picocolors "^1.0.0" - -"@babel/parser@^7.20.15", "@babel/parser@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.7.tgz#9a5226f92f0c5c8ead550b750f5608e766c8ce85" - integrity sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw== - -"@babel/template@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.7.tgz#02efcee317d0609d2c07117cb70ef8fb17ab7315" - integrity sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig== - dependencies: - "@babel/code-frame" "^7.24.7" - "@babel/parser" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/traverse@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.7.tgz#de2b900163fa741721ba382163fe46a936c40cf5" - integrity sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA== - dependencies: - "@babel/code-frame" "^7.24.7" - "@babel/generator" "^7.24.7" - "@babel/helper-environment-visitor" "^7.24.7" - "@babel/helper-function-name" "^7.24.7" - "@babel/helper-hoist-variables" "^7.24.7" - "@babel/helper-split-export-declaration" "^7.24.7" - "@babel/parser" "^7.24.7" - "@babel/types" "^7.24.7" +"@babel/helper-module-imports@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz#7ef769a323e2655e126673bb6d2d6913bbead204" + integrity sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w== + dependencies: + "@babel/traverse" "^7.27.1" + "@babel/types" "^7.27.1" + +"@babel/helper-module-transforms@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.27.1.tgz#e1663b8b71d2de948da5c4fb2a20ca4f3ec27a6f" + integrity sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g== + dependencies: + "@babel/helper-module-imports" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + "@babel/traverse" "^7.27.1" + +"@babel/helper-string-parser@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687" + integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== + +"@babel/helper-validator-identifier@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz#a7054dcc145a967dd4dc8fee845a57c1316c9df8" + integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== + +"@babel/helper-validator-option@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz#fa52f5b1e7db1ab049445b421c4471303897702f" + integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== + +"@babel/helpers@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.27.1.tgz#ffc27013038607cdba3288e692c3611c06a18aa4" + integrity sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ== + dependencies: + "@babel/template" "^7.27.1" + "@babel/types" "^7.27.1" + +"@babel/parser@^7.20.15", "@babel/parser@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.27.1.tgz#c55d5bed74449d1223701f1869b9ee345cc94cc9" + integrity sha512-I0dZ3ZpCrJ1c04OqlNsQcKiZlsrXf/kkE4FXzID9rIOYICsAbA8mMDzhW/luRNAHdCNt7os/u8wenklZDlUVUQ== + dependencies: + "@babel/types" "^7.27.1" + +"@babel/template@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.1.tgz#b9e4f55c17a92312774dfbdde1b3c01c547bbae2" + integrity sha512-Fyo3ghWMqkHHpHQCoBs2VnYjR4iWFFjguTDEqA5WgZDOrFesVjMhMM2FSqTKSoUSDO1VQtavj8NFpdRBEvJTtg== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/parser" "^7.27.1" + "@babel/types" "^7.27.1" + +"@babel/traverse@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.27.1.tgz#4db772902b133bbddd1c4f7a7ee47761c1b9f291" + integrity sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.27.1" + "@babel/parser" "^7.27.1" + "@babel/template" "^7.27.1" + "@babel/types" "^7.27.1" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.7.tgz#6027fe12bc1aa724cd32ab113fb7f1988f1f66f2" - integrity sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q== +"@babel/types@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.27.1.tgz#9defc53c16fc899e46941fc6901a9eea1c9d8560" + integrity sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q== dependencies: - "@babel/helper-string-parser" "^7.24.7" - "@babel/helper-validator-identifier" "^7.24.7" - to-fast-properties "^2.0.0" + "@babel/helper-string-parser" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" "@colors/colors@1.5.0": version "1.5.0" @@ -679,16 +591,16 @@ kuler "^2.0.0" "@eslint-community/eslint-utils@^4.2.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" - integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + version "4.7.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz#607084630c6c033992a082de6e6fbc1a8b52175a" + integrity sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw== dependencies: - eslint-visitor-keys "^3.3.0" + eslint-visitor-keys "^3.4.3" "@eslint-community/regexpp@^4.6.1": - version "4.10.1" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.1.tgz#361461e5cb3845d874e61731c11cfedd664d83a0" - integrity sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA== + version "4.12.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" + integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== "@eslint/eslintrc@^2.1.4": version "2.1.4" @@ -705,10 +617,10 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.57.0": - version "8.57.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" - integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== +"@eslint/js@8.57.1": + version "8.57.1" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" + integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== "@fastify/busboy@^2.1.0": version "2.1.1" @@ -725,71 +637,92 @@ resolved "https://registry.yarnpkg.com/@firebase/app-types/-/app-types-0.9.2.tgz#8cbcceba784753a7c0066a4809bc22f93adee080" integrity sha512-oMEZ1TDlBz479lmABwWsWjzHwheQKiAgnuKxE0pz0IXCVx7/rtlkx1fQ6GfgK24WCrxDKMplZrT50Kh04iMbXQ== +"@firebase/app-types@0.9.3": + version "0.9.3" + resolved "https://registry.yarnpkg.com/@firebase/app-types/-/app-types-0.9.3.tgz#8408219eae9b1fb74f86c24e7150a148460414ad" + integrity sha512-kRVpIl4vVGJ4baogMDINbyrIOtOxqhkZQg4jTq3l8Lw6WSk0xfpEYzezFu+Kl4ve4fbPl79dvwRtaFqAC/ucCw== + "@firebase/auth-interop-types@0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@firebase/auth-interop-types/-/auth-interop-types-0.2.3.tgz#927f1f2139a680b55fef0bddbff2c982b08587e8" integrity sha512-Fc9wuJGgxoxQeavybiuwgyi+0rssr76b+nHpj+eGhXFYAdudMWyfBHvFL/I5fEHniUM/UQdFzi9VXJK2iZF7FQ== -"@firebase/component@0.6.7": - version "0.6.7" - resolved "https://registry.yarnpkg.com/@firebase/component/-/component-0.6.7.tgz#6fbffddb26833e1ed58bf296ad587cb330aee716" - integrity sha512-baH1AA5zxfaz4O8w0vDwETByrKTQqB5CDjRls79Sa4eAGAoERw4Tnung7XbMl3jbJ4B/dmmtsMrdki0KikwDYA== +"@firebase/component@0.6.10": + version "0.6.10" + resolved "https://registry.yarnpkg.com/@firebase/component/-/component-0.6.10.tgz#5d2abe7c5c18d60ae806be8bcc698ca1bee7acbf" + integrity sha512-OsNbEKyz9iLZSmMUhsl6+kCADzte00iisJIRUspnUqvDCX+RSGZOBIqekukv/jN177ovjApBQNFaxSYIDc/SyQ== dependencies: - "@firebase/util" "1.9.6" + "@firebase/util" "1.10.1" tslib "^2.1.0" "@firebase/database-compat@^1.0.2": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@firebase/database-compat/-/database-compat-1.0.5.tgz#18c2314f169942ac315e46b68f86cbe64bafe063" - integrity sha512-NDSMaDjQ+TZEMDMmzJwlTL05kh1+0Y84C+kVMaOmNOzRGRM7VHi29I6YUhCetXH+/b1Wh4ZZRyp1CuWkd8s6hg== - dependencies: - "@firebase/component" "0.6.7" - "@firebase/database" "1.0.5" - "@firebase/database-types" "1.0.3" - "@firebase/logger" "0.4.2" - "@firebase/util" "1.9.6" + version "1.0.10" + resolved "https://registry.yarnpkg.com/@firebase/database-compat/-/database-compat-1.0.10.tgz#3f4f524b44b382c493c446852b6ef715e28adec6" + integrity sha512-x3baGMzEKG5BE5orwFRg+Zpaa33N9lZkcOFXoZSeN9Muw/Mx37stePZpa1YMpcAPqX3aDx1cSv55Nxh4ObgpUQ== + dependencies: + "@firebase/component" "0.6.10" + "@firebase/database" "1.0.9" + "@firebase/database-types" "1.0.6" + "@firebase/logger" "0.4.3" + "@firebase/util" "1.10.1" tslib "^2.1.0" -"@firebase/database-types@1.0.3", "@firebase/database-types@^1.0.0": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@firebase/database-types/-/database-types-1.0.3.tgz#1b764212dce88eca74b16da9d220cfea6814858e" - integrity sha512-39V/Riv2R3O/aUjYKh0xypj7NTNXNAK1bcgY5Kx+hdQPRS/aPTS8/5c0CGFYKgVuFbYlnlnhrCTYsh2uNhGwzA== +"@firebase/database-types@1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@firebase/database-types/-/database-types-1.0.6.tgz#97e3026e726ebfd489dbce095371b47c69387bc9" + integrity sha512-sMI7IynSZBsyGbUugc8PKE1jwKbnvaieAz/RxuM57PZQNCi6Rteiviwcw/jqZOX6igqYJwXWZ3UzKOZo2nUDRA== dependencies: "@firebase/app-types" "0.9.2" - "@firebase/util" "1.9.6" + "@firebase/util" "1.10.1" -"@firebase/database@1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@firebase/database/-/database-1.0.5.tgz#09d7162b7dbc4533f17498ac6a76d5e757ab45be" - integrity sha512-cAfwBqMQuW6HbhwI3Cb/gDqZg7aR0OmaJ85WUxlnoYW2Tm4eR0hFl5FEijI3/gYPUiUcUPQvTkGV222VkT7KPw== +"@firebase/database-types@^1.0.0": + version "1.0.10" + resolved "https://registry.yarnpkg.com/@firebase/database-types/-/database-types-1.0.10.tgz#14cfed45bb06394cf1641e19265cbf90e4f6fb51" + integrity sha512-mH6RC1E9/Pv8jf1/p+M8YFTX+iu+iHDN89hecvyO7wHrI4R1V0TXjxOHvX3nLJN1sfh0CWG6CHZ0VlrSmK/cwg== + dependencies: + "@firebase/app-types" "0.9.3" + "@firebase/util" "1.11.0" + +"@firebase/database@1.0.9": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@firebase/database/-/database-1.0.9.tgz#1e4862542b3a93e8039cb3a5a25c79fe5ff1f212" + integrity sha512-EkiPSKSu2TJJGtOjyISASf3UFpFJDil1lMbfqnxilfbmIsilvC8DzgjuLoYD+eOitcug4wtU9Fh1tt2vgBhskA== dependencies: "@firebase/app-check-interop-types" "0.3.2" "@firebase/auth-interop-types" "0.2.3" - "@firebase/component" "0.6.7" - "@firebase/logger" "0.4.2" - "@firebase/util" "1.9.6" + "@firebase/component" "0.6.10" + "@firebase/logger" "0.4.3" + "@firebase/util" "1.10.1" faye-websocket "0.11.4" tslib "^2.1.0" -"@firebase/logger@0.4.2": - version "0.4.2" - resolved "https://registry.yarnpkg.com/@firebase/logger/-/logger-0.4.2.tgz#74dfcfeedee810deb8a7080d5b7eba56aa16ffa2" - integrity sha512-Q1VuA5M1Gjqrwom6I6NUU4lQXdo9IAQieXlujeHZWvRt1b7qQ0KwBaNAjgxG27jgF9/mUwsNmO8ptBCGVYhB0A== +"@firebase/logger@0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@firebase/logger/-/logger-0.4.3.tgz#e7e55c022b62083307a428b6d03f86db012eca88" + integrity sha512-Th42bWJg18EF5bJwhRosn2M/eYxmbWCwXZr4hHX7ltO0SE3QLrpgiMKeRBR/NW7vJke7i0n3i8esbCW2s93qBw== dependencies: tslib "^2.1.0" -"@firebase/util@1.9.6": - version "1.9.6" - resolved "https://registry.yarnpkg.com/@firebase/util/-/util-1.9.6.tgz#56dc34e20fcbc0dd07b11b800f95f5d0417cbfb4" - integrity sha512-IBr1MZbp4d5MjBCXL3TW1dK/PDXX4yOGbiwRNh1oAbE/+ci5Uuvy9KIrsFYY80as1I0iOaD5oOMA9Q8j4TJWcw== +"@firebase/util@1.10.1": + version "1.10.1" + resolved "https://registry.yarnpkg.com/@firebase/util/-/util-1.10.1.tgz#1af07dff98320b45c6eb46d7992e88800b97cba2" + integrity sha512-AIhFnCCjM8FmCqSNlNPTuOk3+gpHC1RkeNUBLtPbcqGYpN5MxI5q7Yby+rxycweOZOCboDzfIj8WyaY4tpQG/g== + dependencies: + tslib "^2.1.0" + +"@firebase/util@1.11.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@firebase/util/-/util-1.11.0.tgz#e74ee2dc260ec4f9e75fe5d52bc4b0254d9872a9" + integrity sha512-PzSrhIr++KI6y4P6C/IdgBNMkEx0Ex6554/cYd0Hm+ovyFSJtJXqb/3OSIdnBoa2cpwZT1/GW56EmRc5qEc5fQ== dependencies: tslib "^2.1.0" "@google-cloud/firestore@^7.7.0": - version "7.8.0" - resolved "https://registry.yarnpkg.com/@google-cloud/firestore/-/firestore-7.8.0.tgz#029bed6c47de84c667a27256acbaca6f6ee50e15" - integrity sha512-m21BWVZLz7H7NF8HZ5hCGUSCEJKNwYB5yzQqDTuE9YUzNDRMDei3BwVDht5k4xF636sGlnobyBL+dcbthSGONg== + version "7.11.0" + resolved "https://registry.yarnpkg.com/@google-cloud/firestore/-/firestore-7.11.0.tgz#a8a2b61d5069ba23ff2a1b98eac78d15a904a40f" + integrity sha512-88uZ+jLsp1aVMj7gh3EKYH1aulTAMFAp8sH/v5a9w8q8iqSG27RiWLoxSAFr/XocZ9hGiWH1kEnBw+zl3xAgNA== dependencies: + "@opentelemetry/api" "^1.3.0" fast-deep-equal "^3.1.1" functional-red-black-tree "^1.0.1" google-gax "^4.3.3" @@ -826,16 +759,16 @@ resolved "https://registry.yarnpkg.com/@google-cloud/projectify/-/projectify-4.0.0.tgz#d600e0433daf51b88c1fa95ac7f02e38e80a07be" integrity sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA== +"@google-cloud/promisify@<4.1.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@google-cloud/promisify/-/promisify-4.0.0.tgz#a906e533ebdd0f754dca2509933334ce58b8c8b1" + integrity sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g== + "@google-cloud/promisify@^2.0.0": version "2.0.4" resolved "https://registry.yarnpkg.com/@google-cloud/promisify/-/promisify-2.0.4.tgz#9d8705ecb2baa41b6b2673f3a8e9b7b7e1abc52a" integrity sha512-j8yRSSqswWi1QqUGKVEKOG03Q7qOoZP6/h2zN2YO+F5h2+DHU0bSrHCK9Y7lo2DI9fBd8qGAw795sf+3Jva4yA== -"@google-cloud/promisify@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@google-cloud/promisify/-/promisify-4.0.0.tgz#a906e533ebdd0f754dca2509933334ce58b8c8b1" - integrity sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g== - "@google-cloud/pubsub@^3.0.1": version "3.7.5" resolved "https://registry.yarnpkg.com/@google-cloud/pubsub/-/pubsub-3.7.5.tgz#3fed656b7e7ea3a4618d5590004f08321a1389b9" @@ -859,17 +792,17 @@ p-defer "^3.0.0" "@google-cloud/storage@^7.7.0": - version "7.11.2" - resolved "https://registry.yarnpkg.com/@google-cloud/storage/-/storage-7.11.2.tgz#a8942d9a4a75634186d262b82c5b41e90649f11c" - integrity sha512-jJOrKyOdujfrSF8EJODW9yY6hqO4jSTk6eVITEj2gsD43BSXuDlnMlLOaBUQhXL29VGnSkxDgYl5tlFhA6LKSA== + version "7.16.0" + resolved "https://registry.yarnpkg.com/@google-cloud/storage/-/storage-7.16.0.tgz#62c04ee4f80190992ef06cb033a90c054bcea575" + integrity sha512-7/5LRgykyOfQENcm6hDKP8SX/u9XxE5YOiWOkgkwcoO+cG8xT/cyOvp9wwN3IxfdYgpHs8CE7Nq2PKX2lNaEXw== dependencies: "@google-cloud/paginator" "^5.0.0" "@google-cloud/projectify" "^4.0.0" - "@google-cloud/promisify" "^4.0.0" + "@google-cloud/promisify" "<4.1.0" abort-controller "^3.0.0" async-retry "^1.3.3" duplexify "^4.1.3" - fast-xml-parser "^4.3.0" + fast-xml-parser "^4.4.1" gaxios "^6.0.2" google-auth-library "^9.6.3" html-entities "^2.5.2" @@ -879,10 +812,10 @@ teeny-request "^9.0.0" uuid "^8.0.0" -"@grpc/grpc-js@^1.9.4", "@grpc/grpc-js@~1.10.3": - version "1.10.9" - resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.10.9.tgz#468cc1549a3fe37b760a16745fb7685d91f4f10c" - integrity sha512-5tcgUctCG0qoNyfChZifz2tJqbRbXVO9J7X6duFcOjY3HUNCxg5D0ZCK7EP9vIcZ0zRpLU9bWkyCqVCLZ46IbQ== +"@grpc/grpc-js@^1.10.9", "@grpc/grpc-js@^1.9.4": + version "1.13.3" + resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.13.3.tgz#6ad08d186c2a8651697085f790c5c68eaca45904" + integrity sha512-FTXHdOoPbZrBjlVLHuKbDZnsTxXv2BlHF57xw6LuThXacXvtkahEPED0CKMk6obZDf65Hv4k3z62eyPNpvinIg== dependencies: "@grpc/proto-loader" "^0.7.13" "@js-sdsl/ordered-map" "^4.4.2" @@ -896,9 +829,9 @@ "@types/node" ">=12.12.47" "@grpc/proto-loader@^0.7.0", "@grpc/proto-loader@^0.7.13", "@grpc/proto-loader@^0.7.5": - version "0.7.13" - resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.13.tgz#f6a44b2b7c9f7b609f5748c6eac2d420e37670cf" - integrity sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw== + version "0.7.15" + resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.15.tgz#4cdfbf35a35461fc843abe8b9e2c0770b5095e60" + integrity sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ== dependencies: lodash.camelcase "^4.3.0" long "^5.0.0" @@ -917,12 +850,12 @@ dependencies: "@hapi/hoek" "^9.0.0" -"@humanwhocodes/config-array@^0.11.14": - version "0.11.14" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" - integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== +"@humanwhocodes/config-array@^0.13.0": + version "0.13.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" + integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== dependencies: - "@humanwhocodes/object-schema" "^2.0.2" + "@humanwhocodes/object-schema" "^2.0.3" debug "^4.3.1" minimatch "^3.0.5" @@ -931,7 +864,7 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^2.0.2": +"@humanwhocodes/object-schema@^2.0.3": version "2.0.3" resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== @@ -991,9 +924,9 @@ chalk "^4.0.0" "@jridgewell/gen-mapping@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" - integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + version "0.3.8" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz#4f0e06362e01362f823d348f1872b08f666d8142" + integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== dependencies: "@jridgewell/set-array" "^1.2.1" "@jridgewell/sourcemap-codec" "^1.4.10" @@ -1010,9 +943,9 @@ integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": - version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== "@jridgewell/trace-mapping@0.3.9": version "0.3.9" @@ -1041,21 +974,21 @@ integrity sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg== "@jsdoc/salty@^0.2.1": - version "0.2.8" - resolved "https://registry.yarnpkg.com/@jsdoc/salty/-/salty-0.2.8.tgz#8d29923a9429694a437a50ab75004b576131d597" - integrity sha512-5e+SFVavj1ORKlKaKr2BmTOekmXbelU7dC0cDkQLqag7xfuTPuGMUFx7KWJuv4bYZrTsoL2Z18VVCOKYxzoHcg== + version "0.2.9" + resolved "https://registry.yarnpkg.com/@jsdoc/salty/-/salty-0.2.9.tgz#4d8c147f7ca011532681ce86352a77a0178f1dec" + integrity sha512-yYxMVH7Dqw6nO0d5NIV8OQWnitU8k6vXH8NtgqAfIa/IUqRMxRv/NUJJ08VEKbAakwxlgBl5PJdrU0dMPStsnw== dependencies: lodash "^4.17.21" "@newrelic/native-metrics@^10.0.0": - version "10.1.1" - resolved "https://registry.yarnpkg.com/@newrelic/native-metrics/-/native-metrics-10.1.1.tgz#5e19f3fbd2e36d33b9e11d4bfa892f3966ba26b9" - integrity sha512-BvdTMAqS3d94ZwJ6u70dWqZVkX8ev3dybkxRInHMbKV2DE1koQR3nzH2ut3hf1MaRQh4SF6SpUNTUznzCZZtjw== + version "10.2.0" + resolved "https://registry.yarnpkg.com/@newrelic/native-metrics/-/native-metrics-10.2.0.tgz#a11263c84c0b1f8a1071fbce1cdf204604aef350" + integrity sha512-yUcG8d1Zfbi/wiJ/6qhM69lhJgYlzP3CMtuC7CgCBTXJRRUqhHirwJ8kC89FvcYIvqbN0ecrc69LITsTNgccsA== dependencies: - nan "^2.18.0" + nan "^2.19.0" node-gyp "^10.1.0" - node-gyp-build "^4.8.0" - prebuildify "^6.0.0" + node-gyp-build "^4.8.1" + prebuildify "^6.0.1" semver "^7.5.2" "@newrelic/ritm@^7.2.0": @@ -1068,11 +1001,11 @@ resolve "^1.22.1" "@newrelic/security-agent@^1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@newrelic/security-agent/-/security-agent-1.3.0.tgz#bf8fb2b584a5aed635d5c186b29f4fb4af55fcff" - integrity sha512-kIW/9qlGwUlNE1khlta2JzrXqZZhZbWBJxDF+T4s4KC5OtOH/tQSr1OnLgwJ2dqPddcisLJkwlQCX77Kjd0mzw== + version "1.5.0" + resolved "https://registry.yarnpkg.com/@newrelic/security-agent/-/security-agent-1.5.0.tgz#2a99f99806c5f9e284ee6ebf12f828e305114761" + integrity sha512-QCKn6WRPNgWPocD1mWwdP3kP1+U9FdOblliXaNbGA6vxXOl9NgBiFv4AgRsJxFNxwPI/6iAeA05Y454Ml8qbyQ== dependencies: - axios "^1.6.8" + axios "^1.7.4" check-disk-space "^3.4.0" content-type "^1.0.5" fast-safe-stringify "^2.1.1" @@ -1092,7 +1025,12 @@ unescape "^1.0.1" unescape-js "^1.1.4" uuid "^9.0.1" - ws "^8.14.2" + ws "^8.17.1" + +"@noble/hashes@^1.1.5": + version "1.8.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.8.0.tgz#cee43d801fcef9644b11b8194857695acd5f815a" + integrity sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -1133,7 +1071,7 @@ dependencies: semver "^7.3.5" -"@opentelemetry/api@^1.6.0": +"@opentelemetry/api@^1.3.0", "@opentelemetry/api@^1.6.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.9.0.tgz#d03eba68273dc0f7509e2a3d5cba21eae10379fe" integrity sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg== @@ -1143,6 +1081,13 @@ resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.3.1.tgz#ba07b864a3c955f061aa30ea3ef7f4ae4449794a" integrity sha512-wU5J8rUoo32oSef/rFpOT1HIjLjAv3qIDHkw1QIhODV3OpAVHi5oVzlouozg9obUmZKtbZ0qUe/m7FP0y0yBzA== +"@paralleldrive/cuid2@^2.2.2": + version "2.2.2" + resolved "https://registry.yarnpkg.com/@paralleldrive/cuid2/-/cuid2-2.2.2.tgz#7f91364d53b89e2c9cb9e02e8dd0f129e834455f" + integrity sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA== + dependencies: + "@noble/hashes" "^1.1.5" + "@pkgjs/parseargs@^0.11.0": version "0.11.0" resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" @@ -1161,9 +1106,9 @@ graceful-fs "4.2.10" "@pnpm/npm-conf@^2.1.0": - version "2.2.2" - resolved "https://registry.yarnpkg.com/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz#0058baf1c26cbb63a828f0193795401684ac86f0" - integrity sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA== + version "2.3.1" + resolved "https://registry.yarnpkg.com/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz#bb375a571a0bd63ab0a23bece33033c683e9b6b0" + integrity sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw== dependencies: "@pnpm/config.env-replace" "^1.1.0" "@pnpm/network.ca-file" "^1.0.1" @@ -1227,6 +1172,11 @@ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== +"@rtsao/scc@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" + integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== + "@sideway/address@^4.1.5": version "4.1.5" resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.5.tgz#4bc149a0076623ced99ca8208ba780d65a99b9d5" @@ -1249,14 +1199,7 @@ resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== -"@sinonjs/commons@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-2.0.0.tgz#fd4ca5b063554307e8327b4564bd56d3b73924a3" - integrity sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg== - dependencies: - type-detect "4.0.8" - -"@sinonjs/commons@^3.0.0", "@sinonjs/commons@^3.0.1": +"@sinonjs/commons@^3.0.1": version "3.0.1" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== @@ -1264,99 +1207,104 @@ type-detect "4.0.8" "@sinonjs/fake-timers@^11.2.2": - version "11.2.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz#50063cc3574f4a27bd8453180a04171c85cc9699" - integrity sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw== + version "11.3.1" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-11.3.1.tgz#51d6e8d83ca261ff02c0ab0e68e9db23d5cd5999" + integrity sha512-EVJO7nW5M/F5Tur0Rf2z/QoMo+1Ia963RiMtapiQrEWvY0iBUvADo8Beegwjpnle5BHkyHuoxSTW3jF43H1XRA== dependencies: - "@sinonjs/commons" "^3.0.0" + "@sinonjs/commons" "^3.0.1" + +"@sinonjs/fake-timers@^13.0.1": + version "13.0.5" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz#36b9dbc21ad5546486ea9173d6bea063eb1717d5" + integrity sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw== + dependencies: + "@sinonjs/commons" "^3.0.1" "@sinonjs/samsam@^8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-8.0.0.tgz#0d488c91efb3fa1442e26abea81759dfc8b5ac60" - integrity sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew== + version "8.0.2" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-8.0.2.tgz#e4386bf668ff36c95949e55a38dc5f5892fc2689" + integrity sha512-v46t/fwnhejRSFTGqbpn9u+LQ9xJDse10gNnPgAcxgdoCDMXj/G2asWAC/8Qs+BAZDicX+MNZouXT1A7c83kVw== dependencies: - "@sinonjs/commons" "^2.0.0" + "@sinonjs/commons" "^3.0.1" lodash.get "^4.4.2" - type-detect "^4.0.8" + type-detect "^4.1.0" -"@sinonjs/text-encoding@^0.7.2": - version "0.7.2" - resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz#5981a8db18b56ba38ef0efb7d995b12aa7b51918" - integrity sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ== +"@sinonjs/text-encoding@^0.7.3": + version "0.7.3" + resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz#282046f03e886e352b2d5f5da5eb755e01457f3f" + integrity sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA== -"@smithy/abort-controller@^3.1.5": - version "3.1.5" - resolved "https://registry.yarnpkg.com/@smithy/abort-controller/-/abort-controller-3.1.5.tgz#ca7a86a3c6b20fabe59667143f58d9e198616d14" - integrity sha512-DhNPnqTqPoG8aZ5dWkFOgsuY+i0GQ3CI6hMmvCoduNsnU9gUZWZBwGfDQsTTB7NvFPkom1df7jMIJWU90kuXXg== +"@smithy/abort-controller@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@smithy/abort-controller/-/abort-controller-4.0.2.tgz#36a23e8cc65fc03cacb6afa35dfbfd319c560c6b" + integrity sha512-Sl/78VDtgqKxN2+1qduaVE140XF+Xg+TafkncspwM4jFP/LHr76ZHmIY/y3V1M0mMLNk+Je6IGbzxy23RSToMw== dependencies: - "@smithy/types" "^3.5.0" + "@smithy/types" "^4.2.0" tslib "^2.6.2" -"@smithy/config-resolver@^3.0.9": - version "3.0.9" - resolved "https://registry.yarnpkg.com/@smithy/config-resolver/-/config-resolver-3.0.9.tgz#dcf4b7747ca481866f9bfac21469ebe2031a599e" - integrity sha512-5d9oBf40qC7n2xUoHmntKLdqsyTMMo/r49+eqSIjJ73eDfEtljAxEhzIQ3bkgXJtR3xiv7YzMT/3FF3ORkjWdg== +"@smithy/config-resolver@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@smithy/config-resolver/-/config-resolver-4.1.0.tgz#de1043cbd75f05d99798b0fbcfdaf4b89b0f2f41" + integrity sha512-8smPlwhga22pwl23fM5ew4T9vfLUCeFXlcqNOCD5M5h8VmNPNUE9j6bQSuRXpDSV11L/E/SwEBQuW8hr6+nS1A== dependencies: - "@smithy/node-config-provider" "^3.1.8" - "@smithy/types" "^3.5.0" - "@smithy/util-config-provider" "^3.0.0" - "@smithy/util-middleware" "^3.0.7" + "@smithy/node-config-provider" "^4.0.2" + "@smithy/types" "^4.2.0" + "@smithy/util-config-provider" "^4.0.0" + "@smithy/util-middleware" "^4.0.2" tslib "^2.6.2" -"@smithy/core@^2.4.7": - version "2.4.8" - resolved "https://registry.yarnpkg.com/@smithy/core/-/core-2.4.8.tgz#397ac17dfa8ad658b77f96f19484f0eeaf22d397" - integrity sha512-x4qWk7p/a4dcf7Vxb2MODIf4OIcqNbK182WxRvZ/3oKPrf/6Fdic5sSElhO1UtXpWKBazWfqg0ZEK9xN1DsuHA== - dependencies: - "@smithy/middleware-endpoint" "^3.1.4" - "@smithy/middleware-retry" "^3.0.23" - "@smithy/middleware-serde" "^3.0.7" - "@smithy/protocol-http" "^4.1.4" - "@smithy/smithy-client" "^3.4.0" - "@smithy/types" "^3.5.0" - "@smithy/util-body-length-browser" "^3.0.0" - "@smithy/util-middleware" "^3.0.7" - "@smithy/util-utf8" "^3.0.0" +"@smithy/core@^3.3.0", "@smithy/core@^3.3.1": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@smithy/core/-/core-3.3.1.tgz#6119a683f62099158eb193e3745f4ade6de741dd" + integrity sha512-W7AppgQD3fP1aBmo8wWo0id5zeR2/aYRy067vZsDVaa6v/mdhkg6DxXwEVuSPjZl+ZnvWAQbUMCd5ckw38+tHQ== + dependencies: + "@smithy/middleware-serde" "^4.0.3" + "@smithy/protocol-http" "^5.1.0" + "@smithy/types" "^4.2.0" + "@smithy/util-body-length-browser" "^4.0.0" + "@smithy/util-middleware" "^4.0.2" + "@smithy/util-stream" "^4.2.0" + "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@smithy/credential-provider-imds@^3.2.4": - version "3.2.4" - resolved "https://registry.yarnpkg.com/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.4.tgz#e1a2bfc8a0066f673756ad8735247cf284b9735c" - integrity sha512-S9bb0EIokfYEuar4kEbLta+ivlKCWOCFsLZuilkNy9i0uEUEHSi47IFLPaxqqCl+0ftKmcOTHayY5nQhAuq7+w== +"@smithy/credential-provider-imds@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.2.tgz#1ec34a04842fa69996b151a695b027f0486c69a8" + integrity sha512-32lVig6jCaWBHnY+OEQ6e6Vnt5vDHaLiydGrwYMW9tPqO688hPGTYRamYJ1EptxEC2rAwJrHWmPoKRBl4iTa8w== dependencies: - "@smithy/node-config-provider" "^3.1.8" - "@smithy/property-provider" "^3.1.7" - "@smithy/types" "^3.5.0" - "@smithy/url-parser" "^3.0.7" + "@smithy/node-config-provider" "^4.0.2" + "@smithy/property-provider" "^4.0.2" + "@smithy/types" "^4.2.0" + "@smithy/url-parser" "^4.0.2" tslib "^2.6.2" -"@smithy/fetch-http-handler@^3.2.9": - version "3.2.9" - resolved "https://registry.yarnpkg.com/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.9.tgz#8d5199c162a37caa37a8b6848eefa9ca58221a0b" - integrity sha512-hYNVQOqhFQ6vOpenifFME546f0GfJn2OiQ3M0FDmuUu8V/Uiwy2wej7ZXxFBNqdx0R5DZAqWM1l6VRhGz8oE6A== +"@smithy/fetch-http-handler@^5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.2.tgz#9d3cacf044aa9573ab933f445ab95cddb284813d" + integrity sha512-+9Dz8sakS9pe7f2cBocpJXdeVjMopUDLgZs1yWeu7h++WqSbjUYv/JAJwKwXw1HV6gq1jyWjxuyn24E2GhoEcQ== dependencies: - "@smithy/protocol-http" "^4.1.4" - "@smithy/querystring-builder" "^3.0.7" - "@smithy/types" "^3.5.0" - "@smithy/util-base64" "^3.0.0" + "@smithy/protocol-http" "^5.1.0" + "@smithy/querystring-builder" "^4.0.2" + "@smithy/types" "^4.2.0" + "@smithy/util-base64" "^4.0.0" tslib "^2.6.2" -"@smithy/hash-node@^3.0.7": - version "3.0.7" - resolved "https://registry.yarnpkg.com/@smithy/hash-node/-/hash-node-3.0.7.tgz#03b5a382fb588b8c2bac11b4fe7300aaf1661c88" - integrity sha512-SAGHN+QkrwcHFjfWzs/czX94ZEjPJ0CrWJS3M43WswDXVEuP4AVy9gJ3+AF6JQHZD13bojmuf/Ap/ItDeZ+Qfw== +"@smithy/hash-node@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@smithy/hash-node/-/hash-node-4.0.2.tgz#a34fe5a33b067d754ca63302b9791778f003e437" + integrity sha512-VnTpYPnRUE7yVhWozFdlxcYknv9UN7CeOqSrMH+V877v4oqtVYuoqhIhtSjmGPvYrYnAkaM61sLMKHvxL138yg== dependencies: - "@smithy/types" "^3.5.0" - "@smithy/util-buffer-from" "^3.0.0" - "@smithy/util-utf8" "^3.0.0" + "@smithy/types" "^4.2.0" + "@smithy/util-buffer-from" "^4.0.0" + "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@smithy/invalid-dependency@^3.0.7": - version "3.0.7" - resolved "https://registry.yarnpkg.com/@smithy/invalid-dependency/-/invalid-dependency-3.0.7.tgz#b36f258d94498f3c72ab6020091a66fc7cc16eda" - integrity sha512-Bq00GsAhHeYSuZX8Kpu4sbI9agH2BNYnqUmmbTGWOhki9NVsWn2jFr896vvoTMH8KAjNX/ErC/8t5QHuEXG+IA== +"@smithy/invalid-dependency@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@smithy/invalid-dependency/-/invalid-dependency-4.0.2.tgz#e9b1c5e407d795f10a03afba90e37bccdc3e38f7" + integrity sha512-GatB4+2DTpgWPday+mnUkoumP54u/MDM/5u44KF9hIu8jF0uafZtQLcdfIKkIcUNuF/fBojpLEHZS/56JqPeXQ== dependencies: - "@smithy/types" "^3.5.0" + "@smithy/types" "^4.2.0" tslib "^2.6.2" "@smithy/is-array-buffer@^2.2.0": @@ -1366,197 +1314,199 @@ dependencies: tslib "^2.6.2" -"@smithy/is-array-buffer@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz#9a95c2d46b8768946a9eec7f935feaddcffa5e7a" - integrity sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ== +"@smithy/is-array-buffer@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz#55a939029321fec462bcc574890075cd63e94206" + integrity sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw== dependencies: tslib "^2.6.2" -"@smithy/middleware-content-length@^3.0.9": - version "3.0.9" - resolved "https://registry.yarnpkg.com/@smithy/middleware-content-length/-/middleware-content-length-3.0.9.tgz#fb613d1a6b8c91e828d11c0d7a0a8576dba89b8b" - integrity sha512-t97PidoGElF9hTtLCrof32wfWMqC5g2SEJNxaVH3NjlatuNGsdxXRYO/t+RPnxA15RpYiS0f+zG7FuE2DeGgjA== +"@smithy/middleware-content-length@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@smithy/middleware-content-length/-/middleware-content-length-4.0.2.tgz#ff78658e8047ad7038f58478cf8713ee2f6ef647" + integrity sha512-hAfEXm1zU+ELvucxqQ7I8SszwQ4znWMbNv6PLMndN83JJN41EPuS93AIyh2N+gJ6x8QFhzSO6b7q2e6oClDI8A== dependencies: - "@smithy/protocol-http" "^4.1.4" - "@smithy/types" "^3.5.0" + "@smithy/protocol-http" "^5.1.0" + "@smithy/types" "^4.2.0" tslib "^2.6.2" -"@smithy/middleware-endpoint@^3.1.4": - version "3.1.4" - resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-3.1.4.tgz#222c9fa49c8af6ebf8bea8ab220d92d9b8c90d3d" - integrity sha512-/ChcVHekAyzUbyPRI8CzPPLj6y8QRAfJngWcLMgsWxKVzw/RzBV69mSOzJYDD3pRwushA1+5tHtPF8fjmzBnrQ== - dependencies: - "@smithy/middleware-serde" "^3.0.7" - "@smithy/node-config-provider" "^3.1.8" - "@smithy/shared-ini-file-loader" "^3.1.8" - "@smithy/types" "^3.5.0" - "@smithy/url-parser" "^3.0.7" - "@smithy/util-middleware" "^3.0.7" +"@smithy/middleware-endpoint@^4.1.1", "@smithy/middleware-endpoint@^4.1.2": + version "4.1.2" + resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.2.tgz#d8ad5e4e439126d7bcc79f0046fc5f9518d8afd8" + integrity sha512-EqOy3xaEGQpsKxLlzYstDRJ8eY90CbyBP4cl+w7r45mE60S8YliyL9AgWsdWcyNiB95E2PMqHBEv67nNl1zLfg== + dependencies: + "@smithy/core" "^3.3.1" + "@smithy/middleware-serde" "^4.0.3" + "@smithy/node-config-provider" "^4.0.2" + "@smithy/shared-ini-file-loader" "^4.0.2" + "@smithy/types" "^4.2.0" + "@smithy/url-parser" "^4.0.2" + "@smithy/util-middleware" "^4.0.2" tslib "^2.6.2" -"@smithy/middleware-retry@^3.0.22", "@smithy/middleware-retry@^3.0.23": - version "3.0.23" - resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-3.0.23.tgz#ce5574e278dd14a7995afd5a4ed2a6c9891da8ed" - integrity sha512-x9PbGXxkcXIpm6L26qRSCC+eaYcHwybRmqU8LO/WM2RRlW0g8lz6FIiKbKgGvHuoK3dLZRiQVSQJveiCzwnA5A== - dependencies: - "@smithy/node-config-provider" "^3.1.8" - "@smithy/protocol-http" "^4.1.4" - "@smithy/service-error-classification" "^3.0.7" - "@smithy/smithy-client" "^3.4.0" - "@smithy/types" "^3.5.0" - "@smithy/util-middleware" "^3.0.7" - "@smithy/util-retry" "^3.0.7" +"@smithy/middleware-retry@^4.1.2": + version "4.1.3" + resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-4.1.3.tgz#6d22d21321b2089b4caeb79577a9b40bf4ac6ace" + integrity sha512-AsJtI9KiFoEGAhcEKZyzzPfrszAQGcf4HSYKmenz0WGx/6YNvoPPv4OSGfZTCsDmgPHv4pXzxE+7QV7jcGWNKw== + dependencies: + "@smithy/node-config-provider" "^4.0.2" + "@smithy/protocol-http" "^5.1.0" + "@smithy/service-error-classification" "^4.0.3" + "@smithy/smithy-client" "^4.2.2" + "@smithy/types" "^4.2.0" + "@smithy/util-middleware" "^4.0.2" + "@smithy/util-retry" "^4.0.3" tslib "^2.6.2" uuid "^9.0.1" -"@smithy/middleware-serde@^3.0.7": - version "3.0.7" - resolved "https://registry.yarnpkg.com/@smithy/middleware-serde/-/middleware-serde-3.0.7.tgz#03f0dda75edffc4cc90ea422349cbfb82368efa7" - integrity sha512-VytaagsQqtH2OugzVTq4qvjkLNbWehHfGcGr0JLJmlDRrNCeZoWkWsSOw1nhS/4hyUUWF/TLGGml4X/OnEep5g== +"@smithy/middleware-serde@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@smithy/middleware-serde/-/middleware-serde-4.0.3.tgz#b90ef1065ad9dc0b54c561fae73c8a5792d145e3" + integrity sha512-rfgDVrgLEVMmMn0BI8O+8OVr6vXzjV7HZj57l0QxslhzbvVfikZbVfBVthjLHqib4BW44QhcIgJpvebHlRaC9A== dependencies: - "@smithy/types" "^3.5.0" + "@smithy/types" "^4.2.0" tslib "^2.6.2" -"@smithy/middleware-stack@^3.0.7": - version "3.0.7" - resolved "https://registry.yarnpkg.com/@smithy/middleware-stack/-/middleware-stack-3.0.7.tgz#813fa7b47895ce0d085eac89c056d21b1e46e771" - integrity sha512-EyTbMCdqS1DoeQsO4gI7z2Gzq1MoRFAeS8GkFYIwbedB7Lp5zlLHJdg+56tllIIG5Hnf9ZWX48YKSHlsKvugGA== +"@smithy/middleware-stack@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@smithy/middleware-stack/-/middleware-stack-4.0.2.tgz#ca7bc3eedc7c1349e2cf94e0dc92a68d681bef18" + integrity sha512-eSPVcuJJGVYrFYu2hEq8g8WWdJav3sdrI4o2c6z/rjnYDd3xH9j9E7deZQCzFn4QvGPouLngH3dQ+QVTxv5bOQ== dependencies: - "@smithy/types" "^3.5.0" + "@smithy/types" "^4.2.0" tslib "^2.6.2" -"@smithy/node-config-provider@^3.1.8": - version "3.1.8" - resolved "https://registry.yarnpkg.com/@smithy/node-config-provider/-/node-config-provider-3.1.8.tgz#2c1092040b4062eae0f7c9e121cc00ac6a77efee" - integrity sha512-E0rU0DglpeJn5ge64mk8wTGEXcQwmpUTY5Zr7IzTpDLmHKiIamINERNZYrPQjg58Ck236sEKSwRSHA4CwshU6Q== +"@smithy/node-config-provider@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@smithy/node-config-provider/-/node-config-provider-4.0.2.tgz#017ba626828bced0fa588e795246e5468632f3ef" + integrity sha512-WgCkILRZfJwJ4Da92a6t3ozN/zcvYyJGUTmfGbgS/FkCcoCjl7G4FJaCDN1ySdvLvemnQeo25FdkyMSTSwulsw== dependencies: - "@smithy/property-provider" "^3.1.7" - "@smithy/shared-ini-file-loader" "^3.1.8" - "@smithy/types" "^3.5.0" + "@smithy/property-provider" "^4.0.2" + "@smithy/shared-ini-file-loader" "^4.0.2" + "@smithy/types" "^4.2.0" tslib "^2.6.2" -"@smithy/node-http-handler@^3.2.4": - version "3.2.4" - resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-3.2.4.tgz#3c57c40d082c3bacac1e49955bd1240e8ccc40b2" - integrity sha512-49reY3+JgLMFNm7uTAKBWiKCA6XSvkNp9FqhVmusm2jpVnHORYFeFZ704LShtqWfjZW/nhX+7Iexyb6zQfXYIQ== +"@smithy/node-http-handler@^4.0.4": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-4.0.4.tgz#aa583d201c1ee968170b65a07f06d633c214b7a1" + integrity sha512-/mdqabuAT3o/ihBGjL94PUbTSPSRJ0eeVTdgADzow0wRJ0rN4A27EOrtlK56MYiO1fDvlO3jVTCxQtQmK9dZ1g== dependencies: - "@smithy/abort-controller" "^3.1.5" - "@smithy/protocol-http" "^4.1.4" - "@smithy/querystring-builder" "^3.0.7" - "@smithy/types" "^3.5.0" + "@smithy/abort-controller" "^4.0.2" + "@smithy/protocol-http" "^5.1.0" + "@smithy/querystring-builder" "^4.0.2" + "@smithy/types" "^4.2.0" tslib "^2.6.2" -"@smithy/property-provider@^3.1.7": - version "3.1.7" - resolved "https://registry.yarnpkg.com/@smithy/property-provider/-/property-provider-3.1.7.tgz#8a304a4b9110a067a93c784e4c11e175f82da379" - integrity sha512-QfzLi1GPMisY7bAM5hOUqBdGYnY5S2JAlr201pghksrQv139f8iiiMalXtjczIP5f6owxFn3MINLNUNvUkgtPw== +"@smithy/property-provider@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@smithy/property-provider/-/property-provider-4.0.2.tgz#4572c10415c9d4215f3df1530ba61b0319b17b55" + integrity sha512-wNRoQC1uISOuNc2s4hkOYwYllmiyrvVXWMtq+TysNRVQaHm4yoafYQyjN/goYZS+QbYlPIbb/QRjaUZMuzwQ7A== dependencies: - "@smithy/types" "^3.5.0" + "@smithy/types" "^4.2.0" tslib "^2.6.2" -"@smithy/protocol-http@^4.1.4": - version "4.1.4" - resolved "https://registry.yarnpkg.com/@smithy/protocol-http/-/protocol-http-4.1.4.tgz#6940d652b1825bda2422163ec9baab552669a338" - integrity sha512-MlWK8eqj0JlpZBnWmjQLqmFp71Ug00P+m72/1xQB3YByXD4zZ+y9N4hYrR0EDmrUCZIkyATWHOXFgtavwGDTzQ== +"@smithy/protocol-http@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@smithy/protocol-http/-/protocol-http-5.1.0.tgz#ad34e336a95944785185234bebe2ec8dbe266936" + integrity sha512-KxAOL1nUNw2JTYrtviRRjEnykIDhxc84qMBzxvu1MUfQfHTuBlCG7PA6EdVwqpJjH7glw7FqQoFxUJSyBQgu7g== dependencies: - "@smithy/types" "^3.5.0" + "@smithy/types" "^4.2.0" tslib "^2.6.2" -"@smithy/querystring-builder@^3.0.7": - version "3.0.7" - resolved "https://registry.yarnpkg.com/@smithy/querystring-builder/-/querystring-builder-3.0.7.tgz#8c443c65f4249ff1637088db1166d18411d41555" - integrity sha512-65RXGZZ20rzqqxTsChdqSpbhA6tdt5IFNgG6o7e1lnPVLCe6TNWQq4rTl4N87hTDD8mV4IxJJnvyE7brbnRkQw== +"@smithy/querystring-builder@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@smithy/querystring-builder/-/querystring-builder-4.0.2.tgz#834cea95bf413ab417bf9c166d60fd80d2cb3016" + integrity sha512-NTOs0FwHw1vimmQM4ebh+wFQvOwkEf/kQL6bSM1Lock+Bv4I89B3hGYoUEPkmvYPkDKyp5UdXJYu+PoTQ3T31Q== dependencies: - "@smithy/types" "^3.5.0" - "@smithy/util-uri-escape" "^3.0.0" + "@smithy/types" "^4.2.0" + "@smithy/util-uri-escape" "^4.0.0" tslib "^2.6.2" -"@smithy/querystring-parser@^3.0.7": - version "3.0.7" - resolved "https://registry.yarnpkg.com/@smithy/querystring-parser/-/querystring-parser-3.0.7.tgz#936206d1e6da9d862384dae730b4bad042d6a948" - integrity sha512-Fouw4KJVWqqUVIu1gZW8BH2HakwLz6dvdrAhXeXfeymOBrZw+hcqaWs+cS1AZPVp4nlbeIujYrKA921ZW2WMPA== +"@smithy/querystring-parser@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@smithy/querystring-parser/-/querystring-parser-4.0.2.tgz#d80c5afb740e12ad8b4d4f58415e402c69712479" + integrity sha512-v6w8wnmZcVXjfVLjxw8qF7OwESD9wnpjp0Dqry/Pod0/5vcEA3qxCr+BhbOHlxS8O+29eLpT3aagxXGwIoEk7Q== dependencies: - "@smithy/types" "^3.5.0" + "@smithy/types" "^4.2.0" tslib "^2.6.2" -"@smithy/service-error-classification@^3.0.7": - version "3.0.7" - resolved "https://registry.yarnpkg.com/@smithy/service-error-classification/-/service-error-classification-3.0.7.tgz#5bab4ad802d30bd3fa52b8134f6c171582358226" - integrity sha512-91PRkTfiBf9hxkIchhRKJfl1rsplRDyBnmyFca3y0Z3x/q0JJN480S83LBd8R6sBCkm2bBbqw2FHp0Mbh+ecSA== +"@smithy/service-error-classification@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@smithy/service-error-classification/-/service-error-classification-4.0.3.tgz#df43e3ec00a9f2d15415185561d98cd602c8bc67" + integrity sha512-FTbcajmltovWMjj3tksDQdD23b2w6gH+A0DYA1Yz3iSpjDj8fmkwy62UnXcWMy4d5YoMoSyLFHMfkEVEzbiN8Q== dependencies: - "@smithy/types" "^3.5.0" + "@smithy/types" "^4.2.0" -"@smithy/shared-ini-file-loader@^3.1.8": - version "3.1.8" - resolved "https://registry.yarnpkg.com/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.8.tgz#7a0bf5f20cfe8e0c4a36d8dcab8194d0d2ee958e" - integrity sha512-0NHdQiSkeGl0ICQKcJQ2lCOKH23Nb0EaAa7RDRId6ZqwXkw4LJyIyZ0t3iusD4bnKYDPLGy2/5e2rfUhrt0Acw== +"@smithy/shared-ini-file-loader@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.2.tgz#15043f0516fe09ff4b22982bc5f644dc701ebae5" + integrity sha512-J9/gTWBGVuFZ01oVA6vdb4DAjf1XbDhK6sLsu3OS9qmLrS6KB5ygpeHiM3miIbj1qgSJ96GYszXFWv6ErJ8QEw== dependencies: - "@smithy/types" "^3.5.0" + "@smithy/types" "^4.2.0" tslib "^2.6.2" -"@smithy/signature-v4@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-4.2.0.tgz#291f5a0e756cc251377e1e8af2a1f494e6173029" - integrity sha512-LafbclHNKnsorMgUkKm7Tk7oJ7xizsZ1VwqhGKqoCIrXh4fqDDp73fK99HOEEgcsQbtemmeY/BPv0vTVYYUNEQ== - dependencies: - "@smithy/is-array-buffer" "^3.0.0" - "@smithy/protocol-http" "^4.1.4" - "@smithy/types" "^3.5.0" - "@smithy/util-hex-encoding" "^3.0.0" - "@smithy/util-middleware" "^3.0.7" - "@smithy/util-uri-escape" "^3.0.0" - "@smithy/util-utf8" "^3.0.0" +"@smithy/signature-v4@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-5.1.0.tgz#2c56e5b278482b04383d84ea2c07b7f0a8eb8f63" + integrity sha512-4t5WX60sL3zGJF/CtZsUQTs3UrZEDO2P7pEaElrekbLqkWPYkgqNW1oeiNYC6xXifBnT9dVBOnNQRvOE9riU9w== + dependencies: + "@smithy/is-array-buffer" "^4.0.0" + "@smithy/protocol-http" "^5.1.0" + "@smithy/types" "^4.2.0" + "@smithy/util-hex-encoding" "^4.0.0" + "@smithy/util-middleware" "^4.0.2" + "@smithy/util-uri-escape" "^4.0.0" + "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@smithy/smithy-client@^3.3.6", "@smithy/smithy-client@^3.4.0": - version "3.4.0" - resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-3.4.0.tgz#ceffb92108a4ad60cbede3baf44ed224dc70b333" - integrity sha512-nOfJ1nVQsxiP6srKt43r2My0Gp5PLWCW2ASqUioxIiGmu6d32v4Nekidiv5qOmmtzIrmaD+ADX5SKHUuhReeBQ== - dependencies: - "@smithy/middleware-endpoint" "^3.1.4" - "@smithy/middleware-stack" "^3.0.7" - "@smithy/protocol-http" "^4.1.4" - "@smithy/types" "^3.5.0" - "@smithy/util-stream" "^3.1.9" +"@smithy/smithy-client@^4.2.1", "@smithy/smithy-client@^4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-4.2.2.tgz#b599c841c376994a3b3019942b1d3f1ecfaf964b" + integrity sha512-3AnHfsMdq9Wg7+3BeR1HuLWI9+DMA/SoHVpCWq6xSsa52ikNd6nlF/wFzdpHyGtVa+Aji6lMgvwOF4sGcVA7SA== + dependencies: + "@smithy/core" "^3.3.1" + "@smithy/middleware-endpoint" "^4.1.2" + "@smithy/middleware-stack" "^4.0.2" + "@smithy/protocol-http" "^5.1.0" + "@smithy/types" "^4.2.0" + "@smithy/util-stream" "^4.2.0" tslib "^2.6.2" -"@smithy/types@^3.5.0": - version "3.5.0" - resolved "https://registry.yarnpkg.com/@smithy/types/-/types-3.5.0.tgz#9589e154c50d9c5d00feb7d818112ef8fc285d6e" - integrity sha512-QN0twHNfe8mNJdH9unwsCK13GURU7oEAZqkBI+rsvpv1jrmserO+WnLE7jidR9W/1dxwZ0u/CB01mV2Gms/K2Q== +"@smithy/types@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@smithy/types/-/types-4.2.0.tgz#e7998984cc54b1acbc32e6d4cf982c712e3d26b6" + integrity sha512-7eMk09zQKCO+E/ivsjQv+fDlOupcFUCSC/L2YUPgwhvowVGWbPQHjEFcmjt7QQ4ra5lyowS92SV53Zc6XD4+fg== dependencies: tslib "^2.6.2" -"@smithy/url-parser@^3.0.7": - version "3.0.7" - resolved "https://registry.yarnpkg.com/@smithy/url-parser/-/url-parser-3.0.7.tgz#9d7d7e4e38514bf75ade6e8a30d2300f3db17d1b" - integrity sha512-70UbSSR8J97c1rHZOWhl+VKiZDqHWxs/iW8ZHrHp5fCCPLSBE7GcUlUvKSle3Ca+J9LLbYCj/A79BxztBvAfpA== +"@smithy/url-parser@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@smithy/url-parser/-/url-parser-4.0.2.tgz#a316f7d8593ffab796348bc5df96237833880713" + integrity sha512-Bm8n3j2ScqnT+kJaClSVCMeiSenK6jVAzZCNewsYWuZtnBehEz4r2qP0riZySZVfzB+03XZHJeqfmJDkeeSLiQ== dependencies: - "@smithy/querystring-parser" "^3.0.7" - "@smithy/types" "^3.5.0" + "@smithy/querystring-parser" "^4.0.2" + "@smithy/types" "^4.2.0" tslib "^2.6.2" -"@smithy/util-base64@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@smithy/util-base64/-/util-base64-3.0.0.tgz#f7a9a82adf34e27a72d0719395713edf0e493017" - integrity sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ== +"@smithy/util-base64@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-base64/-/util-base64-4.0.0.tgz#8345f1b837e5f636e5f8470c4d1706ae0c6d0358" + integrity sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg== dependencies: - "@smithy/util-buffer-from" "^3.0.0" - "@smithy/util-utf8" "^3.0.0" + "@smithy/util-buffer-from" "^4.0.0" + "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@smithy/util-body-length-browser@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@smithy/util-body-length-browser/-/util-body-length-browser-3.0.0.tgz#86ec2f6256310b4845a2f064e2f571c1ca164ded" - integrity sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ== +"@smithy/util-body-length-browser@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-body-length-browser/-/util-body-length-browser-4.0.0.tgz#965d19109a4b1e5fe7a43f813522cce718036ded" + integrity sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA== dependencies: tslib "^2.6.2" -"@smithy/util-body-length-node@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@smithy/util-body-length-node/-/util-body-length-node-3.0.0.tgz#99a291bae40d8932166907fe981d6a1f54298a6d" - integrity sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA== +"@smithy/util-body-length-node@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-body-length-node/-/util-body-length-node-4.0.0.tgz#3db245f6844a9b1e218e30c93305bfe2ffa473b3" + integrity sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg== dependencies: tslib "^2.6.2" @@ -1568,96 +1518,96 @@ "@smithy/is-array-buffer" "^2.2.0" tslib "^2.6.2" -"@smithy/util-buffer-from@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz#559fc1c86138a89b2edaefc1e6677780c24594e3" - integrity sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA== +"@smithy/util-buffer-from@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz#b23b7deb4f3923e84ef50c8b2c5863d0dbf6c0b9" + integrity sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug== dependencies: - "@smithy/is-array-buffer" "^3.0.0" + "@smithy/is-array-buffer" "^4.0.0" tslib "^2.6.2" -"@smithy/util-config-provider@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@smithy/util-config-provider/-/util-config-provider-3.0.0.tgz#62c6b73b22a430e84888a8f8da4b6029dd5b8efe" - integrity sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ== +"@smithy/util-config-provider@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz#e0c7c8124c7fba0b696f78f0bd0ccb060997d45e" + integrity sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w== dependencies: tslib "^2.6.2" -"@smithy/util-defaults-mode-browser@^3.0.22": - version "3.0.23" - resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.23.tgz#6920b473126ae8857a04dd6941793bbda12adc8b" - integrity sha512-Y07qslyRtXDP/C5aWKqxTPBl4YxplEELG3xRrz2dnAQ6Lq/FgNrcKWmV561nNaZmFH+EzeGOX3ZRMbU8p1T6Nw== +"@smithy/util-defaults-mode-browser@^4.0.9": + version "4.0.10" + resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.10.tgz#50cc8aff3e1881848d574ea777439ff74a465550" + integrity sha512-2k6fgUNOZ1Rn0gEjvGPGrDEINLG8qSBHsN7xlkkbO+fnHJ36BQPDzhFfMmYSDS8AgzoygqQiDOQ+6Hp2vBTUdA== dependencies: - "@smithy/property-provider" "^3.1.7" - "@smithy/smithy-client" "^3.4.0" - "@smithy/types" "^3.5.0" + "@smithy/property-provider" "^4.0.2" + "@smithy/smithy-client" "^4.2.2" + "@smithy/types" "^4.2.0" bowser "^2.11.0" tslib "^2.6.2" -"@smithy/util-defaults-mode-node@^3.0.22": - version "3.0.23" - resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.23.tgz#d03d21816e8b2f586ccf4a87cd0b1cc55b4d75e0" - integrity sha512-9Y4WH7f0vnDGuHUa4lGX9e2p+sMwODibsceSV6rfkZOvMC+BY3StB2LdO1NHafpsyHJLpwAgChxQ38tFyd6vkg== - dependencies: - "@smithy/config-resolver" "^3.0.9" - "@smithy/credential-provider-imds" "^3.2.4" - "@smithy/node-config-provider" "^3.1.8" - "@smithy/property-provider" "^3.1.7" - "@smithy/smithy-client" "^3.4.0" - "@smithy/types" "^3.5.0" +"@smithy/util-defaults-mode-node@^4.0.9": + version "4.0.10" + resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.10.tgz#f85b0a12fe3d1bc63e776ee8100d14055a211526" + integrity sha512-2XR1WRglLVmoIFts7bODUTgBdVyvkfKNkydHrlsI5VxW9q3s1hnJCuY+f1OHzvj5ue23q4vydM2fjrMjf2HSdQ== + dependencies: + "@smithy/config-resolver" "^4.1.0" + "@smithy/credential-provider-imds" "^4.0.2" + "@smithy/node-config-provider" "^4.0.2" + "@smithy/property-provider" "^4.0.2" + "@smithy/smithy-client" "^4.2.2" + "@smithy/types" "^4.2.0" tslib "^2.6.2" -"@smithy/util-endpoints@^2.1.3": - version "2.1.3" - resolved "https://registry.yarnpkg.com/@smithy/util-endpoints/-/util-endpoints-2.1.3.tgz#7498151e9dc714bdd0c6339314dd2350fa4d250a" - integrity sha512-34eACeKov6jZdHqS5hxBMJ4KyWKztTMulhuQ2UdOoP6vVxMLrOKUqIXAwJe/wiWMhXhydLW664B02CNpQBQ4Aw== +"@smithy/util-endpoints@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@smithy/util-endpoints/-/util-endpoints-3.0.2.tgz#6933a0d6d4a349523ef71ca9540c9c0b222b559e" + integrity sha512-6QSutU5ZyrpNbnd51zRTL7goojlcnuOB55+F9VBD+j8JpRY50IGamsjlycrmpn8PQkmJucFW8A0LSfXj7jjtLQ== dependencies: - "@smithy/node-config-provider" "^3.1.8" - "@smithy/types" "^3.5.0" + "@smithy/node-config-provider" "^4.0.2" + "@smithy/types" "^4.2.0" tslib "^2.6.2" -"@smithy/util-hex-encoding@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz#32938b33d5bf2a15796cd3f178a55b4155c535e6" - integrity sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ== +"@smithy/util-hex-encoding@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz#dd449a6452cffb37c5b1807ec2525bb4be551e8d" + integrity sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw== dependencies: tslib "^2.6.2" -"@smithy/util-middleware@^3.0.7": - version "3.0.7" - resolved "https://registry.yarnpkg.com/@smithy/util-middleware/-/util-middleware-3.0.7.tgz#770d09749b6d170a1641384a2e961487447446fa" - integrity sha512-OVA6fv/3o7TMJTpTgOi1H5OTwnuUa8hzRzhSFDtZyNxi6OZ70L/FHattSmhE212I7b6WSOJAAmbYnvcjTHOJCA== +"@smithy/util-middleware@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@smithy/util-middleware/-/util-middleware-4.0.2.tgz#272f1249664e27068ef0d5f967a233bf7b77962c" + integrity sha512-6GDamTGLuBQVAEuQ4yDQ+ti/YINf/MEmIegrEeg7DdB/sld8BX1lqt9RRuIcABOhAGTA50bRbPzErez7SlDtDQ== dependencies: - "@smithy/types" "^3.5.0" + "@smithy/types" "^4.2.0" tslib "^2.6.2" -"@smithy/util-retry@^3.0.7": - version "3.0.7" - resolved "https://registry.yarnpkg.com/@smithy/util-retry/-/util-retry-3.0.7.tgz#694e0667574ffe9772f620b35d3c7286aced35e9" - integrity sha512-nh1ZO1vTeo2YX1plFPSe/OXaHkLAHza5jpokNiiKX2M5YpNUv6RxGJZhpfmiR4jSvVHCjIDmILjrxKmP+/Ghug== +"@smithy/util-retry@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@smithy/util-retry/-/util-retry-4.0.3.tgz#42d54b3a100915b61c6f9bee43c966e96139584d" + integrity sha512-DPuYjZQDXmKr/sNvy9Spu8R/ESa2e22wXZzSAY6NkjOLj6spbIje/Aq8rT97iUMdDj0qHMRIe+bTxvlU74d9Ng== dependencies: - "@smithy/service-error-classification" "^3.0.7" - "@smithy/types" "^3.5.0" + "@smithy/service-error-classification" "^4.0.3" + "@smithy/types" "^4.2.0" tslib "^2.6.2" -"@smithy/util-stream@^3.1.9": - version "3.1.9" - resolved "https://registry.yarnpkg.com/@smithy/util-stream/-/util-stream-3.1.9.tgz#d39656eae27696bdc5a3ec7c2f6b89c32dccd1ca" - integrity sha512-7YAR0Ub3MwTMjDfjnup4qa6W8gygZMxikBhFMPESi6ASsl/rZJhwLpF/0k9TuezScCojsM0FryGdz4LZtjKPPQ== - dependencies: - "@smithy/fetch-http-handler" "^3.2.9" - "@smithy/node-http-handler" "^3.2.4" - "@smithy/types" "^3.5.0" - "@smithy/util-base64" "^3.0.0" - "@smithy/util-buffer-from" "^3.0.0" - "@smithy/util-hex-encoding" "^3.0.0" - "@smithy/util-utf8" "^3.0.0" +"@smithy/util-stream@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@smithy/util-stream/-/util-stream-4.2.0.tgz#85f85516b0042726162bf619caa3358332195652" + integrity sha512-Vj1TtwWnuWqdgQI6YTUF5hQ/0jmFiOYsc51CSMgj7QfyO+RF4EnT2HNjoviNlOOmgzgvf3f5yno+EiC4vrnaWQ== + dependencies: + "@smithy/fetch-http-handler" "^5.0.2" + "@smithy/node-http-handler" "^4.0.4" + "@smithy/types" "^4.2.0" + "@smithy/util-base64" "^4.0.0" + "@smithy/util-buffer-from" "^4.0.0" + "@smithy/util-hex-encoding" "^4.0.0" + "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@smithy/util-uri-escape@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz#e43358a78bf45d50bb736770077f0f09195b6f54" - integrity sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg== +"@smithy/util-uri-escape@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz#a96c160c76f3552458a44d8081fade519d214737" + integrity sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg== dependencies: tslib "^2.6.2" @@ -1669,12 +1619,12 @@ "@smithy/util-buffer-from" "^2.2.0" tslib "^2.6.2" -"@smithy/util-utf8@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-3.0.0.tgz#1a6a823d47cbec1fd6933e5fc87df975286d9d6a" - integrity sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA== +"@smithy/util-utf8@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-4.0.0.tgz#09ca2d9965e5849e72e347c130f2a29d5c0c863c" + integrity sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow== dependencies: - "@smithy/util-buffer-from" "^3.0.0" + "@smithy/util-buffer-from" "^4.0.0" tslib "^2.6.2" "@tootallnate/once@2": @@ -1720,7 +1670,12 @@ resolved "https://registry.yarnpkg.com/@types/caseless/-/caseless-0.12.5.tgz#db9468cb1b1b5a925b8f34822f1669df0c5472f5" integrity sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg== -"@types/chai@4", "@types/chai@4.3.16": +"@types/chai@4": + version "4.3.20" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.20.tgz#cb291577ed342ca92600430841a00329ba05cecc" + integrity sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ== + +"@types/chai@4.3.16": version "4.3.16" resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.16.tgz#b1572967f0b8b60bf3f87fe1d854a5604ea70c82" integrity sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ== @@ -1732,10 +1687,10 @@ dependencies: "@types/node" "*" -"@types/config@3.3.4": - version "3.3.4" - resolved "https://registry.yarnpkg.com/@types/config/-/config-3.3.4.tgz#e46d1ee74f9b0c53645f644dd5f3ba5bedc68d76" - integrity sha512-qFiTLnWy+TdPSMIXFHP+87lFXFRM4SXjRS+CSB66+56TrpLNw003y1sh7DGaaC1NGesxgKoT5FDy6dyA1Xju/g== +"@types/config@^3.3.5": + version "3.3.5" + resolved "https://registry.yarnpkg.com/@types/config/-/config-3.3.5.tgz#91f0a52b10212b9c4254fb0bbc4bedd77cd389b8" + integrity sha512-itq2HtXQBrNUKwMNZnb9mBRE3T99VYCdl1gjST9rq+9kFaB1iMMGuDeZnP88qid73DnpAMKH9ZolqDpS1Lz7+w== "@types/connect@*": version "3.4.38" @@ -1757,16 +1712,16 @@ "@types/node" "*" "@types/express-serve-static-core@^4.17.33": - version "4.19.5" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz#218064e321126fcf9048d1ca25dd2465da55d9c6" - integrity sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg== + version "4.19.6" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz#e01324c2a024ff367d92c66f48553ced0ab50267" + integrity sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A== dependencies: "@types/node" "*" "@types/qs" "*" "@types/range-parser" "*" "@types/send" "*" -"@types/express@4.17.21", "@types/express@^4.17.17": +"@types/express@4.17.21", "@types/express@^4.17.20": version "4.17.21" resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== @@ -1833,11 +1788,12 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== -"@types/jsonwebtoken@^9.0.2": - version "9.0.6" - resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-9.0.6.tgz#d1af3544d99ad992fb6681bbe60676e06b032bd3" - integrity sha512-/5hndP5dCjloafCXns6SZyESp3Ldq7YjH3zwzwczYnjxIT0Fqzk5ROSYVGfFyczIue7IUEj8hkvLbPoLQ18vQw== +"@types/jsonwebtoken@^9.0.4": + version "9.0.9" + resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-9.0.9.tgz#a4c3a446c0ebaaf467a58398382616f416345fb3" + integrity sha512-uoe+GxEuHbvy12OUQct2X9JenKM3qAscquYymuQN4fMWG9DBQtykrQEFcAbVACF7qaLw9BePSodUL0kquqBJpQ== dependencies: + "@types/ms" "*" "@types/node" "*" "@types/linkify-it@*", "@types/linkify-it@^5": @@ -1859,9 +1815,9 @@ "@types/mdurl" "*" "@types/markdown-it@^14.1.1": - version "14.1.1" - resolved "https://registry.yarnpkg.com/@types/markdown-it/-/markdown-it-14.1.1.tgz#06bafb7a4e3f77b62b1f308acf7df76687887e0b" - integrity sha512-4NpsnpYl2Gt1ljyBGrKMxFYAYvpqbnnkgP/i/g+NLpjEUa3obn1XJCur9YbEXKDAkaXqsR1LbDnGEJ0MmKFxfg== + version "14.1.2" + resolved "https://registry.yarnpkg.com/@types/markdown-it/-/markdown-it-14.1.2.tgz#57f2532a0800067d9b934f3521429a2e8bfb4c61" + integrity sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog== dependencies: "@types/linkify-it" "^5" "@types/mdurl" "^2" @@ -1886,12 +1842,17 @@ resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.6.tgz#818551d39113081048bdddbef96701b4e8bb9d1b" integrity sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg== -"@types/node@*", "@types/node@>=12.12.47", "@types/node@>=13.7.0", "@types/node@^20.10.3": - version "20.14.6" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.6.tgz#f3c19ffc98c2220e18de259bb172dd4d892a6075" - integrity sha512-JbA0XIJPL1IiNnU7PFxDXyfAwcwVVrOoqyzzyQTyMeVhBzkJVMSkC1LlVsRQ2lpqiY4n6Bb9oCS6lzDKVQxbZw== +"@types/ms@*": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-2.1.0.tgz#052aa67a48eccc4309d7f0191b7e41434b90bb78" + integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA== + +"@types/node@*", "@types/node@>=12.12.47", "@types/node@>=13.7.0": + version "22.15.8" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.15.8.tgz#d84fc99205d1d550d138abce87c7bcd5a9618f4f" + integrity sha512-VINDWfc4C3DGAa1J+riYRHjzt+IFj5eRaEl768ze7ZqXcjyN/4WHxPLAWMLTwmODpPvFyzuMTAT6A4RMOHlg5g== dependencies: - undici-types "~5.26.4" + undici-types "~6.21.0" "@types/node@20.11.24": version "20.11.24" @@ -1905,22 +1866,29 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b" integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== +"@types/node@^20.10.3": + version "20.17.37" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.17.37.tgz#adf72f8a4f2d39eaf8413df236c265f01a348cb6" + integrity sha512-+XPEBN3Bkgu4Lk1zIqmoXZssB6jzL31Sdi2pUfOtpVvyrmBKUrZc6m4aCS+osqC5zgQroONCroEVgoznnErzpw== + dependencies: + undici-types "~6.19.2" + "@types/node@^8.0.0": version "8.10.66" resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.66.tgz#dd035d409df322acc83dff62a602f12a5783bbb3" integrity sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw== "@types/nodemailer@^6.4.15": - version "6.4.15" - resolved "https://registry.yarnpkg.com/@types/nodemailer/-/nodemailer-6.4.15.tgz#494be695e11c438f7f5df738fb4ab740312a6ed2" - integrity sha512-0EBJxawVNjPkng1zm2vopRctuWVCxk34JcIlRuXSf54habUWdz1FB7wHDqOqvDa8Mtpt0Q3LTXQkAs2LNyK5jQ== + version "6.4.17" + resolved "https://registry.yarnpkg.com/@types/nodemailer/-/nodemailer-6.4.17.tgz#5c82a42aee16a3dd6ea31446a1bd6a447f1ac1a4" + integrity sha512-I9CCaIp6DTldEg7vyUTZi8+9Vo0hi1/T8gv3C89yk1rSAAzoKQ8H8ki/jBYJSFoH/BisgLP8tkZMlQ91CIquww== dependencies: "@types/node" "*" "@types/qs@*", "@types/qs@^6.2.31": - version "6.9.15" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.15.tgz#adde8a060ec9c305a82de1babc1056e73bd64dce" - integrity sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg== + version "6.9.18" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.18.tgz#877292caa91f7c1b213032b34626505b746624c2" + integrity sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA== "@types/range-parser@*": version "1.2.7" @@ -2007,49 +1975,56 @@ resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c" integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw== +"@types/winston@^2.4.4": + version "2.4.4" + resolved "https://registry.yarnpkg.com/@types/winston/-/winston-2.4.4.tgz#48cc744b7b42fad74b9a2e8490e0112bd9a3d08d" + integrity sha512-BVGCztsypW8EYwJ+Hq+QNYiT/MUyCif0ouBH+flrY66O5W+KIXAMML6E/0fJpm7VjIzgangahl5S03bJJQGrZw== + dependencies: + winston "*" + "@types/yargs-parser@*": version "21.0.3" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== "@types/yargs@^17.0.8": - version "17.0.32" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.32.tgz#030774723a2f7faafebf645f4e5a48371dca6229" - integrity sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog== + version "17.0.33" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.33.tgz#8c32303da83eec050a84b3c7ae7b9f922d13e32d" + integrity sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA== dependencies: "@types/yargs-parser" "*" "@typescript-eslint/parser@^7.1.1": - version "7.13.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.13.1.tgz#fac57811b3e519185f7259bac312291f7b9c4e72" - integrity sha512-1ELDPlnLvDQ5ybTSrMhRTFDfOQEOXNM+eP+3HT/Yq7ruWpciQw+Avi73pdEbA4SooCawEWo3dtYbF68gN7Ed1A== - dependencies: - "@typescript-eslint/scope-manager" "7.13.1" - "@typescript-eslint/types" "7.13.1" - "@typescript-eslint/typescript-estree" "7.13.1" - "@typescript-eslint/visitor-keys" "7.13.1" + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.18.0.tgz#83928d0f1b7f4afa974098c64b5ce6f9051f96a0" + integrity sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg== + dependencies: + "@typescript-eslint/scope-manager" "7.18.0" + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/typescript-estree" "7.18.0" + "@typescript-eslint/visitor-keys" "7.18.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@7.13.1": - version "7.13.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.13.1.tgz#c08041206904bf36f0e6997efdb0ca775e0c452e" - integrity sha512-adbXNVEs6GmbzaCpymHQ0MB6E4TqoiVbC0iqG3uijR8ZYfpAXMGttouQzF4Oat3P2GxDVIrg7bMI/P65LiQZdg== +"@typescript-eslint/scope-manager@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz#c928e7a9fc2c0b3ed92ab3112c614d6bd9951c83" + integrity sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA== dependencies: - "@typescript-eslint/types" "7.13.1" - "@typescript-eslint/visitor-keys" "7.13.1" + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/visitor-keys" "7.18.0" -"@typescript-eslint/types@7.13.1": - version "7.13.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.13.1.tgz#787db283bd0b58751094c90d5b58bbf5e9fc9bd8" - integrity sha512-7K7HMcSQIAND6RBL4kDl24sG/xKM13cA85dc7JnmQXw2cBDngg7c19B++JzvJHRG3zG36n9j1i451GBzRuHchw== +"@typescript-eslint/types@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.18.0.tgz#b90a57ccdea71797ffffa0321e744f379ec838c9" + integrity sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ== -"@typescript-eslint/typescript-estree@7.13.1": - version "7.13.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.13.1.tgz#3412841b130e070db2f675e3d9b8cb1ae49e1c3f" - integrity sha512-uxNr51CMV7npU1BxZzYjoVz9iyjckBduFBP0S5sLlh1tXYzHzgZ3BR9SVsNed+LmwKrmnqN3Kdl5t7eZ5TS1Yw== +"@typescript-eslint/typescript-estree@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz#b5868d486c51ce8f312309ba79bdb9f331b37931" + integrity sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA== dependencies: - "@typescript-eslint/types" "7.13.1" - "@typescript-eslint/visitor-keys" "7.13.1" + "@typescript-eslint/types" "7.18.0" + "@typescript-eslint/visitor-keys" "7.18.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" @@ -2057,12 +2032,12 @@ semver "^7.6.0" ts-api-utils "^1.3.0" -"@typescript-eslint/visitor-keys@7.13.1": - version "7.13.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.13.1.tgz#9c229a795a919db61f2d7f2337ef584ac05fbe96" - integrity sha512-k/Bfne7lrP7hcb7m9zSsgcBmo+8eicqqfNAJ7uUY+jkTFpKeH2FSkWpFRtimBxgkyvqfu9jTPRbYOvud6isdXA== +"@typescript-eslint/visitor-keys@7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz#0564629b6124d67607378d0f0332a0495b25e7d7" + integrity sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg== dependencies: - "@typescript-eslint/types" "7.13.1" + "@typescript-eslint/types" "7.18.0" eslint-visitor-keys "^3.4.3" "@tyriar/fibonacci-heap@^2.0.7": @@ -2071,9 +2046,9 @@ integrity sha512-bYuSNomfn4hu2tPiDN+JZtnzCpSpbJ/PNeulmocDy3xN2X5OkJL65zo6rPZp65cPPhLF9vfT/dgE+RtFRCSxOA== "@ungap/structured-clone@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" - integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + version "1.3.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz#d06bbb384ebcf6c505fde1c3d0ed4ddffe0aaff8" + integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== abbrev@^2.0.0: version "2.0.0" @@ -2087,7 +2062,7 @@ abort-controller@^3.0.0: dependencies: event-target-shim "^5.0.0" -accepts@~1.3.5, accepts@~1.3.8: +accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== @@ -2106,16 +2081,16 @@ acorn-jsx@^5.3.2: integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn-walk@^8.1.1: - version "8.3.3" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.3.tgz#9caeac29eefaa0c41e3d4c65137de4d6f34df43e" - integrity sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw== + version "8.3.4" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" + integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== dependencies: acorn "^8.11.0" -acorn@^8.11.0, acorn@^8.4.1, acorn@^8.8.2, acorn@^8.9.0: - version "8.12.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.0.tgz#1627bfa2e058148036133b8d9b51a700663c294c" - integrity sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw== +acorn@^8.11.0, acorn@^8.14.0, acorn@^8.4.1, acorn@^8.9.0: + version "8.14.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.1.tgz#721d5dc10f7d5b5609a891773d47731796935dfb" + integrity sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg== agent-base@6: version "6.0.2" @@ -2124,12 +2099,10 @@ agent-base@6: dependencies: debug "4" -agent-base@^7.0.2, agent-base@^7.1.0, agent-base@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.1.tgz#bdbded7dfb096b751a2a087eeeb9664725b2e317" - integrity sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA== - dependencies: - debug "^4.3.4" +agent-base@^7.1.0, agent-base@^7.1.2: + version "7.1.3" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.3.tgz#29435eb821bc4194633a5b89e5bc4703bafc25a1" + integrity sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw== aggregate-error@^3.0.0: version "3.1.0" @@ -2157,14 +2130,14 @@ ajv@^6.12.4, ajv@^6.12.6: uri-js "^4.2.2" ajv@^8.0.0, ajv@^8.3.0: - version "8.16.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.16.0.tgz#22e2a92b94f005f7e0f9c9d39652ef0b8f6f0cb4" - integrity sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw== + version "8.17.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" + integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== dependencies: fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" json-schema-traverse "^1.0.0" require-from-string "^2.0.2" - uri-js "^4.4.1" ansi-align@^3.0.0: version "3.0.1" @@ -2196,16 +2169,9 @@ ansi-regex@^5.0.1: integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" + version "6.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" + integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" @@ -2316,25 +2282,20 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -array-buffer-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" - integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== +array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz#384d12a37295aec3769ab022ad323a18a51ccf8b" + integrity sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw== dependencies: - call-bind "^1.0.5" - is-array-buffer "^3.0.4" + call-bound "^1.0.3" + is-array-buffer "^3.0.5" array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== -array-flatten@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-3.0.0.tgz#6428ca2ee52c7b823192ec600fa3ed2f157cd541" - integrity sha512-zPMVc3ZYlGLNk4mpK1NzP2wg0ml9t7fUgDsayR5Y5rSzxQilzR9FGu/EH2jQOcKSAeAfWeylyW8juy3OkWRvNA== - -array-includes@^3.1.7: +array-includes@^3.1.8: version "3.1.8" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== @@ -2351,51 +2312,51 @@ array-union@^2.1.0: resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -array.prototype.findlastindex@^1.2.3: - version "1.2.5" - resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" - integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== +array.prototype.findlastindex@^1.2.5: + version "1.2.6" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz#cfa1065c81dcb64e34557c9b81d012f6a421c564" + integrity sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ== dependencies: - call-bind "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.4" define-properties "^1.2.1" - es-abstract "^1.23.2" + es-abstract "^1.23.9" es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-shim-unscopables "^1.0.2" + es-object-atoms "^1.1.1" + es-shim-unscopables "^1.1.0" array.prototype.flat@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" - integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== + version "1.3.3" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz#534aaf9e6e8dd79fb6b9a9917f839ef1ec63afe5" + integrity sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-shim-unscopables "^1.0.2" array.prototype.flatmap@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" - integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== + version "1.3.3" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz#712cc792ae70370ae40586264629e33aab5dd38b" + integrity sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-shim-unscopables "^1.0.2" -arraybuffer.prototype.slice@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" - integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== +arraybuffer.prototype.slice@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz#9d760d84dbdd06d0cbf92c8849615a1a7ab3183c" + integrity sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ== dependencies: array-buffer-byte-length "^1.0.1" - call-bind "^1.0.5" + call-bind "^1.0.8" define-properties "^1.2.1" - es-abstract "^1.22.3" - es-errors "^1.2.1" - get-intrinsic "^1.2.3" + es-abstract "^1.23.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" is-array-buffer "^3.0.4" - is-shared-array-buffer "^1.0.2" arrify@^2.0.0: version "2.0.1" @@ -2424,6 +2385,11 @@ ast-types@^0.13.4: dependencies: tslib "^2.0.1" +async-function@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-function/-/async-function-1.0.0.tgz#509c9fca60eaf85034c6829838188e4e4c8ffb2b" + integrity sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA== + async-lock@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/async-lock/-/async-lock-1.3.2.tgz#56668613f91c1c55432b4db73e65c9ced664e789" @@ -2436,17 +2402,10 @@ async-retry@^1.3.3: dependencies: retry "0.13.1" -async@^2.6.4: - version "2.6.4" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" - integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== - dependencies: - lodash "^4.17.14" - -async@^3.2.3, async@^3.2.4: - version "3.2.5" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" - integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== +async@^3.2.3, async@^3.2.4, async@^3.2.6: + version "3.2.6" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" + integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== asynckit@^0.4.0: version "0.4.0" @@ -2469,10 +2428,10 @@ axios@1.7.4: form-data "^4.0.0" proxy-from-env "^1.1.0" -axios@^1.6.8: - version "1.7.2" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.2.tgz#b625db8a7051fbea61c35a3cbb3a1daa7b9c7621" - integrity sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw== +axios@^1.7.4: + version "1.9.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.9.0.tgz#25534e3b72b54540077d33046f77e3b8d7081901" + integrity sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg== dependencies: follow-redirects "^1.15.6" form-data "^4.0.0" @@ -2493,10 +2452,12 @@ base64url@3.x.x: resolved "https://registry.yarnpkg.com/base64url/-/base64url-3.0.1.tgz#6399d572e2bc3f90a9a8b22d5dbb0a32d33f788d" integrity sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A== -basic-auth-connect@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/basic-auth-connect/-/basic-auth-connect-1.0.0.tgz#fdb0b43962ca7b40456a7c2bb48fe173da2d2122" - integrity sha512-kiV+/DTgVro4aZifY/hwRwALBISViL5NP4aReaR2EVJEObpbUBHIkdJh/YpcoEiYt7nBodZ6U2ajZeZvSxUCCg== +basic-auth-connect@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/basic-auth-connect/-/basic-auth-connect-1.1.0.tgz#b44af37d5b3bd7561b56491e58cf26ae1578f0c7" + integrity sha512-rKcWjfiRZ3p5WS9e5q6msXa07s6DaFAMXoyowV+mb2xQG+oYdw2QEUyKi0Xp95JvXzShlM+oGy5QuqSK6TfC1Q== + dependencies: + tsscmp "^1.0.6" basic-auth@~2.0.1: version "2.0.1" @@ -2511,9 +2472,9 @@ basic-ftp@^5.0.2: integrity sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg== bignumber.js@^9.0.0: - version "9.1.2" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c" - integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== + version "9.3.0" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.3.0.tgz#bdba7e2a4c1a2eba08290e8dcad4f36393c92acd" + integrity sha512-EM7aMFTXbptt/wZdMlBv2t8IViwQL+h6SLHosp8Yf0dqJMTnY6iL32opnAB6kAdL0SZPuvcAzFr31o0c/R3/RA== binary-extensions@^2.0.0: version "2.3.0" @@ -2534,7 +2495,7 @@ bluebird@^3.7.2: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -body-parser@1.20.2, body-parser@^1.18.3, body-parser@^1.19.0: +body-parser@1.20.2: version "1.20.2" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== @@ -2552,6 +2513,24 @@ body-parser@1.20.2, body-parser@^1.18.3, body-parser@^1.19.0: type-is "~1.6.18" unpipe "1.0.0" +body-parser@1.20.3, body-parser@^1.18.3, body-parser@^1.19.0: + version "1.20.3" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6" + integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== + dependencies: + bytes "3.1.2" + content-type "~1.0.5" + 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.13.0" + raw-body "2.5.2" + type-is "~1.6.18" + unpipe "1.0.0" + boom@^7.3.x: version "7.3.0" resolved "https://registry.yarnpkg.com/boom/-/boom-7.3.0.tgz#733a6d956d33b0b1999da3fe6c12996950d017b9" @@ -2605,15 +2584,15 @@ browser-stdout@1.3.1: resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== -browserslist@^4.22.2: - version "4.23.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.1.tgz#ce4af0534b3d37db5c1a4ca98b9080f985041e96" - integrity sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw== +browserslist@^4.24.0: + version "4.24.5" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.5.tgz#aa0f5b8560fe81fde84c6dcb38f759bafba0e11b" + integrity sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw== dependencies: - caniuse-lite "^1.0.30001629" - electron-to-chromium "^1.4.796" - node-releases "^2.0.14" - update-browserslist-db "^1.0.16" + caniuse-lite "^1.0.30001716" + electron-to-chromium "^1.5.149" + node-releases "^2.0.19" + update-browserslist-db "^1.1.3" buffer-crc32@^0.2.1, buffer-crc32@^0.2.13: version "0.2.13" @@ -2645,20 +2624,15 @@ busboy@^1.0.0: dependencies: streamsearch "^1.1.0" -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== - bytes@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== cacache@^18.0.0: - version "18.0.3" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-18.0.3.tgz#864e2c18414e1e141ae8763f31e46c2cb96d1b21" - integrity sha512-qXCd4rh6I07cnDqh8V48/94Tc/WSfj+o3Gn6NZ0aZovS255bUx8O13uKxRFd2eWG0xgsco7+YItQNPaa5E85hg== + version "18.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-18.0.4.tgz#4601d7578dadb59c66044e157d02a3314682d6a5" + integrity sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ== dependencies: "@npmcli/fs" "^3.1.0" fs-minipass "^3.0.0" @@ -2683,16 +2657,31 @@ caching-transform@^4.0.0: package-hash "^4.0.0" write-file-atomic "^3.0.0" -call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" - integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== +call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== dependencies: - es-define-property "^1.0.0" es-errors "^1.3.0" function-bind "^1.1.2" + +call-bind@^1.0.7, call-bind@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" + integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== + dependencies: + call-bind-apply-helpers "^1.0.0" + es-define-property "^1.0.0" get-intrinsic "^1.2.4" - set-function-length "^1.2.1" + set-function-length "^1.2.2" + +call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" + integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== + dependencies: + call-bind-apply-helpers "^1.0.2" + get-intrinsic "^1.3.0" call-me-maybe@^1.0.1: version "1.0.2" @@ -2714,10 +2703,10 @@ camelcase@^6.0.0, camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001629: - version "1.0.30001636" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz#b15f52d2bdb95fad32c2f53c0b68032b85188a78" - integrity sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg== +caniuse-lite@^1.0.30001716: + version "1.0.30001717" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001717.tgz#5d9fec5ce09796a1893013825510678928aca129" + integrity sha512-auPpttCq6BDEG8ZAuHJIplGw6GODhjw+/11e7IjpnYCxZcW/ONgPs0KVBJ0d1bY3e2+7PRe5RCLyP+PfwVgkYw== cardinal@^2.1.1: version "2.1.1" @@ -2766,15 +2755,6 @@ chai@4.4.1: pathval "^1.1.1" type-detect "^4.0.8" -chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" @@ -2784,9 +2764,9 @@ chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: supports-color "^7.1.0" chalk@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" - integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== + version "5.4.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.4.1.tgz#1b48bf0963ec158dce2aacf69c093ae2dd2092d8" + integrity sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w== chardet@^0.7.0: version "0.7.0" @@ -2861,9 +2841,9 @@ ci-info@^3.2.0: integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== cjs-module-lexer@^1.2.2: - version "1.3.1" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz#c485341ae8fd999ca4ee5af2d7a1c9ae01e0099c" - integrity sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q== + version "1.4.3" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz#0f79731eb8cfe1ec72acd4066efac9d61991b00d" + integrity sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q== cjson@^0.3.1: version "0.3.3" @@ -2955,7 +2935,7 @@ cloudinary@2.0.3: lodash "^4.17.21" q "^1.5.1" -color-convert@^1.9.0, color-convert@^1.9.3: +color-convert@^1.9.3: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== @@ -3013,7 +2993,7 @@ colorspace@1.1.x: color "^3.1.3" text-hex "1.0.x" -combined-stream@^1.0.6, combined-stream@^1.0.8: +combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -3050,7 +3030,7 @@ compress-commons@^4.1.2: normalize-path "^3.0.0" readable-stream "^3.6.0" -compressible@~2.0.16: +compressible@~2.0.18: version "2.0.18" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== @@ -3058,16 +3038,16 @@ compressible@~2.0.16: mime-db ">= 1.43.0 < 2" compression@^1.7.0: - version "1.7.4" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" - integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + version "1.8.0" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.8.0.tgz#09420efc96e11a0f44f3a558de59e321364180f7" + integrity sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA== dependencies: - accepts "~1.3.5" - bytes "3.0.0" - compressible "~2.0.16" + bytes "3.1.2" + compressible "~2.0.18" debug "2.6.9" + negotiator "~0.6.4" on-headers "~1.0.2" - safe-buffer "5.1.2" + safe-buffer "5.2.1" vary "~1.1.2" concat-map@0.0.1: @@ -3103,12 +3083,12 @@ config-chain@^1.1.11: ini "^1.3.4" proto-list "~1.2.1" -config@3.3.7: - version "3.3.7" - resolved "https://registry.yarnpkg.com/config/-/config-3.3.7.tgz#4310410dc2bf4e0effdca21a12a4035860a24ee4" - integrity sha512-mX/n7GKDYZMqvvkY6e6oBY49W8wxdmQt+ho/5lhwFDXqQW9gI+Ahp8EKp8VAbISPnmf2+Bv5uZK7lKXZ6pf1aA== +config@3.3.12: + version "3.3.12" + resolved "https://registry.yarnpkg.com/config/-/config-3.3.12.tgz#a10ae66efcc3e48c1879fbb657c86c4ef6c7b25e" + integrity sha512-Vmx389R/QVM3foxqBzXO8t2tUikYZP64Q6vQxGrsMpREeJc/aWRnPRERXWsYzOHAumx/AOoILWe6nU3ZJL+6Sw== dependencies: - json5 "^2.1.1" + json5 "^2.2.3" configstore@^5.0.1: version "5.0.1" @@ -3177,10 +3157,10 @@ cookie@0.5.0: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== -cookie@0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" - integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== +cookie@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.1.tgz#2f73c42142d5d5cf71310a74fc4ae61670e5dbc9" + integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w== cookiejar@^2.1.4: version "2.1.4" @@ -3242,9 +3222,9 @@ cross-spawn@^5.0.1: which "^1.2.9" cross-spawn@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + version "6.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.6.tgz#30d0efa0712ddb7eb5a76e1e8721bffafa6b5d57" + integrity sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw== dependencies: nice-try "^1.0.4" path-key "^2.0.1" @@ -3252,10 +3232,10 @@ cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== +cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3, cross-spawn@^7.0.6: + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== dependencies: path-key "^3.1.0" shebang-command "^2.0.0" @@ -3267,39 +3247,39 @@ crypto-random-string@^2.0.0: integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== csv-parse@^5.0.4: - version "5.5.6" - resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-5.5.6.tgz#0d726d58a60416361358eec291a9f93abe0b6b1a" - integrity sha512-uNpm30m/AGSkLxxy7d9yRXpJQFrZzVWLFBkS+6ngPcZkw/5k3L/jjFuj7tVnEpRn+QgmiXr21nDlhCiUK4ij2A== + version "5.6.0" + resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-5.6.0.tgz#219beace2a3e9f28929999d2aa417d3fb3071c7f" + integrity sha512-l3nz3euub2QMg5ouu5U09Ew9Wf6/wQ8I++ch1loQ0ljmzhmfZYrH9fflS22i/PQEvsPvxCwxgz5q7UB8K1JO4Q== data-uri-to-buffer@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz#8a58bb67384b261a38ef18bea1810cb01badd28b" integrity sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw== -data-view-buffer@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" - integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== +data-view-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.2.tgz#211a03ba95ecaf7798a8c7198d79536211f88570" + integrity sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ== dependencies: - call-bind "^1.0.6" + call-bound "^1.0.3" es-errors "^1.3.0" - is-data-view "^1.0.1" + is-data-view "^1.0.2" -data-view-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" - integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== +data-view-byte-length@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz#9e80f7ca52453ce3e93d25a35318767ea7704735" + integrity sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ== dependencies: - call-bind "^1.0.7" + call-bound "^1.0.3" es-errors "^1.3.0" - is-data-view "^1.0.1" + is-data-view "^1.0.2" -data-view-byte-offset@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" - integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== +data-view-byte-offset@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz#068307f9b71ab76dbbe10291389e020856606191" + integrity sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ== dependencies: - call-bind "^1.0.6" + call-bound "^1.0.2" es-errors "^1.3.0" is-data-view "^1.0.1" @@ -3323,12 +3303,12 @@ debug@2.6.9: dependencies: ms "2.0.0" -debug@4, debug@4.3.5, debug@^4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.5" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" - integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== +debug@4, debug@^4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.6, debug@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" + integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== dependencies: - ms "2.1.2" + ms "^2.1.3" debug@4.3.1: version "4.3.1" @@ -3344,6 +3324,13 @@ debug@4.3.4: dependencies: ms "2.1.2" +debug@4.3.5: + version "4.3.5" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" + integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== + dependencies: + ms "2.1.2" + debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" @@ -3421,7 +3408,7 @@ define-data-property@^1.0.1, define-data-property@^1.1.4: es-errors "^1.3.0" gopd "^1.0.1" -define-properties@^1.2.0, define-properties@^1.2.1: +define-properties@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== @@ -3444,7 +3431,7 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== -depd@2.0.0, depd@~2.0.0: +depd@2.0.0, depd@^2.0.0, depd@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== @@ -3455,9 +3442,9 @@ destroy@1.2.0, destroy@^1.0.4: integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== detect-libc@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" - integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== + version "2.0.4" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.4.tgz#f04715b8ba815e53b4d8109655b6508a6865a7e8" + integrity sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA== dezalgo@^1.0.4: version "1.0.4" @@ -3515,6 +3502,20 @@ dot-prop@^5.2.0: dependencies: is-obj "^2.0.0" +dotenv@^16.5.0: + version "16.5.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.5.0.tgz#092b49f25f808f020050051d1ff258e404c78692" + integrity sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg== + +dunder-proto@^1.0.0, dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + duplexify@^4.0.0, duplexify@^4.1.3: version "4.1.3" resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-4.1.3.tgz#a07e1c0d0a2c001158563d32592ba58bddb0236f" @@ -3549,10 +3550,10 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -electron-to-chromium@^1.4.796: - version "1.4.807" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.807.tgz#4d6c5ea1516f0164ac5bfd487ccd4ee9507c8f01" - integrity sha512-kSmJl2ZwhNf/bcIuCH/imtNOKlpkLDn2jqT5FJ+/0CXjhnFaOa9cOe9gHKKy71eM49izwuQjZhKk+lWQ1JxB7A== +electron-to-chromium@^1.5.149: + version "1.5.150" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.150.tgz#3120bf34453a7a82cb4d9335df20680b2bb40649" + integrity sha512-rOOkP2ZUMx1yL4fCxXQKDHQ8ZXwisb2OycOQVKHgvB3ZI4CvehOd4y2tfnnLDieJ3Zs1RL1Dlp3cMkyIn7nnXA== emoji-regex@^8.0.0: version "8.0.0" @@ -3574,6 +3575,11 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== +encodeurl@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" + integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== + encoding@^0.1.13: version "0.1.13" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" @@ -3608,111 +3614,115 @@ err-code@^2.0.2: resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== -es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2: - version "1.23.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" - integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== +es-abstract@^1.23.2, es-abstract@^1.23.5, es-abstract@^1.23.9: + version "1.23.9" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.9.tgz#5b45994b7de78dada5c1bebf1379646b32b9d606" + integrity sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA== dependencies: - array-buffer-byte-length "^1.0.1" - arraybuffer.prototype.slice "^1.0.3" + array-buffer-byte-length "^1.0.2" + arraybuffer.prototype.slice "^1.0.4" available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - data-view-buffer "^1.0.1" - data-view-byte-length "^1.0.1" - data-view-byte-offset "^1.0.0" - es-define-property "^1.0.0" + call-bind "^1.0.8" + call-bound "^1.0.3" + data-view-buffer "^1.0.2" + data-view-byte-length "^1.0.2" + data-view-byte-offset "^1.0.1" + es-define-property "^1.0.1" es-errors "^1.3.0" es-object-atoms "^1.0.0" - es-set-tostringtag "^2.0.3" - es-to-primitive "^1.2.1" - function.prototype.name "^1.1.6" - get-intrinsic "^1.2.4" - get-symbol-description "^1.0.2" - globalthis "^1.0.3" - gopd "^1.0.1" + es-set-tostringtag "^2.1.0" + es-to-primitive "^1.3.0" + function.prototype.name "^1.1.8" + get-intrinsic "^1.2.7" + get-proto "^1.0.0" + get-symbol-description "^1.1.0" + globalthis "^1.0.4" + gopd "^1.2.0" has-property-descriptors "^1.0.2" - has-proto "^1.0.3" - has-symbols "^1.0.3" + has-proto "^1.2.0" + has-symbols "^1.1.0" hasown "^2.0.2" - internal-slot "^1.0.7" - is-array-buffer "^3.0.4" + internal-slot "^1.1.0" + is-array-buffer "^3.0.5" is-callable "^1.2.7" - is-data-view "^1.0.1" - is-negative-zero "^2.0.3" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.3" - is-string "^1.0.7" - is-typed-array "^1.1.13" - is-weakref "^1.0.2" - object-inspect "^1.13.1" + is-data-view "^1.0.2" + is-regex "^1.2.1" + is-shared-array-buffer "^1.0.4" + is-string "^1.1.1" + is-typed-array "^1.1.15" + is-weakref "^1.1.0" + math-intrinsics "^1.1.0" + object-inspect "^1.13.3" object-keys "^1.1.1" - object.assign "^4.1.5" - regexp.prototype.flags "^1.5.2" - safe-array-concat "^1.1.2" - safe-regex-test "^1.0.3" - string.prototype.trim "^1.2.9" - string.prototype.trimend "^1.0.8" + object.assign "^4.1.7" + own-keys "^1.0.1" + regexp.prototype.flags "^1.5.3" + safe-array-concat "^1.1.3" + safe-push-apply "^1.0.0" + safe-regex-test "^1.1.0" + set-proto "^1.0.0" + string.prototype.trim "^1.2.10" + string.prototype.trimend "^1.0.9" string.prototype.trimstart "^1.0.8" - typed-array-buffer "^1.0.2" - typed-array-byte-length "^1.0.1" - typed-array-byte-offset "^1.0.2" - typed-array-length "^1.0.6" - unbox-primitive "^1.0.2" - which-typed-array "^1.1.15" - -es-define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" - integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== - dependencies: - get-intrinsic "^1.2.4" + typed-array-buffer "^1.0.3" + typed-array-byte-length "^1.0.3" + typed-array-byte-offset "^1.0.4" + typed-array-length "^1.0.7" + unbox-primitive "^1.1.0" + which-typed-array "^1.1.18" + +es-define-property@^1.0.0, es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== -es-errors@^1.2.1, es-errors@^1.3.0: +es-errors@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== -es-object-atoms@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" - integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== +es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" + integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== dependencies: es-errors "^1.3.0" -es-set-tostringtag@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" - integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== +es-set-tostringtag@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" + integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== dependencies: - get-intrinsic "^1.2.4" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" has-tostringtag "^1.0.2" - hasown "^2.0.1" + hasown "^2.0.2" -es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" - integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== +es-shim-unscopables@^1.0.2, es-shim-unscopables@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz#438df35520dac5d105f3943d927549ea3b00f4b5" + integrity sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw== dependencies: - hasown "^2.0.0" + hasown "^2.0.2" -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== +es-to-primitive@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.3.0.tgz#96c89c82cc49fd8794a24835ba3e1ff87f214e18" + integrity sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g== dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" + is-callable "^1.2.7" + is-date-object "^1.0.5" + is-symbol "^1.0.4" es6-error@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== -escalade@^3.1.1, escalade@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" - integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== +escalade@^3.1.1, escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== escape-goat@^2.0.0: version "2.1.1" @@ -3781,10 +3791,10 @@ eslint-import-resolver-node@^0.3.9: is-core-module "^2.13.0" resolve "^1.22.4" -eslint-module-utils@^2.8.0: - version "2.8.1" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz#52f2404300c3bd33deece9d7372fb337cc1d7c34" - integrity sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q== +eslint-module-utils@^2.12.0: + version "2.12.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz#fe4cfb948d61f49203d7b08871982b65b9af0b0b" + integrity sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg== dependencies: debug "^3.2.7" @@ -3797,32 +3807,34 @@ eslint-plugin-es@^3.0.0: regexpp "^3.0.0" eslint-plugin-import@^2.22.1: - version "2.29.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" - integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== + version "2.31.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz#310ce7e720ca1d9c0bb3f69adfd1c6bdd7d9e0e7" + integrity sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A== dependencies: - array-includes "^3.1.7" - array.prototype.findlastindex "^1.2.3" + "@rtsao/scc" "^1.1.0" + array-includes "^3.1.8" + array.prototype.findlastindex "^1.2.5" array.prototype.flat "^1.3.2" array.prototype.flatmap "^1.3.2" debug "^3.2.7" doctrine "^2.1.0" eslint-import-resolver-node "^0.3.9" - eslint-module-utils "^2.8.0" - hasown "^2.0.0" - is-core-module "^2.13.1" + eslint-module-utils "^2.12.0" + hasown "^2.0.2" + is-core-module "^2.15.1" is-glob "^4.0.3" minimatch "^3.1.2" - object.fromentries "^2.0.7" - object.groupby "^1.0.1" - object.values "^1.1.7" + object.fromentries "^2.0.8" + object.groupby "^1.0.3" + object.values "^1.2.0" semver "^6.3.1" + string.prototype.trimend "^1.0.8" tsconfig-paths "^3.15.0" eslint-plugin-mocha@^10.0.0: - version "10.4.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-mocha/-/eslint-plugin-mocha-10.4.3.tgz#bf641379d9f1c7d6a84646a3fc1a0baa50da8bfd" - integrity sha512-emc4TVjq5Ht0/upR+psftuz6IBG5q279p+1dSRDeHf+NS9aaerBi3lXKo1SEzwC29hFIW21gO89CEWSvRsi8IQ== + version "10.5.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-mocha/-/eslint-plugin-mocha-10.5.0.tgz#0aca8d709e7cddef566e0dc252f6b02e307a2b7e" + integrity sha512-F2ALmQVPT1GoP27O1JTZGrV9Pqg8k79OeIuvw63UxMtQKREZtmkK1NFgkZQ2TW7L2JSSFKHFPTtHu5z8R9QNRw== dependencies: eslint-utils "^3.0.0" globals "^13.24.0" @@ -3848,9 +3860,9 @@ eslint-plugin-prettier@^4.2.1: prettier-linter-helpers "^1.0.0" eslint-plugin-promise@^6.0.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.2.0.tgz#e24ab0e3c0a25fa227d98d9ff612156b5af15945" - integrity sha512-QmAqwizauvnKOlifxyDj2ObfULpHQawlg/zQdgEixur9vl0CvZGv/LCJV2rtj3210QCoeGBzVMfMXqGAOr/4fA== + version "6.6.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz#acd3fd7d55cead7a10f92cf698f36c0aafcd717a" + integrity sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ== eslint-plugin-security@^1.7.1: version "1.7.1" @@ -3891,21 +3903,21 @@ eslint-visitor-keys@^2.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: +eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: version "3.4.3" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== eslint@^8.57.0: - version "8.57.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" - integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== + version "8.57.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9" + integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.57.0" - "@humanwhocodes/config-array" "^0.11.14" + "@eslint/js" "8.57.1" + "@humanwhocodes/config-array" "^0.13.0" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" "@ungap/structured-clone" "^1.2.0" @@ -3955,9 +3967,9 @@ esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esquery@^1.4.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" - integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + version "1.6.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== dependencies: estraverse "^5.1.0" @@ -4006,9 +4018,9 @@ exegesis-express@^4.0.0: exegesis "^4.1.0" exegesis@^4.1.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/exegesis/-/exegesis-4.1.2.tgz#0d73786202c80fafd23977c4090797e5cd603970" - integrity sha512-D9ZFTFQ8O5ZRBLZ0HAHqo0Gc3+ts330WimHf0cF7OQZLQ3YqRVfjig5qGvEjheS68m+fMjJSR/wN/Qousg17Dw== + version "4.3.0" + resolved "https://registry.yarnpkg.com/exegesis/-/exegesis-4.3.0.tgz#3b5c45222f543f70ab89fa49eea3a564111a7324" + integrity sha512-V90IJQ4XYO1SfH5qdJTOijXkQTF3hSpSHHqlf7MstUMDKP22iAvi63gweFLtPZ4Gj3Wnh8RgJX5TGu0WiwTyDQ== dependencies: "@apidevtools/json-schema-ref-parser" "^9.0.3" ajv "^8.3.0" @@ -4023,7 +4035,6 @@ exegesis@^4.1.0: lodash "^4.17.11" openapi3-ts "^3.1.1" promise-breaker "^6.0.0" - pump "^3.0.0" qs "^6.6.0" raw-body "^2.3.3" semver "^7.0.0" @@ -4045,9 +4056,9 @@ expect@^29.0.0: jest-util "^29.7.0" exponential-backoff@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6" - integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== + version "3.1.2" + resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.2.tgz#a8f26adb96bf78e8cd8ad1037928d5e5c0679d91" + integrity sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA== express-boom@3.0.0: version "3.0.0" @@ -4057,36 +4068,36 @@ express-boom@3.0.0: boom "^7.3.x" express@^4.16.4: - version "4.19.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465" - integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q== + version "4.21.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.21.2.tgz#cf250e48362174ead6cea4a566abef0162c1ec32" + integrity sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA== dependencies: accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.20.2" + body-parser "1.20.3" content-disposition "0.5.4" content-type "~1.0.4" - cookie "0.6.0" + cookie "0.7.1" cookie-signature "1.0.6" debug "2.6.9" depd "2.0.0" - encodeurl "~1.0.2" + encodeurl "~2.0.0" escape-html "~1.0.3" etag "~1.8.1" - finalhandler "1.2.0" + finalhandler "1.3.1" fresh "0.5.2" http-errors "2.0.0" - merge-descriptors "1.0.1" + merge-descriptors "1.0.3" methods "~1.1.2" on-finished "2.4.1" parseurl "~1.3.3" - path-to-regexp "0.1.7" + path-to-regexp "0.1.12" proxy-addr "~2.0.7" - qs "6.11.0" + qs "6.13.0" range-parser "~1.2.1" safe-buffer "5.2.1" - send "0.18.0" - serve-static "1.15.0" + send "0.19.0" + serve-static "1.16.2" setprototypeof "1.2.0" statuses "2.0.1" type-is "~1.6.18" @@ -4170,15 +4181,15 @@ fast-diff@^1.1.2: integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== fast-glob@^3.2.9: - version "3.3.2" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" - integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + version "3.3.3" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" + integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== 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" + micromatch "^4.0.8" fast-json-stable-stringify@^2.0.0: version "2.1.0" @@ -4200,12 +4211,10 @@ fast-text-encoding@^1.0.0, fast-text-encoding@^1.0.3: resolved "https://registry.yarnpkg.com/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz#0aa25f7f638222e3396d72bf936afcf1d42d6867" integrity sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w== -fast-url-parser@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d" - integrity sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ== - dependencies: - punycode "^1.3.2" +fast-uri@^3.0.1: + version "3.0.6" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.6.tgz#88f130b77cfaea2378d56bf970dea21257a68748" + integrity sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw== fast-xml-parser@4.4.1: version "4.4.1" @@ -4214,17 +4223,17 @@ fast-xml-parser@4.4.1: dependencies: strnum "^1.0.5" -fast-xml-parser@^4.3.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.4.0.tgz#341cc98de71e9ba9e651a67f41f1752d1441a501" - integrity sha512-kLY3jFlwIYwBNDojclKsNAC12sfD6NwW74QB2CoNGPvtVxjliYehVunB3HYyNi+n4Tt1dAcgwYvmKF/Z18flqg== +fast-xml-parser@^4.4.1: + version "4.5.3" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.5.3.tgz#c54d6b35aa0f23dc1ea60b6c884340c006dc6efb" + integrity sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig== dependencies: - strnum "^1.0.5" + strnum "^1.1.1" fastq@^1.6.0: - version "1.17.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" - integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== + version "1.19.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.19.1.tgz#d50eaba803c8846a883c16492821ebcd2cda55f5" + integrity sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ== dependencies: reusify "^1.0.4" @@ -4292,6 +4301,19 @@ finalhandler@1.2.0: statuses "2.0.1" unpipe "~1.0.0" +finalhandler@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019" + integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== + dependencies: + debug "2.6.9" + encodeurl "~2.0.0" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + find-cache-dir@^3.2.0: version "3.3.2" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" @@ -4424,9 +4446,9 @@ flat@^5.0.2: integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== flatted@^3.2.7, flatted@^3.2.9: - version "3.3.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" - integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== + version "3.3.3" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" + integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== fn.name@1.x.x: version "1.1.0" @@ -4434,16 +4456,16 @@ fn.name@1.x.x: integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== follow-redirects@^1.15.6: - version "1.15.6" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" - integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== + version "1.15.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" + integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== +for-each@^0.3.3, for-each@^0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47" + integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== dependencies: - is-callable "^1.1.3" + is-callable "^1.2.7" foreground-child@^2.0.0: version "2.0.0" @@ -4454,38 +4476,41 @@ foreground-child@^2.0.0: signal-exit "^3.0.2" foreground-child@^3.1.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.2.1.tgz#767004ccf3a5b30df39bed90718bab43fe0a59f7" - integrity sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA== + version "3.3.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f" + integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw== dependencies: - cross-spawn "^7.0.0" + cross-spawn "^7.0.6" signal-exit "^4.0.1" form-data@^2.2.0, form-data@^2.5.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4" - integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA== + version "2.5.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.3.tgz#f9bcf87418ce748513c0c3494bb48ec270c97acc" + integrity sha512-XHIrMD0NpDrNM/Ckf7XJiBbLl57KEhT3+i3yY+eWm+cqYZJQTZrKo8Y8AWKnuV5GT4scfuUGt9LzNoIx3dU1nQ== dependencies: asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" + combined-stream "^1.0.8" + es-set-tostringtag "^2.1.0" + mime-types "^2.1.35" + safe-buffer "^5.2.1" form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + version "4.0.2" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.2.tgz#35cabbdd30c3ce73deb2c42d3c8d3ed9ca51794c" + integrity sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w== dependencies: asynckit "^0.4.0" combined-stream "^1.0.8" + es-set-tostringtag "^2.1.0" mime-types "^2.1.12" formidable@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/formidable/-/formidable-2.1.2.tgz#fa973a2bec150e4ce7cac15589d7a25fc30ebd89" - integrity sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g== + version "2.1.5" + resolved "https://registry.yarnpkg.com/formidable/-/formidable-2.1.5.tgz#dd7ef4d55c164afaf9b6eb472bfd04b02d66d2dd" + integrity sha512-Oz5Hwvwak/DCaXVVUtPn4oLMLLy1CdclLKO1LFgU7XzDpVMUU5UjlSLpGMocyQNNk8F6IJW9M/YdooSn2MRI+Q== dependencies: + "@paralleldrive/cuid2" "^2.2.2" dezalgo "^1.0.4" - hexoid "^1.0.0" once "^1.4.0" qs "^6.11.0" @@ -4518,15 +4543,6 @@ fs-extra@^10.1.0: jsonfile "^6.0.1" universalify "^2.0.0" -fs-extra@^11.2.0: - version "11.2.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b" - integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - fs-extra@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" @@ -4565,15 +4581,17 @@ function-bind@^1.1.2: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== -function.prototype.name@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" - integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== +function.prototype.name@^1.1.6, function.prototype.name@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.8.tgz#e68e1df7b259a5c949eeef95cdbde53edffabb78" + integrity sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" functions-have-names "^1.2.3" + hasown "^2.0.2" + is-callable "^1.2.7" functional-red-black-tree@^1.0.1: version "1.0.1" @@ -4612,9 +4630,9 @@ gaxios@^5.0.0, gaxios@^5.0.1: node-fetch "^2.6.9" gaxios@^6.0.0, gaxios@^6.0.2, gaxios@^6.1.1: - version "6.6.0" - resolved "https://registry.yarnpkg.com/gaxios/-/gaxios-6.6.0.tgz#af8242fff0bbb82a682840d5feaa91b6a1c58be4" - integrity sha512-bpOZVQV5gthH/jVCSuYuokRo2bTKOcuBiVWpjmTn6C5Agl5zclGfTljuGsQZxwwDBkli+YhZhP4TdlqTnhOezQ== + version "6.7.1" + resolved "https://registry.yarnpkg.com/gaxios/-/gaxios-6.7.1.tgz#ebd9f7093ede3ba502685e73390248bb5b7f71fb" + integrity sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ== dependencies: extend "^3.0.2" https-proxy-agent "^7.0.1" @@ -4639,11 +4657,12 @@ gcp-metadata@^5.3.0: json-bigint "^1.0.0" gcp-metadata@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-6.1.0.tgz#9b0dd2b2445258e7597f2024332d20611cbd6b8c" - integrity sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg== + version "6.1.1" + resolved "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-6.1.1.tgz#f65aa69f546bc56e116061d137d3f5f90bdec494" + integrity sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A== dependencies: - gaxios "^6.0.0" + gaxios "^6.1.1" + google-logging-utils "^0.0.2" json-bigint "^1.0.0" gensync@^1.0.0-beta.2: @@ -4661,16 +4680,21 @@ get-func-name@^2.0.1, get-func-name@^2.0.2: resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== -get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" - integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== +get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.2.7, get-intrinsic@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== dependencies: + call-bind-apply-helpers "^1.0.2" + es-define-property "^1.0.1" es-errors "^1.3.0" + es-object-atoms "^1.1.1" function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" + get-proto "^1.0.1" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.1.0" get-package-type@^0.1.0: version "0.1.0" @@ -4682,24 +4706,31 @@ get-port@^3.1.0: resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc" integrity sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg== -get-symbol-description@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" - integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== +get-proto@^1.0.0, get-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== + dependencies: + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" + +get-symbol-description@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz#7bdd54e0befe8ffc9f3b4e203220d9f1e881b6ee" + integrity sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg== dependencies: - call-bind "^1.0.5" + call-bound "^1.0.3" es-errors "^1.3.0" - get-intrinsic "^1.2.4" + get-intrinsic "^1.2.6" get-uri@^6.0.1: - version "6.0.3" - resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-6.0.3.tgz#0d26697bc13cf91092e519aa63aa60ee5b6f385a" - integrity sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw== + version "6.0.4" + resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-6.0.4.tgz#6daaee9e12f9759e19e55ba313956883ef50e0a7" + integrity sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ== dependencies: basic-ftp "^5.0.2" data-uri-to-buffer "^6.0.2" debug "^4.3.4" - fs-extra "^11.2.0" github-from-package@0.0.0: version "0.0.0" @@ -4746,9 +4777,9 @@ glob@8.1.0, glob@^8.0.0: once "^1.3.0" glob@^10.2.2, glob@^10.3.10: - version "10.4.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.2.tgz#bed6b95dade5c1f80b4434daced233aee76160e5" - integrity sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w== + version "10.4.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" + integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== dependencies: foreground-child "^3.1.0" jackspeak "^3.1.2" @@ -4788,7 +4819,7 @@ globals@^13.19.0, globals@^13.24.0: dependencies: type-fest "^0.20.2" -globalthis@^1.0.3: +globalthis@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== @@ -4839,9 +4870,9 @@ google-auth-library@^8.0.2: lru-cache "^6.0.0" google-auth-library@^9.3.0, google-auth-library@^9.6.3: - version "9.11.0" - resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-9.11.0.tgz#bd6da364bcde4e0cc4ed70a0e0df5112b6a671dd" - integrity sha512-epX3ww/mNnhl6tL45EQ/oixsY8JLEgUFoT4A5E/5iAR4esld9Kqv6IJGk7EmGuOgDvaarwF95hU2+v7Irql9lw== + version "9.15.1" + resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-9.15.1.tgz#0c5d84ed1890b2375f1cd74f03ac7b806b392928" + integrity sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng== dependencies: base64-js "^1.3.0" ecdsa-sig-formatter "^1.0.11" @@ -4872,23 +4903,28 @@ google-gax@^3.6.1: retry-request "^5.0.0" google-gax@^4.3.3: - version "4.3.6" - resolved "https://registry.yarnpkg.com/google-gax/-/google-gax-4.3.6.tgz#aed8cb1ffc8072615c7ec0cf557ade7343136413" - integrity sha512-z3MR+pE6WqU+tnKtkJl4c723EYY7Il4fcSNgEbehzUJpcNWkca9AyoC2pdBWmEa0cda21VRpUBb4s6VSATiUKg== + version "4.6.0" + resolved "https://registry.yarnpkg.com/google-gax/-/google-gax-4.6.0.tgz#455c94496d80ecf0cba113b0451a883b7bcee0fd" + integrity sha512-zKKLeLfcYBVOzzM48Brtn4EQkKcTli9w6c1ilzFK2NbJvcd4ATD8/XqFExImvE/W5IwMlKKwa5qqVufji3ioNQ== dependencies: - "@grpc/grpc-js" "~1.10.3" + "@grpc/grpc-js" "^1.10.9" "@grpc/proto-loader" "^0.7.13" "@types/long" "^4.0.0" abort-controller "^3.0.0" duplexify "^4.0.0" google-auth-library "^9.3.0" - node-fetch "^2.6.1" + node-fetch "^2.7.0" object-hash "^3.0.0" - proto3-json-serializer "^2.0.0" - protobufjs "7.3.0" + proto3-json-serializer "^2.0.2" + protobufjs "^7.3.2" retry-request "^7.0.0" uuid "^9.0.1" +google-logging-utils@^0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/google-logging-utils/-/google-logging-utils-0.0.2.tgz#5fd837e06fa334da450433b9e3e1870c1594466a" + integrity sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ== + google-p12-pem@^3.1.3: version "3.1.4" resolved "https://registry.yarnpkg.com/google-p12-pem/-/google-p12-pem-3.1.4.tgz#123f7b40da204de4ed1fbf2fd5be12c047fc8b3b" @@ -4903,12 +4939,10 @@ google-p12-pem@^4.0.0: dependencies: node-forge "^1.3.1" -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" +gopd@^1.0.1, gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== graceful-fs@4.2.10: version "4.2.10" @@ -4951,10 +4985,10 @@ gtoken@^7.0.0: gaxios "^6.0.0" jws "^4.0.0" -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== +has-bigints@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.1.0.tgz#28607e965ac967e03cd2a2c70a2636a1edad49fe" + integrity sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg== has-flag@^3.0.0: version "3.0.0" @@ -4973,17 +5007,19 @@ has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: dependencies: es-define-property "^1.0.0" -has-proto@^1.0.1, has-proto@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" - integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== +has-proto@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.2.0.tgz#5de5a6eabd95fdffd9818b43055e8065e39fe9d5" + integrity sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ== + dependencies: + dunder-proto "^1.0.0" -has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== +has-symbols@^1.0.3, has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== -has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: +has-tostringtag@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== @@ -5011,7 +5047,7 @@ hasha@^5.0.0: is-stream "^2.0.0" type-fest "^0.8.0" -hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: +hasown@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== @@ -5024,29 +5060,24 @@ he@1.2.0: integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== heap-js@^2.2.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/heap-js/-/heap-js-2.5.0.tgz#487e268b1733b187ca04eccf52f8387be92b46cb" - integrity sha512-kUGoI3p7u6B41z/dp33G6OaL7J4DRqRYwVmeIlwLClx7yaaAy7hoDExnuejTKtuDwfcatGmddHDEOjf6EyIxtQ== + version "2.6.0" + resolved "https://registry.yarnpkg.com/heap-js/-/heap-js-2.6.0.tgz#72a2fc9efdb8b7b103c351b6e936d18325104a15" + integrity sha512-trFMIq3PATiFRiQmNNeHtsrkwYRByIXUbYNbotiY9RLVfMkdwZdd2eQ38mGt7BRiCKBaj1DyBAIHmm7mmXPuuw== helmet@7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/helmet/-/helmet-7.1.0.tgz#287279e00f8a3763d5dccbaf1e5ee39b8c3784ca" integrity sha512-g+HZqgfbpXdCkme/Cd/mZkV0aV3BZZZSugecH03kl38m/Kmdx8jKjBikpDj2cr+Iynv4KpYEviojNdTJActJAg== -hexoid@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/hexoid/-/hexoid-1.0.0.tgz#ad10c6573fb907de23d9ec63a711267d9dc9bc18" - integrity sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g== - hoek@6.x.x: version "6.1.3" resolved "https://registry.yarnpkg.com/hoek/-/hoek-6.1.3.tgz#73b7d33952e01fe27a38b0457294b79dd8da242c" integrity sha512-YXXAAhmF9zpQbC7LEcREFtXfGq5K1fmd+4PHkBq8NUqmzW3G+Dq10bI/i0KucLRwss3YYFQ0fSfoxBZYiGUqtQ== html-entities@^2.3.6, html-entities@^2.5.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.5.2.tgz#201a3cf95d3a15be7099521620d19dfb4f65359f" - integrity sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA== + version "2.6.0" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.6.0.tgz#7c64f1ea3b36818ccae3d3fb48b6974208e984f8" + integrity sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ== html-escaper@^2.0.0: version "2.0.2" @@ -5080,9 +5111,9 @@ http-errors@2.0.0, http-errors@~2.0.0: toidentifier "1.0.1" http-parser-js@>=0.5.1: - version "0.5.8" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" - integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== + version "0.5.10" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.10.tgz#b3277bd6d7ed5588e20ea73bf724fcbe44609075" + integrity sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA== http-proxy-agent@^5.0.0: version "5.0.0" @@ -5116,12 +5147,12 @@ https-proxy-agent@^5.0.0: agent-base "6" debug "4" -https-proxy-agent@^7.0.1, https-proxy-agent@^7.0.2, https-proxy-agent@^7.0.3: - version "7.0.4" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz#8e97b841a029ad8ddc8731f26595bad868cb4168" - integrity sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg== +https-proxy-agent@^7.0.1, https-proxy-agent@^7.0.6: + version "7.0.6" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz#da8dfeac7da130b05c2ba4b59c9b6cd66611a6b9" + integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw== dependencies: - agent-base "^7.0.2" + agent-base "^7.1.2" debug "4" iconv-lite@0.4.24, iconv-lite@^0.4.24: @@ -5149,9 +5180,9 @@ ignore-by-default@^1.0.1: integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== ignore@^5.1.1, ignore@^5.2.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" - integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== image-size@1.0.0: version "1.0.0" @@ -5161,19 +5192,19 @@ image-size@1.0.0: queue "6.0.2" import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + version "3.3.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" + integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== dependencies: parent-module "^1.0.0" resolve-from "^4.0.0" import-in-the-middle@^1.6.0: - version "1.8.1" - resolved "https://registry.yarnpkg.com/import-in-the-middle/-/import-in-the-middle-1.8.1.tgz#8b51c2cc631b64e53e958d7048d2d9463ce628f8" - integrity sha512-yhRwoHtiLGvmSozNOALgjRPFI6uYsds60EoMqqnXyyv+JOIW/BrrLejuTGBt+bq0T5tLzOHrN0T7xYTm4Qt/ng== + version "1.13.1" + resolved "https://registry.yarnpkg.com/import-in-the-middle/-/import-in-the-middle-1.13.1.tgz#789651f9e93dd902a5a306f499ab51eb72b03a12" + integrity sha512-k2V9wNm9B+ysuelDTHjI9d5KPc4l8zAZTGqj+pcynvWkypZd857ryzN8jNC7Pg2YZXNMJcHRPpaDyCBbNyVRpA== dependencies: - acorn "^8.8.2" + acorn "^8.14.0" acorn-import-attributes "^1.9.5" cjs-module-lexer "^1.2.2" module-details-from-path "^1.0.3" @@ -5253,14 +5284,14 @@ install-artifact-from-github@^1.3.5: resolved "https://registry.yarnpkg.com/install-artifact-from-github/-/install-artifact-from-github-1.3.5.tgz#88c96fe40e5eb21d45586d564208c648a1dbf38d" integrity sha512-gZHC7f/cJgXz7MXlHFBxPVMsvIbev1OQN1uKQYKVJDydGNm9oYf9JstbU4Atnh/eSvk41WtEovoRm+8IF686xg== -internal-slot@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" - integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== +internal-slot@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.1.0.tgz#1eac91762947d2f7056bc838d93e13b2e9604961" + integrity sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw== dependencies: es-errors "^1.3.0" - hasown "^2.0.0" - side-channel "^1.0.4" + hasown "^2.0.2" + side-channel "^1.1.0" ip-address@^9.0.5: version "9.0.5" @@ -5285,25 +5316,37 @@ ipaddr.js@1.9.1: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== -is-array-buffer@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" - integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== +is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz#65742e1e687bd2cc666253068fd8707fe4d44280" + integrity sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" + call-bind "^1.0.8" + call-bound "^1.0.3" + get-intrinsic "^1.2.6" is-arrayish@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== +is-async-function@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.1.1.tgz#3e69018c8e04e73b738793d020bfe884b9fd3523" + integrity sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ== dependencies: - has-bigints "^1.0.1" + async-function "^1.0.0" + call-bound "^1.0.3" + get-proto "^1.0.1" + has-tostringtag "^1.0.2" + safe-regex-test "^1.1.0" + +is-bigint@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.1.0.tgz#dda7a3445df57a42583db4228682eba7c4170672" + integrity sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ== + dependencies: + has-bigints "^1.0.2" is-binary-path@~2.1.0: version "2.1.0" @@ -5312,15 +5355,15 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== +is-boolean-object@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.2.2.tgz#7067f47709809a393c71ff5bb3e135d8a9215d9e" + integrity sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A== dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" + call-bound "^1.0.3" + has-tostringtag "^1.0.2" -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: +is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== @@ -5332,26 +5375,29 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" -is-core-module@^2.13.0, is-core-module@^2.13.1: - version "2.13.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" - integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== +is-core-module@^2.13.0, is-core-module@^2.15.1, is-core-module@^2.16.0: + version "2.16.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" + integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== dependencies: - hasown "^2.0.0" + hasown "^2.0.2" -is-data-view@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" - integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== +is-data-view@^1.0.1, is-data-view@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.2.tgz#bae0a41b9688986c2188dda6657e56b8f9e63b8e" + integrity sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw== dependencies: + call-bound "^1.0.2" + get-intrinsic "^1.2.6" is-typed-array "^1.1.13" -is-date-object@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== +is-date-object@^1.0.5, is-date-object@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.1.0.tgz#ad85541996fc7aa8b2729701d27b7319f95d82f7" + integrity sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg== dependencies: - has-tostringtag "^1.0.0" + call-bound "^1.0.2" + has-tostringtag "^1.0.2" is-extendable@^0.1.0: version "0.1.1" @@ -5363,11 +5409,28 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== +is-finalizationregistry@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz#eefdcdc6c94ddd0674d9c85887bf93f944a97c90" + integrity sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg== + dependencies: + call-bound "^1.0.3" + is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== +is-generator-function@^1.0.10: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.1.0.tgz#bf3eeda931201394f57b5dba2800f91a238309ca" + integrity sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ== + dependencies: + call-bound "^1.0.3" + get-proto "^1.0.0" + has-tostringtag "^1.0.2" + safe-regex-test "^1.1.0" + is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" @@ -5405,22 +5468,23 @@ is-lambda@^1.0.1: resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== -is-negative-zero@^2.0.3: +is-map@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" - integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" + integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== is-npm@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-5.0.0.tgz#43e8d65cc56e1b67f8d47262cf667099193f45a8" integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== +is-number-object@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.1.1.tgz#144b21e95a1bc148205dcc2814a9134ec41b2541" + integrity sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw== dependencies: - has-tostringtag "^1.0.0" + call-bound "^1.0.3" + has-tostringtag "^1.0.2" is-number@^7.0.0: version "7.0.0" @@ -5442,20 +5506,32 @@ is-plain-obj@^2.1.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== +is-promise@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3" + integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== + +is-regex@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.1.tgz#76d70a3ed10ef9be48eb577887d74205bf0cad22" + integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g== dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" + call-bound "^1.0.2" + gopd "^1.2.0" + has-tostringtag "^1.0.2" + hasown "^2.0.2" -is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" - integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== +is-set@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" + integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== + +is-shared-array-buffer@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz#9b67844bd9b7f246ba0708c3a93e34269c774f6f" + integrity sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A== dependencies: - call-bind "^1.0.7" + call-bound "^1.0.3" is-stream-ended@^0.1.4: version "0.1.4" @@ -5467,26 +5543,29 @@ is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== +is-string@^1.0.7, is-string@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.1.1.tgz#92ea3f3d5c5b6e039ca8677e5ac8d07ea773cbb9" + integrity sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA== dependencies: - has-tostringtag "^1.0.0" + call-bound "^1.0.3" + has-tostringtag "^1.0.2" -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== +is-symbol@^1.0.4, is-symbol@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.1.1.tgz#f47761279f532e2b05a7024a7506dbbedacd0634" + integrity sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w== dependencies: - has-symbols "^1.0.2" + call-bound "^1.0.2" + has-symbols "^1.1.0" + safe-regex-test "^1.1.0" -is-typed-array@^1.1.13: - version "1.1.13" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" - integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== +is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15: + version "1.1.15" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b" + integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== dependencies: - which-typed-array "^1.1.14" + which-typed-array "^1.1.16" is-typedarray@^1.0.0: version "1.0.0" @@ -5503,12 +5582,25 @@ is-url@^1.2.2, is-url@^1.2.4: resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== +is-weakmap@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" + integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== + +is-weakref@^1.0.2, is-weakref@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.1.1.tgz#eea430182be8d64174bd96bffbc46f21bf3f9293" + integrity sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew== + dependencies: + call-bound "^1.0.3" + +is-weakset@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.4.tgz#c9f5deb0bc1906c6d6f1027f284ddf459249daca" + integrity sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ== dependencies: - call-bind "^1.0.2" + call-bound "^1.0.3" + get-intrinsic "^1.2.6" is-windows@^1.0.2: version "1.0.2" @@ -5628,9 +5720,9 @@ istanbul-reports@^3.0.2: istanbul-lib-report "^3.0.0" jackspeak@^3.1.2: - version "3.4.0" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.0.tgz#a75763ff36ad778ede6a156d8ee8b124de445b4a" - integrity sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw== + version "3.4.3" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" + integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== dependencies: "@isaacs/cliui" "^8.0.2" optionalDependencies: @@ -5713,10 +5805,10 @@ join-path@^1.1.1: url-join "0.0.1" valid-url "^1" -jose@^4.14.6: - version "4.15.7" - resolved "https://registry.yarnpkg.com/jose/-/jose-4.15.7.tgz#96ad68d786632bd03c9068aa281810dbbe1b60d8" - integrity sha512-L7ioP+JAuZe8v+T5+zVI9Tx8LtU8BL7NxkyDFVMv+Qr3JW0jSoYDedLtodaXwfqMpeCyx4WXFNyu9tJt4WvC1A== +jose@^4.15.4: + version "4.15.9" + resolved "https://registry.yarnpkg.com/jose/-/jose-4.15.9.tgz#9b68eda29e9a0614c042fa29387196c7dd800100" + integrity sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA== js-tokens@^4.0.0: version "4.0.0" @@ -5772,9 +5864,9 @@ jsdoc@4.0.2: underscore "~1.13.2" jsdoc@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/jsdoc/-/jsdoc-4.0.3.tgz#bfee86c6a82f6823e12b5e8be698fd99ae46c061" - integrity sha512-Nu7Sf35kXJ1MWDZIMAuATRQTg1iIPdzh7tqJ6jjvaU/GfDf+qi5UV8zJR3Mo+/pYFvm8mzay4+6O5EWigaQBQw== + version "4.0.4" + resolved "https://registry.yarnpkg.com/jsdoc/-/jsdoc-4.0.4.tgz#86565a9e39cc723a3640465b3fb189a22d1206ca" + integrity sha512-zeFezwyXeG4syyYHbvh1A967IAqq/67yXtXvuL5wnqCkFZe8I0vKfm+EO+YEvLguo6w9CDUbrAXVtJSHh2E8rw== dependencies: "@babel/parser" "^7.20.15" "@jsdoc/salty" "^0.2.1" @@ -5792,10 +5884,10 @@ jsdoc@^4.0.0: strip-json-comments "^3.1.0" underscore "~1.13.2" -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== +jsesc@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" + integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== json-bigint@^1.0.0: version "1.0.0" @@ -5848,7 +5940,7 @@ json5@^1.0.2: dependencies: minimist "^1.2.0" -json5@^2.1.1, json5@^2.2.3: +json5@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== @@ -5870,9 +5962,9 @@ jsonfile@^6.0.1: graceful-fs "^4.1.6" jsonschema@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.1.tgz#cc4c3f0077fb4542982973d8a083b6b34f482dab" - integrity sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ== + version "1.5.0" + resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.5.0.tgz#f6aceb1ab9123563dd901d05f81f9d4883d3b7d8" + integrity sha512-K+A9hhqbn0f3pJX17Q/7H6yQfD/5OXgdrR5UE12gMXCiN9D5Xq2o5mddV2QEcX/bjla99ASsAAQUyMCCRWAEhw== jsonwebtoken@^8.5.1: version "8.5.1" @@ -5930,14 +6022,14 @@ jwa@^2.0.0: safe-buffer "^5.0.1" jwks-rsa@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/jwks-rsa/-/jwks-rsa-3.1.0.tgz#50406f23e38c9b2682cd437f824d7d61aa983171" - integrity sha512-v7nqlfezb9YfHHzYII3ef2a2j1XnGeSE/bK3WfumaYCqONAIstJbrEGapz4kadScZzEt7zYCN7bucj8C0Mv/Rg== + version "3.2.0" + resolved "https://registry.yarnpkg.com/jwks-rsa/-/jwks-rsa-3.2.0.tgz#132bc8bfa7b03928a273bbc93486f70226449e04" + integrity sha512-PwchfHcQK/5PSydeKCs1ylNym0w/SSv8a62DgHJ//7x2ZclCoinlsjAfDxAAbpoTPybOum/Jgy+vkvMmKz89Ww== dependencies: - "@types/express" "^4.17.17" - "@types/jsonwebtoken" "^9.0.2" + "@types/express" "^4.17.20" + "@types/jsonwebtoken" "^9.0.4" debug "^4.3.4" - jose "^4.14.6" + jose "^4.15.4" limiter "^1.1.5" lru-memoizer "^2.2.0" @@ -6005,16 +6097,16 @@ levn@~0.3.0: type-check "~0.3.2" libsodium-wrappers@^0.7.10: - version "0.7.13" - resolved "https://registry.yarnpkg.com/libsodium-wrappers/-/libsodium-wrappers-0.7.13.tgz#83299e06ee1466057ba0e64e532777d2929b90d3" - integrity sha512-kasvDsEi/r1fMzKouIDv7B8I6vNmknXwGiYodErGuESoFTohGSKZplFtVxZqHaoQ217AynyIFgnOVRitpHs0Qw== + version "0.7.15" + resolved "https://registry.yarnpkg.com/libsodium-wrappers/-/libsodium-wrappers-0.7.15.tgz#53f13e483820272a3d55b23be2e34402ac988055" + integrity sha512-E4anqJQwcfiC6+Yrl01C1m8p99wEhLmJSs0VQqST66SbQXXBoaJY0pF4BNjRYa/sOQAxx6lXAaAFIlx+15tXJQ== dependencies: - libsodium "^0.7.13" + libsodium "^0.7.15" -libsodium@^0.7.13: - version "0.7.13" - resolved "https://registry.yarnpkg.com/libsodium/-/libsodium-0.7.13.tgz#230712ec0b7447c57b39489c48a4af01985fb393" - integrity sha512-mK8ju0fnrKXXfleL53vtp9xiPq5hKM0zbDQtcxQIsSmxNgSxqCj6R7Hl9PkrNe2j29T4yoDaF7DJLK9/i5iWUw== +libsodium@^0.7.15: + version "0.7.15" + resolved "https://registry.yarnpkg.com/libsodium/-/libsodium-0.7.15.tgz#ac284e3dcb1c29ae9526c5581cdada6a072f6d20" + integrity sha512-sZwRknt/tUpE2AwzHq3jEyUU5uvIZHtSssktXq7owd++3CSgn8RGrv6UZJJBpP7+iBghBqe7Z06/2M31rI2NKw== limiter@^1.1.5: version "1.1.5" @@ -6151,7 +6243,7 @@ lodash.union@^4.6.0: resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" integrity sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw== -lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21: +lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -6175,10 +6267,10 @@ log4js@^6.9.1: rfdc "^1.3.0" streamroller "^3.1.5" -logform@^2.3.2, logform@^2.4.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/logform/-/logform-2.6.0.tgz#8c82a983f05d6eaeb2d75e3decae7a768b2bf9b5" - integrity sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ== +logform@^2.4.0, logform@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/logform/-/logform-2.7.0.tgz#cfca97528ef290f2e125a08396805002b2d060d1" + integrity sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ== dependencies: "@colors/colors" "1.6.0" "@types/triple-beam" "^1.3.2" @@ -6188,9 +6280,9 @@ logform@^2.3.2, logform@^2.4.0: triple-beam "^1.3.0" long@^5.0.0, long@^5.2.3: - version "5.2.3" - resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" - integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== + version "5.3.2" + resolved "https://registry.yarnpkg.com/long/-/long-5.3.2.tgz#1d84463095999262d7d7b7f8bfd4a8cc55167f83" + integrity sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA== loupe@^2.3.6: version "2.3.7" @@ -6207,9 +6299,9 @@ lru-cache@6.0.0, lru-cache@^6.0.0: yallist "^4.0.0" lru-cache@^10.0.1, lru-cache@^10.2.0: - version "10.2.2" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.2.tgz#48206bc114c1252940c41b25b41af5b545aca878" - integrity sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ== + version "10.4.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== lru-cache@^4.0.1: version "4.1.5" @@ -6321,6 +6413,11 @@ marked@^4.0.10, marked@^4.0.14: resolved "https://registry.yarnpkg.com/marked/-/marked-4.3.0.tgz#796362821b019f734054582038b116481b456cf3" integrity sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A== +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + mdurl@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" @@ -6341,6 +6438,11 @@ merge-descriptors@1.0.1: resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== +merge-descriptors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" + integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== + merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" @@ -6351,19 +6453,24 @@ methods@^1.1.2, methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== -micromatch@^4.0.4: - version "4.0.7" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.7.tgz#33e8190d9fe474a9895525f5618eee136d46c2e5" - integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== +micromatch@^4.0.4, micromatch@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: braces "^3.0.3" picomatch "^2.3.1" -mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": +mime-db@1.52.0: version "1.52.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== +"mime-db@>= 1.43.0 < 2": + version "1.54.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.54.0.tgz#cddb3ee4f9c64530dff640236661d42cb6a314f5" + integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== + mime-types@^2.1.12, mime-types@^2.1.35, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" @@ -6435,9 +6542,9 @@ minimatch@^6.1.6: brace-expansion "^2.0.1" minimatch@^9.0.4: - version "9.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" - integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== dependencies: brace-expansion "^2.0.1" @@ -6515,7 +6622,7 @@ mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== -mkdirp@^0.5.4, mkdirp@^0.5.6: +mkdirp@^0.5.4: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== @@ -6554,9 +6661,9 @@ mocha@10.3.0: yargs-unparser "2.0.0" module-details-from-path@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/module-details-from-path/-/module-details-from-path-1.0.3.tgz#114c949673e2a8a35e9d35788527aa37b679da2b" - integrity sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A== + version "1.0.4" + resolved "https://registry.yarnpkg.com/module-details-from-path/-/module-details-from-path-1.0.4.tgz#b662fdcd93f6c83d3f25289da0ce81c8d9685b94" + integrity sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w== morgan@1.10.0, morgan@^1.10.0, morgan@^1.8.2: version "1.10.0" @@ -6579,7 +6686,7 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@2.1.3, ms@^2.1.1: +ms@2.1.3, ms@^2.1.1, ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -6602,26 +6709,31 @@ mute-stream@0.0.8: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== -nan@^2.17.0, nan@^2.18.0, nan@^2.20.0: - version "2.20.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.20.0.tgz#08c5ea813dd54ed16e5bd6505bf42af4f7838ca3" - integrity sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw== +nan@^2.17.0, nan@^2.19.0, nan@^2.20.0: + version "2.22.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.22.2.tgz#6b504fd029fb8f38c0990e52ad5c26772fdacfbb" + integrity sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ== -napi-build-utils@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" - integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== +napi-build-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-2.0.0.tgz#13c22c0187fcfccce1461844136372a47ddc027e" + integrity sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA== natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -negotiator@0.6.3, negotiator@^0.6.3: +negotiator@0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== +negotiator@^0.6.3, negotiator@~0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.4.tgz#777948e2452651c570b712dd01c23e262713fff7" + integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== + netmask@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/netmask/-/netmask-2.0.2.tgz#8b01a07644065d536383835823bc52004ebac5e7" @@ -6657,15 +6769,15 @@ nice-try@^1.0.4: integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== nise@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/nise/-/nise-6.0.0.tgz#ae56fccb5d912037363c3b3f29ebbfa28bde8b48" - integrity sha512-K8ePqo9BFvN31HXwEtTNGzgrPpmvgciDsFz8aztFjt4LqKO/JeFD8tBOeuDiCMXrIl/m1YvfH8auSpxfaD09wg== + version "6.1.1" + resolved "https://registry.yarnpkg.com/nise/-/nise-6.1.1.tgz#78ea93cc49be122e44cb7c8fdf597b0e8778b64a" + integrity sha512-aMSAzLVY7LyeM60gvBS423nBmIPP+Wy7St7hsb+8/fc1HmeoHJfLO8CKse4u3BtOZvQLJghYPI2i/1WZrEj5/g== dependencies: - "@sinonjs/commons" "^3.0.0" - "@sinonjs/fake-timers" "^11.2.2" - "@sinonjs/text-encoding" "^0.7.2" + "@sinonjs/commons" "^3.0.1" + "@sinonjs/fake-timers" "^13.0.1" + "@sinonjs/text-encoding" "^0.7.3" just-extend "^6.2.0" - path-to-regexp "^6.2.1" + path-to-regexp "^8.1.0" nock@13.2.9: version "13.2.9" @@ -6678,9 +6790,9 @@ nock@13.2.9: propagate "^2.0.0" node-abi@^3.3.0: - version "3.65.0" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.65.0.tgz#ca92d559388e1e9cab1680a18c1a18757cdac9d3" - integrity sha512-ThjYBfoDNr08AWx6hGaRbfPwxKV9kVzAzOzlLKbk2CuqXE2xnCh+cbAGnwM3t8Lq4v9rUB7VfondlkBckcJrVA== + version "3.75.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.75.0.tgz#2f929a91a90a0d02b325c43731314802357ed764" + integrity sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg== dependencies: semver "^7.3.5" @@ -6696,7 +6808,7 @@ node-emoji@^1.11.0: dependencies: lodash "^4.17.21" -node-fetch@^2.6.1, node-fetch@^2.6.7, node-fetch@^2.6.9: +node-fetch@^2.6.1, node-fetch@^2.6.7, node-fetch@^2.6.9, node-fetch@^2.7.0: version "2.7.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== @@ -6708,15 +6820,15 @@ node-forge@^1.3.1: resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== -node-gyp-build@^4.6.0, node-gyp-build@^4.8.0: - version "4.8.1" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.1.tgz#976d3ad905e71b76086f4f0b0d3637fe79b6cda5" - integrity sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw== +node-gyp-build@^4.6.0, node-gyp-build@^4.8.1: + version "4.8.4" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.4.tgz#8a70ee85464ae52327772a90d66c6077a900cfc8" + integrity sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ== -node-gyp@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-10.1.0.tgz#75e6f223f2acb4026866c26a2ead6aab75a8ca7e" - integrity sha512-B4J5M1cABxPc5PwfjhbV5hoy2DP9p8lFXASnEN6hugXOa61416tnTZ29x9sSwAd0o99XNIcpvDDy1swAExsVKA== +node-gyp@^10.1.0, node-gyp@^10.2.0: + version "10.3.1" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-10.3.1.tgz#1dd1a1a1c6c5c59da1a76aea06a062786b2c8a1a" + integrity sha512-Pp3nFHBThHzVtNY7U6JfPjvT/DTE8+o/4xKsLQtBoU+j2HLsGlhcfzflAoUreaJbNmYnX+LlLi0qjV8kpyO6xQ== dependencies: env-paths "^2.2.0" exponential-backoff "^3.1.1" @@ -6724,9 +6836,9 @@ node-gyp@^10.1.0: graceful-fs "^4.2.6" make-fetch-happen "^13.0.0" nopt "^7.0.0" - proc-log "^3.0.0" + proc-log "^4.1.0" semver "^7.3.5" - tar "^6.1.2" + tar "^6.2.1" which "^4.0.0" node-preload@^0.2.1: @@ -6736,22 +6848,22 @@ node-preload@^0.2.1: dependencies: process-on-spawn "^1.0.0" -node-releases@^2.0.14: - version "2.0.14" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" - integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== +node-releases@^2.0.19: + version "2.0.19" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" + integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== nodemailer-mock@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/nodemailer-mock/-/nodemailer-mock-2.0.6.tgz#0dd3e522df73682d47f4f2b1ee905aacd22e2c8e" - integrity sha512-9x/QN1AbKy4PJ7yIQnToly3c7gUCSGABeB10/c5jgO986fAOMghzVedbZe8UDsu2PEStCoOd+MayX09CduYSHQ== + version "2.0.8" + resolved "https://registry.yarnpkg.com/nodemailer-mock/-/nodemailer-mock-2.0.8.tgz#f260ed037c53263cbf15c5cc929e3e7a46e27377" + integrity sha512-4NbxjUlBOC1BEl9i7y1gN/taNR9aKOvRnZsrv3ChQr+OLBRteY+8xf3KkEwVH6XTQflkUAMEM1uWRvSCZe6+3A== dependencies: - debug "^4.3.4" + debug "^4.4.0" nodemailer@^6.9.15: - version "6.9.15" - resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.9.15.tgz#57b79dc522be27e0e47ac16cc860aa0673e62e04" - integrity sha512-AHf04ySLC6CIfuRtRiEYtGEXgRfa6INgWGluDhnxTZhHSKvrBu7lc1VVchQ0d8nPc4cFaZoPq8vkyNoZr0TpGQ== + version "6.10.1" + resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.10.1.tgz#cbc434c54238f83a51c07eabd04e2b3e832da623" + integrity sha512-Z+iLaBGVaSjbIzQ4pX6XV41HrooLsQ10ZWPUehGmuantvzWoDVBnmsdUcOIDM1t+yPor5pDhVlDESgOMEGxhHA== nodemon@3.1.3: version "3.1.3" @@ -6822,9 +6934,9 @@ nyc@15.1.0: yargs "^15.0.2" oauth@0.10.x: - version "0.10.0" - resolved "https://registry.yarnpkg.com/oauth/-/oauth-0.10.0.tgz#3551c4c9b95c53ea437e1e21e46b649482339c58" - integrity sha512-1orQ9MT1vHFGQxhuy7E/0gECD3fd2fCC+PIX+/jgmU/gI3EpRocXtmtvxCO5x3WZ443FLTLFWNDjl5MPJf9u+Q== + version "0.10.2" + resolved "https://registry.yarnpkg.com/oauth/-/oauth-0.10.2.tgz#fd7139b0ce1a1037bd11fa4e236afc588132418c" + integrity sha512-JtFnB+8nxDEXgNyniwz573xxbKSOu3R8D40xQKqcjwJ2CDkYqUDI53o6IuzDJBx60Z8VKCm271+t8iFjakrl8Q== object-assign@^4, object-assign@^4.1.1: version "4.1.1" @@ -6836,27 +6948,29 @@ object-hash@^3.0.0: resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== -object-inspect@^1.13.1: - version "1.13.1" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" - integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== +object-inspect@^1.13.3: + version "1.13.4" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" + integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.1.5: - version "4.1.5" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" - integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== +object.assign@^4.1.7: + version "4.1.7" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.7.tgz#8c14ca1a424c6a561b0bb2a22f66f5049a945d3d" + integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== dependencies: - call-bind "^1.0.5" + call-bind "^1.0.8" + call-bound "^1.0.3" define-properties "^1.2.1" - has-symbols "^1.0.3" + es-object-atoms "^1.0.0" + has-symbols "^1.1.0" object-keys "^1.1.1" -object.fromentries@^2.0.7: +object.fromentries@^2.0.8: version "2.0.8" resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== @@ -6866,7 +6980,7 @@ object.fromentries@^2.0.7: es-abstract "^1.23.2" es-object-atoms "^1.0.0" -object.groupby@^1.0.1: +object.groupby@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== @@ -6875,12 +6989,13 @@ object.groupby@^1.0.1: define-properties "^1.2.1" es-abstract "^1.23.2" -object.values@^1.1.7: - version "1.2.0" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" - integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== +object.values@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.1.tgz#deed520a50809ff7f75a7cfd4bc64c7a038c6216" + integrity sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA== dependencies: - call-bind "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.3" define-properties "^1.2.1" es-object-atoms "^1.0.0" @@ -6987,6 +7102,15 @@ os-tmpdir@~1.0.2: resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== +own-keys@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/own-keys/-/own-keys-1.0.1.tgz#e4006910a2bf913585289676eebd6f390cf51358" + integrity sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg== + dependencies: + get-intrinsic "^1.2.6" + object-keys "^1.1.1" + safe-push-apply "^1.0.0" + p-defer@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-3.0.0.tgz#d1dceb4ee9b2b604b1d94ffec83760175d4e6f83" @@ -7039,21 +7163,21 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -pac-proxy-agent@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz#6b9ddc002ec3ff0ba5fdf4a8a21d363bcc612d75" - integrity sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A== +pac-proxy-agent@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz#9cfaf33ff25da36f6147a20844230ec92c06e5df" + integrity sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA== dependencies: "@tootallnate/quickjs-emscripten" "^0.23.0" - agent-base "^7.0.2" + agent-base "^7.1.2" debug "^4.3.4" get-uri "^6.0.1" http-proxy-agent "^7.0.0" - https-proxy-agent "^7.0.2" - pac-resolver "^7.0.0" - socks-proxy-agent "^8.0.2" + https-proxy-agent "^7.0.6" + pac-resolver "^7.0.1" + socks-proxy-agent "^8.0.5" -pac-resolver@^7.0.0: +pac-resolver@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-7.0.1.tgz#54675558ea368b64d210fd9c92a640b5f3b8abb6" integrity sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg== @@ -7072,9 +7196,9 @@ package-hash@^4.0.0: release-zalgo "^1.0.0" package-json-from-dist@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00" - integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw== + version "1.0.1" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" + integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== parent-module@^1.0.0: version "1.0.1" @@ -7088,7 +7212,7 @@ parse-cache-control@^1.0.1: resolved "https://registry.yarnpkg.com/parse-cache-control/-/parse-cache-control-1.0.1.tgz#8eeab3e54fa56920fe16ba38f77fa21aacc2d74e" integrity sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg== -parseurl@~1.3.3: +parseurl@^1.3.3, parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== @@ -7165,22 +7289,27 @@ path-scurry@^1.11.1: lru-cache "^10.2.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" +path-to-regexp@0.1.12: + version "0.1.12" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7" + integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ== + path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== -path-to-regexp@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" - integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== +path-to-regexp@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.9.0.tgz#5dc0753acbf8521ca2e0f137b4578b917b10cf24" + integrity sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g== dependencies: isarray "0.0.1" -path-to-regexp@^6.2.1: - version "6.2.2" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.2.2.tgz#324377a83e5049cbecadc5554d6a63a9a4866b36" - integrity sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw== +path-to-regexp@^8.0.0, path-to-regexp@^8.1.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-8.2.0.tgz#73990cc29e57a3ff2a0d914095156df5db79e8b4" + integrity sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ== path-type@^4.0.0: version "4.0.0" @@ -7197,10 +7326,10 @@ pause@0.0.1: resolved "https://registry.yarnpkg.com/pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d" integrity sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg== -picocolors@^1.0.0, picocolors@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" - integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== +picocolors@^1.0.0, picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" @@ -7215,18 +7344,17 @@ pkg-dir@^4.1.0: find-up "^4.0.0" portfinder@^1.0.32: - version "1.0.32" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.32.tgz#2fe1b9e58389712429dc2bea5beb2146146c7f81" - integrity sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg== + version "1.0.37" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.37.tgz#92b754ef89a11801c8efe4b0e5cd845b0064c212" + integrity sha512-yuGIEjDAYnnOex9ddMnKZEMFE0CcGo6zbfzDklkmT1m5z734ss6JMzN9rNB3+RR7iS+F10D4/BVIaXOyh8PQKw== dependencies: - async "^2.6.4" - debug "^3.2.7" - mkdirp "^0.5.6" + async "^3.2.6" + debug "^4.3.6" possible-typed-array-names@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" - integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + version "1.1.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz#93e3582bc0e5426586d9d07b79ee40fc841de4ae" + integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== pre-commit@1.2.2: version "1.2.2" @@ -7238,16 +7366,16 @@ pre-commit@1.2.2: which "1.2.x" prebuild-install@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.2.tgz#a5fd9986f5a6251fbc47e1e5c65de71e68c0a056" - integrity sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ== + version "7.1.3" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.3.tgz#d630abad2b147443f20a212917beae68b8092eec" + integrity sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug== dependencies: detect-libc "^2.0.0" expand-template "^2.0.3" github-from-package "0.0.0" minimist "^1.2.3" mkdirp-classic "^0.5.3" - napi-build-utils "^1.0.1" + napi-build-utils "^2.0.0" node-abi "^3.3.0" pump "^3.0.0" rc "^1.2.7" @@ -7255,7 +7383,7 @@ prebuild-install@^7.1.2: tar-fs "^2.0.0" tunnel-agent "^0.6.0" -prebuildify@^6.0.0: +prebuildify@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/prebuildify/-/prebuildify-6.0.1.tgz#655746f91fc95b68610615898678536dd303cd03" integrity sha512-8Y2oOOateom/s8dNBsGIcnm6AxPmLH4/nanQzL5lQMU+sC0CMhzARZHizwr36pUPLdvBnOkCNQzxg4djuFSgIw== @@ -7303,12 +7431,7 @@ pretty-format@^29.0.0, pretty-format@^29.7.0: ansi-styles "^5.0.0" react-is "^18.0.0" -proc-log@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-3.0.0.tgz#fb05ef83ccd64fd7b20bbe9c8c1070fc08338dd8" - integrity sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A== - -proc-log@^4.2.0: +proc-log@^4.1.0, proc-log@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-4.2.0.tgz#b6f461e4026e75fdfe228b265e9f7a00779d7034" integrity sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA== @@ -7319,9 +7442,9 @@ process-nextick-args@~2.0.0: integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== process-on-spawn@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/process-on-spawn/-/process-on-spawn-1.0.0.tgz#95b05a23073d30a17acfdc92a440efd2baefdc93" - integrity sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg== + version "1.1.0" + resolved "https://registry.yarnpkg.com/process-on-spawn/-/process-on-spawn-1.1.0.tgz#9d5999ba87b3bf0a8acb05322d69f2f5aa4fb763" + integrity sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q== dependencies: fromentries "^1.2.0" @@ -7367,7 +7490,7 @@ proto3-json-serializer@^1.0.0: dependencies: protobufjs "^7.0.0" -proto3-json-serializer@^2.0.0: +proto3-json-serializer@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/proto3-json-serializer/-/proto3-json-serializer-2.0.2.tgz#5b705203b4d58f3880596c95fad64902617529dd" integrity sha512-SAzp/O4Yh02jGdRc+uIrGoe87dkN/XtwxfZ4ZyafJHymd79ozp5VG5nyZ7ygqPM5+cpLDjjGnYFUkngonyDPOQ== @@ -7408,28 +7531,10 @@ protobufjs@7.2.4: "@types/node" ">=13.7.0" long "^5.0.0" -protobufjs@7.3.0: - version "7.3.0" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.3.0.tgz#a32ec0422c039798c41a0700306a6e305b9cb32c" - integrity sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g== - 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" - -protobufjs@^7.0.0, protobufjs@^7.2.5, protobufjs@^7.2.6: - version "7.3.2" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.3.2.tgz#60f3b7624968868f6f739430cfbc8c9370e26df4" - integrity sha512-RXyHaACeqXeqAKGLDl68rQKbmObRsTIn4TYVUUug1KfS47YWCo5MacGITEryugIgZqORCvJWEk4l449POg5Txg== +protobufjs@^7.0.0, protobufjs@^7.2.5, protobufjs@^7.2.6, protobufjs@^7.3.2: + version "7.5.0" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.5.0.tgz#a317ad80713e9db43c8e55afa8636a9aa76bb630" + integrity sha512-Z2E/kOY1QjoMlCytmexzYfDm/w5fKAiRwpSzGtdnXW1zC88Z2yXazHHrOtwCzn+7wSxyE8PYM4rvVcMphF9sOA== dependencies: "@protobufjs/aspromise" "^1.1.2" "@protobufjs/base64" "^1.1.2" @@ -7453,18 +7558,18 @@ proxy-addr@~2.0.7: ipaddr.js "1.9.1" proxy-agent@^6.3.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-6.4.0.tgz#b4e2dd51dee2b377748aef8d45604c2d7608652d" - integrity sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ== + version "6.5.0" + resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-6.5.0.tgz#9e49acba8e4ee234aacb539f89ed9c23d02f232d" + integrity sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A== dependencies: - agent-base "^7.0.2" + agent-base "^7.1.2" debug "^4.3.4" http-proxy-agent "^7.0.1" - https-proxy-agent "^7.0.3" + https-proxy-agent "^7.0.6" lru-cache "^7.14.1" - pac-proxy-agent "^7.0.1" + pac-proxy-agent "^7.1.0" proxy-from-env "^1.1.0" - socks-proxy-agent "^8.0.2" + socks-proxy-agent "^8.0.5" proxy-from-env@^1.1.0: version "1.1.0" @@ -7482,9 +7587,9 @@ pstree.remy@^1.1.8: integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + version "3.0.2" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8" + integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw== dependencies: end-of-stream "^1.1.0" once "^1.3.1" @@ -7494,11 +7599,6 @@ punycode.js@^2.3.1: resolved "https://registry.yarnpkg.com/punycode.js/-/punycode.js-2.3.1.tgz#6b53e56ad75588234e79f4affa90972c7dd8cdb7" integrity sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA== -punycode@^1.3.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== - punycode@^2.1.0: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" @@ -7523,13 +7623,20 @@ qs@6.11.0: dependencies: side-channel "^1.0.4" -qs@^6.11.0, qs@^6.11.2, qs@^6.4.0, qs@^6.6.0: - version "6.12.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.12.1.tgz#39422111ca7cbdb70425541cba20c7d7b216599a" - integrity sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ== +qs@6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" + integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== dependencies: side-channel "^1.0.6" +qs@^6.11.0, qs@^6.11.2, qs@^6.4.0, qs@^6.6.0: + version "6.14.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.14.0.tgz#c63fa40680d2c5c941412a0e899c89af60c0a930" + integrity sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w== + dependencies: + side-channel "^1.1.0" + queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -7585,13 +7692,13 @@ rc@^1.2.7, rc@^1.2.8: strip-json-comments "~2.0.1" re2@^1.17.7: - version "1.21.3" - resolved "https://registry.yarnpkg.com/re2/-/re2-1.21.3.tgz#4bced725a837cbe73d7d42b702a0d46671e6d00a" - integrity sha512-GI+KoGkHT4kxTaX+9p0FgNB1XUnCndO9slG5qqeEoZ7kbf6Dk6ohQVpmwKVeSp7LPLn+g6Q3BaCopz4oHuBDuQ== + version "1.21.4" + resolved "https://registry.yarnpkg.com/re2/-/re2-1.21.4.tgz#d688edcc40da3cf542ee3a480a8b60e5900dd24d" + integrity sha512-MVIfXWJmsP28mRsSt8HeL750ifb8H5+oF2UDIxGaiJCr8fkMqhLZ7kcX9ADRk2dC8qeGKedB7UVYRfBVpEiLfA== dependencies: install-artifact-from-github "^1.3.5" nan "^2.20.0" - node-gyp "^10.1.0" + node-gyp "^10.2.0" react-is@^18.0.0: version "18.3.1" @@ -7611,7 +7718,7 @@ readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.2.2: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0, readable-stream@^3.6.1: +readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0, readable-stream@^3.6.1, readable-stream@^3.6.2: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== @@ -7641,20 +7748,36 @@ redeyed@~2.1.0: dependencies: esprima "~4.0.0" +reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz#c629219e78a3316d8b604c765ef68996964e7bf9" + integrity sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.9" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.7" + get-proto "^1.0.1" + which-builtin-type "^1.2.1" + regexp-tree@~0.1.1: version "0.1.27" resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.27.tgz#2198f0ef54518ffa743fe74d983b56ffd631b6cd" integrity sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA== -regexp.prototype.flags@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" - integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== +regexp.prototype.flags@^1.5.3: + version "1.5.4" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz#1ad6c62d44a259007e55b3970e00f746efbcaa19" + integrity sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA== dependencies: - call-bind "^1.0.6" + call-bind "^1.0.8" define-properties "^1.2.1" es-errors "^1.3.0" - set-function-name "^2.0.1" + get-proto "^1.0.1" + gopd "^1.2.0" + set-function-name "^2.0.2" regexpp@^3.0.0: version "3.2.0" @@ -7662,9 +7785,9 @@ regexpp@^3.0.0: integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== registry-auth-token@^5.0.1: - version "5.0.2" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-5.0.2.tgz#8b026cc507c8552ebbe06724136267e63302f756" - integrity sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ== + version "5.1.0" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-5.1.0.tgz#3c659047ecd4caebd25bc1570a3aa979ae490eca" + integrity sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw== dependencies: "@pnpm/npm-conf" "^2.1.0" @@ -7720,11 +7843,11 @@ resolve-from@^5.0.0: integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== resolve@^1.0.0, resolve@^1.10.1, resolve@^1.22.1, resolve@^1.22.4: - version "1.22.8" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" - integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + version "1.22.10" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" + integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== dependencies: - is-core-module "^2.13.0" + is-core-module "^2.16.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" @@ -7764,9 +7887,9 @@ retry@^0.12.0: integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + version "1.1.0" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f" + integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== rfdc@^1.3.0: version "1.4.1" @@ -7792,18 +7915,16 @@ ringbufferjs@^2.0.0: resolved "https://registry.yarnpkg.com/ringbufferjs/-/ringbufferjs-2.0.0.tgz#09f40e2675a99cfef430b7ec5815ac1bc2e24120" integrity sha512-GCOqTzUsTHF7nrqcgtNGAFotXztLgiePpIDpyWZ7R5I02tmfJWV+/yuJc//Hlsd8G+WzI1t/dc2y/w2imDZdog== -router@^1.3.1: - version "1.3.8" - resolved "https://registry.yarnpkg.com/router/-/router-1.3.8.tgz#1509614ae1fbc67139a728481c54b057ecfb04bf" - integrity sha512-461UFH44NtSfIlS83PUg2N7OZo86BC/kB3dY77gJdsODsBhhw7+2uE0tzTINxrY9CahCUVk1VhpWCA5i1yoIEg== +router@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/router/-/router-2.2.0.tgz#019be620b711c87641167cc79b99090f00b146ef" + integrity sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ== dependencies: - array-flatten "3.0.0" - debug "2.6.9" - methods "~1.1.2" - parseurl "~1.3.3" - path-to-regexp "0.1.7" - setprototypeof "1.2.0" - utils-merge "1.0.1" + debug "^4.4.0" + depd "^2.0.0" + is-promise "^4.0.0" + parseurl "^1.3.3" + path-to-regexp "^8.0.0" run-async@^2.4.0, run-async@^2.4.1: version "2.4.1" @@ -7818,20 +7939,21 @@ run-parallel@^1.1.9: queue-microtask "^1.2.2" rxjs@^7.5.4, rxjs@^7.5.5: - version "7.8.1" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" - integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== + version "7.8.2" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.2.tgz#955bc473ed8af11a002a2be52071bf475638607b" + integrity sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA== dependencies: tslib "^2.1.0" -safe-array-concat@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" - integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== +safe-array-concat@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.3.tgz#c9e54ec4f603b0bbb8e7e5007a5ee7aecd1538c3" + integrity sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q== dependencies: - call-bind "^1.0.7" - get-intrinsic "^1.2.4" - has-symbols "^1.0.3" + call-bind "^1.0.8" + call-bound "^1.0.2" + get-intrinsic "^1.2.6" + has-symbols "^1.1.0" isarray "^2.0.5" safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: @@ -7839,19 +7961,27 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0: +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -safe-regex-test@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" - integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== +safe-push-apply@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-push-apply/-/safe-push-apply-1.0.0.tgz#01850e981c1602d398c85081f360e4e6d03d27f5" + integrity sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA== + dependencies: + es-errors "^1.3.0" + isarray "^2.0.5" + +safe-regex-test@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz#7f87dfb67a3150782eaaf18583ff5d1711ac10c1" + integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw== dependencies: - call-bind "^1.0.6" + call-bound "^1.0.2" es-errors "^1.3.0" - is-regex "^1.1.4" + is-regex "^1.2.1" safe-regex@^2.1.1: version "2.1.1" @@ -7861,9 +7991,9 @@ safe-regex@^2.1.1: regexp-tree "~0.1.1" safe-stable-stringify@^2.3.1: - version "2.4.3" - resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" - integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== + version "2.5.0" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz#4ca2f8e385f2831c432a719b108a3bf7af42a1dd" + integrity sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA== "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" @@ -7888,9 +8018,9 @@ semver@^6.0.0, semver@^6.1.0, semver@^6.3.0, semver@^6.3.1: integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== semver@^7.0.0, semver@^7.1.2, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0: - version "7.6.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" - integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== + version "7.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f" + integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== send@0.18.0: version "0.18.0" @@ -7911,6 +8041,25 @@ send@0.18.0: range-parser "~1.2.1" statuses "2.0.1" +send@0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" + integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== + 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" + serialize-javascript@6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" @@ -7928,12 +8077,22 @@ serve-static@1.15.0: parseurl "~1.3.3" send "0.18.0" +serve-static@1.16.2: + version "1.16.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296" + integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== + dependencies: + encodeurl "~2.0.0" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.19.0" + set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== -set-function-length@^1.2.1: +set-function-length@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== @@ -7945,7 +8104,7 @@ set-function-length@^1.2.1: gopd "^1.0.1" has-property-descriptors "^1.0.2" -set-function-name@^2.0.1: +set-function-name@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== @@ -7955,6 +8114,15 @@ set-function-name@^2.0.1: functions-have-names "^1.2.3" has-property-descriptors "^1.0.2" +set-proto@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/set-proto/-/set-proto-1.0.0.tgz#0760dbcff30b2d7e801fd6e19983e56da337565e" + integrity sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw== + dependencies: + dunder-proto "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + setprototypeof@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" @@ -7984,15 +8152,45 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -side-channel@^1.0.4, side-channel@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" - integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== +side-channel-list@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" + integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== dependencies: - call-bind "^1.0.7" es-errors "^1.3.0" - get-intrinsic "^1.2.4" - object-inspect "^1.13.1" + object-inspect "^1.13.3" + +side-channel-map@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" + integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + +side-channel-weakmap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" + integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + side-channel-map "^1.0.1" + +side-channel@^1.0.4, side-channel@^1.0.6, side-channel@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" + integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + side-channel-list "^1.0.0" + side-channel-map "^1.0.1" + side-channel-weakmap "^1.0.2" signal-exit@^3.0.2: version "3.0.7" @@ -8054,19 +8252,19 @@ smart-buffer@^4.2.0: resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== -socks-proxy-agent@^8.0.2, socks-proxy-agent@^8.0.3: - version "8.0.3" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.3.tgz#6b2da3d77364fde6292e810b496cb70440b9b89d" - integrity sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A== +socks-proxy-agent@^8.0.3, socks-proxy-agent@^8.0.5: + version "8.0.5" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz#b9cdb4e7e998509d7659d689ce7697ac21645bee" + integrity sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw== dependencies: - agent-base "^7.1.1" + agent-base "^7.1.2" debug "^4.3.4" - socks "^2.7.1" + socks "^2.8.3" -socks@^2.7.1: - version "2.8.3" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.3.tgz#1ebd0f09c52ba95a09750afe3f3f9f724a800cb5" - integrity sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw== +socks@^2.8.3: + version "2.8.4" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.4.tgz#07109755cdd4da03269bda4725baa061ab56d5cc" + integrity sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ== dependencies: ip-address "^9.0.5" smart-buffer "^4.2.0" @@ -8163,9 +8361,9 @@ stream-events@^1.0.5: stubs "^3.0.0" stream-json@^1.7.3: - version "1.8.0" - resolved "https://registry.yarnpkg.com/stream-json/-/stream-json-1.8.0.tgz#53f486b2e3b4496c506131f8d7260ba42def151c" - integrity sha512-HZfXngYHUAr1exT4fxlbc1IOce1RYxp2ldeaf97LYCOPSoOqY/1Psp7iGvpb+6JIOgkra9zDYnPX01hGAHzEPw== + version "1.9.1" + resolved "https://registry.yarnpkg.com/stream-json/-/stream-json-1.9.1.tgz#e3fec03e984a503718946c170db7d74556c2a187" + integrity sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw== dependencies: stream-chain "^2.2.5" @@ -8188,16 +8386,7 @@ streamsearch@^1.1.0: resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - 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" - -string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -8220,22 +8409,26 @@ string.fromcodepoint@^0.2.1: resolved "https://registry.yarnpkg.com/string.fromcodepoint/-/string.fromcodepoint-0.2.1.tgz#8d978333c0bc92538f50f383e4888f3e5619d653" integrity sha512-n69H31OnxSGSZyZbgBlvYIXlrMhJQ0dQAX1js1QDhpaUH6zmU3QYlj07bCwCNlPOu3oRXIubGPl2gDGnHsiCqg== -string.prototype.trim@^1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" - integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== +string.prototype.trim@^1.2.10: + version "1.2.10" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz#40b2dd5ee94c959b4dcfb1d65ce72e90da480c81" + integrity sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA== dependencies: - call-bind "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.2" + define-data-property "^1.1.4" define-properties "^1.2.1" - es-abstract "^1.23.0" + es-abstract "^1.23.5" es-object-atoms "^1.0.0" + has-property-descriptors "^1.0.2" -string.prototype.trimend@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" - integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== +string.prototype.trimend@^1.0.8, string.prototype.trimend@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz#62e2731272cd285041b36596054e9f66569b6942" + integrity sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ== dependencies: - call-bind "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.2" define-properties "^1.2.1" es-object-atoms "^1.0.0" @@ -8262,14 +8455,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -8303,10 +8489,10 @@ strip-json-comments@^2.0.0, strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== -strnum@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db" - integrity sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA== +strnum@^1.0.5, strnum@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.1.2.tgz#57bca4fbaa6f271081715dbc9ed7cee5493e28e4" + integrity sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA== stubs@^3.0.0: version "3.0.0" @@ -8330,16 +8516,15 @@ superagent@^8.0.9: semver "^7.3.8" superstatic@^9.0.3: - version "9.0.3" - resolved "https://registry.yarnpkg.com/superstatic/-/superstatic-9.0.3.tgz#eb271841e971d9c3760f6d4b3adca5db00f29f18" - integrity sha512-e/tmW0bsnQ/33ivK6y3CapJT0Ovy4pk/ohNPGhIAGU2oasoNLRQ1cv6enua09NU9w6Y0H/fBu07cjzuiWvLXxw== + version "9.2.0" + resolved "https://registry.yarnpkg.com/superstatic/-/superstatic-9.2.0.tgz#c3d338e87fb1b695670c79db5affb18288441c32" + integrity sha512-QrJAJIpAij0jJT1nEwYTB0SzDi4k0wYygu6GxK0ko8twiQgfgaOAZ7Hu99p02MTAsGho753zhzSvsw8We4PBEQ== dependencies: - basic-auth-connect "^1.0.0" + basic-auth-connect "^1.1.0" commander "^10.0.0" compression "^1.7.0" connect "^3.7.0" destroy "^1.0.4" - fast-url-parser "^1.1.3" glob-slasher "^1.0.1" is-url "^1.2.2" join-path "^1.1.1" @@ -8349,8 +8534,8 @@ superstatic@^9.0.3: morgan "^1.8.2" on-finished "^2.2.0" on-headers "^1.0.0" - path-to-regexp "^1.8.0" - router "^1.3.1" + path-to-regexp "^1.9.0" + router "^2.0.0" update-notifier-cjs "^5.1.6" optionalDependencies: re2 "^1.17.7" @@ -8362,7 +8547,7 @@ supports-color@8.1.1: dependencies: has-flag "^4.0.0" -supports-color@^5.3.0, supports-color@^5.5.0: +supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== @@ -8406,9 +8591,9 @@ sync-rpc@^1.2.1: get-port "^3.1.0" tar-fs@^2.0.0, tar-fs@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" - integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== + version "2.1.2" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.2.tgz#425f154f3404cb16cb8ff6e671d45ab2ed9596c5" + integrity sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA== dependencies: chownr "^1.1.1" mkdirp-classic "^0.5.2" @@ -8426,7 +8611,7 @@ tar-stream@^2.1.4, tar-stream@^2.2.0: inherits "^2.0.3" readable-stream "^3.1.1" -tar@^6.1.11, tar@^6.1.2: +tar@^6.1.11, tar@^6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== @@ -8510,11 +8695,6 @@ tmp@^0.2.1: resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae" integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w== -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -8555,9 +8735,9 @@ triple-beam@^1.3.0: integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg== ts-api-utils@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" - integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== + version "1.4.3" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.4.3.tgz#bfc2215fe6528fecab2b0fba570a2e8a4263b064" + integrity sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw== ts-node-dev@2.0.0: version "2.0.0" @@ -8614,15 +8794,15 @@ tsconfig@^7.0.0: strip-bom "^3.0.0" strip-json-comments "^2.0.0" -tslib@^2.0.1, tslib@^2.1.0: - version "2.6.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" - integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== +tslib@^2.0.1, tslib@^2.1.0, tslib@^2.6.2: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== -tslib@^2.6.2: - version "2.7.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" - integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== +tsscmp@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb" + integrity sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA== tunnel-agent@^0.6.0: version "0.6.0" @@ -8645,11 +8825,16 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.8: +type-detect@4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== +type-detect@^4.0.0, type-detect@^4.0.8, type-detect@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.1.0.tgz#deb2453e8f08dcae7ae98c626b13dddb0155906c" + integrity sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw== + type-fest@^0.20.2: version "0.20.2" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" @@ -8673,49 +8858,50 @@ type-is@^1.6.4, type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" -typed-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" - integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== +typed-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536" + integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== dependencies: - call-bind "^1.0.7" + call-bound "^1.0.3" es-errors "^1.3.0" - is-typed-array "^1.1.13" + is-typed-array "^1.1.14" -typed-array-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" - integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== +typed-array-byte-length@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz#8407a04f7d78684f3d252aa1a143d2b77b4160ce" + integrity sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg== dependencies: - call-bind "^1.0.7" + call-bind "^1.0.8" for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" + gopd "^1.2.0" + has-proto "^1.2.0" + is-typed-array "^1.1.14" -typed-array-byte-offset@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" - integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== +typed-array-byte-offset@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz#ae3698b8ec91a8ab945016108aef00d5bff12355" + integrity sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ== dependencies: available-typed-arrays "^1.0.7" - call-bind "^1.0.7" + call-bind "^1.0.8" for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" + gopd "^1.2.0" + has-proto "^1.2.0" + is-typed-array "^1.1.15" + reflect.getprototypeof "^1.0.9" -typed-array-length@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" - integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== +typed-array-length@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.7.tgz#ee4deff984b64be1e118b0de8c9c877d5ce73d3d" + integrity sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg== dependencies: call-bind "^1.0.7" for-each "^0.3.3" gopd "^1.0.1" - has-proto "^1.0.3" is-typed-array "^1.1.13" possible-typed-array-names "^1.0.0" + reflect.getprototypeof "^1.0.6" typedarray-to-buffer@^3.1.5: version "3.1.5" @@ -8745,24 +8931,24 @@ uc.micro@^2.0.0, uc.micro@^2.1.0: integrity sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A== uglify-js@^3.7.7: - version "3.18.0" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.18.0.tgz#73b576a7e8fda63d2831e293aeead73e0a270deb" - integrity sha512-SyVVbcNBCk0dzr9XL/R/ySrmYf0s372K6/hFklzgcp2lBFyXtw4I7BOdDjlLhE1aVqaI/SHWXWmYdlZxuyF38A== + version "3.19.3" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.19.3.tgz#82315e9bbc6f2b25888858acd1fff8441035b77f" + integrity sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ== uid2@0.0.x: version "0.0.4" resolved "https://registry.yarnpkg.com/uid2/-/uid2-0.0.4.tgz#033f3b1d5d32505f5ce5f888b9f3b667123c0a44" integrity sha512-IevTus0SbGwQzYh3+fRsAMTVVPOoIVufzacXcHPmdlle1jUpq7BRL+mw3dgeLanvGZdwwbWhRV6XrcFNdBmjWA== -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== +unbox-primitive@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.1.0.tgz#8d9d2c9edeea8460c7f35033a88867944934d1e2" + integrity sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw== dependencies: - call-bind "^1.0.2" + call-bound "^1.0.3" has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" + has-symbols "^1.1.0" + which-boxed-primitive "^1.1.1" undefsafe@^2.0.5: version "2.0.5" @@ -8770,15 +8956,25 @@ undefsafe@^2.0.5: integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== underscore@~1.13.2: - version "1.13.6" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.6.tgz#04786a1f589dc6c09f761fc5f45b89e935136441" - integrity sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A== + version "1.13.7" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.7.tgz#970e33963af9a7dda228f17ebe8399e5fbe63a10" + integrity sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g== undici-types@~5.26.4: version "5.26.5" resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== +undici-types@~6.19.2: + version "6.19.8" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" + integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== + +undici-types@~6.21.0: + version "6.21.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.21.0.tgz#691d00af3909be93a7faa13be61b3a5b50ef12cb" + integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ== + unescape-js@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/unescape-js/-/unescape-js-1.1.4.tgz#4bc6389c499cb055a98364a0b3094e1c3d5da395" @@ -8837,18 +9033,18 @@ unpipe@1.0.0, unpipe@~1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== -update-browserslist-db@^1.0.16: - version "1.0.16" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz#f6d489ed90fb2f07d67784eb3f53d7891f736356" - integrity sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ== +update-browserslist-db@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz#348377dd245216f9e7060ff50b15a1b740b75420" + integrity sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw== dependencies: - escalade "^3.1.2" - picocolors "^1.0.1" + escalade "^3.2.0" + picocolors "^1.1.1" update-notifier-cjs@^5.1.6: - version "5.1.6" - resolved "https://registry.yarnpkg.com/update-notifier-cjs/-/update-notifier-cjs-5.1.6.tgz#6e3aff745d1551b55bb0a0a5939b7e636d95877d" - integrity sha512-wgxdSBWv3x/YpMzsWz5G4p4ec7JWD0HCl8W6bmNB6E5Gwo+1ym5oN4hiXpLf0mPySVEJEIsYlkshnplkg2OP9A== + version "5.1.7" + resolved "https://registry.yarnpkg.com/update-notifier-cjs/-/update-notifier-cjs-5.1.7.tgz#995733b43bdaeb136b999d55061fc385ef787a7f" + integrity sha512-eZWTh8F+VCEoC4UIh0pKmh8h4izj65VvLhCpJpVefUxdYe0fU3GBrC4Sbh1AoWA/miNPAb6UVlp2fUQNsfp+3g== dependencies: boxen "^5.0.0" chalk "^4.1.0" @@ -8867,7 +9063,7 @@ update-notifier-cjs@^5.1.6: semver-diff "^3.1.1" xdg-basedir "^4.0.0" -uri-js@^4.2.2, uri-js@^4.4.1: +uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== @@ -8953,31 +9149,62 @@ whatwg-url@^5.0.0: tr46 "~0.0.3" webidl-conversions "^3.0.0" -which-boxed-primitive@^1.0.2: +which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz#d76ec27df7fa165f18d5808374a5fe23c29b176e" + integrity sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA== + dependencies: + is-bigint "^1.1.0" + is-boolean-object "^1.2.1" + is-number-object "^1.1.1" + is-string "^1.1.1" + is-symbol "^1.1.1" + +which-builtin-type@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.2.1.tgz#89183da1b4907ab089a6b02029cc5d8d6574270e" + integrity sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q== + dependencies: + call-bound "^1.0.2" + function.prototype.name "^1.1.6" + has-tostringtag "^1.0.2" + is-async-function "^2.0.0" + is-date-object "^1.1.0" + is-finalizationregistry "^1.1.0" + is-generator-function "^1.0.10" + is-regex "^1.2.1" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.1.0" + which-collection "^1.0.2" + which-typed-array "^1.1.16" + +which-collection@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" + integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" + is-map "^2.0.3" + is-set "^2.0.3" + is-weakmap "^2.0.2" + is-weakset "^2.0.3" which-module@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== -which-typed-array@^1.1.14, which-typed-array@^1.1.15: - version "1.1.15" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" - integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== +which-typed-array@^1.1.16, which-typed-array@^1.1.18: + version "1.1.19" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.19.tgz#df03842e870b6b88e117524a4b364b6fc689f956" + integrity sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw== dependencies: available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" + call-bind "^1.0.8" + call-bound "^1.0.4" + for-each "^0.3.5" + get-proto "^1.0.1" + gopd "^1.2.0" has-tostringtag "^1.0.2" which@1.2.x: @@ -9015,16 +9242,33 @@ widest-line@^3.1.0: dependencies: string-width "^4.0.0" -winston-transport@^4.4.0, winston-transport@^4.5.0, winston-transport@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.7.0.tgz#e302e6889e6ccb7f383b926df6936a5b781bd1f0" - integrity sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg== +winston-transport@^4.4.0, winston-transport@^4.5.0, winston-transport@^4.7.0, winston-transport@^4.9.0: + version "4.9.0" + resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.9.0.tgz#3bba345de10297654ea6f33519424560003b3bf9" + integrity sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A== dependencies: - logform "^2.3.2" - readable-stream "^3.6.0" + logform "^2.7.0" + readable-stream "^3.6.2" + triple-beam "^1.3.0" + +winston@*, winston@^3.0.0: + version "3.17.0" + resolved "https://registry.yarnpkg.com/winston/-/winston-3.17.0.tgz#74b8665ce9b4ea7b29d0922cfccf852a08a11423" + integrity sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw== + dependencies: + "@colors/colors" "^1.6.0" + "@dabh/diagnostics" "^2.0.2" + async "^3.2.3" + is-stream "^2.0.0" + logform "^2.7.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.9.0" -winston@3.13.0, winston@^3.0.0: +winston@3.13.0: version "3.13.0" resolved "https://registry.yarnpkg.com/winston/-/winston-3.13.0.tgz#e76c0d722f78e04838158c61adc1287201de7ce3" integrity sha512-rwidmA1w3SE4j0E5MuIufFhyJPBDG7Nu71RkZor1p2+qHvJSZ9GYDA81AyleQcZbh/+V6HjeBdfnTZJm9rSeQQ== @@ -9051,7 +9295,7 @@ workerpool@6.2.1: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -9069,15 +9313,6 @@ wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" @@ -9107,10 +9342,10 @@ ws@^7.2.3: resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== -ws@^8.14.2: - version "8.17.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" - integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== +ws@^8.17.1: + version "8.18.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.2.tgz#42738b2be57ced85f46154320aabb51ab003705a" + integrity sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ== xdg-basedir@^4.0.0: version "4.0.0" @@ -9153,9 +9388,9 @@ yallist@^4.0.0: integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== yaml@^2.2.1: - version "2.4.5" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.5.tgz#60630b206dd6d84df97003d33fc1ddf6296cca5e" - integrity sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg== + version "2.7.1" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.7.1.tgz#44a247d1b88523855679ac7fa7cda6ed7e135cf6" + integrity sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ== yargs-parser@20.2.4: version "20.2.4"