From 76044aa98bcae2423e23db92ee4df71040495bd2 Mon Sep 17 00:00:00 2001 From: rusiruavb Date: Fri, 24 Dec 2021 21:43:51 +0530 Subject: [PATCH 1/9] Implement organization info feature --- .../controllers/Organization.controller.ts | 63 ++++++++++++++ src/api/controllers/index.ts | 12 +++ src/api/interfaces/IOrganization.ts | 14 +++ src/api/interfaces/index.ts | 2 + src/api/middleware/Auth.middleware.ts | 8 +- src/api/models/Organization.model.ts | 27 ++++++ src/api/routes/index.ts | 6 ++ src/api/services/Organization.service.ts | 87 +++++++++++++++++++ src/api/services/index.ts | 12 +++ 9 files changed, 225 insertions(+), 6 deletions(-) create mode 100644 src/api/controllers/Organization.controller.ts create mode 100644 src/api/interfaces/IOrganization.ts create mode 100644 src/api/models/Organization.model.ts create mode 100644 src/api/services/Organization.service.ts diff --git a/src/api/controllers/Organization.controller.ts b/src/api/controllers/Organization.controller.ts new file mode 100644 index 0000000..cf3fc48 --- /dev/null +++ b/src/api/controllers/Organization.controller.ts @@ -0,0 +1,63 @@ +import { Request, Response, NextFunction } from "express"; +import ImageService from "../../util/image.handler"; +import OrganizationService from "../services"; + +export const insertOrganization = async (request: Request, response: Response, next: NextFunction) => { + const bucketDirectoryName = "organization-images"; + const organizationImagePath = await ImageService.uploadImage(request.file, bucketDirectoryName); + request.body.imagePath = organizationImagePath; + + await OrganizationService.createOrganization(request.body, request.user._id) + .then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); +}; + +export const getOrganization = async (request: Request, response: Response, next: NextFunction) => { + await OrganizationService.getOrganizationInfo() + .then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); +}; + +export const getOrganizationForAdmin = async (request: Request, response: Response, next: NextFunction) => { + await OrganizationService.getOrganizationInfoForAdmin() + .then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); +}; + +export const updateOrganization = async (request: Request, response: Response, next: NextFunction) => { + if (request.file) { + const bucketDirectoryName = "organization-images"; + const organizationImagePath = await ImageService.uploadImage(request.file, bucketDirectoryName); + request.body.imagePath = organizationImagePath; + } + const updatedBy = request.user && request.user._id ? request.user._id : null; + const organizationId = request.body.organizationId; + + await OrganizationService.updateOrganizationInfo(organizationId, request.body, updatedBy) + .then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); +}; diff --git a/src/api/controllers/index.ts b/src/api/controllers/index.ts index 7a62d8f..87871b3 100644 --- a/src/api/controllers/index.ts +++ b/src/api/controllers/index.ts @@ -74,6 +74,13 @@ import { deleteExecutiveBoardDetails, } from "./ExecutiveBoard.controller"; +import { + insertOrganization, + getOrganization, + getOrganizationForAdmin, + updateOrganization, +} from "./Organization.controller"; + export default { //User Controllers createUser, @@ -139,4 +146,9 @@ export default { changeApplicationStatusIntoInterview, changeApplicationStatusIntoSelected, changeApplicationStatusIntoRejected, + // Organization Controllers + insertOrganization, + getOrganization, + getOrganizationForAdmin, + updateOrganization, }; diff --git a/src/api/interfaces/IOrganization.ts b/src/api/interfaces/IOrganization.ts new file mode 100644 index 0000000..cadb50a --- /dev/null +++ b/src/api/interfaces/IOrganization.ts @@ -0,0 +1,14 @@ +import { IUpdatedBy } from "."; + +interface IOrganization { + name: string; + email: string; + phoneNumber?: string | null; + university: string | null; + address: string | null; + website: string | null; + updatedBy: IUpdatedBy[]; + imagePath: string; +} + +export type { IOrganization }; diff --git a/src/api/interfaces/index.ts b/src/api/interfaces/index.ts index b8e6856..6d00184 100644 --- a/src/api/interfaces/index.ts +++ b/src/api/interfaces/index.ts @@ -8,6 +8,7 @@ import { IExecutiveBoard } from "./IExecutiveBoard"; import { IBoardMember } from "./IBoardMember"; import { IApplication } from "./IApplication"; import { IInterview } from "./IInterview"; +import { IOrganization } from "./IOrganization"; export { IUser, @@ -23,4 +24,5 @@ export { IApplication, ITopSpeaker, IInterview, + IOrganization, }; diff --git a/src/api/middleware/Auth.middleware.ts b/src/api/middleware/Auth.middleware.ts index 7409405..1dc0623 100644 --- a/src/api/middleware/Auth.middleware.ts +++ b/src/api/middleware/Auth.middleware.ts @@ -14,11 +14,7 @@ import UserModel from "../models/User.model"; * the user in the system. If the authentication success, then only necessary * method will execute. */ -export const authenticate = async ( - request: Request, - response: Response, - next: NextFunction -) => { +export const authenticate = async (request: Request, response: Response, next: NextFunction) => { try { const secret = process.env.JWT_SECRET as string; @@ -41,7 +37,7 @@ export const authenticate = async ( request.authToken = authToken; request.user = user; - logger.info("Token Verified"); + logger.info(`Authentication Token for ID ${user._id} is Accepted`); next(); } else { throw new Error("Token Secret is not found"); diff --git a/src/api/models/Organization.model.ts b/src/api/models/Organization.model.ts new file mode 100644 index 0000000..9f6cd26 --- /dev/null +++ b/src/api/models/Organization.model.ts @@ -0,0 +1,27 @@ +import mongoose, { Schema } from "mongoose"; +import { IOrganization } from "../interfaces"; + +const OrganizationSchema = new Schema( + { + name: { type: String, required: true, trim: true }, + email: { type: String, required: true, trim: true }, + university: { type: String, required: true, trim: true }, + phoneNumber: { type: String, required: true, trim: true }, + address: { type: String, required: true, trim: true }, + website: { type: String, required: true, trim: true }, + imagePath: { type: String, required: true, trim: true }, + updatedBy: [ + { + user: { type: Schema.Types.ObjectId, required: false, ref: "users" }, + updatedAt: { type: Date, required: false }, + }, + ], + }, + { + timestamps: true, + } +); + +const OrganizationModel = mongoose.model("organization", OrganizationSchema); + +export default OrganizationModel; diff --git a/src/api/routes/index.ts b/src/api/routes/index.ts index bc57c71..7f19558 100644 --- a/src/api/routes/index.ts +++ b/src/api/routes/index.ts @@ -89,4 +89,10 @@ export default function (app: Express) { // Application endpoints - Public app.post("/application/", controller.addApplication); + + // Organization endpoints - Private + app.post("/admin/organization/", middleware.authenticate, upload.single('organizationLogo'), controller.insertOrganization); + app.get("/admin/organization/info", middleware.authenticate, controller.getOrganization); + app.get("/admin/organization/", middleware.authenticate, controller.getOrganizationForAdmin); + app.put("/admin/organization/", middleware.authenticate, upload.single('organizationLogo'), controller.updateOrganization); } diff --git a/src/api/services/Organization.service.ts b/src/api/services/Organization.service.ts new file mode 100644 index 0000000..054963a --- /dev/null +++ b/src/api/services/Organization.service.ts @@ -0,0 +1,87 @@ +import OrganizationModel from "../models/Organization.model"; +import { DocumentDefinition, FilterQuery, Schema } from "mongoose"; +import { IOrganization, IUpdatedBy } from "../interfaces"; + +// Insert the organization information +export const createOrganization = async ( + organizationData: DocumentDefinition, + user: Schema.Types.ObjectId +) => { + return OrganizationModel.create(organizationData) + .then(async (organization) => { + let initialUpdatedBy: IUpdatedBy = { + user: user, + updatedAt: new Date(), + }; + organization.updatedBy.push(initialUpdatedBy); + return await organization.save(); + }) + .catch((error) => { + throw new Error(error.message); + }); +}; + +// Get organization information for dashboard +export const getOrganizationInfo = async () => { + return OrganizationModel.findOne() + .select("name email phoneNumber address website university imagePath") + .then((organization) => { + return organization; + }) + .catch((error) => { + throw new Error(error.message); + }); +}; + +// Get organization information for admin +export const getOrganizationInfoForAdmin = async () => { + return OrganizationModel.findOne() + .populate({ + path: "updatedBy", + populate: { + path: "user", + select: "firstName lastName email permissionLevel profileImage", + }, + select: "updatedAt", + }) + .then((organization) => { + return organization; + }) + .catch((error) => { + throw new Error(error.message); + }); +}; + +// Update organization information +export const updateOrganizationInfo = async ( + organizationId: string, + updateInfo: DocumentDefinition, + user: Schema.Types.ObjectId +) => { + if (organizationId) { + return OrganizationModel.findById(organizationId) + .then(async (organization) => { + if (organization) { + if (updateInfo.name) organization.name = updateInfo.name; + if (updateInfo.email) organization.email = updateInfo.email; + if (updateInfo.phoneNumber) organization.phoneNumber = updateInfo.phoneNumber; + if (updateInfo.university) organization.university = updateInfo.university; + if (updateInfo.address) organization.address = updateInfo.address; + if (updateInfo.website) organization.website = updateInfo.website; + if (updateInfo.imagePath) organization.website = updateInfo.imagePath; + + const updateUserInfo: IUpdatedBy = { + user: user, + updatedAt: new Date(), + }; + organization.updatedBy.push(updateUserInfo); + return await organization.save(); + } + }) + .catch((error) => { + throw new Error(error.message); + }); + } else { + throw new Error("Organization ID not Passed"); + } +}; diff --git a/src/api/services/index.ts b/src/api/services/index.ts index 26573cd..c49d8ef 100644 --- a/src/api/services/index.ts +++ b/src/api/services/index.ts @@ -74,6 +74,13 @@ import { deleteExecutiveBoardDetails, } from "./ExecutiveBoard.service"; +import { + createOrganization, + getOrganizationInfo, + getOrganizationInfoForAdmin, + updateOrganizationInfo, +} from "./Organization.service"; + export default { // User services insertUser, @@ -139,4 +146,9 @@ export default { addBoardMember, updateExecutiveBoardDetails, deleteExecutiveBoardDetails, + // Organization Service + createOrganization, + getOrganizationInfo, + getOrganizationInfoForAdmin, + updateOrganizationInfo, }; From 4e76925ad4396a0606374d7ab5be3378ea351b2a Mon Sep 17 00:00:00 2001 From: rusiruavb Date: Tue, 4 Jan 2022 17:47:21 +0530 Subject: [PATCH 2/9] Create email queue with rabbitmq --- package-lock.json | 96 +++++++++++++++++++++++++++++++++++ package.json | 2 + src/api/interfaces/IConfig.ts | 6 +++ src/config/index.ts | 12 +++++ src/email/Email.service.ts | 7 +++ src/email/email.queue.ts | 32 ++++++++++++ src/util/email.handler.ts | 23 ++------- 7 files changed, 160 insertions(+), 18 deletions(-) create mode 100644 src/email/Email.service.ts create mode 100644 src/email/email.queue.ts diff --git a/package-lock.json b/package-lock.json index 777ca41..0574ed0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -813,6 +813,16 @@ "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", "dev": true }, + "@types/amqplib": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@types/amqplib/-/amqplib-0.8.2.tgz", + "integrity": "sha512-p+TFLzo52f8UanB+Nq6gyUi65yecAcRY3nYowU6MPGFtaJvEDxcnFWrxssSTkF+ts1W3zyQDvgVICLQem5WxRA==", + "dev": true, + "requires": { + "@types/bluebird": "*", + "@types/node": "*" + } + }, "@types/bcrypt": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@types/bcrypt/-/bcrypt-5.0.0.tgz", @@ -826,6 +836,12 @@ "resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.2.tgz", "integrity": "sha512-LiMQ6EOPob/4yUL66SZzu6Yh77cbzJFYll+ZfaPiPPFswtIlA/Fs1MzdKYA7JApHU49zQTbJGX3PDmCpIdDBRQ==" }, + "@types/bluebird": { + "version": "3.5.36", + "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.36.tgz", + "integrity": "sha512-HBNx4lhkxN7bx6P0++W8E289foSu8kO8GCk2unhuVggO+cE7rh9DhZUyPhUxNRG9m+5B5BTKxZQ5ZP92x/mx9Q==", + "dev": true + }, "@types/body-parser": { "version": "1.19.2", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", @@ -1086,6 +1102,47 @@ } } }, + "amqplib": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.8.0.tgz", + "integrity": "sha512-icU+a4kkq4Y1PS4NNi+YPDMwdlbFcZ1EZTQT2nigW3fvOb6AOgUQ9+Mk4ue0Zu5cBg/XpDzB40oH10ysrk2dmA==", + "requires": { + "bitsyntax": "~0.1.0", + "bluebird": "^3.7.2", + "buffer-more-ints": "~1.0.0", + "readable-stream": "1.x >=1.1.9", + "safe-buffer": "~5.2.1", + "url-parse": "~1.5.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, "ansi-align": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", @@ -1273,6 +1330,21 @@ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, + "bitsyntax": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/bitsyntax/-/bitsyntax-0.1.0.tgz", + "integrity": "sha512-ikAdCnrloKmFOugAfxWws89/fPc+nw0OOG1IzIE72uSOg/A3cYptKCjSUhDTuj7fhsJtzkzlv7l3b8PzRHLN0Q==", + "requires": { + "buffer-more-ints": "~1.0.0", + "debug": "~2.6.9", + "safe-buffer": "~5.1.2" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, "body-parser": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", @@ -1350,6 +1422,11 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, + "buffer-more-ints": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-1.0.0.tgz", + "integrity": "sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==" + }, "busboy": { "version": "0.2.14", "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz", @@ -3722,6 +3799,11 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -3823,6 +3905,11 @@ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + }, "responselike": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", @@ -4478,6 +4565,15 @@ } } }, + "url-parse": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.4.tgz", + "integrity": "sha512-ITeAByWWoqutFClc/lRZnFplgXgEZr3WJ6XngMM/N9DMIm4K8zXPCZ1Jdu0rERwO84w1WC5wkle2ubwTA4NTBg==", + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, "url-parse-lax": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", diff --git a/package.json b/package.json index bb25af8..b40333a 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "@types/sharp": "^0.29.4", "@types/uuid": "^8.3.3", "@types/validator": "^13.7.0", + "amqplib": "^0.8.0", "bcryptjs": "^2.4.3", "body-parser": "^1.19.0", "cors": "^2.8.5", @@ -54,6 +55,7 @@ }, "devDependencies": { "@google-cloud/storage": "^5.16.0", + "@types/amqplib": "^0.8.2", "@types/express": "^4.17.13", "@types/node": "^16.11.9", "cross-env": "^7.0.3", diff --git a/src/api/interfaces/IConfig.ts b/src/api/interfaces/IConfig.ts index 1cce469..728d02d 100644 --- a/src/api/interfaces/IConfig.ts +++ b/src/api/interfaces/IConfig.ts @@ -31,6 +31,12 @@ interface IConfig { applicationImageBucket: string; bucketName: string; }; + queue: { + messageBrokerURL: string; + exchangeName: string; + emailQueue: string; + emailService: string; + }; } export type { IConfig }; diff --git a/src/config/index.ts b/src/config/index.ts index 3df13c1..e3d3c26 100644 --- a/src/config/index.ts +++ b/src/config/index.ts @@ -36,6 +36,12 @@ if (environment == "Development") { applicationImageBucket: process.env.APPLICATION_IMAGES_BUCKET as string, emailTemplateBucket: process.env.EMAIL_TEMPLATE_BUCKET as string, }, + queue: { + messageBrokerURL: process.env.MESSAGE_BROKER_URL as string, + exchangeName: process.env.EXCHANGE_NAME as string, + emailService: process.env.EMAIL_SERVICE_NAME as string, + emailQueue: process.env.EMAIL_QUEUE_NAME as string, + }, }; } @@ -73,6 +79,12 @@ if (environment == "Production") { applicationImageBucket: process.env.APPLICATION_IMAGES_BUCKET as string, emailTemplateBucket: process.env.EMAIL_TEMPLATE_BUCKET as string, }, + queue: { + messageBrokerURL: process.env.MESSAGE_BROKER_URL as string, + exchangeName: process.env.EXCHANGE_NAME as string, + emailService: process.env.EMAIL_SERVICE_NAME as string, + emailQueue: process.env.EMAIL_QUEUE_NAME as string, + }, }; } diff --git a/src/email/Email.service.ts b/src/email/Email.service.ts new file mode 100644 index 0000000..8a573c9 --- /dev/null +++ b/src/email/Email.service.ts @@ -0,0 +1,7 @@ +import { subscribeMessages } from "./email.queue"; +import Handlebars from "handlebars"; +import fs from "fs"; +import logger from "../util/logger"; +import moment from "moment"; +import fetch from "cross-fetch"; +import { Channel } from "amqplib"; diff --git a/src/email/email.queue.ts b/src/email/email.queue.ts new file mode 100644 index 0000000..f5fee98 --- /dev/null +++ b/src/email/email.queue.ts @@ -0,0 +1,32 @@ +import amqp, { Channel } from "amqplib"; +import { configs } from "../config"; + +const messageBrokerURL = configs.queue.messageBrokerURL; +const exchangeName = configs.queue.exchangeName; +const emailService = configs.queue.emailService; +const emailQueue = configs.queue.emailQueue; + +// Create a channel +const createChannel = async () => { + try { + const connection = await amqp.connect(messageBrokerURL); + const channel = await connection.createChannel(); + await channel.assertExchange(exchangeName, "direct", { durable: false }); + return channel; + } catch (error) { + throw error; + } +}; + +// Subscribe to messages +const subscribeMessages = async (channel: Channel, service: any) => { + const serviceQueue = await channel.assertQueue(emailQueue); + channel.bindQueue(serviceQueue.queue, exchangeName, emailService); + channel.consume(serviceQueue.queue, (data) => { + if (data) { + // Call the service function + } + }); +}; + +export { createChannel, subscribeMessages }; diff --git a/src/util/email.handler.ts b/src/util/email.handler.ts index 118c7e4..250b221 100644 --- a/src/util/email.handler.ts +++ b/src/util/email.handler.ts @@ -6,7 +6,7 @@ import moment from "moment"; import fetch from "cross-fetch"; const cc = - "senurajayadeva@gmail.com,Lasalshettiarachchi458@gmail.com,rusiruavb98@gmail.com,yasirurandika99@gmail.com"; + "senurajayadeva@gmail.com,Lasalshettiarachchi458@gmail.com,rusiruavbpersonal98@gmail.com,yasirurandika99@gmail.com"; // HTML Configuration require.extensions[".html"] = (module: any, fileName: string) => { @@ -29,12 +29,7 @@ let template: HandlebarsTemplateDelegate; let htmlToSend: string; class EmailService { - static sendEmailWithTemplate( - fileName: string, - to: string, - subject: string, - emailBodyData: any - ) { + static sendEmailWithTemplate(fileName: string, to: string, subject: string, emailBodyData: any) { return new Promise(async (resolve, reject) => { this.getEmailTemplatePath(fileName) .then((emailTemplate) => { @@ -85,9 +80,7 @@ class EmailService { text: htmlTemplate, }) .then((responseData: any) => { - logger.info( - `Email sent from ${responseData.envelope.from} to ${responseData.envelope.to}` - ); + logger.info(`Email sent from ${responseData.envelope.from} to ${responseData.envelope.to}`); return resolve(responseData); }) .catch((error: any) => { @@ -97,18 +90,12 @@ class EmailService { }); }; - static retry = ( - maxRetries: number, - retryFunction: any, - retryFunctionName: string - ) => { + static retry = (maxRetries: number, retryFunction: any, retryFunctionName: string) => { logger.info("## RETRY COUNT: " + maxRetries); return retryFunction().catch((error: any) => { if (maxRetries <= 0) { - const RetryFailedDateAndTime = moment() - .utcOffset("+05.30") - .format("MMMM Do YYYY, h:mm:ss a"); + const RetryFailedDateAndTime = moment().utcOffset("+05.30").format("MMMM Do YYYY, h:mm:ss a"); logger.error(RetryFailedDateAndTime); /** * @todo - to send Email to the system admin about the failure From 37b79bec7ec4c09a730f3b230e71e1c8a2619238 Mon Sep 17 00:00:00 2001 From: rusiruavb Date: Tue, 4 Jan 2022 18:43:03 +0530 Subject: [PATCH 3/9] Add SendGrid credentials to config file --- src/api/interfaces/IConfig.ts | 4 ++++ src/config/index.ts | 8 ++++++++ src/util/email.handler.ts | 6 +++--- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/api/interfaces/IConfig.ts b/src/api/interfaces/IConfig.ts index 728d02d..9b5b15c 100644 --- a/src/api/interfaces/IConfig.ts +++ b/src/api/interfaces/IConfig.ts @@ -21,6 +21,10 @@ interface IConfig { tls: { rejectUnauthorized: boolean; }; + sendGrid: { + user: string; + apiKey: string; + }; }; firebase: { projectId: string; diff --git a/src/config/index.ts b/src/config/index.ts index e3d3c26..070b255 100644 --- a/src/config/index.ts +++ b/src/config/index.ts @@ -26,6 +26,10 @@ if (environment == "Development") { tls: { rejectUnauthorized: false, }, + sendGrid: { + user: process.env.EMAIL_SENDGRID_USER as string, + apiKey: process.env.SENDGRID_API_KEY as string, + }, }, firebase: { projectId: process.env.STORAGE_PROJECT_ID as string, @@ -69,6 +73,10 @@ if (environment == "Production") { tls: { rejectUnauthorized: false, }, + sendGrid: { + user: process.env.EMAIL_SENDGRID_USER as string, + apiKey: process.env.SENDGRID_API_KEY as string, + }, }, firebase: { projectId: process.env.PROJECT_ID as string, diff --git a/src/util/email.handler.ts b/src/util/email.handler.ts index 0249a56..d4763cf 100644 --- a/src/util/email.handler.ts +++ b/src/util/email.handler.ts @@ -29,7 +29,7 @@ class EmailService { htmlToSend = template(emailBodyData); this.retry( - 5, + 5, // Retry count function () { return EmailService.sendEmail(to, subject, htmlToSend) .then((responseData) => { @@ -60,10 +60,10 @@ class EmailService { static sendEmail = (to: string, subject: string, htmlTemplate: any) => { return new Promise((resolve, reject) => { - sgMail.setApiKey(process.env.SENFGRID_API_KEY); + sgMail.setApiKey(configs.email.sendGrid.apiKey); const msg = { to: to, // Change to your recipient - from: { name: "MS Club of SLIIT", email: process.env.EMAIL_SENFGRID_USER }, // Change to your verified sender + from: { name: "MS Club of SLIIT", email: configs.email.sendGrid.user }, // Change to your verified sender cc: "msclubofsliit@gmail.com", subject: subject, text: htmlTemplate, From 2c8871a1b2ff17fe4970d3adf2ae4aec502a9000 Mon Sep 17 00:00:00 2001 From: rusiruavb Date: Tue, 4 Jan 2022 18:48:40 +0530 Subject: [PATCH 4/9] Change the interface folder location --- src/api/controllers/Application.controller.ts | 78 +++++----------- src/api/controllers/Event.controller.ts | 2 +- src/api/controllers/TopSpeaker.controller.ts | 87 +++++------------- src/api/controllers/User.controller.ts | 2 +- src/api/models/Application.model.ts | 40 ++++---- src/api/models/BoardMember.model.ts | 7 +- src/api/models/Contact.model.ts | 61 ++++++------ src/api/models/Event.model.ts | 2 +- src/api/models/ExecutiveBoard.model.ts | 7 +- src/api/models/Organization.model.ts | 2 +- src/api/models/TopSpeaker.model.ts | 9 +- src/api/models/User.model.ts | 2 +- src/api/models/Webinar.model.ts | 2 +- src/api/services/Application.service.ts | 92 +++++++------------ src/api/services/BoardMember.service.ts | 23 ++--- src/api/services/Contact.service.ts | 18 ++-- src/api/services/Event.service.ts | 2 +- src/api/services/ExecutiveBoard.service.ts | 15 +-- src/api/services/Organization.service.ts | 2 +- src/api/services/TopSpeaker.service.ts | 35 ++----- src/api/services/User.service.ts | 2 +- src/api/services/Webinar.service.ts | 3 +- src/config/index.ts | 2 +- src/{api => }/interfaces/IApplication.ts | 0 src/{api => }/interfaces/IBoardMember.ts | 0 src/{api => }/interfaces/IConfig.ts | 0 src/{api => }/interfaces/IContact.ts | 0 src/{api => }/interfaces/IEvent.ts | 0 src/{api => }/interfaces/IExecutiveBoard.ts | 0 src/{api => }/interfaces/IInterview.ts | 0 src/{api => }/interfaces/IOrganization.ts | 0 src/{api => }/interfaces/ITopSpeaker.ts | 0 src/{api => }/interfaces/IUser.ts | 0 src/{api => }/interfaces/IWebinar.ts | 0 src/{api => }/interfaces/index.ts | 0 35 files changed, 180 insertions(+), 315 deletions(-) rename src/{api => }/interfaces/IApplication.ts (100%) rename src/{api => }/interfaces/IBoardMember.ts (100%) rename src/{api => }/interfaces/IConfig.ts (100%) rename src/{api => }/interfaces/IContact.ts (100%) rename src/{api => }/interfaces/IEvent.ts (100%) rename src/{api => }/interfaces/IExecutiveBoard.ts (100%) rename src/{api => }/interfaces/IInterview.ts (100%) rename src/{api => }/interfaces/IOrganization.ts (100%) rename src/{api => }/interfaces/ITopSpeaker.ts (100%) rename src/{api => }/interfaces/IUser.ts (100%) rename src/{api => }/interfaces/IWebinar.ts (100%) rename src/{api => }/interfaces/index.ts (100%) diff --git a/src/api/controllers/Application.controller.ts b/src/api/controllers/Application.controller.ts index 95e79bf..929e2a6 100644 --- a/src/api/controllers/Application.controller.ts +++ b/src/api/controllers/Application.controller.ts @@ -2,7 +2,7 @@ import { Request, Response, NextFunction } from "express"; import ApplicationService from "../services"; import EmailService from "../../util/email.handler"; import logger from "../../util/logger"; -import { IApplication } from "../interfaces"; +import { IApplication } from "../../interfaces"; import { request } from "http"; /** @@ -11,11 +11,7 @@ import { request } from "http"; * @param {NextFunction} next - Next function * @returns {IApplication} - New application document */ -export const addApplication = async ( - request: Request, - response: Response, - next: NextFunction -) => { +export const addApplication = async (request: Request, response: Response, next: NextFunction) => { await ApplicationService.addApplication(request.body) .then((data) => { // Send email @@ -32,7 +28,7 @@ export const addApplication = async ( gitHub: data.gitHub, skillsAndTalents: data.skillsAndTalents, }; - + EmailService.sendEmailWithTemplate(emailTemplate, to, subject, emailBodyData) .then(() => { request.handleResponse.successRespond(response)({ @@ -58,11 +54,7 @@ export const addApplication = async ( * @param {NextFunction} next - Next function * @returns {IApplication} - Application document that relevent to the passed ID */ -export const getApplicationById = async ( - request: Request, - response: Response, - next: NextFunction -) => { +export const getApplicationById = async (request: Request, response: Response, next: NextFunction) => { const applicationId = request.params.applicationId; if (applicationId) { await ApplicationService.fetchApplicationById(applicationId) @@ -85,11 +77,7 @@ export const getApplicationById = async ( * @param {NextFunction} next - Next function * @returns {IApplication} - All application documents */ -export const getApplications = async ( - request: Request, - response: Response, - next: NextFunction -) => { +export const getApplications = async (request: Request, response: Response, next: NextFunction) => { await ApplicationService.fetchApplications() .then((data) => { request.handleResponse.successRespond(response)(data); @@ -107,11 +95,7 @@ export const getApplications = async ( * @param {NextFunction} next - Next function * @returns {IApplication} - Updated application document */ -export const setApplicationArchive = async ( - request: Request, - response: Response, - next: NextFunction -) => { +export const setApplicationArchive = async (request: Request, response: Response, next: NextFunction) => { const applicationId = request.params.applicationId; if (applicationId) { await ApplicationService.archiveApplication(applicationId) @@ -144,10 +128,7 @@ export const changeApplicationStatusIntoInterview = async ( ) => { const applicationId = request.params.applicationId; if (applicationId) { - await ApplicationService.changeApplicationStatusIntoInterview( - applicationId, - request.body - ) + await ApplicationService.changeApplicationStatusIntoInterview(applicationId, request.body) .then((data) => { request.handleResponse.successRespond(response)(data); next(); @@ -170,17 +151,10 @@ export const changeApplicationStatusIntoInterview = async ( * @param {NextFunction} next - Next function * @returns {IApplication} updated application document in the system */ -export const changeApplicationStatusIntoSelected = async ( - request: Request, - response: Response, - next: NextFunction -) => { +export const changeApplicationStatusIntoSelected = async (request: Request, response: Response, next: NextFunction) => { const applicationId = request.params.applicationId; if (applicationId) { - await ApplicationService.changeApplicationStatusIntoSelected( - applicationId, - request.body - ) + await ApplicationService.changeApplicationStatusIntoSelected(applicationId, request.body) .then((data) => { request.handleResponse.successRespond(response)(data); next(); @@ -202,16 +176,10 @@ export const changeApplicationStatusIntoSelected = async ( * @param {NextFunction} next - Next function * @returns {IApplication} updated application document in the system */ -export const changeApplicationStatusIntoRejected = async ( - request: Request, - response: Response, - next: NextFunction -) => { +export const changeApplicationStatusIntoRejected = async (request: Request, response: Response, next: NextFunction) => { const applicationId = request.params.applicationId; if (applicationId) { - await ApplicationService.changeApplicationStatusIntoRejected( - applicationId - ) + await ApplicationService.changeApplicationStatusIntoRejected(applicationId) .then((data) => { request.handleResponse.successRespond(response)(data); next(); @@ -232,9 +200,9 @@ export const changeApplicationStatusIntoRejected = async ( * @param {Request} request - Request from the frontend * @param {Response} response - Response that need to send to the client * @param {NextFunction} next - Next function - * @returns {IApplication} fetched pending applications + * @returns {IApplication} fetched pending applications */ -export const fetchPendingApplications = async (request: Request, response:Response, next: NextFunction) =>{ +export const fetchPendingApplications = async (request: Request, response: Response, next: NextFunction) => { await ApplicationService.fetchPendingApplications() .then((data: any) => { request.handleResponse.successRespond(response)(data); @@ -244,7 +212,7 @@ export const fetchPendingApplications = async (request: Request, response:Respon request.handleResponse.errorRespond(response)(error.message); next(); }); -} +}; /** * @function fetchSelectedApplications that calls * @function fetchSelectedApplications in the ApplicationService @@ -252,9 +220,9 @@ export const fetchPendingApplications = async (request: Request, response:Respon * @param {Request} request - Request from the frontend * @param {Response} response - Response that need to send to the client * @param {NextFunction} next - Next function - * @returns {IApplication} fetched selected applications + * @returns {IApplication} fetched selected applications */ -export const fetchSelectedApplications = async (request: Request, response:Response, next: NextFunction) =>{ +export const fetchSelectedApplications = async (request: Request, response: Response, next: NextFunction) => { await ApplicationService.fetchSelectedApplications() .then((data) => { request.handleResponse.successRespond(response)(data); @@ -264,7 +232,7 @@ export const fetchSelectedApplications = async (request: Request, response:Respo request.handleResponse.errorRespond(response)(error.message); next(); }); -} +}; /** * @function fetchInterviewApplications that calls * @function fetchInterviewApplications in the ApplicationService @@ -272,9 +240,9 @@ export const fetchSelectedApplications = async (request: Request, response:Respo * @param {Request} request - Request from the frontend * @param {Response} response - Response that need to send to the client * @param {NextFunction} next - Next function - * @returns {IApplication} fetched interview applications + * @returns {IApplication} fetched interview applications */ -export const fetchInterviewApplications = async (request: Request, response:Response, next: NextFunction) =>{ +export const fetchInterviewApplications = async (request: Request, response: Response, next: NextFunction) => { await ApplicationService.fetchInterviewApplications() .then((data) => { request.handleResponse.successRespond(response)(data); @@ -284,7 +252,7 @@ export const fetchInterviewApplications = async (request: Request, response:Resp request.handleResponse.errorRespond(response)(error.message); next(); }); -} +}; /** * @function fetchRejectedApplications that calls @@ -293,10 +261,10 @@ export const fetchInterviewApplications = async (request: Request, response:Resp * @param {Request} request - Request from the frontend * @param {Response} response - Response that need to send to the client * @param {NextFunction} next - Next function - * @returns {IApplication} fetched rejected applications + * @returns {IApplication} fetched rejected applications */ -export const fetchRejectedApplications = async (request: Request, response:Response, next: NextFunction) =>{ +export const fetchRejectedApplications = async (request: Request, response: Response, next: NextFunction) => { await ApplicationService.fetchRejectedApplications() .then((data) => { request.handleResponse.successRespond(response)(data); @@ -306,4 +274,4 @@ export const fetchRejectedApplications = async (request: Request, response:Respo request.handleResponse.errorRespond(response)(error.message); next(); }); -} +}; diff --git a/src/api/controllers/Event.controller.ts b/src/api/controllers/Event.controller.ts index 4364f29..ac1cca0 100644 --- a/src/api/controllers/Event.controller.ts +++ b/src/api/controllers/Event.controller.ts @@ -1,7 +1,7 @@ import { Express, Request, Response, NextFunction } from "express"; import EventService from "../services"; import logger from "../../util/logger"; -import { IEvent } from "../interfaces"; +import { IEvent } from "../../interfaces"; import ImageService from "../../util/image.handler"; /** diff --git a/src/api/controllers/TopSpeaker.controller.ts b/src/api/controllers/TopSpeaker.controller.ts index 67e6687..608ea1f 100644 --- a/src/api/controllers/TopSpeaker.controller.ts +++ b/src/api/controllers/TopSpeaker.controller.ts @@ -1,7 +1,7 @@ import { Express, Request, Response, NextFunction } from "express"; import TopSpeakerService from "../services"; import logger from "../../util/logger"; -import { ITopSpeaker } from "../interfaces"; +import { ITopSpeaker } from "../../interfaces"; import ImageService from "../../util/image.handler"; /** @@ -11,19 +11,11 @@ import ImageService from "../../util/image.handler"; * @returns { ITopSpeaker } topSpeaker document */ -export const insertTopSpeaker = async ( - request: Request, - response: Response, - next: NextFunction -) => { +export const insertTopSpeaker = async (request: Request, response: Response, next: NextFunction) => { const bucketDirectoryName = "topspeaker-flyers"; - const topSpeakerFlyerPath = await ImageService.uploadImage( - request.file, - bucketDirectoryName - ); - request.body.createdBy = - request.user && request.user._id ? request.user._id : null; + const topSpeakerFlyerPath = await ImageService.uploadImage(request.file, bucketDirectoryName); + request.body.createdBy = request.user && request.user._id ? request.user._id : null; request.body.imageUrl = topSpeakerFlyerPath; await TopSpeakerService.insertTopSpeaker(request.body) .then((data) => { @@ -43,20 +35,14 @@ export const insertTopSpeaker = async ( * @returns { ITopSpeaker } topSpeaker document */ -export const getTopSpeaker = async ( - request: Request, - response: Response, - next: NextFunction -) => { +export const getTopSpeaker = async (request: Request, response: Response, next: NextFunction) => { const topSpeakerId = request.params.topSpeakerId; - + if (topSpeakerId) { - await TopSpeakerService.getTopSpeaker(request.params.topSpeakerId).then( - (data) => { - request.handleResponse.successRespond(response)(data); - next(); - } - ); + await TopSpeakerService.getTopSpeaker(request.params.topSpeakerId).then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }); } else { request.handleResponse.errorRespond(response)("Top Speaker ID not found"); } @@ -69,11 +55,7 @@ export const getTopSpeaker = async ( * @returns { ITopSpeaker[] } All top speakers in the system */ -export const getTopSpeakers = async ( - request: Request, - response: Response, - next: NextFunction -) => { +export const getTopSpeakers = async (request: Request, response: Response, next: NextFunction) => { await TopSpeakerService.getTopSpeakers() .then((data) => { request.handleResponse.successRespond(response)(data); @@ -92,29 +74,18 @@ export const getTopSpeakers = async ( * @returns { ITopSpeaker } - Updated top speaker details */ -export const updateTopSpeaker = async ( - request: Request, - response: Response, - next: NextFunction -) => { +export const updateTopSpeaker = async (request: Request, response: Response, next: NextFunction) => { if (request.file) { const bucketDirectoryName = "topspeaker-flyers"; - const topSpeakerFlyerPath = await ImageService.uploadImage( - request.file, - bucketDirectoryName - ); + const topSpeakerFlyerPath = await ImageService.uploadImage(request.file, bucketDirectoryName); request.body.imageUrl = topSpeakerFlyerPath; } const topSpeakerId = request.params.topSpeakerId; const updatedBy = request.user && request.user._id ? request.user._id : null; if (topSpeakerId) { - await TopSpeakerService.updateTopSpeaker( - request.params.topSpeakerId, - request.body, - updatedBy - ).then((data) => { + await TopSpeakerService.updateTopSpeaker(request.params.topSpeakerId, request.body, updatedBy).then((data) => { request.handleResponse.successRespond(response)(data); next(); }); @@ -130,31 +101,21 @@ export const updateTopSpeaker = async ( * @returns { ITopSpeaker } - Deleted top speaker details */ -export const deleteTopSpeaker = async ( - request: Request, - response: Response, - next: NextFunction -) => { +export const deleteTopSpeaker = async (request: Request, response: Response, next: NextFunction) => { const topSpeakerId = request.params.topSpeakerId; const deletedBy = request.user && request.user._id ? request.user._id : null; if (topSpeakerId) { - await TopSpeakerService.deleteTopSpeaker(request.params.topSpeakerId,deletedBy).then( - (data) => { - request.handleResponse.successRespond(response)(data); - next(); - } - ); + await TopSpeakerService.deleteTopSpeaker(request.params.topSpeakerId, deletedBy).then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }); } else { request.handleResponse.errorRespond(response)("Top Speaker ID not found"); } }; -export const getAllTopSpeakersForAdmin = async ( - request: Request, - response: Response, - next: NextFunction -) => { +export const getAllTopSpeakersForAdmin = async (request: Request, response: Response, next: NextFunction) => { await TopSpeakerService.getAllTopSpeakersForAdmin() .then((data: any) => { request.handleResponse.successRespond(response)(data); @@ -166,11 +127,7 @@ export const getAllTopSpeakersForAdmin = async ( }); }; -export const getDeletedTopSpeakersForAdmin = async ( - request: Request, - response: Response, - next: NextFunction -) => { +export const getDeletedTopSpeakersForAdmin = async (request: Request, response: Response, next: NextFunction) => { await TopSpeakerService.getDeletedTopSpeakersForAdmin() .then((data: any) => { request.handleResponse.successRespond(response)(data); @@ -180,4 +137,4 @@ export const getDeletedTopSpeakersForAdmin = async ( request.handleResponse.errorRespond(response)(error.message); next(); }); -}; \ No newline at end of file +}; diff --git a/src/api/controllers/User.controller.ts b/src/api/controllers/User.controller.ts index 63c09ea..60fa399 100644 --- a/src/api/controllers/User.controller.ts +++ b/src/api/controllers/User.controller.ts @@ -2,7 +2,7 @@ import { Express, Request, Response, NextFunction } from "express"; import UserService from "../services"; import logger from "../../util/logger"; import ImageService from "../../util/image.handler"; -import { IUserRequest } from "../interfaces"; +import { IUserRequest } from "../../interfaces"; /** * @param {Request} request - Request from the frontend diff --git a/src/api/models/Application.model.ts b/src/api/models/Application.model.ts index 281f72b..32ba4d6 100644 --- a/src/api/models/Application.model.ts +++ b/src/api/models/Application.model.ts @@ -1,29 +1,29 @@ import mongoose, { Schema } from "mongoose"; -import { IApplication } from "../interfaces"; +import { IApplication } from "../../interfaces"; const ApplicationSchema = new Schema( { - studentId : { type: String, required: true}, - name : { type: String, required: true}, - email : { type: String, required: true}, - contactNumber : { type: String, required: true}, - currentAcademicYear : { type: String, required: true}, - selfIntroduction : { type: String, required: true}, - reasonForJoin : { type: String, required: true}, - linkedIn : { type: String, required: true}, - gitHub : { type: String, required: true}, - blog : { type: String, required: false}, - experiences : { type: String, required: false}, - challenges : { type: String, required: false}, - goal : { type: String, required: true}, - skillsAndTalents : [{ type: String, required: true}], - pastWork : { type: String, required: false}, + studentId: { type: String, required: true }, + name: { type: String, required: true }, + email: { type: String, required: true }, + contactNumber: { type: String, required: true }, + currentAcademicYear: { type: String, required: true }, + selfIntroduction: { type: String, required: true }, + reasonForJoin: { type: String, required: true }, + linkedIn: { type: String, required: true }, + gitHub: { type: String, required: true }, + blog: { type: String, required: false }, + experiences: { type: String, required: false }, + challenges: { type: String, required: false }, + goal: { type: String, required: true }, + skillsAndTalents: [{ type: String, required: true }], + pastWork: { type: String, required: false }, deletedAt: { type: Date, required: false, default: null }, - status : { - type: String, - enum: ["PENDING", "INTERVIEW", "SELECTED", "REJECTED"], + status: { + type: String, + enum: ["PENDING", "INTERVIEW", "SELECTED", "REJECTED"], required: false, - default: "PENDING" + default: "PENDING", }, }, { timestamps: true } diff --git a/src/api/models/BoardMember.model.ts b/src/api/models/BoardMember.model.ts index 4870815..48f44e9 100644 --- a/src/api/models/BoardMember.model.ts +++ b/src/api/models/BoardMember.model.ts @@ -1,5 +1,5 @@ import mongoose, { Schema } from "mongoose"; -import { IBoardMember } from "../interfaces/IBoardMember"; +import { IBoardMember } from "../../interfaces/IBoardMember"; const BoardMemberSchema = new Schema({ name: { type: String, required: true }, @@ -27,9 +27,6 @@ const BoardMemberSchema = new Schema({ }, }); -const BoardMemberModel = mongoose.model( - "boardmember", - BoardMemberSchema -); +const BoardMemberModel = mongoose.model("boardmember", BoardMemberSchema); export default BoardMemberModel; diff --git a/src/api/models/Contact.model.ts b/src/api/models/Contact.model.ts index 8ea4c51..ebbcee3 100644 --- a/src/api/models/Contact.model.ts +++ b/src/api/models/Contact.model.ts @@ -1,33 +1,36 @@ -import mongoose, { Schema } from 'mongoose'; -import validator from 'validator'; -import { IContact } from '../interfaces'; +import mongoose, { Schema } from "mongoose"; +import validator from "validator"; +import { IContact } from "../../interfaces"; -const ContactSchema = new Schema({ - name: { - type: String, - required: [true, 'Name is required'], - trim: true +const ContactSchema = new Schema( + { + name: { + type: String, + required: [true, "Name is required"], + trim: true, + }, + email: { + type: String, + required: [true, "Email is required"], + trim: true, + validate(value: string) { + if (!validator.isEmail(value)) { + throw new Error("Email address is not valid"); + } + }, + }, + message: { + type: String, + required: [true, "Message is required"], + trim: true, + }, + deletedAt: { type: Date, required: false, default: null }, }, - email: { - type: String, - required: [true, 'Email is required'], - trim: true, - validate(value: string) { - if (!validator.isEmail(value)) { - throw new Error('Email address is not valid'); - } - } - }, - message: { - type: String, - required: [true, 'Message is required'], - trim: true - }, - deletedAt: { type: Date, required: false, default: null }, -}, { - timestamps: true, -}); + { + timestamps: true, + } +); -const ContactModel = mongoose.model('contacts', ContactSchema); +const ContactModel = mongoose.model("contacts", ContactSchema); -export default ContactModel; \ No newline at end of file +export default ContactModel; diff --git a/src/api/models/Event.model.ts b/src/api/models/Event.model.ts index 85b7159..6f87955 100644 --- a/src/api/models/Event.model.ts +++ b/src/api/models/Event.model.ts @@ -1,5 +1,5 @@ import mongoose, { Schema } from "mongoose"; -import { IEvent } from "../interfaces"; +import { IEvent } from "../../interfaces"; const EventSchema = new Schema( { diff --git a/src/api/models/ExecutiveBoard.model.ts b/src/api/models/ExecutiveBoard.model.ts index ea92f51..c98e3ab 100644 --- a/src/api/models/ExecutiveBoard.model.ts +++ b/src/api/models/ExecutiveBoard.model.ts @@ -1,5 +1,5 @@ import mongoose, { Schema } from "mongoose"; -import { IExecutiveBoard } from "../interfaces/IExecutiveBoard"; +import { IExecutiveBoard } from "../../interfaces/IExecutiveBoard"; const ExecutiveBoardSchema = new Schema({ year: { type: String, required: true }, @@ -20,9 +20,6 @@ const ExecutiveBoardSchema = new Schema({ }, }); -const ExecutiveBoardModel = mongoose.model( - "ececutiveboard", - ExecutiveBoardSchema -); +const ExecutiveBoardModel = mongoose.model("ececutiveboard", ExecutiveBoardSchema); export default ExecutiveBoardModel; diff --git a/src/api/models/Organization.model.ts b/src/api/models/Organization.model.ts index 9f6cd26..fcc28e1 100644 --- a/src/api/models/Organization.model.ts +++ b/src/api/models/Organization.model.ts @@ -1,5 +1,5 @@ import mongoose, { Schema } from "mongoose"; -import { IOrganization } from "../interfaces"; +import { IOrganization } from "../../interfaces"; const OrganizationSchema = new Schema( { diff --git a/src/api/models/TopSpeaker.model.ts b/src/api/models/TopSpeaker.model.ts index 9e248af..9b41e4f 100644 --- a/src/api/models/TopSpeaker.model.ts +++ b/src/api/models/TopSpeaker.model.ts @@ -1,5 +1,5 @@ -import mongoose, { Schema } from 'mongoose'; -import { ITopSpeaker } from '../interfaces'; +import mongoose, { Schema } from "mongoose"; +import { ITopSpeaker } from "../../interfaces"; const TopSpeakerSchema = new Schema( { @@ -31,9 +31,6 @@ const TopSpeakerSchema = new Schema( { timestamps: true } ); -const TopSpeakerModel = mongoose.model( - 'topSpeaker', - TopSpeakerSchema -); +const TopSpeakerModel = mongoose.model("topSpeaker", TopSpeakerSchema); export default TopSpeakerModel; diff --git a/src/api/models/User.model.ts b/src/api/models/User.model.ts index c59168e..00a7eb1 100644 --- a/src/api/models/User.model.ts +++ b/src/api/models/User.model.ts @@ -1,7 +1,7 @@ import mongoose, { Schema } from "mongoose"; import jwt from "jsonwebtoken"; import bcrypt from "bcryptjs"; -import { IUserModel, IUser } from "../interfaces"; +import { IUserModel, IUser } from "../../interfaces"; import validator from "validator"; const UserSchema = new Schema( diff --git a/src/api/models/Webinar.model.ts b/src/api/models/Webinar.model.ts index 5732419..6dcaa72 100644 --- a/src/api/models/Webinar.model.ts +++ b/src/api/models/Webinar.model.ts @@ -1,5 +1,5 @@ import mongoose, { Schema } from "mongoose"; -import { IWebinar } from "../interfaces"; +import { IWebinar } from "../../interfaces"; const WebinarSchema = new Schema( { diff --git a/src/api/services/Application.service.ts b/src/api/services/Application.service.ts index 29a7639..269ac18 100644 --- a/src/api/services/Application.service.ts +++ b/src/api/services/Application.service.ts @@ -1,6 +1,6 @@ import { DocumentDefinition, FilterQuery } from "mongoose"; import EmailService from "../../util/email.handler"; -import { IApplication, IInterview } from "../interfaces"; +import { IApplication, IInterview } from "../../interfaces"; import ApplicationModel from "../models/Application.model"; /** @@ -8,9 +8,7 @@ import ApplicationModel from "../models/Application.model"; * @param {IApplication} application * @returns {Promise} */ -export const addApplication = async ( - applicationData: DocumentDefinition -) => { +export const addApplication = async (applicationData: DocumentDefinition) => { return await ApplicationModel.create(applicationData) .then((application) => { return application; @@ -41,9 +39,7 @@ export const fetchApplicationById = async (applicationId: string) => { * @returns {Promise} */ export const fetchApplications = async () => { - return await ApplicationModel.aggregate([ - { $match: { deletedAt: { $eq: null } } }, - ]) + return await ApplicationModel.aggregate([{ $match: { deletedAt: { $eq: null } } }]) .then((applications) => { return applications; }) @@ -95,12 +91,7 @@ export const changeApplicationStatusIntoInterview = async ( format: interviewData.format, }; - return await EmailService.sendEmailWithTemplate( - emailTemplate, - to, - subject, - emailBodyData - ) + return await EmailService.sendEmailWithTemplate(emailTemplate, to, subject, emailBodyData) .then(async () => { application.status = "INTERVIEW"; return await application.save(); @@ -136,12 +127,7 @@ export const changeApplicationStatusIntoSelected = async ( name: application.name, }; - return await EmailService.sendEmailWithTemplate( - emailTemplate, - to, - subject, - emailBodyData - ) + return await EmailService.sendEmailWithTemplate(emailTemplate, to, subject, emailBodyData) .then(async () => { application.status = "SELECTED"; return await application.save(); @@ -162,9 +148,7 @@ export const changeApplicationStatusIntoSelected = async ( * @todo create @function changeApplicationStatusIntoRejected to update the status into REJECTED of an application in the system * @param applicationId @type string */ -export const changeApplicationStatusIntoRejected = async ( - applicationId: string -) => { +export const changeApplicationStatusIntoRejected = async (applicationId: string) => { return await ApplicationModel.findById(applicationId) .then(async (application) => { if (application) { @@ -177,57 +161,51 @@ export const changeApplicationStatusIntoRejected = async ( }); }; - /** * @todo create @function fetchPendingApplications to filter PENDING applications in the system */ -export const fetchPendingApplications = async () =>{ - return await ApplicationModel.aggregate([ - {$match : {status: {$eq: "PENDING"}, deletedAt : {$eq: null} } }, - ]) +export const fetchPendingApplications = async () => { + return await ApplicationModel.aggregate([{ $match: { status: { $eq: "PENDING" }, deletedAt: { $eq: null } } }]) .then((applications) => { return applications; - }).catch((err) => { + }) + .catch((err) => { throw new Error(err.message); }); }; /** * @todo create @function fetchInterviewApplications to filter INTERVIEW applications in the system */ -export const fetchInterviewApplications = async () =>{ - return await ApplicationModel.aggregate([ - {$match : {status: {$eq: "INTERVIEW"}, deletedAt : {$eq: null} } }, - ]) - .then((applications) => { - return applications; - }).catch((err) => { - throw new Error(err.message); - }); +export const fetchInterviewApplications = async () => { + return await ApplicationModel.aggregate([{ $match: { status: { $eq: "INTERVIEW" }, deletedAt: { $eq: null } } }]) + .then((applications) => { + return applications; + }) + .catch((err) => { + throw new Error(err.message); + }); }; /** * @todo create @function fetchSelectedApplications to filter SELECTED applications in the system */ -export const fetchSelectedApplications = async () =>{ - return await ApplicationModel.aggregate([ - {$match : {status: {$eq: "SELECTED"}, deletedAt : {$eq: null} } }, - ]) - .then((applications) => { - return applications; - }).catch((err) => { - throw new Error(err.message); - }); +export const fetchSelectedApplications = async () => { + return await ApplicationModel.aggregate([{ $match: { status: { $eq: "SELECTED" }, deletedAt: { $eq: null } } }]) + .then((applications) => { + return applications; + }) + .catch((err) => { + throw new Error(err.message); + }); }; /** * @todo create @function fetchRejectedApplications to filter REJECTED applications in the system */ -export const fetchRejectedApplications = async () =>{ - return await ApplicationModel.aggregate([ - {$match : {status: {$eq: "REJECTED"}, deletedAt : {$eq: null} } }, - ]) - .then((applications) => { - return applications; - }).catch((err) => { - throw new Error(err.message); - }); -} - +export const fetchRejectedApplications = async () => { + return await ApplicationModel.aggregate([{ $match: { status: { $eq: "REJECTED" }, deletedAt: { $eq: null } } }]) + .then((applications) => { + return applications; + }) + .catch((err) => { + throw new Error(err.message); + }); +}; diff --git a/src/api/services/BoardMember.service.ts b/src/api/services/BoardMember.service.ts index f3422aa..861ed7b 100644 --- a/src/api/services/BoardMember.service.ts +++ b/src/api/services/BoardMember.service.ts @@ -1,13 +1,11 @@ import { DocumentDefinition, FilterQuery, Schema } from "mongoose"; -import { IBoardMember, IUpdatedBy } from "../interfaces"; +import { IBoardMember, IUpdatedBy } from "../../interfaces"; import BoardMemberModel from "../models/BoardMember.model"; /** add a new Board Member to the database */ -export const insertBoardMember = async ( - BoardMemberData: DocumentDefinition -) => { +export const insertBoardMember = async (BoardMemberData: DocumentDefinition) => { return await BoardMemberModel.create(BoardMemberData) .then(async (boardMember) => { let initialUpdatedBy: IUpdatedBy = { @@ -73,20 +71,16 @@ export const updateBoardMemberDetails = async ( } if (updateData.socialMedia) { if (updateData.socialMedia.facebook) { - boardMemberDetails.socialMedia.facebook = - updateData.socialMedia.facebook; + boardMemberDetails.socialMedia.facebook = updateData.socialMedia.facebook; } if (updateData.socialMedia.instagram) { - boardMemberDetails.socialMedia.instagram = - updateData.socialMedia.instagram; + boardMemberDetails.socialMedia.instagram = updateData.socialMedia.instagram; } if (updateData.socialMedia.linkedIn) { - boardMemberDetails.socialMedia.linkedIn = - updateData.socialMedia.linkedIn; + boardMemberDetails.socialMedia.linkedIn = updateData.socialMedia.linkedIn; } if (updateData.socialMedia.twitter) { - boardMemberDetails.socialMedia.twitter = - updateData.socialMedia.twitter; + boardMemberDetails.socialMedia.twitter = updateData.socialMedia.twitter; } } const updateUserInfo: IUpdatedBy = { @@ -112,10 +106,7 @@ export const updateBoardMemberDetails = async ( delete member * @param boardMemberId @type string */ -export const deleteBoardMemberDetails = async ( - boardMemberId: string, - deletedBy: Schema.Types.ObjectId -) => { +export const deleteBoardMemberDetails = async (boardMemberId: string, deletedBy: Schema.Types.ObjectId) => { return await BoardMemberModel.findById(boardMemberId) .then(async (boardMemberDetails) => { if (boardMemberDetails && boardMemberDetails.deletedAt === null) { diff --git a/src/api/services/Contact.service.ts b/src/api/services/Contact.service.ts index a25cb61..b9e0695 100644 --- a/src/api/services/Contact.service.ts +++ b/src/api/services/Contact.service.ts @@ -1,6 +1,6 @@ -import { DocumentDefinition } from 'mongoose'; -import { IContact } from '../interfaces'; -import ContactModel from '../models/Contact.model'; +import { DocumentDefinition } from "mongoose"; +import { IContact } from "../../interfaces"; +import ContactModel from "../models/Contact.model"; /** * @param {IContact} contactData @@ -14,7 +14,7 @@ export const insertContact = async (contactData: DocumentDefinition) = .catch((error) => { throw new Error(error.message); }); -} +}; /** * @param {string} contactId @@ -26,26 +26,24 @@ export const archiveContact = async (contactId: string) => { if (contactData && contactData.deletedAt === null) { contactData.deletedAt = new Date(); return await contactData.save(); - } else { + } else { return "Contact not found"; } }) .catch((error) => { throw new Error(error.message); }); -} +}; /** * @returns {IContact[]} All available contacts */ export const fetchContactInfo = async () => { - return await ContactModel.aggregate([ - { $match: { deletedAt: { $eq: null }}} - ]) + return await ContactModel.aggregate([{ $match: { deletedAt: { $eq: null } } }]) .then((contacts) => { return contacts; }) .catch((error) => { throw new Error(error.message); }); -} \ No newline at end of file +}; diff --git a/src/api/services/Event.service.ts b/src/api/services/Event.service.ts index 37b2d59..ee70b70 100644 --- a/src/api/services/Event.service.ts +++ b/src/api/services/Event.service.ts @@ -1,5 +1,5 @@ import { DocumentDefinition, FilterQuery, Schema } from "mongoose"; -import { IEvent, IUpdatedBy } from "../interfaces"; +import { IEvent, IUpdatedBy } from "../../interfaces"; import EventModel from "../models/Event.model"; import UserModel from "../models/User.model"; diff --git a/src/api/services/ExecutiveBoard.service.ts b/src/api/services/ExecutiveBoard.service.ts index cf3e067..e9d50d4 100644 --- a/src/api/services/ExecutiveBoard.service.ts +++ b/src/api/services/ExecutiveBoard.service.ts @@ -1,5 +1,5 @@ -import { DocumentDefinition, FilterQuery,Schema } from "mongoose"; -import {IExecutiveBoard, IBoardMember,IUpdatedBy } from "../interfaces"; +import { DocumentDefinition, FilterQuery, Schema } from "mongoose"; +import { IExecutiveBoard, IBoardMember, IUpdatedBy } from "../../interfaces"; import ExecutiveBoardModel from "../models/ExecutiveBoard.model"; import BoardMemberModel from "../models/BoardMember.model"; import { insertBoardMember } from "../services/BoardMember.service"; @@ -7,12 +7,9 @@ import { insertBoardMember } from "../services/BoardMember.service"; /** add a new executive board to the database */ -export const insertExecutiveBoard = async ( - executiveBoardData: DocumentDefinition -) => { +export const insertExecutiveBoard = async (executiveBoardData: DocumentDefinition) => { return await ExecutiveBoardModel.create(executiveBoardData) .then(async (executiveBoard) => { - let initialUpdatedBy: IUpdatedBy = { user: executiveBoard.createdBy, updatedAt: new Date(), @@ -67,9 +64,7 @@ export const addBoardMember = async ( ) => { return await insertBoardMember(insertData) .then(async (createdBoardMember: IBoardMember) => { - const executiveBoard = await ExecutiveBoardModel.findById( - executiveBoardId - ); + const executiveBoard = await ExecutiveBoardModel.findById(executiveBoardId); if (executiveBoard) { executiveBoard.board.unshift(createdBoardMember); const updateUserInfo: IUpdatedBy = { @@ -121,7 +116,7 @@ export const updateExecutiveBoardDetails = async ( * @param boardId @type string * @param boardMemberId @type string */ -export const deleteExecutiveBoardDetails = async (boardId: string,deletedBy: Schema.Types.ObjectId) => { +export const deleteExecutiveBoardDetails = async (boardId: string, deletedBy: Schema.Types.ObjectId) => { return await ExecutiveBoardModel.findById(boardId) .then(async (executiveBoardDetails) => { if (executiveBoardDetails && executiveBoardDetails.deletedAt === null) { diff --git a/src/api/services/Organization.service.ts b/src/api/services/Organization.service.ts index 054963a..c87f76c 100644 --- a/src/api/services/Organization.service.ts +++ b/src/api/services/Organization.service.ts @@ -1,6 +1,6 @@ import OrganizationModel from "../models/Organization.model"; import { DocumentDefinition, FilterQuery, Schema } from "mongoose"; -import { IOrganization, IUpdatedBy } from "../interfaces"; +import { IOrganization, IUpdatedBy } from "../../interfaces"; // Insert the organization information export const createOrganization = async ( diff --git a/src/api/services/TopSpeaker.service.ts b/src/api/services/TopSpeaker.service.ts index e81253b..44c91a4 100644 --- a/src/api/services/TopSpeaker.service.ts +++ b/src/api/services/TopSpeaker.service.ts @@ -1,12 +1,10 @@ import { DocumentDefinition, FilterQuery, Schema } from "mongoose"; -import { ITopSpeaker, IUpdatedBy } from "../interfaces"; +import { ITopSpeaker, IUpdatedBy } from "../../interfaces"; import TopSpeakerModel from "../models/TopSpeaker.model"; /** save a speaker in the database */ -export const insertTopSpeaker = async ( - topSpeakerData: DocumentDefinition -) => { +export const insertTopSpeaker = async (topSpeakerData: DocumentDefinition) => { return await TopSpeakerModel.create(topSpeakerData) .then(async (topSpeaker) => { let initialUpdatedBy: IUpdatedBy = { @@ -44,9 +42,7 @@ export const getTopSpeaker = async (topSpeakerId: string) => { fetch all the TopSpeakers in the system */ export const getTopSpeakers = async () => { - return await TopSpeakerModel.aggregate([ - { $match: { deletedAt: { $eq: null } } }, - ]) + return await TopSpeakerModel.aggregate([{ $match: { deletedAt: { $eq: null } } }]) .then((topSpeakers) => { return topSpeakers; }) @@ -81,31 +77,23 @@ export const updateTopSpeaker = async ( } if (updateData.socialMediaURLs && updateData.socialMediaURLs.facebook) { - topSpeakerDetails.socialMediaURLs.facebook = - updateData.socialMediaURLs.facebook; + topSpeakerDetails.socialMediaURLs.facebook = updateData.socialMediaURLs.facebook; } - if ( - updateData.socialMediaURLs && - updateData.socialMediaURLs.instagram - ) { - topSpeakerDetails.socialMediaURLs.instagram = - updateData.socialMediaURLs.instagram; + if (updateData.socialMediaURLs && updateData.socialMediaURLs.instagram) { + topSpeakerDetails.socialMediaURLs.instagram = updateData.socialMediaURLs.instagram; } if (updateData.socialMediaURLs && updateData.socialMediaURLs.linkedIn) { - topSpeakerDetails.socialMediaURLs.linkedIn = - updateData.socialMediaURLs.linkedIn; + topSpeakerDetails.socialMediaURLs.linkedIn = updateData.socialMediaURLs.linkedIn; } if (updateData.socialMediaURLs && updateData.socialMediaURLs.twitter) { - topSpeakerDetails.socialMediaURLs.twitter = - updateData.socialMediaURLs.twitter; + topSpeakerDetails.socialMediaURLs.twitter = updateData.socialMediaURLs.twitter; } if (updateData.socialMediaURLs && updateData.socialMediaURLs.web) { - topSpeakerDetails.socialMediaURLs.web = - updateData.socialMediaURLs.web; + topSpeakerDetails.socialMediaURLs.web = updateData.socialMediaURLs.web; } const updateUserInfo: IUpdatedBy = { @@ -128,10 +116,7 @@ export const updateTopSpeaker = async ( delete a past event * @param topSpeakerId @type string */ -export const deleteTopSpeaker = async ( - topSpeakerId: string, - deletedBy: Schema.Types.ObjectId -) => { +export const deleteTopSpeaker = async (topSpeakerId: string, deletedBy: Schema.Types.ObjectId) => { return await TopSpeakerModel.findById(topSpeakerId) .then(async (topSpeakerDetails) => { if (topSpeakerDetails && topSpeakerDetails.deletedAt === null) { diff --git a/src/api/services/User.service.ts b/src/api/services/User.service.ts index ce8ed50..ab90f43 100644 --- a/src/api/services/User.service.ts +++ b/src/api/services/User.service.ts @@ -1,5 +1,5 @@ import { DocumentDefinition, Schema } from "mongoose"; -import { IUser, IUserRequest } from "../interfaces"; +import { IUser, IUserRequest } from "../../interfaces"; import UserModel from "../models/User.model"; import bcrypt from "bcrypt"; diff --git a/src/api/services/Webinar.service.ts b/src/api/services/Webinar.service.ts index 3de0959..c069291 100644 --- a/src/api/services/Webinar.service.ts +++ b/src/api/services/Webinar.service.ts @@ -1,5 +1,5 @@ import { DocumentDefinition, FilterQuery, Schema } from "mongoose"; -import { IWebinar, IUpdatedBy } from "../interfaces"; +import { IWebinar, IUpdatedBy } from "../../interfaces"; import WebinarModel from "../models/Webinar.model"; /** * Save a webinar in the database @@ -91,7 +91,6 @@ export const updateWebinar = async ( webinarData: DocumentDefinition, updatedBy: Schema.Types.ObjectId ) => { - return await WebinarModel.findById(webinarId) .then(async (webinarDetails) => { if (webinarDetails) { diff --git a/src/config/index.ts b/src/config/index.ts index 070b255..c1eb8e8 100644 --- a/src/config/index.ts +++ b/src/config/index.ts @@ -1,4 +1,4 @@ -import { IConfig } from "../api/interfaces"; +import { IConfig } from "../interfaces"; let configs: IConfig; const environment = process.env.NODE_ENV?.trim() as string; diff --git a/src/api/interfaces/IApplication.ts b/src/interfaces/IApplication.ts similarity index 100% rename from src/api/interfaces/IApplication.ts rename to src/interfaces/IApplication.ts diff --git a/src/api/interfaces/IBoardMember.ts b/src/interfaces/IBoardMember.ts similarity index 100% rename from src/api/interfaces/IBoardMember.ts rename to src/interfaces/IBoardMember.ts diff --git a/src/api/interfaces/IConfig.ts b/src/interfaces/IConfig.ts similarity index 100% rename from src/api/interfaces/IConfig.ts rename to src/interfaces/IConfig.ts diff --git a/src/api/interfaces/IContact.ts b/src/interfaces/IContact.ts similarity index 100% rename from src/api/interfaces/IContact.ts rename to src/interfaces/IContact.ts diff --git a/src/api/interfaces/IEvent.ts b/src/interfaces/IEvent.ts similarity index 100% rename from src/api/interfaces/IEvent.ts rename to src/interfaces/IEvent.ts diff --git a/src/api/interfaces/IExecutiveBoard.ts b/src/interfaces/IExecutiveBoard.ts similarity index 100% rename from src/api/interfaces/IExecutiveBoard.ts rename to src/interfaces/IExecutiveBoard.ts diff --git a/src/api/interfaces/IInterview.ts b/src/interfaces/IInterview.ts similarity index 100% rename from src/api/interfaces/IInterview.ts rename to src/interfaces/IInterview.ts diff --git a/src/api/interfaces/IOrganization.ts b/src/interfaces/IOrganization.ts similarity index 100% rename from src/api/interfaces/IOrganization.ts rename to src/interfaces/IOrganization.ts diff --git a/src/api/interfaces/ITopSpeaker.ts b/src/interfaces/ITopSpeaker.ts similarity index 100% rename from src/api/interfaces/ITopSpeaker.ts rename to src/interfaces/ITopSpeaker.ts diff --git a/src/api/interfaces/IUser.ts b/src/interfaces/IUser.ts similarity index 100% rename from src/api/interfaces/IUser.ts rename to src/interfaces/IUser.ts diff --git a/src/api/interfaces/IWebinar.ts b/src/interfaces/IWebinar.ts similarity index 100% rename from src/api/interfaces/IWebinar.ts rename to src/interfaces/IWebinar.ts diff --git a/src/api/interfaces/index.ts b/src/interfaces/index.ts similarity index 100% rename from src/api/interfaces/index.ts rename to src/interfaces/index.ts From 3dbdf422d13b29c6ad310821a2f8ef7ff8d40788 Mon Sep 17 00:00:00 2001 From: rusiruavb Date: Wed, 5 Jan 2022 01:19:00 +0530 Subject: [PATCH 5/9] Implement queue configs for email sending --- src/api/controllers/Application.controller.ts | 37 ++-------- src/api/controllers/Contact.controller.ts | 28 +------- src/api/services/Application.service.ts | 68 ++++++++++++++----- src/api/services/Contact.service.ts | 26 ++++++- src/config/index.ts | 4 +- src/email/Email.service.ts | 7 -- src/email/email.queue.ts | 32 --------- src/util/email.handler.ts | 21 +++++- src/util/queue.config.ts | 39 +++++++++++ 9 files changed, 141 insertions(+), 121 deletions(-) delete mode 100644 src/email/Email.service.ts delete mode 100644 src/email/email.queue.ts create mode 100644 src/util/queue.config.ts diff --git a/src/api/controllers/Application.controller.ts b/src/api/controllers/Application.controller.ts index 929e2a6..e31d421 100644 --- a/src/api/controllers/Application.controller.ts +++ b/src/api/controllers/Application.controller.ts @@ -1,9 +1,7 @@ import { Request, Response, NextFunction } from "express"; import ApplicationService from "../services"; -import EmailService from "../../util/email.handler"; -import logger from "../../util/logger"; -import { IApplication } from "../../interfaces"; -import { request } from "http"; +import { createChannel, publishMessageToQueue } from "../../util/queue.config"; +import { configs } from "../../config"; /** * @param {Request} request - Request from the frontend @@ -13,34 +11,9 @@ import { request } from "http"; */ export const addApplication = async (request: Request, response: Response, next: NextFunction) => { await ApplicationService.addApplication(request.body) - .then((data) => { - // Send email - const emailTemplate = "Application-Email-Template.html"; - const to = data.email; - const subject = "MS Club SLIIT - Application Received"; - const emailBodyData = { - studentId: data.studentId, - name: data.name, - email: data.email, - contactNumber: data.contactNumber, - currentAcademicYear: data.currentAcademicYear, - linkedIn: data.linkedIn, - gitHub: data.gitHub, - skillsAndTalents: data.skillsAndTalents, - }; - - EmailService.sendEmailWithTemplate(emailTemplate, to, subject, emailBodyData) - .then(() => { - request.handleResponse.successRespond(response)({ - applicationData: data, - }); - }) - .catch((error) => { - request.handleResponse.errorRespond(response)({ - message: error.message, - data: data, - }); - }); + .then(async (data) => { + request.handleResponse.successRespond(response)(data); + next(); }) .catch((error: any) => { request.handleResponse.errorRespond(response)(error.message); diff --git a/src/api/controllers/Contact.controller.ts b/src/api/controllers/Contact.controller.ts index d8491d7..d945dae 100644 --- a/src/api/controllers/Contact.controller.ts +++ b/src/api/controllers/Contact.controller.ts @@ -1,7 +1,5 @@ import { Request, Response, NextFunction } from "express"; import ContactService from "../services"; -import EmailService from "../../util/email.handler"; -import moment from "moment"; /** * @param {Request} request - Request from the frontend @@ -12,30 +10,8 @@ import moment from "moment"; export const createContact = async (request: Request, response: Response, next: NextFunction) => { await ContactService.insertContact(request.body) .then((data) => { - // Send email - const emailTemplate = "Contact-Us-Email-Template.html"; - const to = data.email; - const subject = "MS Club SLIIT - Contact Us"; - const emailBodyData = { - name: data.name, - email: data.email, - message: data.message, - date_time: moment(data.createdAt).format("LLL"), - }; - - EmailService.sendEmailWithTemplate(emailTemplate, to, subject, emailBodyData) - .then((emailData) => { - request.handleResponse.successRespond(response)({ - contactData: data, - emailData: emailData, - }); - }) - .catch((error) => { - request.handleResponse.errorRespond(response)({ - message: error.message, - data: data, - }); - }); + request.handleResponse.successRespond(response)(data); + next(); }) .catch((error: any) => { request.handleResponse.errorRespond(response)(error.message); diff --git a/src/api/services/Application.service.ts b/src/api/services/Application.service.ts index 269ac18..87b443d 100644 --- a/src/api/services/Application.service.ts +++ b/src/api/services/Application.service.ts @@ -1,7 +1,8 @@ import { DocumentDefinition, FilterQuery } from "mongoose"; -import EmailService from "../../util/email.handler"; import { IApplication, IInterview } from "../../interfaces"; import ApplicationModel from "../models/Application.model"; +import { createChannel, publishMessageToQueue } from "../../util/queue.config"; +import { configs } from "../../config"; /** * Application Service @@ -10,7 +11,32 @@ import ApplicationModel from "../models/Application.model"; */ export const addApplication = async (applicationData: DocumentDefinition) => { return await ApplicationModel.create(applicationData) - .then((application) => { + .then(async (application) => { + // Send email + const emailTemplate = "Application-Email-Template.html"; + const to = application.email; + const subject = "MS Club SLIIT - Application Received"; + const emailBodyData = { + studentId: application.studentId, + name: application.name, + email: application.email, + contactNumber: application.contactNumber, + currentAcademicYear: application.currentAcademicYear, + linkedIn: application.linkedIn, + gitHub: application.gitHub, + skillsAndTalents: application.skillsAndTalents, + }; + + const email = { + template: emailTemplate, + to: to, + subject: subject, + body: emailBodyData, + }; + + // Send email data to message queue + const channel = await createChannel(); + publishMessageToQueue(channel, configs.queue.emailService, JSON.stringify(email)); return application; }) .catch((error) => { @@ -91,14 +117,17 @@ export const changeApplicationStatusIntoInterview = async ( format: interviewData.format, }; - return await EmailService.sendEmailWithTemplate(emailTemplate, to, subject, emailBodyData) - .then(async () => { - application.status = "INTERVIEW"; - return await application.save(); - }) - .catch(() => { - return application; - }); + const email = { + template: emailTemplate, + to: to, + subject: subject, + body: emailBodyData, + }; + + // Send email data to message queue + const channel = await createChannel(); + publishMessageToQueue(channel, configs.queue.emailService, JSON.stringify(email)); + return application; } else { return null; } @@ -127,14 +156,17 @@ export const changeApplicationStatusIntoSelected = async ( name: application.name, }; - return await EmailService.sendEmailWithTemplate(emailTemplate, to, subject, emailBodyData) - .then(async () => { - application.status = "SELECTED"; - return await application.save(); - }) - .catch(() => { - return application; - }); + const email = { + template: emailTemplate, + to: to, + subject: subject, + body: emailBodyData, + }; + + // Send email data to message queue + const channel = await createChannel(); + publishMessageToQueue(channel, configs.queue.emailService, JSON.stringify(email)); + return application; } else { return null; } diff --git a/src/api/services/Contact.service.ts b/src/api/services/Contact.service.ts index b9e0695..1ee8632 100644 --- a/src/api/services/Contact.service.ts +++ b/src/api/services/Contact.service.ts @@ -1,6 +1,9 @@ import { DocumentDefinition } from "mongoose"; import { IContact } from "../../interfaces"; +import { createChannel, publishMessageToQueue } from "../../util/queue.config"; import ContactModel from "../models/Contact.model"; +import moment from "moment"; +import { configs } from "../../config"; /** * @param {IContact} contactData @@ -8,7 +11,28 @@ import ContactModel from "../models/Contact.model"; */ export const insertContact = async (contactData: DocumentDefinition) => { return await ContactModel.create(contactData) - .then((data) => { + .then(async (data) => { + // Send email + const emailTemplate = "Contact-Us-Email-Template.html"; + const to = data.email; + const subject = "MS Club SLIIT - Contact Us"; + const emailBodyData = { + name: data.name, + email: data.email, + message: data.message, + date_time: moment(data.createdAt).format("LLL"), + }; + + const email = { + template: emailTemplate, + to: to, + subject: subject, + body: emailBodyData, + }; + + // Send email data to message queue + const channel = await createChannel(); + publishMessageToQueue(channel, configs.queue.emailService, JSON.stringify(email)); return data; }) .catch((error) => { diff --git a/src/config/index.ts b/src/config/index.ts index c1eb8e8..e2fc310 100644 --- a/src/config/index.ts +++ b/src/config/index.ts @@ -41,7 +41,7 @@ if (environment == "Development") { emailTemplateBucket: process.env.EMAIL_TEMPLATE_BUCKET as string, }, queue: { - messageBrokerURL: process.env.MESSAGE_BROKER_URL as string, + messageBrokerURL: process.env.DEV_MESSAGE_BROKER_URL as string, exchangeName: process.env.EXCHANGE_NAME as string, emailService: process.env.EMAIL_SERVICE_NAME as string, emailQueue: process.env.EMAIL_QUEUE_NAME as string, @@ -88,7 +88,7 @@ if (environment == "Production") { emailTemplateBucket: process.env.EMAIL_TEMPLATE_BUCKET as string, }, queue: { - messageBrokerURL: process.env.MESSAGE_BROKER_URL as string, + messageBrokerURL: process.env.PROD_MESSAGE_BROKER_URL as string, exchangeName: process.env.EXCHANGE_NAME as string, emailService: process.env.EMAIL_SERVICE_NAME as string, emailQueue: process.env.EMAIL_QUEUE_NAME as string, diff --git a/src/email/Email.service.ts b/src/email/Email.service.ts deleted file mode 100644 index 8a573c9..0000000 --- a/src/email/Email.service.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { subscribeMessages } from "./email.queue"; -import Handlebars from "handlebars"; -import fs from "fs"; -import logger from "../util/logger"; -import moment from "moment"; -import fetch from "cross-fetch"; -import { Channel } from "amqplib"; diff --git a/src/email/email.queue.ts b/src/email/email.queue.ts deleted file mode 100644 index f5fee98..0000000 --- a/src/email/email.queue.ts +++ /dev/null @@ -1,32 +0,0 @@ -import amqp, { Channel } from "amqplib"; -import { configs } from "../config"; - -const messageBrokerURL = configs.queue.messageBrokerURL; -const exchangeName = configs.queue.exchangeName; -const emailService = configs.queue.emailService; -const emailQueue = configs.queue.emailQueue; - -// Create a channel -const createChannel = async () => { - try { - const connection = await amqp.connect(messageBrokerURL); - const channel = await connection.createChannel(); - await channel.assertExchange(exchangeName, "direct", { durable: false }); - return channel; - } catch (error) { - throw error; - } -}; - -// Subscribe to messages -const subscribeMessages = async (channel: Channel, service: any) => { - const serviceQueue = await channel.assertQueue(emailQueue); - channel.bindQueue(serviceQueue.queue, exchangeName, emailService); - channel.consume(serviceQueue.queue, (data) => { - if (data) { - // Call the service function - } - }); -}; - -export { createChannel, subscribeMessages }; diff --git a/src/util/email.handler.ts b/src/util/email.handler.ts index d4763cf..8ebfdad 100644 --- a/src/util/email.handler.ts +++ b/src/util/email.handler.ts @@ -4,6 +4,8 @@ import logger from "./logger"; import { configs } from "../config"; import moment from "moment"; import fetch from "cross-fetch"; +import { Channel } from "amqplib"; +import { subscribeMessages } from "./queue.config"; const cc = "senurajayadeva@gmail.com,Lasalshettiarachchi458@gmail.com,rusiruavbpersonal98@gmail.com,yasirurandika99@gmail.com"; @@ -20,15 +22,28 @@ let template: HandlebarsTemplateDelegate; let htmlToSend: string; class EmailService { - static sendEmailWithTemplate(fileName: string, to: string, subject: string, emailBodyData: any) { + channel: Channel; + + constructor(channel: Channel) { + this.channel = channel; + subscribeMessages(this.channel, this); + } + + sendEmailWithTemplate(data: any) { + console.log(data); + let fileName = data.email.template; + let to = data.email.to; + let subject = data.email.subject; + let emailBodyData = data.email.body; + return new Promise(async (resolve, reject) => { - this.getEmailTemplatePath(fileName) + EmailService.getEmailTemplatePath(fileName) .then((emailTemplate) => { if (emailTemplate) { template = handlebars.compile(emailTemplate); htmlToSend = template(emailBodyData); - this.retry( + EmailService.retry( 5, // Retry count function () { return EmailService.sendEmail(to, subject, htmlToSend) diff --git a/src/util/queue.config.ts b/src/util/queue.config.ts new file mode 100644 index 0000000..180c6c2 --- /dev/null +++ b/src/util/queue.config.ts @@ -0,0 +1,39 @@ +import amqp, { Channel } from "amqplib"; +import { configs } from "../config"; +import EmailService from "./email.handler"; + +// Create a channel +const createChannel = async () => { + try { + const connection = await amqp.connect(configs.queue.messageBrokerURL); + const channel = await connection.createChannel(); + await channel.assertExchange(configs.queue.exchangeName, "direct", { durable: false }); + return channel; + } catch (error) { + throw error; + } +}; + +// Publish the messages +const publishMessageToQueue = async (channel: Channel, bindingKey: string, message: any) => { + try { + await channel.publish(configs.queue.exchangeName, bindingKey, Buffer.from(JSON.stringify(message))); + } catch (error) { + throw error; + } +}; + +// Subscribe to messages +const subscribeMessages = async (channel: Channel, service: EmailService) => { + const serviceQueue = await channel.assertQueue(configs.queue.emailQueue); + channel.bindQueue(serviceQueue.queue, configs.queue.exchangeName, configs.queue.emailService); + channel.consume(serviceQueue.queue, (data) => { + if (data) { + const queueItem = JSON.parse(JSON.parse(data.content.toString())); + service.sendEmailWithTemplate(queueItem); + channel.ack(data); // Send acknowledgement to queue after consume the message + } + }); +}; + +export { createChannel, publishMessageToQueue, subscribeMessages }; From 27328c19812dd3be29d462866850f5f6117041de Mon Sep 17 00:00:00 2001 From: rusiruavb Date: Wed, 5 Jan 2022 19:11:24 +0530 Subject: [PATCH 6/9] Configure Husky and Prettier formatting --- .eslintignore | 5 + .eslintrc.json | 25 + .husky/pre-commit | 38 + .prettierignore | 5 + .prettierrc | 9 + package-lock.json | 727 +++++++++++++++++- package.json | 147 ++-- src/api/controllers/Application.controller.ts | 256 +++--- src/api/controllers/BoardMember.controller.ts | 135 ++-- src/api/services/Application.service.ts | 15 +- src/api/services/Contact.service.ts | 6 +- src/app.ts | 35 + src/util/queue.config.ts | 6 +- typings/express/index.d.ts | 58 +- 14 files changed, 1168 insertions(+), 299 deletions(-) create mode 100644 .eslintignore create mode 100644 .eslintrc.json create mode 100644 .husky/pre-commit create mode 100644 .prettierignore create mode 100644 .prettierrc diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..a7e5055 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,5 @@ +build +dist/* +.idea/* +.vscode +node_modules/* \ No newline at end of file diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..921619c --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,25 @@ +{ + "env": { + "es2021": true, + "node": true + }, + "extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended"], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "sourceType": "module" + }, + "plugins": ["@typescript-eslint"], + "rules": { + "indent": ["error", "tab"], + "linebreak-style": ["error", "windows"], + "quotes": ["error", "double"], + "semi": ["error", "always"], + "@typescript-eslint/no-explicit-any": "off", + "no-const-assign": "error", + "max-len": ["warn", { "code": 120, "ignoreUrls": true, "ignoreRegExpLiterals": true }], + "no-unused-vars": "error", + "no-console": "error", + "no-duplicate-imports": ["error", { "includeExports": true }], + "default-case": "error" + } +} diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 0000000..e740996 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,38 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +echo '🏗️👷 Hi, my name is Bob. I am responsible for styling, testing and building your project before commit' + +# Check Prettier standards +npm run check-format || +( + echo '🤢🤮 Prettier Check Failed. Your code styling not looking good. 🤢🤮 Run npm run format, add changes and try commit again.'; + false; +) + +# Check ESLint Standards +npm run check-lint || +( + echo '😤🏀 ESLint Check Failed. Your code may have some linting issues. 👋😤 Make the required changes listed above, add changes and try to commit again.' + false; +) + +# Check tsconfig standards +npm run check-types || +( + echo '❌❌ Failed Type check. ❌❌ Are you seriously trying to write that? Make the changes required above.' + false; +) + +# If everything passes... Now we can commit +echo '🤔🤔 Alright.... Code looks good to me... Trying to build now. 🤔🤔' + +npm run build || +( + echo '🔨❌ Better call Bob... Because your build failed 🔨❌ Next build failed: View the errors above to see why.' + false; +) + +# If everything passes... Now we can commit +echo '✅✅ You win this time... I am committing this now. ✅✅' + diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..a7e5055 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,5 @@ +build +dist/* +.idea/* +.vscode +node_modules/* \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..92b8409 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,9 @@ +{ + "trailingComma": "es5", + "tabWidth": 2, + "useTabs": true, + "semi": true, + "singleQuote": false, + "printWidth": 120, + "arrowParens": "always" +} diff --git a/package-lock.json b/package-lock.json index 9e27e2b..76de1ee 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,6 +19,52 @@ "@cspotcode/source-map-consumer": "0.8.0" } }, + "@eslint/eslintrc": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", + "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.2.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + } + } + }, "@firebase/analytics": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.7.4.tgz", @@ -685,6 +731,40 @@ "yargs": "^16.1.1" } }, + "@humanwhocodes/config-array": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz", + "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -968,6 +1048,12 @@ "@types/node": "*" } }, + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, "@types/jsonwebtoken": { "version": "8.5.6", "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.6.tgz", @@ -1087,6 +1173,219 @@ "@types/webidl-conversions": "*" } }, + "@typescript-eslint/eslint-plugin": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.9.0.tgz", + "integrity": "sha512-qT4lr2jysDQBQOPsCCvpPUZHjbABoTJW8V9ZzIYKHMfppJtpdtzszDYsldwhFxlhvrp7aCHeXD1Lb9M1zhwWwQ==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "5.9.0", + "@typescript-eslint/scope-manager": "5.9.0", + "@typescript-eslint/type-utils": "5.9.0", + "debug": "^4.3.2", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.1.8", + "regexpp": "^3.2.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/experimental-utils": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.9.0.tgz", + "integrity": "sha512-ZnLVjBrf26dn7ElyaSKa6uDhqwvAi4jBBmHK1VxuFGPRAxhdi18ubQYSGA7SRiFiES3q9JiBOBHEBStOFkwD2g==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.9.0", + "@typescript-eslint/types": "5.9.0", + "@typescript-eslint/typescript-estree": "5.9.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "dependencies": { + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + } + } + }, + "@typescript-eslint/parser": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.9.0.tgz", + "integrity": "sha512-/6pOPz8yAxEt4PLzgbFRDpZmHnXCeZgPDrh/1DaVKOjvn/UPMlWhbx/gA96xRi2JxY1kBl2AmwVbyROUqys5xQ==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.9.0", + "@typescript-eslint/types": "5.9.0", + "@typescript-eslint/typescript-estree": "5.9.0", + "debug": "^4.3.2" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.9.0.tgz", + "integrity": "sha512-DKtdIL49Qxk2a8icF6whRk7uThuVz4A6TCXfjdJSwOsf+9ree7vgQWcx0KOyCdk0i9ETX666p4aMhrRhxhUkyg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.9.0", + "@typescript-eslint/visitor-keys": "5.9.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.9.0.tgz", + "integrity": "sha512-uVCb9dJXpBrK1071ri5aEW7ZHdDHAiqEjYznF3HSSvAJXyrkxGOw2Ejibz/q6BXdT8lea8CMI0CzKNFTNI6TEQ==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "5.9.0", + "debug": "^4.3.2", + "tsutils": "^3.21.0" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@typescript-eslint/types": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.9.0.tgz", + "integrity": "sha512-mWp6/b56Umo1rwyGCk8fPIzb9Migo8YOniBGPAQDNC6C52SeyNGN4gsVwQTAR+RS2L5xyajON4hOLwAGwPtUwg==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.9.0.tgz", + "integrity": "sha512-kxo3xL2mB7XmiVZcECbaDwYCt3qFXz99tBSuVJR4L/sR7CJ+UNAPrYILILktGj1ppfZ/jNt/cWYbziJUlHl1Pw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.9.0", + "@typescript-eslint/visitor-keys": "5.9.0", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.9.0.tgz", + "integrity": "sha512-6zq0mb7LV0ThExKlecvpfepiB+XEtFv/bzx7/jKSgyXTFD7qjmSu1FoiS0x3OZaiS+UIXpH2vd9O89f02RCtgw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.9.0", + "eslint-visitor-keys": "^3.0.0" + } + }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -1117,6 +1416,12 @@ "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==", "dev": true }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true + }, "acorn-walk": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", @@ -1210,6 +1515,12 @@ "string-width": "^4.1.0" } }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -1282,6 +1593,12 @@ "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "args": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/args/-/args-5.0.1.tgz", @@ -1607,6 +1924,12 @@ } } }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, "camelcase": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.1.tgz", @@ -1958,6 +2281,12 @@ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, "deepmerge": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", @@ -2022,6 +2351,15 @@ "path-type": "^4.0.0" } }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, "dot-prop": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", @@ -2093,6 +2431,15 @@ "once": "^1.4.0" } }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, "ent": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", @@ -2129,6 +2476,193 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, + "eslint": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.6.0.tgz", + "integrity": "sha512-UvxdOJ7mXFlw7iuHZA4jmzPaUqIw54mZrv+XPYKNbKdLR0et4rf60lIZUU9kiNtnzzMzGWxMV+tQ7uG7JG8DPw==", + "dev": true, + "requires": { + "@eslint/eslintrc": "^1.0.5", + "@humanwhocodes/config-array": "^0.9.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.0", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.1.0", + "espree": "^9.3.0", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.2.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + } + } + }, + "eslint-config-prettier": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", + "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", + "dev": true + }, + "eslint-scope": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", + "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", + "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", + "dev": true + }, + "espree": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz", + "integrity": "sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==", + "dev": true, + "requires": { + "acorn": "^8.7.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^3.1.0" + }, + "dependencies": { + "acorn": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "dev": true + } + } + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -2214,6 +2748,12 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, "fast-redact": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.0.2.tgz", @@ -2259,6 +2799,15 @@ "web-streams-polyfill": "^3.0.3" } }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, "file-type": { "version": "12.4.2", "resolved": "https://registry.npmjs.org/file-type/-/file-type-12.4.2.tgz", @@ -2336,6 +2885,22 @@ "node-forge": "^0.10.0" } }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", + "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", + "dev": true + }, "follow-redirects": { "version": "1.14.6", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.6.tgz", @@ -2395,8 +2960,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true, - "optional": true + "dev": true }, "gauge": { "version": "2.7.4", @@ -2575,6 +3139,15 @@ "ini": "2.0.0" } }, + "globals": { + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", + "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, "globby": { "version": "10.0.2", "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", @@ -2892,6 +3465,12 @@ } } }, + "husky": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/husky/-/husky-7.0.4.tgz", + "integrity": "sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ==", + "dev": true + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -2940,6 +3519,16 @@ "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, "import-lazy": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", @@ -3109,6 +3698,15 @@ "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.0.1.tgz", "integrity": "sha512-SJcJNBg32dGgxhPtM0wQqxqV0ax9k/9TaUskGDSJkSFSQOEWWvQ3zzWdGQRIUry2j1zA5+ReH13t0Mf3StuVZA==" }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", @@ -3139,6 +3737,12 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -3296,6 +3900,16 @@ "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=" }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, "lie": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", @@ -3351,6 +3965,12 @@ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, "lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", @@ -3617,6 +4237,12 @@ "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", @@ -3850,6 +4476,20 @@ "wrappy": "1" } }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, "p-cancelable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", @@ -3895,6 +4535,15 @@ "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -4008,17 +4657,35 @@ "tunnel-agent": "^0.6.0" } }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, "prepend-http": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", "dev": true }, + "prettier": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz", + "integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==", + "dev": true + }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, "promise-polyfill": { "version": "8.1.3", "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.1.3.tgz", @@ -4197,6 +4864,12 @@ "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz", "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==" }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, "registry-auth-token": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", @@ -4279,6 +4952,12 @@ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, "responselike": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", @@ -4771,6 +5450,12 @@ } } }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, "thread-stream": { "version": "0.13.0", "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-0.13.0.tgz", @@ -4857,6 +5542,23 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -4870,6 +5572,15 @@ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, "type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -5006,6 +5717,12 @@ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, "validator": { "version": "13.7.0", "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", @@ -5097,6 +5814,12 @@ "string-width": "^4.0.0" } }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", diff --git a/package.json b/package.json index 905fa01..9006808 100644 --- a/package.json +++ b/package.json @@ -1,70 +1,81 @@ { - "name": "msclubwebserver", - "version": "1.0.0", - "description": "MS Club Web Site Server", - "main": "app.js", - "scripts": { - "start": "node build/app.js", - "dev:server": "cross-env NODE_ENV=Development nodemon src/app.ts", - "prod:server": "cross-env NODE_ENV=Production nodemon src/app.ts", - "build": "tsc -p .", - "build:docker": "docker build -t ghcr.io/ms-club-sliit/msclubwebserver ." - }, - "keywords": [ - "nodejs", - "typescript", - "express" - ], - "author": "MS CLUB SLIIT", - "license": "ISC", - "dependencies": { - "@sendgrid/mail": "^7.6.0", - "@types/bcrypt": "^5.0.0", - "@types/bcryptjs": "^2.4.2", - "@types/cors": "^2.8.12", - "@types/firebase": "^3.2.1", - "@types/handlebars": "^4.1.0", - "@types/imagemin": "^7.0.1", - "@types/jsonwebtoken": "^8.5.6", - "@types/mongoose": "^5.11.97", - "@types/multer": "^1.4.7", - "@types/nodemailer": "^6.4.4", - "@types/sharp": "^0.29.4", - "@types/uuid": "^8.3.3", - "@types/validator": "^13.7.0", - "amqplib": "^0.8.0", - "bcryptjs": "^2.4.3", - "body-parser": "^1.19.0", - "cors": "^2.8.5", - "cross-fetch": "^3.1.4", - "dayjs": "^1.10.7", - "dotenv": "^10.0.0", - "env-cmd": "^10.1.0", - "express": "^4.17.1", - "firebase": "^9.5.0", - "imagemin": "^7.0.1", - "is-jpg": "^3.0.0", - "jsonwebtoken": "^8.5.1", - "moment": "^2.29.1", - "multer": "^1.4.3", - "node-fetch": "^3.1.0", - "nodemailer": "^6.7.2", - "nodemailer-sendgrid": "^1.0.3", - "pino": "^7.4.0", - "pino-pretty": "^7.2.0", - "sharp": "^0.29.3", - "validator": "^13.7.0" - }, - "devDependencies": { - "@google-cloud/storage": "^5.16.0", - "@types/amqplib": "^0.8.2", - "@types/express": "^4.17.13", - "@types/node": "^16.11.9", - "cross-env": "^7.0.3", - "firebase-admin": "^10.0.0", - "nodemon": "^2.0.15", - "ts-node": "^10.4.0", - "typescript": "^4.5.2", - "uuid": "^8.3.2" - } + "name": "msclubwebserver", + "version": "1.0.0", + "description": "MS Club Web Site Server", + "main": "app.js", + "scripts": { + "start": "node build/app.js", + "dev:server": "cross-env NODE_ENV=Development nodemon src/app.ts", + "prod:server": "cross-env NODE_ENV=Production nodemon src/app.ts", + "build": "tsc -p .", + "build:docker": "docker build -t ghcr.io/ms-club-sliit/msclubwebserver .", + "prepare": "husky install", + "check-types": "tsc --pretty --noEmit", + "check-format": "prettier --check .", + "check-lint": "eslint . --ext ts --ext tsx --ext js", + "format": "prettier --write ." + }, + "keywords": [ + "nodejs", + "typescript", + "express" + ], + "author": "MS CLUB SLIIT", + "license": "ISC", + "dependencies": { + "@sendgrid/mail": "^7.6.0", + "@types/bcrypt": "^5.0.0", + "@types/bcryptjs": "^2.4.2", + "@types/cors": "^2.8.12", + "@types/firebase": "^3.2.1", + "@types/handlebars": "^4.1.0", + "@types/imagemin": "^7.0.1", + "@types/jsonwebtoken": "^8.5.6", + "@types/mongoose": "^5.11.97", + "@types/multer": "^1.4.7", + "@types/nodemailer": "^6.4.4", + "@types/sharp": "^0.29.4", + "@types/uuid": "^8.3.3", + "@types/validator": "^13.7.0", + "amqplib": "^0.8.0", + "bcryptjs": "^2.4.3", + "body-parser": "^1.19.0", + "cors": "^2.8.5", + "cross-fetch": "^3.1.4", + "dayjs": "^1.10.7", + "dotenv": "^10.0.0", + "env-cmd": "^10.1.0", + "express": "^4.17.1", + "firebase": "^9.5.0", + "imagemin": "^7.0.1", + "is-jpg": "^3.0.0", + "jsonwebtoken": "^8.5.1", + "moment": "^2.29.1", + "multer": "^1.4.3", + "node-fetch": "^3.1.0", + "nodemailer": "^6.7.2", + "nodemailer-sendgrid": "^1.0.3", + "pino": "^7.4.0", + "pino-pretty": "^7.2.0", + "sharp": "^0.29.3", + "validator": "^13.7.0" + }, + "devDependencies": { + "@google-cloud/storage": "^5.16.0", + "@types/amqplib": "^0.8.2", + "@types/express": "^4.17.13", + "@types/node": "^16.11.9", + "@typescript-eslint/eslint-plugin": "^5.9.0", + "@typescript-eslint/parser": "^5.9.0", + "cross-env": "^7.0.3", + "eslint": "^8.6.0", + "eslint-config-prettier": "^8.3.0", + "firebase-admin": "^10.0.0", + "husky": "^7.0.0", + "nodemon": "^2.0.15", + "prettier": "^2.5.1", + "ts-node": "^10.4.0", + "typescript": "^4.5.2", + "uuid": "^8.3.2" + } } diff --git a/src/api/controllers/Application.controller.ts b/src/api/controllers/Application.controller.ts index e31d421..49ec3cd 100644 --- a/src/api/controllers/Application.controller.ts +++ b/src/api/controllers/Application.controller.ts @@ -1,7 +1,5 @@ import { Request, Response, NextFunction } from "express"; import ApplicationService from "../services"; -import { createChannel, publishMessageToQueue } from "../../util/queue.config"; -import { configs } from "../../config"; /** * @param {Request} request - Request from the frontend @@ -10,15 +8,15 @@ import { configs } from "../../config"; * @returns {IApplication} - New application document */ export const addApplication = async (request: Request, response: Response, next: NextFunction) => { - await ApplicationService.addApplication(request.body) - .then(async (data) => { - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error: any) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); + await ApplicationService.addApplication(request.body) + .then(async (data) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); }; /** @@ -28,20 +26,20 @@ export const addApplication = async (request: Request, response: Response, next: * @returns {IApplication} - Application document that relevent to the passed ID */ export const getApplicationById = async (request: Request, response: Response, next: NextFunction) => { - const applicationId = request.params.applicationId; - if (applicationId) { - await ApplicationService.fetchApplicationById(applicationId) - .then((data) => { - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error: any) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); - } else { - request.handleResponse.errorRespond(response)("applicationId not found"); - } + const { applicationId } = request.params; + if (applicationId) { + await ApplicationService.fetchApplicationById(applicationId) + .then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); + } else { + request.handleResponse.errorRespond(response)("applicationId not found"); + } }; /** @@ -51,15 +49,15 @@ export const getApplicationById = async (request: Request, response: Response, n * @returns {IApplication} - All application documents */ export const getApplications = async (request: Request, response: Response, next: NextFunction) => { - await ApplicationService.fetchApplications() - .then((data) => { - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error: any) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); + await ApplicationService.fetchApplications() + .then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); }; /** @@ -69,20 +67,20 @@ export const getApplications = async (request: Request, response: Response, next * @returns {IApplication} - Updated application document */ export const setApplicationArchive = async (request: Request, response: Response, next: NextFunction) => { - const applicationId = request.params.applicationId; - if (applicationId) { - await ApplicationService.archiveApplication(applicationId) - .then((data) => { - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error: any) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); - } else { - request.handleResponse.errorRespond(response)("applicationId not found"); - } + const { applicationId } = request.params; + if (applicationId) { + await ApplicationService.archiveApplication(applicationId) + .then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); + } else { + request.handleResponse.errorRespond(response)("applicationId not found"); + } }; /** @@ -95,24 +93,24 @@ export const setApplicationArchive = async (request: Request, response: Response * @returns {IApplication} updated application document in the system */ export const changeApplicationStatusIntoInterview = async ( - request: Request, - response: Response, - next: NextFunction + request: Request, + response: Response, + next: NextFunction ) => { - const applicationId = request.params.applicationId; - if (applicationId) { - await ApplicationService.changeApplicationStatusIntoInterview(applicationId, request.body) - .then((data) => { - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error: any) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); - } else { - request.handleResponse.errorRespond(response)("applicationId not found"); - } + const { applicationId } = request.params; + if (applicationId) { + await ApplicationService.changeApplicationStatusIntoInterview(applicationId, request.body) + .then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); + } else { + request.handleResponse.errorRespond(response)("applicationId not found"); + } }; /** @@ -125,20 +123,20 @@ export const changeApplicationStatusIntoInterview = async ( * @returns {IApplication} updated application document in the system */ export const changeApplicationStatusIntoSelected = async (request: Request, response: Response, next: NextFunction) => { - const applicationId = request.params.applicationId; - if (applicationId) { - await ApplicationService.changeApplicationStatusIntoSelected(applicationId, request.body) - .then((data) => { - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error: any) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); - } else { - request.handleResponse.errorRespond(response)("applicationId not found"); - } + const { applicationId } = request.params; + if (applicationId) { + await ApplicationService.changeApplicationStatusIntoSelected(applicationId, request.body) + .then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); + } else { + request.handleResponse.errorRespond(response)("applicationId not found"); + } }; /** * @todo implement a @function changeApplicationStatusIntoRejected that calls @@ -150,20 +148,20 @@ export const changeApplicationStatusIntoSelected = async (request: Request, resp * @returns {IApplication} updated application document in the system */ export const changeApplicationStatusIntoRejected = async (request: Request, response: Response, next: NextFunction) => { - const applicationId = request.params.applicationId; - if (applicationId) { - await ApplicationService.changeApplicationStatusIntoRejected(applicationId) - .then((data) => { - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error: any) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); - } else { - request.handleResponse.errorRespond(response)("applicationId not found"); - } + const { applicationId } = request.params; + if (applicationId) { + await ApplicationService.changeApplicationStatusIntoRejected(applicationId) + .then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); + } else { + request.handleResponse.errorRespond(response)("applicationId not found"); + } }; /** @@ -176,15 +174,15 @@ export const changeApplicationStatusIntoRejected = async (request: Request, resp * @returns {IApplication} fetched pending applications */ export const fetchPendingApplications = async (request: Request, response: Response, next: NextFunction) => { - await ApplicationService.fetchPendingApplications() - .then((data: any) => { - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error: any) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); + await ApplicationService.fetchPendingApplications() + .then((data: any) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); }; /** * @function fetchSelectedApplications that calls @@ -196,15 +194,15 @@ export const fetchPendingApplications = async (request: Request, response: Respo * @returns {IApplication} fetched selected applications */ export const fetchSelectedApplications = async (request: Request, response: Response, next: NextFunction) => { - await ApplicationService.fetchSelectedApplications() - .then((data) => { - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error: any) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); + await ApplicationService.fetchSelectedApplications() + .then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); }; /** * @function fetchInterviewApplications that calls @@ -216,15 +214,15 @@ export const fetchSelectedApplications = async (request: Request, response: Resp * @returns {IApplication} fetched interview applications */ export const fetchInterviewApplications = async (request: Request, response: Response, next: NextFunction) => { - await ApplicationService.fetchInterviewApplications() - .then((data) => { - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error: any) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); + await ApplicationService.fetchInterviewApplications() + .then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); }; /** @@ -238,13 +236,13 @@ export const fetchInterviewApplications = async (request: Request, response: Res */ export const fetchRejectedApplications = async (request: Request, response: Response, next: NextFunction) => { - await ApplicationService.fetchRejectedApplications() - .then((data) => { - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error: any) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); + await ApplicationService.fetchRejectedApplications() + .then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); }; diff --git a/src/api/controllers/BoardMember.controller.ts b/src/api/controllers/BoardMember.controller.ts index f1ea124..e5570c2 100644 --- a/src/api/controllers/BoardMember.controller.ts +++ b/src/api/controllers/BoardMember.controller.ts @@ -1,6 +1,5 @@ -import { Express, Request, Response, NextFunction } from "express"; +import { Request, Response, NextFunction } from "express"; import BoardMemberService from "../services"; -import logger from "../../util/logger"; import ImageService from "../../util/image.handler"; /** @@ -10,20 +9,20 @@ import ImageService from "../../util/image.handler"; * @returns boardMember */ export const getBoardMemberbyID = async (request: Request, response: Response, next: NextFunction) => { - const boardMemberId = request.params.boardMemberId; - if (boardMemberId) { - await BoardMemberService.getBoardMemberbyID(request.params.boardMemberId) - .then((data) => { - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error: any) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); - } else { - request.handleResponse.errorRespond(response)("Board Member ID not found"); - } + const boardMemberId = request.params.boardMemberId; + if (boardMemberId) { + await BoardMemberService.getBoardMemberbyID(request.params.boardMemberId) + .then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); + } else { + request.handleResponse.errorRespond(response)("Board Member ID not found"); + } }; /** * @param {Request} request - Request from the frontend @@ -32,15 +31,15 @@ export const getBoardMemberbyID = async (request: Request, response: Response, n * @returns boardMember[] */ export const getAllBoardMembers = async (request: Request, response: Response, next: NextFunction) => { - await BoardMemberService.getAllBoardMembers() - .then((data) => { - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error: any) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); + await BoardMemberService.getAllBoardMembers() + .then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); }; /** * @param {Request} request - Request from the frontend @@ -48,40 +47,29 @@ export const getAllBoardMembers = async (request: Request, response: Response, n * @param {NextFunction} next - Next function * @returns updated boardMember */ -export const updateBoardMemberDetails = async ( - request: Request, - response: Response, - next: NextFunction -) => { - if (request.file) { - const bucketDirectoryName = "boardmember-flyers"; +export const updateBoardMemberDetails = async (request: Request, response: Response, next: NextFunction) => { + if (request.file) { + const bucketDirectoryName = "boardmember-flyers"; - const boardMemberFlyerPath = await ImageService.uploadImage( - request.file, - bucketDirectoryName - ); - request.body.imageUrl = boardMemberFlyerPath; - } - const boardMemberId = request.params.boardMemberId; - const updatedBy = request.user && request.user._id ? request.user._id : null; + const boardMemberFlyerPath = await ImageService.uploadImage(request.file, bucketDirectoryName); + request.body.imageUrl = boardMemberFlyerPath; + } + const boardMemberId = request.params.boardMemberId; + const updatedBy = request.user && request.user._id ? request.user._id : null; - if (boardMemberId) { - await BoardMemberService.updateBoardMemberDetails( - request.params.boardMemberId, - request.body, - updatedBy - ) - .then((data) => { - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error: any) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); - } else { - request.handleResponse.errorRespond(response)("Board Member ID not found"); - } + if (boardMemberId) { + await BoardMemberService.updateBoardMemberDetails(request.params.boardMemberId, request.body, updatedBy) + .then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); + } else { + request.handleResponse.errorRespond(response)("Board Member ID not found"); + } }; /** * @param {Request} request - Request from the frontend @@ -90,23 +78,20 @@ export const updateBoardMemberDetails = async ( * @returns updated boardMember */ export const deleteBoardMemberDetails = async (request: Request, response: Response, next: NextFunction) => { - const boardMemberId = request.params.boardMemberId; - const deletedBy = request.user && request.user._id ? request.user._id : null; + const boardMemberId = request.params.boardMemberId; + const deletedBy = request.user && request.user._id ? request.user._id : null; - if (boardMemberId) { - await BoardMemberService.deleteBoardMemberDetails( - request.params.boardMemberId, - deletedBy - ) - .then((data) => { - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error: any) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); - } else { - request.handleResponse.errorRespond(response)("Board Member ID not found"); - } + if (boardMemberId) { + await BoardMemberService.deleteBoardMemberDetails(request.params.boardMemberId, deletedBy) + .then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); + } else { + request.handleResponse.errorRespond(response)("Board Member ID not found"); + } }; diff --git a/src/api/services/Application.service.ts b/src/api/services/Application.service.ts index 87b443d..20fe031 100644 --- a/src/api/services/Application.service.ts +++ b/src/api/services/Application.service.ts @@ -1,8 +1,8 @@ import { DocumentDefinition, FilterQuery } from "mongoose"; import { IApplication, IInterview } from "../../interfaces"; import ApplicationModel from "../models/Application.model"; -import { createChannel, publishMessageToQueue } from "../../util/queue.config"; import { configs } from "../../config"; +import { request } from "express"; /** * Application Service @@ -35,8 +35,9 @@ export const addApplication = async (applicationData: DocumentDefinition { @@ -125,8 +126,8 @@ export const changeApplicationStatusIntoInterview = async ( }; // Send email data to message queue - const channel = await createChannel(); - publishMessageToQueue(channel, configs.queue.emailService, JSON.stringify(email)); + const channel = request.channel; + request.queue.publishMessage(channel, configs.queue.emailService, JSON.stringify(email)); return application; } else { return null; @@ -164,8 +165,8 @@ export const changeApplicationStatusIntoSelected = async ( }; // Send email data to message queue - const channel = await createChannel(); - publishMessageToQueue(channel, configs.queue.emailService, JSON.stringify(email)); + const channel = request.channel; + request.queue.publishMessage(channel, configs.queue.emailService, JSON.stringify(email)); return application; } else { return null; diff --git a/src/api/services/Contact.service.ts b/src/api/services/Contact.service.ts index 1ee8632..d073ab8 100644 --- a/src/api/services/Contact.service.ts +++ b/src/api/services/Contact.service.ts @@ -1,9 +1,9 @@ import { DocumentDefinition } from "mongoose"; import { IContact } from "../../interfaces"; -import { createChannel, publishMessageToQueue } from "../../util/queue.config"; import ContactModel from "../models/Contact.model"; import moment from "moment"; import { configs } from "../../config"; +import { request } from "express"; /** * @param {IContact} contactData @@ -31,8 +31,8 @@ export const insertContact = async (contactData: DocumentDefinition) = }; // Send email data to message queue - const channel = await createChannel(); - publishMessageToQueue(channel, configs.queue.emailService, JSON.stringify(email)); + const channel = request.channel; + request.queue.publishMessage(channel, configs.queue.emailService, JSON.stringify(email)); return data; }) .catch((error) => { diff --git a/src/app.ts b/src/app.ts index 7be42b3..955192b 100644 --- a/src/app.ts +++ b/src/app.ts @@ -6,8 +6,13 @@ import responseHandler from "./util/response.handler"; import routes from "./api/routes"; import { configs } from "./config"; import connect from "./util/database.connection"; +import amqp from "amqplib"; +import { createChannel } from "./util/queue.config"; export const app: Express = express(); +const channel = createChannel().then((channelData) => { + return channelData; +}); const PORT: string = configs.port; const ENVIRONMENT = configs.environment; const MONGO_URI = configs.mongodb.uri; @@ -23,6 +28,36 @@ app.use((req: Request, res: Response, next: NextFunction) => { next(); }); +// Create and Inject the message queue +app.use((req: Request, res: Response, next: NextFunction) => { + try { + // Create the channel + amqp + .connect(configs.queue.messageBrokerURL) + .then((connection) => { + connection + .createChannel() + .then((channel) => { + channel.assertExchange(configs.queue.exchangeName, "direct", { durable: false }); + + // Add channel as request property + console.log("Test", req.channel); + req.channel = channel; + next(); + }) + .catch((channelError) => { + logger.error(`Channel Error: ${channelError.message}`); + }); + }) + .catch((connectionError: any) => { + logger.error(`Connection Error: ${connectionError.message}`); + }); + } catch (error: any) { + console.log("Error"); + logger.error(error.message); + } +}); + // Root API Call app.get("/", (req: Request, res: Response, next: NextFunction) => { res.send("

MS CLUB SLIIT Web API

"); diff --git a/src/util/queue.config.ts b/src/util/queue.config.ts index 180c6c2..cb06ab2 100644 --- a/src/util/queue.config.ts +++ b/src/util/queue.config.ts @@ -15,7 +15,7 @@ const createChannel = async () => { }; // Publish the messages -const publishMessageToQueue = async (channel: Channel, bindingKey: string, message: any) => { +const publishMessage = async (channel: Channel, bindingKey: string, message: any) => { try { await channel.publish(configs.queue.exchangeName, bindingKey, Buffer.from(JSON.stringify(message))); } catch (error) { @@ -24,7 +24,7 @@ const publishMessageToQueue = async (channel: Channel, bindingKey: string, messa }; // Subscribe to messages -const subscribeMessages = async (channel: Channel, service: EmailService) => { +const subscribeMessages = async (channel: Channel, service: any) => { const serviceQueue = await channel.assertQueue(configs.queue.emailQueue); channel.bindQueue(serviceQueue.queue, configs.queue.exchangeName, configs.queue.emailService); channel.consume(serviceQueue.queue, (data) => { @@ -36,4 +36,4 @@ const subscribeMessages = async (channel: Channel, service: EmailService) => { }); }; -export { createChannel, publishMessageToQueue, subscribeMessages }; +export { createChannel, publishMessage, subscribeMessages }; diff --git a/typings/express/index.d.ts b/typings/express/index.d.ts index 49e4d8e..c9cf359 100644 --- a/typings/express/index.d.ts +++ b/typings/express/index.d.ts @@ -1,12 +1,46 @@ -declare module Express { - export interface Request { - handleResponse: { - successRespond(response: Response):(data: any) => Response; - notFoundRespond(response: Response):(data: any) => Response; - errorRespond(response: Response):(error: any) => Response; - unauthorizedRespond(response: Response):(data: any) => Response; - }; - authToken: any; - user: any; - }; -} \ No newline at end of file +import { Channel } from "amqplib"; +declare global { + namespace Express { + interface Request { + handleResponse: { + successRespond(response: Response): (data: any) => Response; + notFoundRespond(response: Response): (data: any) => Response; + errorRespond(response: Response): (error: any) => Response; + unauthorizedRespond(response: Response): (data: any) => Response; + }; + queue: { + /** + * Publish messages to the queue. This function wil take 3 parameters. + * @param channel - RabbitMQ Channel + * @param bindingKey - Binding key to bind the messages to the queue + * @param message - Actual message data that add to the queue + * @example + * let channel = request.queue.channel; + * let bindingKey = configs.queue.emailService; + * let message = { + * template: "Email-Template.html", + * body: "Email template to queue" + * }; + * + * request.queue.publishMessage(channel, bindingKey, message); + */ + publishMessage(channel: Channel, bindingKey: string, message: any): Promise; + + /** + * Consume the messages that are published to the message queue. The function will take 3 parameters. + * @param channel - RabbitMQ Channel + * @param service - Class name of the service + * @example + * let channel = request.queue.channel; + * let emailService = new EmailService(); + * + * request.queue.subscribeMessages(channel, emailService); + */ + subscribeMessages(channel: Channel, service: EmailService): Promise; + }; + authToken: any; + user: any; + channel: Channel; + } + } +} From 645b5b3ef237b2b43f6cacaf8e5c46ca14e5620e Mon Sep 17 00:00:00 2001 From: rusiruavb Date: Wed, 5 Jan 2022 19:12:36 +0530 Subject: [PATCH 7/9] Fix code linting issues --- .eslintrc.json | 3 +- .github/templates/ISSUE_TEMPLATE.md | 5 +- .github/templates/PR_TEMPLATE.md | 2 +- .github/workflows/docker-image.yml | 28 +- .github/workflows/node-build.yml | 28 +- .prettierrc | 14 +- README.md | 59 +- package-lock.json | 11822 ++++++++-------- src/api/controllers/Application.controller.ts | 2 +- src/api/controllers/Contact.controller.ts | 50 +- src/api/controllers/Event.controller.ts | 254 +- .../controllers/ExecutiveBoard.controller.ts | 232 +- .../controllers/Organization.controller.ts | 92 +- src/api/controllers/TopSpeaker.controller.ts | 162 +- src/api/controllers/User.controller.ts | 246 +- src/api/controllers/Webinar.controller.ts | 279 +- src/api/controllers/index.ts | 270 +- src/api/middleware/Auth.middleware.ts | 54 +- src/api/middleware/index.ts | 4 +- src/api/models/Application.model.ts | 50 +- src/api/models/BoardMember.model.ts | 46 +- src/api/models/Contact.model.ts | 52 +- src/api/models/Event.model.ts | 50 +- src/api/models/ExecutiveBoard.model.ts | 32 +- src/api/models/Organization.model.ts | 36 +- src/api/models/TopSpeaker.model.ts | 54 +- src/api/models/User.model.ts | 154 +- src/api/models/Webinar.model.ts | 50 +- src/api/routes/index.ts | 22 +- src/api/services/Application.service.ts | 321 +- src/api/services/BoardMember.service.ts | 174 +- src/api/services/Contact.service.ts | 90 +- src/api/services/Event.service.ts | 324 +- src/api/services/ExecutiveBoard.service.ts | 175 +- src/api/services/Organization.service.ts | 132 +- src/api/services/TopSpeaker.service.ts | 252 +- src/api/services/User.service.ts | 217 +- src/api/services/Webinar.service.ts | 278 +- src/api/services/index.ts | 269 +- src/app.ts | 76 +- src/config/index.ts | 176 +- src/config/storage.config.ts | 10 +- src/interfaces/IApplication.ts | 40 +- src/interfaces/IBoardMember.ts | 28 +- src/interfaces/IConfig.ts | 84 +- src/interfaces/IContact.ts | 16 +- src/interfaces/IEvent.ts | 32 +- src/interfaces/IExecutiveBoard.ts | 18 +- src/interfaces/IInterview.ts | 14 +- src/interfaces/IOrganization.ts | 16 +- src/interfaces/ITopSpeaker.ts | 32 +- src/interfaces/IUser.ts | 49 +- src/interfaces/IWebinar.ts | 28 +- src/interfaces/index.ts | 28 +- src/templates/Email-Template.html | 391 +- src/util/database.connection.ts | 34 +- src/util/email.handler.ts | 188 +- src/util/image.handler.ts | 55 +- src/util/logger.ts | 16 +- src/util/queue.config.ts | 37 +- src/util/response.handler.ts | 54 +- tsconfig.json | 26 +- typings/express/index.d.ts | 85 +- 63 files changed, 8915 insertions(+), 9002 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 921619c..cb9169a 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -11,12 +11,11 @@ "plugins": ["@typescript-eslint"], "rules": { "indent": ["error", "tab"], - "linebreak-style": ["error", "windows"], "quotes": ["error", "double"], "semi": ["error", "always"], "@typescript-eslint/no-explicit-any": "off", "no-const-assign": "error", - "max-len": ["warn", { "code": 120, "ignoreUrls": true, "ignoreRegExpLiterals": true }], + "max-len": ["error", { "code": 180, "ignoreUrls": true, "ignoreRegExpLiterals": true }], "no-unused-vars": "error", "no-console": "error", "no-duplicate-imports": ["error", { "includeExports": true }], diff --git a/.github/templates/ISSUE_TEMPLATE.md b/.github/templates/ISSUE_TEMPLATE.md index ab0610b..6dcea6d 100644 --- a/.github/templates/ISSUE_TEMPLATE.md +++ b/.github/templates/ISSUE_TEMPLATE.md @@ -1,5 +1,6 @@ ## Issue/ Feature Request :bricks: -⚠️ *You must fill all the required fields to place you issue correctly.* + +⚠️ _You must fill all the required fields to place you issue correctly._ | Fields | Description | Requirement | | ------ | ----------- | ------------------ | | Name | Name of the feature/ issue. | ✔️ | @@ -9,4 +10,4 @@ | Project | Appropriate project that feature or issue belongs to | ✔️ | **Required** - ✔️
-**Optional** - ❌ \ No newline at end of file +**Optional** - ❌ diff --git a/.github/templates/PR_TEMPLATE.md b/.github/templates/PR_TEMPLATE.md index be7df80..c53ba4f 100644 --- a/.github/templates/PR_TEMPLATE.md +++ b/.github/templates/PR_TEMPLATE.md @@ -1,4 +1,5 @@ ## Pull Request(PR) Template :octocat: + **Check following steps are fulfilled before creating the PR**
📝 Explain what are the changes that you have done to the codebase in the PR description
✔️ Assign more than 2 reviewers to the PR.
@@ -6,4 +7,3 @@ (⚠️ Must to have one of the these labels. **high-priority**, **medium-priority**, **low-priority**)
✔️ Select the project. **(MS Club Web Server)**
✔️ If there is any issue created that related to the PR, please link link it to the PR. - diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index 5f89f96..34b9a51 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -1,26 +1,26 @@ -# This workflow will build the Docker image of the MS Club Web Server and push it +# This workflow will build the Docker image of the MS Club Web Server and push it # to the GitHub Container Registry (GHCR) name: Docker Image CI on: push: - branches: [ master ] + branches: [master] jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - name: Check out code - - - uses: mr-smithers-excellent/docker-build-push@v5 - name: Build & Push Docker image - with: - image: msclubwebserver - tags: v1.0.0, latest - registry: ghcr.io - dockerfile: Dockerfile - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_PASSWORD }} + - uses: actions/checkout@v2 + name: Check out code + + - uses: mr-smithers-excellent/docker-build-push@v5 + name: Build & Push Docker image + with: + image: msclubwebserver + tags: v1.0.0, latest + registry: ghcr.io + dockerfile: Dockerfile + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} diff --git a/.github/workflows/node-build.yml b/.github/workflows/node-build.yml index e0c8f9a..33cd526 100644 --- a/.github/workflows/node-build.yml +++ b/.github/workflows/node-build.yml @@ -1,14 +1,14 @@ -# This workflow will do a clean install of node dependencies, -# cache/restore them, build the source code and run tests across +# This workflow will do a clean install of node dependencies, +# cache/restore them, build the source code and run tests across # different versions of node name: Node Build CI on: push: - branches: [ master, development ] + branches: [master, development] pull_request: - branches: [ master, development ] + branches: [master, development] jobs: build: @@ -16,14 +16,14 @@ jobs: strategy: matrix: node-version: [14.x] - + steps: - - uses: actions/checkout@v2 - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v2 - with: - node-version: ${{ matrix.node-version }} - cache: 'npm' - - run: npm install - - run: npm ci - - run: npm run build \ No newline at end of file + - uses: actions/checkout@v2 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v2 + with: + node-version: ${{ matrix.node-version }} + cache: "npm" + - run: npm install + - run: npm ci + - run: npm run build diff --git a/.prettierrc b/.prettierrc index 92b8409..4ac890e 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,9 +1,9 @@ { - "trailingComma": "es5", - "tabWidth": 2, - "useTabs": true, - "semi": true, - "singleQuote": false, - "printWidth": 120, - "arrowParens": "always" + "trailingComma": "es5", + "tabWidth": 2, + "useTabs": true, + "semi": true, + "singleQuote": false, + "printWidth": 120, + "arrowParens": "always" } diff --git a/README.md b/README.md index 0bb1266..52ee8c9 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,10 @@ # MS Club Web Server + Backend API application for MS Club of SLIIT 🌀
-Read further to know how **you** can start contributing to MS Club! +Read further to know how **you** can start contributing to MS Club! ## Quick Links + - [Tech Stack](#tech-stack) - [How to contribute](#how-to-contribute) - [Learning Resources](#how-can-i-get-start) @@ -13,76 +15,101 @@ Read further to know how **you** can start contributing to MS Club! ![banner-whitegb-spacing-10x(2)](https://firebasestorage.googleapis.com/v0/b/msclubofsliit-v2.appspot.com/o/tech_stack_logo.png?alt=media&token=74635794-1141-411c-8b82-5e90f6113aae) ## [How to contribute](#how-to) + 1. Fork the repo on GitHub :octocat:. 2. Clone the project to your own machine.
+ ``` git clone https://github.com//msclubwebsite.git ``` + 3. Create a branch using the git checkout command. Branch name prefix should be one of these.
-`feature/`
-`fix/`
+ `feature/`
+ `fix/`
+ ``` git checkout -b ``` + 4. Stage your changes and commit with a meaningful commit message. **First letter of the commit should be capital**
+ ``` git add . -``` ``` -git commit -m "" + +``` +git commit -m "" ``` 5. Push your work back up to your fork.
+ ``` git push origin ``` + 6. Submit a Pull request so that we can review your changes. [Learn about creating a pull request.](https://docs.github.com/en/github/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request) ## [How can I get start](#resources) + We got your back. Here are some **FREE** resources for you to strengthen your web development skills and start firing some commits. **TypeScript** + - [Official Documentation](https://www.typescriptlang.org/docs/) - [TypeScript For JS Developers](https://www.typescriptlang.org/docs/handbook/typescript-in-5-minutes.html) - [TypeScript Basics by freeCodeCamp](https://www.freecodecamp.org/news/learn-typescript-basics/) **Node JS / Express** + - [Node JS 14.x Official Documentaion](https://nodejs.org/docs/latest-v14.x/api/) - [Express Official Documentation](https://expressjs.com/) -## [About Docker Image](#about-docker-image) +## [About Docker Image](#about-docker-image) + We use Docker :whale: image to deploy this API application to the server. You can build and run the docker container in your local machine. Follow below steps to build and run the Docker container.
:memo: In order to build and run the Docker container, you must have Docker install on you computer.
-1. Build the Docker image. :building_construction: +1. Build the Docker image. :building_construction: + ``` docker build -t ghcr.io/ms-club-sliit/msclubwebserver:v1.0.0 . ``` -2. Check the build Docker images. :heavy_check_mark: + +2. Check the build Docker images. :heavy_check_mark: + ``` docker image ls ``` -3. Run the Docker container. After run this command the container will start running. :package:
-`docker run -p : -d --name "":`
-**`-d`** - Run in ditach mode
-**`-p`** - Port mapping between Docker container and application + +3. Run the Docker container. After run this command the container will start running. :package:
+ `docker run -p : -d --name "":`
+ **`-d`** - Run in ditach mode
+ **`-p`** - Port mapping between Docker container and application ``` docker run -p 9096:8078 -d --name "mswebserver" ghcr.io/ms-club-sliit/msclubwebserver:v1.0.0 ``` -4. Open your web browser and paste below URL :earth_asia: + +4. Open your web browser and paste below URL :earth_asia: + ``` http://localhost:9096 ``` -5. View the running container :eyes: + +5. View the running container :eyes: + ``` docker ps ``` -6. Stop the running container :stop_sign: + +6. Stop the running container :stop_sign: + ``` docker stop mswebserver ``` + 7. Remove the Docker container :coffin: + ``` docker rm mswebserver -``` \ No newline at end of file +``` diff --git a/package-lock.json b/package-lock.json index 76de1ee..47f4078 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5913 +1,5913 @@ { - "name": "msclubwebserver", - "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@cspotcode/source-map-consumer": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", - "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", - "dev": true - }, - "@cspotcode/source-map-support": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz", - "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==", - "dev": true, - "requires": { - "@cspotcode/source-map-consumer": "0.8.0" - } - }, - "@eslint/eslintrc": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", - "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.2.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - } - } - }, - "@firebase/analytics": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.7.4.tgz", - "integrity": "sha512-AU3XMwHW7SFGCNeUKKNW2wXGTdmS164ackt/Epu2bDXCT1OcauPE1AVd+ofULSIDCaDUAQVmvw3JrobgogEU7Q==", - "requires": { - "@firebase/component": "0.5.9", - "@firebase/installations": "0.5.4", - "@firebase/logger": "0.3.2", - "@firebase/util": "1.4.2", - "tslib": "^2.1.0" - } - }, - "@firebase/analytics-compat": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.1.5.tgz", - "integrity": "sha512-5cfr0uWwlhoHQYAr6UtQCHwnGjs/3J/bWrfA3INNtzaN4/tTTLTD02iobbccRcM7dM5TR0sZFWS5orfAU3OBFg==", - "requires": { - "@firebase/analytics": "0.7.4", - "@firebase/analytics-types": "0.7.0", - "@firebase/component": "0.5.9", - "@firebase/util": "1.4.2", - "tslib": "^2.1.0" - } - }, - "@firebase/analytics-types": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.7.0.tgz", - "integrity": "sha512-DNE2Waiwy5+zZnCfintkDtBfaW6MjIG883474v6Z0K1XZIvl76cLND4iv0YUb48leyF+PJK1KO2XrgHb/KpmhQ==" - }, - "@firebase/app": { - "version": "0.7.9", - "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.7.9.tgz", - "integrity": "sha512-Ke+FRbmCvGaHuJjnNU1UM/W8K1P4mF31sf0lkWrPaJrdQNCaRDJAoI0S/lyLqbJWTjdJgsMN1yw2McR5pAs3Rg==", - "requires": { - "@firebase/component": "0.5.9", - "@firebase/logger": "0.3.2", - "@firebase/util": "1.4.2", - "tslib": "^2.1.0" - } - }, - "@firebase/app-check": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.5.2.tgz", - "integrity": "sha512-DJrvxcn5QPO5dU735GA9kYpf+GwmCmnd/oQdWVExrRG+yjaLnP0rSJ2HKQ4bZKGo8qig3P7fwQpdMOgP2BXFjQ==", - "requires": { - "@firebase/component": "0.5.9", - "@firebase/logger": "0.3.2", - "@firebase/util": "1.4.2", - "tslib": "^2.1.0" - } - }, - "@firebase/app-check-compat": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.2.2.tgz", - "integrity": "sha512-nX2Ou8Rwo+TMMNDecQOGH78kFw6sORLrsGyu0eC95M853JjisVxTngN1TU/RL5h83ElJ0HhNlz6C3FYAuGNqqA==", - "requires": { - "@firebase/app-check": "0.5.2", - "@firebase/component": "0.5.9", - "@firebase/logger": "0.3.2", - "@firebase/util": "1.4.2", - "tslib": "^2.1.0" - } - }, - "@firebase/app-check-interop-types": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.1.0.tgz", - "integrity": "sha512-uZfn9s4uuRsaX5Lwx+gFP3B6YsyOKUE+Rqa6z9ojT4VSRAsZFko9FRn6OxQUA1z5t5d08fY4pf+/+Dkd5wbdbA==" - }, - "@firebase/app-compat": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.1.10.tgz", - "integrity": "sha512-33LdDMO694BvVbSzldyIjqQcjXcnNI6bjNNMOgYFl4lD4fCludKhmOKg5NOuHkwl7iljOg/nKxPFkRvUwlKgPA==", - "requires": { - "@firebase/app": "0.7.9", - "@firebase/component": "0.5.9", - "@firebase/logger": "0.3.2", - "@firebase/util": "1.4.2", - "tslib": "^2.1.0" - } - }, - "@firebase/app-types": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.7.0.tgz", - "integrity": "sha512-6fbHQwDv2jp/v6bXhBw2eSRbNBpxHcd1NBF864UksSMVIqIyri9qpJB1Mn6sGZE+bnDsSQBC5j2TbMxYsJQkQg==" - }, - "@firebase/auth": { - "version": "0.19.3", - "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-0.19.3.tgz", - "integrity": "sha512-asOJkmzBh38DgZ5fBt7cv8dNyU3r7kRVoXi9f1eCpQp/n+NagaiUM+YKXq0snjbchFJu7qPBiwrIg/xZinY4kg==", - "requires": { - "@firebase/component": "0.5.9", - "@firebase/logger": "0.3.2", - "@firebase/util": "1.4.2", - "node-fetch": "2.6.5", - "selenium-webdriver": "4.0.0-rc-1", - "tslib": "^2.1.0" - }, - "dependencies": { - "node-fetch": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.5.tgz", - "integrity": "sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ==", - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - } - } - }, - "@firebase/auth-compat": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.2.3.tgz", - "integrity": "sha512-qXdibKq44Lf22hy9YQaaMsAFMOiTA95Z9NjZJbrY8P0zXZUjFhwpx41Mett8+3X/uv/mXa6KuouRt2QdpsqU/g==", - "requires": { - "@firebase/auth": "0.19.3", - "@firebase/auth-types": "0.11.0", - "@firebase/component": "0.5.9", - "@firebase/util": "1.4.2", - "node-fetch": "2.6.5", - "selenium-webdriver": "^4.0.0-beta.2", - "tslib": "^2.1.0" - }, - "dependencies": { - "node-fetch": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.5.tgz", - "integrity": "sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ==", - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - } - } - }, - "@firebase/auth-interop-types": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.1.6.tgz", - "integrity": "sha512-etIi92fW3CctsmR9e3sYM3Uqnoq861M0Id9mdOPF6PWIg38BXL5k4upCNBggGUpLIS0H1grMOvy/wn1xymwe2g==" - }, - "@firebase/auth-types": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.11.0.tgz", - "integrity": "sha512-q7Bt6cx+ySj9elQHTsKulwk3+qDezhzRBFC9zlQ1BjgMueUOnGMcvqmU0zuKlQ4RhLSH7MNAdBV2znVaoN3Vxw==" - }, - "@firebase/component": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.5.9.tgz", - "integrity": "sha512-oLCY3x9WbM5rn06qmUvbtJuPj4dIw/C9T4Th52IiHF5tiCRC5k6YthvhfUVcTwfoUhK0fOgtwuKJKA/LpCPjgA==", - "requires": { - "@firebase/util": "1.4.2", - "tslib": "^2.1.0" - } - }, - "@firebase/database": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.12.4.tgz", - "integrity": "sha512-XkrL1kXELRNkqKcltuT4hfG1gWmFiGvjFY+z7Lhb//12MqdkLjwa9YMK8c6Lo+Ro+IkWcJArQaOQYe3GkU5Wgg==", - "requires": { - "@firebase/auth-interop-types": "0.1.6", - "@firebase/component": "0.5.9", - "@firebase/logger": "0.3.2", - "@firebase/util": "1.4.2", - "faye-websocket": "0.11.4", - "tslib": "^2.1.0" - } - }, - "@firebase/database-compat": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-0.1.4.tgz", - "integrity": "sha512-dIJiZLDFF3U+MoEwoPBy7zxWmBUro1KefmwSHlpOoxmPv76tuoPm85NumpW/HmMrtTcTkC2qowtb6NjGE8X7mw==", - "requires": { - "@firebase/component": "0.5.9", - "@firebase/database": "0.12.4", - "@firebase/database-types": "0.9.3", - "@firebase/logger": "0.3.2", - "@firebase/util": "1.4.2", - "tslib": "^2.1.0" - }, - "dependencies": { - "@firebase/database-types": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.9.3.tgz", - "integrity": "sha512-R+YXLWy/Q7mNUxiUYiMboTwvVoprrgfyvf1Viyevskw6IoH1q8HV1UjlkLSgmRsOT9HPWt7XZUEStVZJFknHwg==", - "requires": { - "@firebase/app-types": "0.7.0", - "@firebase/util": "1.4.2" - } - } - } - }, - "@firebase/database-types": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.7.3.tgz", - "integrity": "sha512-dSOJmhKQ0nL8O4EQMRNGpSExWCXeHtH57gGg0BfNAdWcKhC8/4Y+qfKLfWXzyHvrSecpLmO0SmAi/iK2D5fp5A==", - "dev": true, - "requires": { - "@firebase/app-types": "0.6.3" - }, - "dependencies": { - "@firebase/app-types": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.6.3.tgz", - "integrity": "sha512-/M13DPPati7FQHEQ9Minjk1HGLm/4K4gs9bR4rzLCWJg64yGtVC0zNg9gDpkw9yc2cvol/mNFxqTtd4geGrwdw==", - "dev": true - } - } - }, - "@firebase/firestore": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-3.3.1.tgz", - "integrity": "sha512-aeEc/UzRJ2YqL/trEQo1fvKFScB/oXHzLg6q/X445tpMPf+zFHmpEuI9YdWGuqSCRfuP/qAy5u0tfkGIcrVmLg==", - "requires": { - "@firebase/component": "0.5.9", - "@firebase/logger": "0.3.2", - "@firebase/util": "1.4.2", - "@firebase/webchannel-wrapper": "0.6.1", - "@grpc/grpc-js": "^1.3.2", - "@grpc/proto-loader": "^0.6.0", - "node-fetch": "2.6.5", - "tslib": "^2.1.0" - }, - "dependencies": { - "node-fetch": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.5.tgz", - "integrity": "sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ==", - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - } - } - }, - "@firebase/firestore-compat": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.1.8.tgz", - "integrity": "sha512-/v9Ag3opJ54i9417xqzRGJF3ptLVGwzBTjnnje/bTMWJam4DwVRoTiE5ZDm2HheMxRipFkZUsLgehRHUB9vMTw==", - "requires": { - "@firebase/component": "0.5.9", - "@firebase/firestore": "3.3.1", - "@firebase/firestore-types": "2.5.0", - "@firebase/util": "1.4.2", - "tslib": "^2.1.0" - } - }, - "@firebase/firestore-types": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-2.5.0.tgz", - "integrity": "sha512-I6c2m1zUhZ5SH0cWPmINabDyH5w0PPFHk2UHsjBpKdZllzJZ2TwTkXbDtpHUZNmnc/zAa0WNMNMvcvbb/xJLKA==" - }, - "@firebase/functions": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.7.6.tgz", - "integrity": "sha512-Kl6a2PbRkOlSlOWJSgYuNp3e53G3cb+axF+r7rbWhJIHiaelG16GerBMxZTSxyiCz77C24LwiA2TKNwe85ObZg==", - "requires": { - "@firebase/app-check-interop-types": "0.1.0", - "@firebase/auth-interop-types": "0.1.6", - "@firebase/component": "0.5.9", - "@firebase/messaging-interop-types": "0.1.0", - "@firebase/util": "1.4.2", - "node-fetch": "2.6.5", - "tslib": "^2.1.0" - }, - "dependencies": { - "node-fetch": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.5.tgz", - "integrity": "sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ==", - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - } - } - }, - "@firebase/functions-compat": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.1.7.tgz", - "integrity": "sha512-Rv3mAUIhsLTxIgPWJSESUcmE1tzNHzUlqQStPnxHn6eFFgHVhkU2wg/NMrKZWTFlb51jpKTjh51AQDhRdT3n3A==", - "requires": { - "@firebase/component": "0.5.9", - "@firebase/functions": "0.7.6", - "@firebase/functions-types": "0.5.0", - "@firebase/util": "1.4.2", - "tslib": "^2.1.0" - } - }, - "@firebase/functions-types": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.5.0.tgz", - "integrity": "sha512-qza0M5EwX+Ocrl1cYI14zoipUX4gI/Shwqv0C1nB864INAD42Dgv4v94BCyxGHBg2kzlWy8PNafdP7zPO8aJQA==" - }, - "@firebase/installations": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.5.4.tgz", - "integrity": "sha512-rYb6Ju/tIBhojmM8FsgS96pErKl6gPgJFnffMO4bKH7HilXhOfgLfKU9k51ZDcps8N0npDx9+AJJ6pL1aYuYZQ==", - "requires": { - "@firebase/component": "0.5.9", - "@firebase/util": "1.4.2", - "idb": "3.0.2", - "tslib": "^2.1.0" - } - }, - "@firebase/logger": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.3.2.tgz", - "integrity": "sha512-lzLrcJp9QBWpo40OcOM9B8QEtBw2Fk1zOZQdvv+rWS6gKmhQBCEMc4SMABQfWdjsylBcDfniD1Q+fUX1dcBTXA==", - "requires": { - "tslib": "^2.1.0" - } - }, - "@firebase/messaging": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.9.4.tgz", - "integrity": "sha512-OvYV4MLPfDpdP/yltLqZXZRx6rXWz52bEilS2jL2B4sGiuTaXSkR6BIHB54EPTblu32nbyZYdlER4fssz4TfXw==", - "requires": { - "@firebase/component": "0.5.9", - "@firebase/installations": "0.5.4", - "@firebase/messaging-interop-types": "0.1.0", - "@firebase/util": "1.4.2", - "idb": "3.0.2", - "tslib": "^2.1.0" - } - }, - "@firebase/messaging-compat": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.1.4.tgz", - "integrity": "sha512-6477jBw7w7hk0uhnTUMsPoukalpcwbxTTo9kMguHVSXe0t3OdoxeXEaapaNJlOmU4Kgc8j3rsms8IDLdKVpvlA==", - "requires": { - "@firebase/component": "0.5.9", - "@firebase/messaging": "0.9.4", - "@firebase/util": "1.4.2", - "tslib": "^2.1.0" - } - }, - "@firebase/messaging-interop-types": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.1.0.tgz", - "integrity": "sha512-DbvUl/rXAZpQeKBnwz0NYY5OCqr2nFA0Bj28Fmr3NXGqR4PAkfTOHuQlVtLO1Nudo3q0HxAYLa68ZDAcuv2uKQ==" - }, - "@firebase/performance": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.5.4.tgz", - "integrity": "sha512-ES6aS4eoMhf9CczntBADDsXhaFea/3a0FADwy/VpWXXBxVb8tqc5tPcoTwd9L5M/aDeSiQMy344rhrSsTbIZEg==", - "requires": { - "@firebase/component": "0.5.9", - "@firebase/installations": "0.5.4", - "@firebase/logger": "0.3.2", - "@firebase/util": "1.4.2", - "tslib": "^2.1.0" - } - }, - "@firebase/performance-compat": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.1.4.tgz", - "integrity": "sha512-YuGfmpC0o+YvEBlEZCbPdNbT4Nn2qhi5uMXjqKnNIUepmXUsgOYDiAqM9nxHPoE/6IkvoFMdCj5nTUYVLCFXgg==", - "requires": { - "@firebase/component": "0.5.9", - "@firebase/logger": "0.3.2", - "@firebase/performance": "0.5.4", - "@firebase/performance-types": "0.1.0", - "@firebase/util": "1.4.2", - "tslib": "^2.1.0" - } - }, - "@firebase/performance-types": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.1.0.tgz", - "integrity": "sha512-6p1HxrH0mpx+622Ql6fcxFxfkYSBpE3LSuwM7iTtYU2nw91Hj6THC8Bc8z4nboIq7WvgsT/kOTYVVZzCSlXl8w==" - }, - "@firebase/polyfill": { - "version": "0.3.36", - "resolved": "https://registry.npmjs.org/@firebase/polyfill/-/polyfill-0.3.36.tgz", - "integrity": "sha512-zMM9oSJgY6cT2jx3Ce9LYqb0eIpDE52meIzd/oe/y70F+v9u1LDqk5kUF5mf16zovGBWMNFmgzlsh6Wj0OsFtg==", - "requires": { - "core-js": "3.6.5", - "promise-polyfill": "8.1.3", - "whatwg-fetch": "2.0.4" - } - }, - "@firebase/remote-config": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.3.3.tgz", - "integrity": "sha512-9hZWfB3k3IYsjHbWeUfhv/SDCcOgv/JMJpLXlUbTppXPm1IZ3X9ZW4I9bS86gGYr7m/kSv99U0oxQ7N9PoR8Iw==", - "requires": { - "@firebase/component": "0.5.9", - "@firebase/installations": "0.5.4", - "@firebase/logger": "0.3.2", - "@firebase/util": "1.4.2", - "tslib": "^2.1.0" - } - }, - "@firebase/remote-config-compat": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.1.4.tgz", - "integrity": "sha512-6WeKR7E9KJ1RIF9GZiyle1uD4IsIPUBKUnUnFkQhj3FV6cGvQwbeG0rbh7QQLvd0IWuh9lABYjHXWp+rGHQk8A==", - "requires": { - "@firebase/component": "0.5.9", - "@firebase/logger": "0.3.2", - "@firebase/remote-config": "0.3.3", - "@firebase/remote-config-types": "0.2.0", - "@firebase/util": "1.4.2", - "tslib": "^2.1.0" - } - }, - "@firebase/remote-config-types": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.2.0.tgz", - "integrity": "sha512-hqK5sCPeZvcHQ1D6VjJZdW6EexLTXNMJfPdTwbD8NrXUw6UjWC4KWhLK/TSlL0QPsQtcKRkaaoP+9QCgKfMFPw==" - }, - "@firebase/storage": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.9.0.tgz", - "integrity": "sha512-1gSYdrwP9kECmugH9L3tvNMvSjnNJGamj91rrESOFk2ZHDO93qKR90awc68NnhmzFAJOT/eJzVm35LKU6SqUNg==", - "requires": { - "@firebase/component": "0.5.9", - "@firebase/util": "1.4.2", - "node-fetch": "2.6.5", - "tslib": "^2.1.0" - }, - "dependencies": { - "node-fetch": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.5.tgz", - "integrity": "sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ==", - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - } - } - }, - "@firebase/storage-compat": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.1.8.tgz", - "integrity": "sha512-L5R0DQoHCDKIgcBbqTx+6+RQ2533WFKeV3cfLAZCTGjyMUustj0eYDsr7fLhGexwsnpT3DaxhlbzT3icUWoDaA==", - "requires": { - "@firebase/component": "0.5.9", - "@firebase/storage": "0.9.0", - "@firebase/storage-types": "0.6.0", - "@firebase/util": "1.4.2", - "tslib": "^2.1.0" - } - }, - "@firebase/storage-types": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.6.0.tgz", - "integrity": "sha512-1LpWhcCb1ftpkP/akhzjzeFxgVefs6eMD2QeKiJJUGH1qOiows2w5o0sKCUSQrvrRQS1lz3SFGvNR1Ck/gqxeA==" - }, - "@firebase/util": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.4.2.tgz", - "integrity": "sha512-JMiUo+9QE9lMBvEtBjqsOFdmJgObFvi7OL1A0uFGwTmlCI1ZeNPOEBrwXkgTOelVCdiMO15mAebtEyxFuQ6FsA==", - "requires": { - "tslib": "^2.1.0" - } - }, - "@firebase/webchannel-wrapper": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.6.1.tgz", - "integrity": "sha512-9FqhNjKQWpQ3fGnSOCovHOm+yhhiorKEqYLAfd525jWavunDJcx8rOW6i6ozAh+FbwcYMkL7b+3j4UR/30MpoQ==" - }, - "@google-cloud/common": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-3.8.1.tgz", - "integrity": "sha512-FOs3NFU6bDt5mXE7IFpwIeqzLwRZNu9lJYl+bHVNkwmxX/w4VyDZAiGjQHhpV1Ek+muNKlX8HPchxaIxNTuOhw==", - "dev": true, - "requires": { - "@google-cloud/projectify": "^2.0.0", - "@google-cloud/promisify": "^2.0.0", - "arrify": "^2.0.1", - "duplexify": "^4.1.1", - "ent": "^2.2.0", - "extend": "^3.0.2", - "google-auth-library": "^7.9.2", - "retry-request": "^4.2.2", - "teeny-request": "^7.0.0" - } - }, - "@google-cloud/firestore": { - "version": "4.15.1", - "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-4.15.1.tgz", - "integrity": "sha512-2PWsCkEF1W02QbghSeRsNdYKN1qavrHBP3m72gPDMHQSYrGULOaTi7fSJquQmAtc4iPVB2/x6h80rdLHTATQtA==", - "dev": true, - "optional": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "functional-red-black-tree": "^1.0.1", - "google-gax": "^2.24.1", - "protobufjs": "^6.8.6" - } - }, - "@google-cloud/paginator": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-3.0.6.tgz", - "integrity": "sha512-XCTm/GfQIlc1ZxpNtTSs/mnZxC2cePNhxU3X8EzHXKIJ2JFncmJj2Fcd2IP+gbmZaSZnY0juFxbUCkIeuu/2eQ==", - "dev": true, - "requires": { - "arrify": "^2.0.0", - "extend": "^3.0.2" - } - }, - "@google-cloud/projectify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-2.1.1.tgz", - "integrity": "sha512-+rssMZHnlh0twl122gXY4/aCrk0G1acBqkHFfYddtsqpYXGxA29nj9V5V9SfC+GyOG00l650f6lG9KL+EpFEWQ==", - "dev": true - }, - "@google-cloud/promisify": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-2.0.4.tgz", - "integrity": "sha512-j8yRSSqswWi1QqUGKVEKOG03Q7qOoZP6/h2zN2YO+F5h2+DHU0bSrHCK9Y7lo2DI9fBd8qGAw795sf+3Jva4yA==", - "dev": true - }, - "@google-cloud/storage": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-5.16.0.tgz", - "integrity": "sha512-I/1lA78v9c5EbOM/KfcYsjzA7YlHQmhpzHYdKLKdYC8X5fFaQrw5nK+FU8GbEwdPxmREAF2qPbN7Ccq+A/ndWA==", - "dev": true, - "requires": { - "@google-cloud/common": "^3.8.1", - "@google-cloud/paginator": "^3.0.0", - "@google-cloud/promisify": "^2.0.0", - "arrify": "^2.0.0", - "async-retry": "^1.3.1", - "compressible": "^2.0.12", - "date-and-time": "^2.0.0", - "duplexify": "^4.0.0", - "extend": "^3.0.2", - "gcs-resumable-upload": "^3.5.1", - "get-stream": "^6.0.0", - "hash-stream-validation": "^0.2.2", - "mime": "^3.0.0", - "mime-types": "^2.0.8", - "p-limit": "^3.0.1", - "pumpify": "^2.0.0", - "snakeize": "^0.1.0", - "stream-events": "^1.0.1", - "xdg-basedir": "^4.0.0" - }, - "dependencies": { - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "dev": true - } - } - }, - "@grpc/grpc-js": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.4.4.tgz", - "integrity": "sha512-a6222b7Dl6fIlMgzVl7e+NiRoLiZFbpcwvBH2Oli56Bn7W4/3Ld+86hK4ffPn5rx2DlDidmIcvIJiOQXyhv9gA==", - "requires": { - "@grpc/proto-loader": "^0.6.4", - "@types/node": ">=12.12.47" - } - }, - "@grpc/proto-loader": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.7.tgz", - "integrity": "sha512-QzTPIyJxU0u+r2qGe8VMl3j/W2ryhEvBv7hc42OjYfthSj370fUrb7na65rG6w3YLZS/fb8p89iTBobfWGDgdw==", - "requires": { - "@types/long": "^4.0.1", - "lodash.camelcase": "^4.3.0", - "long": "^4.0.0", - "protobufjs": "^6.10.0", - "yargs": "^16.1.1" - } - }, - "@humanwhocodes/config-array": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz", - "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, - "dependencies": { - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@panva/asn1.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@panva/asn1.js/-/asn1.js-1.0.0.tgz", - "integrity": "sha512-UdkG3mLEqXgnlKsWanWcgb6dOjUzJ+XC5f+aWw30qrtjxeNUSfKX1cd5FBzOaXQumoe9nIqeZUvrRJS03HCCtw==", - "dev": true - }, - "@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" - }, - "@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" - }, - "@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" - }, - "@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" - }, - "@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", - "requires": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" - }, - "@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" - }, - "@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" - }, - "@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" - }, - "@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" - }, - "@sendgrid/client": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@sendgrid/client/-/client-7.6.0.tgz", - "integrity": "sha512-cpBVZKLlMTO+vpE18krTixubYmZa98oTbLkqBDuTiA3zRkW+urrxg7pDR24TkI35Mid0Zru8jDHwnOiqrXu0TA==", - "requires": { - "@sendgrid/helpers": "^7.6.0", - "axios": "^0.21.4" - } - }, - "@sendgrid/helpers": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@sendgrid/helpers/-/helpers-7.6.0.tgz", - "integrity": "sha512-0uWD+HSXLl4Z/X3cN+UMQC20RE7xwAACgppnfjDyvKG0KvJcUgDGz7HDdQkiMUdcVWfmyk6zKSg7XKfKzBjTwA==", - "requires": { - "deepmerge": "^4.2.2" - } - }, - "@sendgrid/mail": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@sendgrid/mail/-/mail-7.6.0.tgz", - "integrity": "sha512-0KdaSZzflJD/vUAZjB3ALBIuaVGoLq22hrb2fvQXZHRepU/yhRNlEOqrr05MfKBnKskzq1blnD1J0fHxiwaolw==", - "requires": { - "@sendgrid/client": "^7.6.0", - "@sendgrid/helpers": "^7.6.0" - } - }, - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true - }, - "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dev": true, - "requires": { - "defer-to-connect": "^1.0.1" - } - }, - "@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true - }, - "@tsconfig/node10": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", - "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", - "dev": true - }, - "@tsconfig/node12": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", - "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", - "dev": true - }, - "@tsconfig/node14": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", - "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", - "dev": true - }, - "@tsconfig/node16": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", - "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", - "dev": true - }, - "@types/amqplib": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/@types/amqplib/-/amqplib-0.8.2.tgz", - "integrity": "sha512-p+TFLzo52f8UanB+Nq6gyUi65yecAcRY3nYowU6MPGFtaJvEDxcnFWrxssSTkF+ts1W3zyQDvgVICLQem5WxRA==", - "dev": true, - "requires": { - "@types/bluebird": "*", - "@types/node": "*" - } - }, - "@types/bcrypt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/bcrypt/-/bcrypt-5.0.0.tgz", - "integrity": "sha512-agtcFKaruL8TmcvqbndlqHPSJgsolhf/qPWchFlgnW1gECTN/nKbFcoFnvKAQRFfKbh+BO6A3SWdJu9t+xF3Lw==", - "requires": { - "@types/node": "*" - } - }, - "@types/bcryptjs": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.2.tgz", - "integrity": "sha512-LiMQ6EOPob/4yUL66SZzu6Yh77cbzJFYll+ZfaPiPPFswtIlA/Fs1MzdKYA7JApHU49zQTbJGX3PDmCpIdDBRQ==" - }, - "@types/bluebird": { - "version": "3.5.36", - "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.36.tgz", - "integrity": "sha512-HBNx4lhkxN7bx6P0++W8E289foSu8kO8GCk2unhuVggO+cE7rh9DhZUyPhUxNRG9m+5B5BTKxZQ5ZP92x/mx9Q==", - "dev": true - }, - "@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "@types/caseless": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", - "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==" - }, - "@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "requires": { - "@types/node": "*" - } - }, - "@types/cors": { - "version": "2.8.12", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", - "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==" - }, - "@types/express": { - "version": "4.17.13", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", - "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.18", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "@types/express-jwt": { - "version": "0.0.42", - "resolved": "https://registry.npmjs.org/@types/express-jwt/-/express-jwt-0.0.42.tgz", - "integrity": "sha512-WszgUddvM1t5dPpJ3LhWNH8kfNN8GPIBrAGxgIYXVCEGx6Bx4A036aAuf/r5WH9DIEdlmp7gHOYvSM6U87B0ag==", - "dev": true, - "requires": { - "@types/express": "*", - "@types/express-unless": "*" - } - }, - "@types/express-serve-static-core": { - "version": "4.17.25", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.25.tgz", - "integrity": "sha512-OUJIVfRMFijZukGGwTpKNFprqCCXk5WjNGvUgB/CxxBR40QWSjsNK86+yvGKlCOGc7sbwfHLaXhkG+NsytwBaQ==", - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, - "@types/express-unless": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@types/express-unless/-/express-unless-0.5.2.tgz", - "integrity": "sha512-Q74UyYRX/zIgl1HSp9tUX2PlG8glkVm+59r7aK4KGKzC5jqKIOX6rrVLRQrzpZUQ84VukHtRoeAuon2nIssHPQ==", - "dev": true, - "requires": { - "@types/express": "*" - } - }, - "@types/firebase": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@types/firebase/-/firebase-3.2.1.tgz", - "integrity": "sha512-G8XgHMu2jHlElfc2xVNaYP50F0qrqeTCjgeG1v5b4SRwWG4XKC4fCuEdVZuZaMRmVygcnbRZBAo9O7RsDvmkGQ==", - "requires": { - "firebase": "*" - } - }, - "@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "requires": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/handlebars": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@types/handlebars/-/handlebars-4.1.0.tgz", - "integrity": "sha512-gq9YweFKNNB1uFK71eRqsd4niVkXrxHugqWFQkeLRJvGjnxsLr16bYtcsG4tOFwmYi0Bax+wCkbf1reUfdl4kA==", - "requires": { - "handlebars": "*" - } - }, - "@types/imagemin": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@types/imagemin/-/imagemin-7.0.1.tgz", - "integrity": "sha512-xEn5+M3lDBtI3JxLy6eU3ksoVurygnlG7OYhTqJfGGP4PcvYnfn+IABCmMve7ziM/SneHDm5xgJFKC8hCYPicw==", - "requires": { - "@types/node": "*" - } - }, - "@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", - "dev": true - }, - "@types/jsonwebtoken": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.6.tgz", - "integrity": "sha512-+P3O/xC7nzVizIi5VbF34YtqSonFsdnbXBnWUCYRiKOi1f9gA4sEFvXkrGr/QVV23IbMYvcoerI7nnhDUiWXRQ==", - "requires": { - "@types/node": "*" - } - }, - "@types/long": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", - "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" - }, - "@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" - }, - "@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==" - }, - "@types/mongoose": { - "version": "5.11.97", - "resolved": "https://registry.npmjs.org/@types/mongoose/-/mongoose-5.11.97.tgz", - "integrity": "sha512-cqwOVYT3qXyLiGw7ueU2kX9noE8DPGRY6z8eUxudhXY8NZ7DMKYAxyZkLSevGfhCX3dO/AoX5/SO9lAzfjon0Q==", - "requires": { - "mongoose": "*" - } - }, - "@types/multer": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/@types/multer/-/multer-1.4.7.tgz", - "integrity": "sha512-/SNsDidUFCvqqcWDwxv2feww/yqhNeTRL5CVoL3jU4Goc4kKEL10T7Eye65ZqPNi4HRx8sAEX59pV1aEH7drNA==", - "requires": { - "@types/express": "*" - } - }, - "@types/node": { - "version": "16.11.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.9.tgz", - "integrity": "sha512-MKmdASMf3LtPzwLyRrFjtFFZ48cMf8jmX5VRYrDQiJa8Ybu5VAmkqBWqKU8fdCwD8ysw4mQ9nrEHvzg6gunR7A==" - }, - "@types/nodemailer": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.4.tgz", - "integrity": "sha512-Ksw4t7iliXeYGvIQcSIgWQ5BLuC/mljIEbjf615svhZL10PE9t+ei8O9gDaD3FPCasUJn9KTLwz2JFJyiiyuqw==", - "requires": { - "@types/node": "*" - } - }, - "@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" - }, - "@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" - }, - "@types/request": { - "version": "2.48.8", - "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.8.tgz", - "integrity": "sha512-whjk1EDJPcAR2kYHRbFl/lKeeKYTi05A15K9bnLInCVroNDCtXce57xKdI0/rQaA3K+6q0eFyUBPmqfSndUZdQ==", - "requires": { - "@types/caseless": "*", - "@types/node": "*", - "@types/tough-cookie": "*", - "form-data": "^2.5.0" - } - }, - "@types/serve-static": { - "version": "1.13.10", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", - "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", - "requires": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "@types/sharp": { - "version": "0.29.4", - "resolved": "https://registry.npmjs.org/@types/sharp/-/sharp-0.29.4.tgz", - "integrity": "sha512-asrPef2LYenr76zBzyy+Fw40yGzq/q/CY77mUP5n43DnuWjQoOB+8vxnzFcqccz+LF+A7mbnknGCfpVWSG82Bw==", - "requires": { - "@types/node": "*" - } - }, - "@types/tough-cookie": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.1.tgz", - "integrity": "sha512-Y0K95ThC3esLEYD6ZuqNek29lNX2EM1qxV8y2FTLUB0ff5wWrk7az+mLrnNFUnaXcgKye22+sFBRXOgpPILZNg==" - }, - "@types/uuid": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.3.tgz", - "integrity": "sha512-0LbEEx1zxrYB3pgpd1M5lEhLcXjKJnYghvhTRgaBeUivLHMDM1TzF3IJ6hXU2+8uA4Xz+5BA63mtZo5DjVT8iA==" - }, - "@types/validator": { - "version": "13.7.0", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.0.tgz", - "integrity": "sha512-+jBxVvXVuggZOrm04NR8z+5+bgoW4VZyLzUO+hmPPW1mVFL/HaitLAkizfv4yg9TbG8lkfHWVMQ11yDqrVVCzA==" - }, - "@types/webidl-conversions": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-6.1.1.tgz", - "integrity": "sha512-XAahCdThVuCFDQLT7R7Pk/vqeObFNL3YqRyFZg+AqAP/W1/w3xHaIxuW7WszQqTbIBOPRcItYJIou3i/mppu3Q==" - }, - "@types/whatwg-url": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.1.tgz", - "integrity": "sha512-2YubE1sjj5ifxievI5Ge1sckb9k/Er66HyR2c+3+I6VDUUg1TLPdYYTEbQ+DjRkS4nTxMJhgWfSfMRD2sl2EYQ==", - "requires": { - "@types/node": "*", - "@types/webidl-conversions": "*" - } - }, - "@typescript-eslint/eslint-plugin": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.9.0.tgz", - "integrity": "sha512-qT4lr2jysDQBQOPsCCvpPUZHjbABoTJW8V9ZzIYKHMfppJtpdtzszDYsldwhFxlhvrp7aCHeXD1Lb9M1zhwWwQ==", - "dev": true, - "requires": { - "@typescript-eslint/experimental-utils": "5.9.0", - "@typescript-eslint/scope-manager": "5.9.0", - "@typescript-eslint/type-utils": "5.9.0", - "debug": "^4.3.2", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.2.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "dependencies": { - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "@typescript-eslint/experimental-utils": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.9.0.tgz", - "integrity": "sha512-ZnLVjBrf26dn7ElyaSKa6uDhqwvAi4jBBmHK1VxuFGPRAxhdi18ubQYSGA7SRiFiES3q9JiBOBHEBStOFkwD2g==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.9.0", - "@typescript-eslint/types": "5.9.0", - "@typescript-eslint/typescript-estree": "5.9.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "dependencies": { - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - } - } - }, - "@typescript-eslint/parser": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.9.0.tgz", - "integrity": "sha512-/6pOPz8yAxEt4PLzgbFRDpZmHnXCeZgPDrh/1DaVKOjvn/UPMlWhbx/gA96xRi2JxY1kBl2AmwVbyROUqys5xQ==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.9.0", - "@typescript-eslint/types": "5.9.0", - "@typescript-eslint/typescript-estree": "5.9.0", - "debug": "^4.3.2" - }, - "dependencies": { - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "@typescript-eslint/scope-manager": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.9.0.tgz", - "integrity": "sha512-DKtdIL49Qxk2a8icF6whRk7uThuVz4A6TCXfjdJSwOsf+9ree7vgQWcx0KOyCdk0i9ETX666p4aMhrRhxhUkyg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.9.0", - "@typescript-eslint/visitor-keys": "5.9.0" - } - }, - "@typescript-eslint/type-utils": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.9.0.tgz", - "integrity": "sha512-uVCb9dJXpBrK1071ri5aEW7ZHdDHAiqEjYznF3HSSvAJXyrkxGOw2Ejibz/q6BXdT8lea8CMI0CzKNFTNI6TEQ==", - "dev": true, - "requires": { - "@typescript-eslint/experimental-utils": "5.9.0", - "debug": "^4.3.2", - "tsutils": "^3.21.0" - }, - "dependencies": { - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "@typescript-eslint/types": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.9.0.tgz", - "integrity": "sha512-mWp6/b56Umo1rwyGCk8fPIzb9Migo8YOniBGPAQDNC6C52SeyNGN4gsVwQTAR+RS2L5xyajON4hOLwAGwPtUwg==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.9.0.tgz", - "integrity": "sha512-kxo3xL2mB7XmiVZcECbaDwYCt3qFXz99tBSuVJR4L/sR7CJ+UNAPrYILILktGj1ppfZ/jNt/cWYbziJUlHl1Pw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.9.0", - "@typescript-eslint/visitor-keys": "5.9.0", - "debug": "^4.3.2", - "globby": "^11.0.4", - "is-glob": "^4.0.3", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "dependencies": { - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "globby": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.9.0.tgz", - "integrity": "sha512-6zq0mb7LV0ThExKlecvpfepiB+XEtFv/bzx7/jKSgyXTFD7qjmSu1FoiS0x3OZaiS+UIXpH2vd9O89f02RCtgw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.9.0", - "eslint-visitor-keys": "^3.0.0" - } - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dev": true, - "requires": { - "event-target-shim": "^5.0.0" - } - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "acorn": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz", - "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true - }, - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "amqplib": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.8.0.tgz", - "integrity": "sha512-icU+a4kkq4Y1PS4NNi+YPDMwdlbFcZ1EZTQT2nigW3fvOb6AOgUQ9+Mk4ue0Zu5cBg/XpDzB40oH10ysrk2dmA==", - "requires": { - "bitsyntax": "~0.1.0", - "bluebird": "^3.7.2", - "buffer-more-ints": "~1.0.0", - "readable-stream": "1.x >=1.1.9", - "safe-buffer": "~5.2.1", - "url-parse": "~1.5.1" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - }, - "ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dev": true, - "requires": { - "string-width": "^4.1.0" - } - }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "append-field": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", - "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY=" - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" - }, - "are-we-there-yet": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", - "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "args": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/args/-/args-5.0.1.tgz", - "integrity": "sha512-1kqmFCFsPffavQFGt8OxJdIcETti99kySRUPMpOhaGjL6mRJn8HFU1OxKY5bMqfZKUwTQc1mZkAjmGYaVOHFtQ==", - "requires": { - "camelcase": "5.0.0", - "chalk": "2.4.2", - "leven": "2.1.0", - "mri": "1.1.4" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "camelcase": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", - "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==" - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - } - } - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" - }, - "arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "dev": true - }, - "asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "async-retry": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", - "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", - "dev": true, - "requires": { - "retry": "0.13.1" - } - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "atomic-sleep": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", - "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==" - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" - }, - "axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "requires": { - "follow-redirects": "^1.14.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "bcryptjs": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", - "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=" - }, - "bignumber.js": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", - "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==", - "dev": true - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "bitsyntax": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/bitsyntax/-/bitsyntax-0.1.0.tgz", - "integrity": "sha512-ikAdCnrloKmFOugAfxWws89/fPc+nw0OOG1IzIE72uSOg/A3cYptKCjSUhDTuj7fhsJtzkzlv7l3b8PzRHLN0Q==", - "requires": { - "buffer-more-ints": "~1.0.0", - "debug": "~2.6.9", - "safe-buffer": "~5.1.2" - } - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - } - }, - "boxen": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", - "dev": true, - "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.2", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "bson": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/bson/-/bson-4.6.0.tgz", - "integrity": "sha512-8jw1NU1hglS+Da1jDOUYuNcBJ4cNHCFIqzlwoFNnsTOg2R/ox0aTYcTiBN4dzRa9q7Cvy6XErh3L8ReTEb9AQQ==", - "requires": { - "buffer": "^5.6.0" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "buffer-more-ints": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-1.0.0.tgz", - "integrity": "sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==" - }, - "busboy": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz", - "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=", - "requires": { - "dicer": "0.2.5", - "readable-stream": "1.1.x" - }, - "dependencies": { - "dicer": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", - "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=", - "requires": { - "readable-stream": "1.1.x", - "streamsearch": "0.1.2" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" - }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - } - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.1.tgz", - "integrity": "sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "dev": true - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" - }, - "color": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/color/-/color-4.0.2.tgz", - "integrity": "sha512-fSu0jW2aKQG2FHlDywqdFPdabJHsUdZ0xabSt3wFZdcgRKtLnUHs19nUtuFuLGVMFhINGgfZEIjbUOsGZXGu7Q==", - "requires": { - "color-convert": "^2.0.1", - "color-string": "^1.7.4" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "color-string": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.7.4.tgz", - "integrity": "sha512-nVdUvPVgZMpRQad5dcsCMOSB5BXLljklTiaxS6ehhKxDsAI5sD7k5VmFuBt1y3Rlym8uulc/ANUN/bMWtBu6Sg==", - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "colorette": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", - "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==" - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "requires": { - "mime-db": ">= 1.43.0 < 2" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - } - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "requires": { - "safe-buffer": "5.1.2" - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" - }, - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "core-js": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", - "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==" - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "cross-env": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", - "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.1" - } - }, - "cross-fetch": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.4.tgz", - "integrity": "sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ==", - "requires": { - "node-fetch": "2.6.1" - }, - "dependencies": { - "node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" - } - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "data-uri-to-buffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz", - "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==" - }, - "date-and-time": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/date-and-time/-/date-and-time-2.0.1.tgz", - "integrity": "sha512-O7Xe5dLaqvY/aF/MFWArsAM1J4j7w1CSZlPCX9uHgmb+6SbkPd8Q4YOvfvH/cZGvFlJFfHOZKxQtmMUOoZhc/w==", - "dev": true - }, - "dateformat": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", - "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==" - }, - "dayjs": { - "version": "1.10.7", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.7.tgz", - "integrity": "sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig==" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" - }, - "defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" - }, - "denque": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.0.1.tgz", - "integrity": "sha512-tfiWc6BQLXNLpNiR5iGd0Ocu3P3VpxfzFiqubLgMfhfOw9WyvgJBd46CClNn9k3qfbjvT//0cf7AlYRX/OslMQ==" - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" - }, - "dicer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.0.tgz", - "integrity": "sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==", - "dev": true, - "requires": { - "streamsearch": "0.1.2" - } - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - } - }, - "dotenv": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", - "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==" - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true - }, - "duplexify": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz", - "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==", - "requires": { - "end-of-stream": "^1.4.1", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1", - "stream-shift": "^1.0.0" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { - "once": "^1.4.0" - } - }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1" - } - }, - "ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", - "dev": true - }, - "env-cmd": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/env-cmd/-/env-cmd-10.1.0.tgz", - "integrity": "sha512-mMdWTT9XKN7yNth/6N6g2GuKuJTsKMDHlQFUDacb/heQRRWOTIZ42t1rMHnQu4jYxU1ajdTeJM+9eEETlqToMA==", - "requires": { - "commander": "^4.0.0", - "cross-spawn": "^7.0.0" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - }, - "escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "dev": true - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "eslint": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.6.0.tgz", - "integrity": "sha512-UvxdOJ7mXFlw7iuHZA4jmzPaUqIw54mZrv+XPYKNbKdLR0et4rf60lIZUU9kiNtnzzMzGWxMV+tQ7uG7JG8DPw==", - "dev": true, - "requires": { - "@eslint/eslintrc": "^1.0.5", - "@humanwhocodes/config-array": "^0.9.2", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.0", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.1.0", - "espree": "^9.3.0", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.2.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - } - } - }, - "eslint-config-prettier": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", - "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", - "dev": true - }, - "eslint-scope": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", - "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", - "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", - "dev": true - }, - "espree": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz", - "integrity": "sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==", - "dev": true, - "requires": { - "acorn": "^8.7.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.1.0" - }, - "dependencies": { - "acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", - "dev": true - } - } - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" - }, - "event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "dev": true - }, - "expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" - }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", - "requires": { - "@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" - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fast-redact": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.0.2.tgz", - "integrity": "sha512-YN+CYfCVRVMUZOUPeinHNKgytM1wPI/C/UCLEi56EsY2dwwvI00kIJHJoI7pMVqGoMew8SMZ2SSfHKHULHXDsg==" - }, - "fast-safe-stringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" - }, - "fast-text-encoding": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz", - "integrity": "sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig==", - "dev": true - }, - "fastify-warning": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/fastify-warning/-/fastify-warning-0.2.0.tgz", - "integrity": "sha512-s1EQguBw/9qtc1p/WTY4eq9WMRIACkj+HTcOIK1in4MV5aFaQC9ZCIt0dJ7pr5bIf4lPpHvAtP2ywpTNgs7hqw==" - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "requires": { - "reusify": "^1.0.4" - } - }, - "faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "fetch-blob": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.1.3.tgz", - "integrity": "sha512-ax1Y5I9w+9+JiM+wdHkhBoxew+zG4AJ2SvAD1v1szpddUIiPERVGBxrMcB2ZqW0Y3PP8bOWYv2zqQq1Jp2kqUQ==", - "requires": { - "web-streams-polyfill": "^3.0.3" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "file-type": { - "version": "12.4.2", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-12.4.2.tgz", - "integrity": "sha512-UssQP5ZgIOKelfsaB5CuGAL+Y+q7EmONuiwF3N5HAH0t27rvrttgi6Ra9k/+DVaY9UF6+ybxu5pOXLUdA8N7Vg==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - } - }, - "firebase": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/firebase/-/firebase-9.5.0.tgz", - "integrity": "sha512-REScimA1DQz6mPU/u9wafzRwvEqzItX2ndDhtbj167zHbikyRi8Sgg0982N8SU6XlC+Pw6CAEAnNTSejfUYd6A==", - "requires": { - "@firebase/analytics": "0.7.4", - "@firebase/analytics-compat": "0.1.5", - "@firebase/app": "0.7.9", - "@firebase/app-check": "0.5.2", - "@firebase/app-check-compat": "0.2.2", - "@firebase/app-compat": "0.1.10", - "@firebase/app-types": "0.7.0", - "@firebase/auth": "0.19.3", - "@firebase/auth-compat": "0.2.3", - "@firebase/database": "0.12.4", - "@firebase/database-compat": "0.1.4", - "@firebase/firestore": "3.3.1", - "@firebase/firestore-compat": "0.1.8", - "@firebase/functions": "0.7.6", - "@firebase/functions-compat": "0.1.7", - "@firebase/installations": "0.5.4", - "@firebase/messaging": "0.9.4", - "@firebase/messaging-compat": "0.1.4", - "@firebase/performance": "0.5.4", - "@firebase/performance-compat": "0.1.4", - "@firebase/polyfill": "0.3.36", - "@firebase/remote-config": "0.3.3", - "@firebase/remote-config-compat": "0.1.4", - "@firebase/storage": "0.9.0", - "@firebase/storage-compat": "0.1.8", - "@firebase/util": "1.4.2" - } - }, - "firebase-admin": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-10.0.0.tgz", - "integrity": "sha512-EOAk5ZaqXhBBvx9ZyXd28kw8glMTt3xl0g3BepGRCy0RSSUPGOzfAqjGhc65guSKgFOpT5mAUycYcJbqullKUQ==", - "dev": true, - "requires": { - "@firebase/database-compat": "^0.1.1", - "@firebase/database-types": "^0.7.2", - "@google-cloud/firestore": "^4.5.0", - "@google-cloud/storage": "^5.3.0", - "@types/node": ">=12.12.47", - "dicer": "^0.3.0", - "jsonwebtoken": "^8.5.1", - "jwks-rsa": "^2.0.2", - "node-forge": "^0.10.0" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", - "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", - "dev": true - }, - "follow-redirects": { - "version": "1.14.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.6.tgz", - "integrity": "sha512-fhUl5EwSJbbl8AR+uYL2KQDxLkdSjZGR36xy46AO7cOMTrCMON6Sa28FmAnC2tRTDbd/Uuzz3aJBv7EBN7JH8A==" - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", - "requires": { - "fetch-blob": "^3.1.2" - } - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "gaxios": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.3.2.tgz", - "integrity": "sha512-T+ap6GM6UZ0c4E6yb1y/hy2UB6hTrqhglp3XfmU9qbLCGRYhLVV5aRPpC4EmoG8N8zOnkYCgoBz+ScvGAARY6Q==", - "dev": true, - "requires": { - "abort-controller": "^3.0.0", - "extend": "^3.0.2", - "https-proxy-agent": "^5.0.0", - "is-stream": "^2.0.0", - "node-fetch": "^2.6.1" - }, - "dependencies": { - "node-fetch": { - "version": "2.6.6", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz", - "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==", - "dev": true, - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", - "dev": true - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", - "dev": true - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "dev": true, - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - } - } - }, - "gcp-metadata": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.3.1.tgz", - "integrity": "sha512-x850LS5N7V1F3UcV7PoupzGsyD6iVwTVvsh3tbXfkctZnBnjW5yu5z1/3k3SehF7TyoTIe78rJs02GMMy+LF+A==", - "dev": true, - "requires": { - "gaxios": "^4.0.0", - "json-bigint": "^1.0.0" - } - }, - "gcs-resumable-upload": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-3.6.0.tgz", - "integrity": "sha512-IyaNs4tx3Mp2UKn0CltRUiW/ZXYFlBNuK/V+ixs80chzVD+BJq3+8bfiganATFfCoMluAjokF9EswNJdVuOs8A==", - "dev": true, - "requires": { - "abort-controller": "^3.0.0", - "async-retry": "^1.3.3", - "configstore": "^5.0.0", - "extend": "^3.0.2", - "gaxios": "^4.0.0", - "google-auth-library": "^7.0.0", - "pumpify": "^2.0.0", - "stream-events": "^1.0.4" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "requires": { - "is-glob": "^4.0.1" - } - }, - "global-dirs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", - "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", - "dev": true, - "requires": { - "ini": "2.0.0" - } - }, - "globals": { - "version": "13.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", - "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globby": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", - "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", - "requires": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" - } - }, - "google-auth-library": { - "version": "7.10.2", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-7.10.2.tgz", - "integrity": "sha512-M37o9Kxa/TLvOLgF71SXvLeVEP5sbSTmKl1zlIgl72SFy5PtsU3pOdu8G8MIHHpQ3/NZabDI8rQkA9DvQVKkPA==", - "dev": true, - "requires": { - "arrify": "^2.0.0", - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "fast-text-encoding": "^1.0.0", - "gaxios": "^4.0.0", - "gcp-metadata": "^4.2.0", - "gtoken": "^5.0.4", - "jws": "^4.0.0", - "lru-cache": "^6.0.0" - }, - "dependencies": { - "jwa": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", - "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", - "dev": true, - "requires": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "jws": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", - "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", - "dev": true, - "requires": { - "jwa": "^2.0.0", - "safe-buffer": "^5.0.1" - } - } - } - }, - "google-gax": { - "version": "2.28.1", - "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-2.28.1.tgz", - "integrity": "sha512-2Xjd3FrjlVd6Cmw2B2Aicpc/q92SwTpIOvxPUlnRg9w+Do8nu7UR+eQrgoKlo2FIUcUuDTvppvcx8toND0pK9g==", - "dev": true, - "optional": true, - "requires": { - "@grpc/grpc-js": "~1.4.0", - "@grpc/proto-loader": "^0.6.1", - "@types/long": "^4.0.0", - "abort-controller": "^3.0.0", - "duplexify": "^4.0.0", - "fast-text-encoding": "^1.0.3", - "google-auth-library": "^7.6.1", - "is-stream-ended": "^0.1.4", - "node-fetch": "^2.6.1", - "object-hash": "^2.1.1", - "proto3-json-serializer": "^0.1.5", - "protobufjs": "6.11.2", - "retry-request": "^4.0.0" - }, - "dependencies": { - "node-fetch": { - "version": "2.6.6", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz", - "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==", - "dev": true, - "optional": true, - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", - "dev": true, - "optional": true - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", - "dev": true, - "optional": true - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "dev": true, - "optional": true, - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - } - } - }, - "google-p12-pem": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.1.2.tgz", - "integrity": "sha512-tjf3IQIt7tWCDsa0ofDQ1qqSCNzahXDxdAGJDbruWqu3eCg5CKLYKN+hi0s6lfvzYZ1GDVr+oDF9OOWlDSdf0A==", - "dev": true, - "requires": { - "node-forge": "^0.10.0" - } - }, - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - } - }, - "graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" - }, - "gtoken": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-5.3.1.tgz", - "integrity": "sha512-yqOREjzLHcbzz1UrQoxhBtpk8KjrVhuqPE7od1K2uhyxG2BHjKZetlbLw/SPZak/QqTIQW+addS+EcjqQsZbwQ==", - "dev": true, - "requires": { - "gaxios": "^4.0.0", - "google-p12-pem": "^3.0.3", - "jws": "^4.0.0" - }, - "dependencies": { - "jwa": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", - "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", - "dev": true, - "requires": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "jws": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", - "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", - "dev": true, - "requires": { - "jwa": "^2.0.0", - "safe-buffer": "^5.0.1" - } - } - } - }, - "handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", - "requires": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4", - "wordwrap": "^1.0.0" - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" - }, - "has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "dev": true - }, - "hash-stream-validation": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/hash-stream-validation/-/hash-stream-validation-0.2.4.tgz", - "integrity": "sha512-Gjzu0Xn7IagXVkSu9cSFuK1fqzwtLwFhNhVL8IFJijRNMgUttFbBSIAzKuSIrsFMO1+g1RlsoN49zPIbwPDMGQ==", - "dev": true - }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "dev": true - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "http-parser-js": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", - "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==" - }, - "http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "requires": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "husky": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/husky/-/husky-7.0.4.tgz", - "integrity": "sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "idb": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/idb/-/idb-3.0.2.tgz", - "integrity": "sha512-+FLa/0sTXqyux0o6C+i2lOR0VoS60LU/jzUo5xjfY6+7sEEgy4Gz1O7yFBXvjd7N0NyIGWIRg8DcQSLEG+VSPw==" - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, - "ignore": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz", - "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==" - }, - "ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", - "dev": true - }, - "imagemin": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/imagemin/-/imagemin-7.0.1.tgz", - "integrity": "sha512-33AmZ+xjZhg2JMCe+vDf6a9mzWukE7l+wAtesjE7KyteqqKjzxv7aVQeWnul1Ve26mWvEQqyPwl0OctNBfSR9w==", - "requires": { - "file-type": "^12.0.0", - "globby": "^10.0.0", - "graceful-fs": "^4.2.2", - "junk": "^3.1.0", - "make-dir": "^3.0.0", - "p-pipe": "^3.0.0", - "replace-ext": "^1.0.0" - } - }, - "immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" - }, - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "requires": { - "ci-info": "^2.0.0" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dev": true, - "requires": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - } - }, - "is-jpg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-jpg/-/is-jpg-3.0.0.tgz", - "integrity": "sha512-Vcd67KWHZblEKEBrtP25qLZ8wN9ICoAhl1pKUqD7SM7hf2qtuRl7loDgP5Zigh2oN/+7uj+KVyC0eRJvgOEFeQ==" - }, - "is-npm": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", - "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-stream-ended": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-stream-ended/-/is-stream-ended-0.1.4.tgz", - "integrity": "sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==", - "dev": true, - "optional": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "jose": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/jose/-/jose-2.0.5.tgz", - "integrity": "sha512-BAiDNeDKTMgk4tvD0BbxJ8xHEHBZgpeRZ1zGPPsitSyMgjoMWiLGYAE7H7NpP5h0lPppQajQs871E8NHUrzVPA==", - "dev": true, - "requires": { - "@panva/asn1.js": "^1.0.0" - } - }, - "joycon": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.0.1.tgz", - "integrity": "sha512-SJcJNBg32dGgxhPtM0wQqxqV0ax9k/9TaUskGDSJkSFSQOEWWvQ3zzWdGQRIUry2j1zA5+ReH13t0Mf3StuVZA==" - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "json-bigint": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", - "dev": true, - "requires": { - "bignumber.js": "^9.0.0" - } - }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", - "dev": true - }, - "json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "jsonwebtoken": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", - "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", - "requires": { - "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^5.6.0" - }, - "dependencies": { - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } - } - }, - "jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - } - }, - "jszip": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.7.1.tgz", - "integrity": "sha512-ghL0tz1XG9ZEmRMcEN2vt7xabrDdqHHeykgARpmZ0BiIctWxM47Vt63ZO2dnp4QYt/xJVLLy5Zv1l/xRdh2byg==", - "requires": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "set-immediate-shim": "~1.0.1" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "junk": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz", - "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==" - }, - "jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "requires": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "jwks-rsa": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-2.0.5.tgz", - "integrity": "sha512-fliHfsiBRzEU0nXzSvwnh0hynzGB0WihF+CinKbSRlaqRxbqqKf2xbBPgwc8mzf18/WgwlG8e5eTpfSTBcU4DQ==", - "dev": true, - "requires": { - "@types/express-jwt": "0.0.42", - "debug": "^4.3.2", - "jose": "^2.0.5", - "limiter": "^1.1.5", - "lru-memoizer": "^2.1.4" - }, - "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "requires": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, - "kareem": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.2.tgz", - "integrity": "sha512-STHz9P7X2L4Kwn72fA4rGyqyXdmrMSdxqHx9IXon/FXluXieaFA6KJ2upcHAHxQPQ0LeM/OjLrhFxifHewOALQ==" - }, - "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, - "requires": { - "json-buffer": "3.0.0" - } - }, - "latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "dev": true, - "requires": { - "package-json": "^6.3.0" - } - }, - "leven": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", - "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=" - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "requires": { - "immediate": "~3.0.5" - } - }, - "limiter": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", - "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==", - "dev": true - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true - }, - "lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" - }, - "lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" - }, - "lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" - }, - "lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" - }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" - }, - "lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" - }, - "long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "lru-memoizer": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-2.1.4.tgz", - "integrity": "sha512-IXAq50s4qwrOBrXJklY+KhgZF+5y98PDaNo0gi/v2KQBFLyWr+JyFvijZXkGKjQj/h9c0OwoE+JZbwUXce76hQ==", - "dev": true, - "requires": { - "lodash.clonedeep": "^4.5.0", - "lru-cache": "~4.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.2.tgz", - "integrity": "sha1-HRdnnAac2l0ECZGgnbwsDbN35V4=", - "dev": true, - "requires": { - "pseudomap": "^1.0.1", - "yallist": "^2.0.0" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - } - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" - }, - "memory-pager": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", - "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", - "optional": true - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==" - }, - "mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", - "requires": { - "mime-db": "1.51.0" - } - }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" - } - }, - "mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" - }, - "moment": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", - "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" - }, - "mongodb": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.2.2.tgz", - "integrity": "sha512-zt8rCTnTKyMQppyt63qMnrLM5dbADgUk18ORPF1XbtHLIYCyc9hattaYHi0pqMvNxDpgGgUofSVzS+UQErgTug==", - "requires": { - "bson": "^4.6.0", - "denque": "^2.0.1", - "mongodb-connection-string-url": "^2.3.2", - "saslprep": "^1.0.3" - } - }, - "mongodb-connection-string-url": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.3.2.tgz", - "integrity": "sha512-2LkmS0ny7LamAyhEs2Q+zuFFxeGNSc2DaGHBevjqkoPt7bgh+67mg1sFU6awnMsdLKpdEt7zUy466K9x7RsYcQ==", - "requires": { - "@types/whatwg-url": "^8.2.1", - "whatwg-url": "^11.0.0" - } - }, - "mongoose": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.1.2.tgz", - "integrity": "sha512-/CNxPVSPnaRNKndlhVOblFSB8kfpHWuAiJSEoVqs/pjS42actV7m/Wk0o0RbsndUvJ1WUenoXpbG8lrD9atGlQ==", - "requires": { - "bson": "^4.2.2", - "kareem": "2.3.2", - "mongodb": "4.2.2", - "mpath": "0.8.4", - "mquery": "4.0.0", - "ms": "2.1.2", - "regexp-clone": "1.0.0", - "sift": "13.5.2", - "sliced": "1.0.1" - }, - "dependencies": { - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "mpath": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.4.tgz", - "integrity": "sha512-DTxNZomBcTWlrMW76jy1wvV37X/cNNxPW1y2Jzd4DZkAaC5ZGsm8bfGfNOthcDuRJujXLqiuS6o3Tpy0JEoh7g==" - }, - "mquery": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mquery/-/mquery-4.0.0.tgz", - "integrity": "sha512-nGjm89lHja+T/b8cybAby6H0YgA4qYC/lx6UlwvHGqvTq8bDaNeCwl1sY8uRELrNbVWJzIihxVd+vphGGn1vBw==", - "requires": { - "debug": "4.x", - "regexp-clone": "^1.0.0", - "sliced": "1.0.1" - }, - "dependencies": { - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "mri": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.4.tgz", - "integrity": "sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w==" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "multer": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.3.tgz", - "integrity": "sha512-np0YLKncuZoTzufbkM6wEKp68EhWJXcU6fq6QqrSwkckd2LlMgd1UqhUJLj6NS/5sZ8dE8LYDWslsltJznnXlg==", - "requires": { - "append-field": "^1.0.0", - "busboy": "^0.2.11", - "concat-stream": "^1.5.2", - "mkdirp": "^0.5.4", - "object-assign": "^4.1.1", - "on-finished": "^2.3.0", - "type-is": "^1.6.4", - "xtend": "^4.0.0" - } - }, - "napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" - }, - "node-abi": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.5.0.tgz", - "integrity": "sha512-LtHvNIBgOy5mO8mPEUtkCW/YCRWYEKshIvqhe1GHHyXEHEB5mgICyYnAcl4qan3uFeRROErKGzatFHPf6kDxWw==", - "requires": { - "semver": "^7.3.5" - }, - "dependencies": { - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "node-addon-api": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.2.0.tgz", - "integrity": "sha512-eazsqzwG2lskuzBqCGPi7Ac2UgOoMz8JVOXVhTvvPDYhthvNpefx8jWD8Np7Gv+2Sz0FlPWZk0nJV0z598Wn8Q==" - }, - "node-fetch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.1.0.tgz", - "integrity": "sha512-QU0WbIfMUjd5+MUzQOYhenAazakV7Irh1SGkWCsRzBwvm4fAhzEUaHMJ6QLP7gWT6WO9/oH2zhKMMGMuIrDyKw==", - "requires": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.2", - "formdata-polyfill": "^4.0.10" - } - }, - "node-forge": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", - "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", - "dev": true - }, - "nodemailer": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.7.2.tgz", - "integrity": "sha512-Dz7zVwlef4k5R71fdmxwR8Q39fiboGbu3xgswkzGwczUfjp873rVxt1O46+Fh0j1ORnAC6L9+heI8uUpO6DT7Q==" - }, - "nodemailer-sendgrid": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/nodemailer-sendgrid/-/nodemailer-sendgrid-1.0.3.tgz", - "integrity": "sha512-To/veO2M4evjtv1XrY7BUgE+LDypgs/FBx4wOHb2UNTpvZhiARtvMaBI0685Yxkho0lIPJc4jS0cUE7v+XGNgg==", - "requires": { - "@sendgrid/mail": "^6.2.1" - }, - "dependencies": { - "@sendgrid/client": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/@sendgrid/client/-/client-6.5.5.tgz", - "integrity": "sha512-Nbfgo94gbWSL8PIgJfuHoifyOJJepvV8NQkkglctAEfb1hyozKhrzE6v1kPG/z4j0RodaTtXD5LJj/t0q/VhLA==", - "requires": { - "@sendgrid/helpers": "^6.5.5", - "@types/request": "^2.48.4", - "request": "^2.88.0" - } - }, - "@sendgrid/helpers": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/@sendgrid/helpers/-/helpers-6.5.5.tgz", - "integrity": "sha512-uRFEanalfss5hDsuzVXZ1wm7i7eEXHh1py80piOXjobiQ+MxmtR19EU+gDSXZ+uMcEehBGhxnb7QDNN0q65qig==", - "requires": { - "chalk": "^2.0.1", - "deepmerge": "^4.2.2" - } - }, - "@sendgrid/mail": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/@sendgrid/mail/-/mail-6.5.5.tgz", - "integrity": "sha512-DSu8oTPI0BJFH60jMOG9gM+oeNMoRALFmdAYg2PIXpL+Zbxd7L2GzQZtmf1jLy/8UBImkbB3D74TjiOBiLRK1w==", - "requires": { - "@sendgrid/client": "^6.5.5", - "@sendgrid/helpers": "^6.5.5" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - } - } - }, - "nodemon": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.15.tgz", - "integrity": "sha512-gdHMNx47Gw7b3kWxJV64NI+Q5nfl0y5DgDbiVtShiwa7Z0IZ07Ll4RLFo6AjrhzMtoEZn5PDE3/c2AbVsiCkpA==", - "dev": true, - "requires": { - "chokidar": "^3.5.2", - "debug": "^3.2.7", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.0.4", - "pstree.remy": "^1.1.8", - "semver": "^5.7.1", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.5", - "update-notifier": "^5.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - } - } - }, - "nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "dev": true - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-hash": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", - "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", - "dev": true, - "optional": true - }, - "on-exit-leak-free": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-0.2.0.tgz", - "integrity": "sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==" - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { - "ee-first": "1.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-pipe": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-3.1.0.tgz", - "integrity": "sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==" - }, - "package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dev": true, - "requires": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" - }, - "pino": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-7.4.0.tgz", - "integrity": "sha512-qEHLtKcmYcid6s2qjlGTxaLe9Lq1IiGmd74IZb9Obi/FRTaA+ymb8FD/cmOIL4vt6ug/EtmhGwxZbiGhI+7cuQ==", - "requires": { - "fast-redact": "^3.0.0", - "fastify-warning": "^0.2.0", - "get-caller-file": "^2.0.5", - "on-exit-leak-free": "^0.2.0", - "pino-abstract-transport": "v0.5.0", - "pino-std-serializers": "^4.0.0", - "quick-format-unescaped": "^4.0.3", - "real-require": "^0.1.0", - "safe-stable-stringify": "^2.1.0", - "sonic-boom": "^2.2.1", - "thread-stream": "^0.13.0" - } - }, - "pino-abstract-transport": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-0.5.0.tgz", - "integrity": "sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==", - "requires": { - "duplexify": "^4.1.2", - "split2": "^4.0.0" - } - }, - "pino-pretty": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-7.2.0.tgz", - "integrity": "sha512-pkZhaF1JiyQt4BRqkLANYWuZTxavmuXh3OHsb8goeQasTFgNdzOECXkZWyPYrA0YMRa8zKoVsCzeYz9lI2NYwA==", - "requires": { - "args": "^5.0.1", - "colorette": "^2.0.7", - "dateformat": "^4.6.3", - "fast-safe-stringify": "^2.0.7", - "joycon": "^3.0.0", - "pino-abstract-transport": "^0.5.0", - "pump": "^3.0.0", - "readable-stream": "^3.6.0", - "rfdc": "^1.3.0", - "secure-json-parse": "^2.4.0", - "sonic-boom": "^2.2.0", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" - } - } - }, - "pino-std-serializers": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-4.0.0.tgz", - "integrity": "sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==" - }, - "prebuild-install": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.0.0.tgz", - "integrity": "sha512-IvSenf33K7JcgddNz2D5w521EgO+4aMMjFt73Uk9FRzQ7P+QZPKrp7qPsDydsSwjGt3T5xRNnM1bj1zMTD5fTA==", - "requires": { - "detect-libc": "^1.0.3", - "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", - "node-abi": "^3.3.0", - "npmlog": "^4.0.1", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - } - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "dev": true - }, - "prettier": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz", - "integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "promise-polyfill": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.1.3.tgz", - "integrity": "sha512-MG5r82wBzh7pSKDRa9y+vllNHz3e3d4CNj1PQE4BQYxLme0gKYYBm9YENq+UkEikyZ0XbiGWxYlVw3Rl9O/U8g==" - }, - "proto3-json-serializer": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-0.1.6.tgz", - "integrity": "sha512-tGbV6m6Kad8NqxMh5hw87euPS0YoZSAOIfvR01zYkQV8Gpx1V/8yU/0gCKCvfCkhAJsjvzzhnnsdQxA1w7PSog==", - "dev": true, - "optional": true, - "requires": { - "protobufjs": "^6.11.2" - } - }, - "protobufjs": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz", - "integrity": "sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==", - "requires": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/long": "^4.0.1", - "@types/node": ">=13.7.0", - "long": "^4.0.0" - } - }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - } - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" - }, - "pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-2.0.1.tgz", - "integrity": "sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==", - "dev": true, - "requires": { - "duplexify": "^4.1.1", - "inherits": "^2.0.3", - "pump": "^3.0.0" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", - "dev": true, - "requires": { - "escape-goat": "^2.0.0" - } - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" - }, - "querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" - }, - "quick-format-unescaped": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", - "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - } - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "real-require": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.1.0.tgz", - "integrity": "sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==" - }, - "regexp-clone": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz", - "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==" - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "registry-auth-token": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", - "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", - "dev": true, - "requires": { - "rc": "^1.2.8" - } - }, - "registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "dev": true, - "requires": { - "rc": "^1.2.8" - } - }, - "replace-ext": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", - "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==" - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - } - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "dev": true, - "requires": { - "lowercase-keys": "^1.0.0" - } - }, - "retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true - }, - "retry-request": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-4.2.2.tgz", - "integrity": "sha512-xA93uxUD/rogV7BV59agW/JHPGXeREMWiZc9jhcwY4YdZ7QOtC7qbomYg0n4wyk2lJhggjvKvhNX8wln/Aldhg==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "extend": "^3.0.2" - }, - "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" - }, - "rfdc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "safe-stable-stringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.2.0.tgz", - "integrity": "sha512-C6AuMdYPuPV/P1leplHNu0lgc2LAElq/g3TdoksDCIVtBhr78o/CH03bt/9SKqugFbKU9CUjsNlCu0fjtQzQUw==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "saslprep": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", - "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", - "optional": true, - "requires": { - "sparse-bitfield": "^3.0.3" - } - }, - "secure-json-parse": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.4.0.tgz", - "integrity": "sha512-Q5Z/97nbON5t/L/sH6mY2EacfjVGwrCcSi5D3btRO2GZ8pf1K1UN7Z9H5J57hjVU2Qzxr1xO+FmBhOvEkzCMmg==" - }, - "selenium-webdriver": { - "version": "4.0.0-rc-1", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.0.0-rc-1.tgz", - "integrity": "sha512-bcrwFPRax8fifRP60p7xkWDGSJJoMkPAzufMlk5K2NyLPht/YZzR2WcIk1+3gR8VOCLlst1P2PI+MXACaFzpIw==", - "requires": { - "jszip": "^3.6.0", - "rimraf": "^3.0.2", - "tmp": "^0.2.1", - "ws": ">=7.4.6" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dev": true, - "requires": { - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "dependencies": { - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - } - } - }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" - }, - "sharp": { - "version": "0.29.3", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.29.3.tgz", - "integrity": "sha512-fKWUuOw77E4nhpyzCCJR1ayrttHoFHBT2U/kR/qEMRhvPEcluG4BKj324+SCO1e84+knXHwhJ1HHJGnUt4ElGA==", - "requires": { - "color": "^4.0.1", - "detect-libc": "^1.0.3", - "node-addon-api": "^4.2.0", - "prebuild-install": "^7.0.0", - "semver": "^7.3.5", - "simple-get": "^4.0.0", - "tar-fs": "^2.1.1", - "tunnel-agent": "^0.6.0" - }, - "dependencies": { - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" - }, - "sift": { - "version": "13.5.2", - "resolved": "https://registry.npmjs.org/sift/-/sift-13.5.2.tgz", - "integrity": "sha512-+gxdEOMA2J+AI+fVsCqeNn7Tgx3M9ZN9jdi95939l1IJ8cZsqS8sqpJyOkic2SJk+1+98Uwryt/gL6XDaV+UZA==" - }, - "signal-exit": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", - "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==" - }, - "simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" - }, - "simple-get": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.0.tgz", - "integrity": "sha512-ZalZGexYr3TA0SwySsr5HlgOOinS4Jsa8YB2GJ6lUNAazyAu4KG/VmzMTwAt2YVXzzVj8QmefmAonZIK2BSGcQ==", - "requires": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - }, - "dependencies": { - "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "requires": { - "mimic-response": "^3.1.0" - } - }, - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" - } - } - }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "requires": { - "is-arrayish": "^0.3.1" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "sliced": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", - "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" - }, - "snakeize": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/snakeize/-/snakeize-0.1.0.tgz", - "integrity": "sha1-EMCI2LWOsHazIpu1oE4jLOEmQi0=", - "dev": true - }, - "sonic-boom": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-2.3.1.tgz", - "integrity": "sha512-o0vJPsRiCW5Q0EmRKjNiiYGy2DqSXcxk4mY9vIBSPwmkH/e/vJ2Tq8EECd5NTiO77x8vlVN+ykDjRQJTqf7eKg==", - "requires": { - "atomic-sleep": "^1.0.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "sparse-bitfield": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", - "optional": true, - "requires": { - "memory-pager": "^1.0.2" - } - }, - "split2": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz", - "integrity": "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==" - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" - }, - "stream-events": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", - "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", - "dev": true, - "requires": { - "stubs": "^3.0.0" - } - }, - "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" - }, - "streamsearch": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", - "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" - }, - "stubs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", - "integrity": "sha1-6NK6H6nJBXAwPAMLaQD31fiavls=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "requires": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - }, - "dependencies": { - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - } - } - }, - "tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - } - } - } - }, - "teeny-request": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-7.1.3.tgz", - "integrity": "sha512-Ew3aoFzgQEatLA5OBIjdr1DWJUaC1xardG+qbPPo5k/y/3fMwXLxpjh5UB5dVfElktLaQbbMs80chkz53ByvSg==", - "dev": true, - "requires": { - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "node-fetch": "^2.6.1", - "stream-events": "^1.0.5", - "uuid": "^8.0.0" - }, - "dependencies": { - "node-fetch": { - "version": "2.6.6", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz", - "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==", - "dev": true, - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", - "dev": true - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", - "dev": true - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "dev": true, - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - } - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "thread-stream": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-0.13.0.tgz", - "integrity": "sha512-kTMZeX4Dzlb1zZ00/01aerGaTw2i8NE4sWF0TvF1uXewRhCiUjCvatQkvxIvFqauWG2ADFS2Wpd3qBeYL9i3dg==", - "requires": { - "real-require": "^0.1.0" - } - }, - "tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "requires": { - "rimraf": "^3.0.0" - } - }, - "to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" - }, - "touch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", - "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", - "dev": true, - "requires": { - "nopt": "~1.0.10" - } - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", - "requires": { - "punycode": "^2.1.1" - } - }, - "ts-node": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.4.0.tgz", - "integrity": "sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A==", - "dev": true, - "requires": { - "@cspotcode/source-map-support": "0.7.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "yn": "3.1.1" - } - }, - "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.2.tgz", - "integrity": "sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw==", - "dev": true - }, - "uglify-js": { - "version": "3.14.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.3.tgz", - "integrity": "sha512-mic3aOdiq01DuSVx0TseaEzMIVqebMZ0Z3vaeDhFEh9bsc24hV1TFvN74reA2vs08D0ZWfNjAcJ3UbVLaBss+g==", - "optional": true - }, - "undefsafe": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", - "dev": true - }, - "unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dev": true, - "requires": { - "crypto-random-string": "^2.0.0" - } - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" - }, - "update-notifier": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", - "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", - "dev": true, - "requires": { - "boxen": "^5.0.0", - "chalk": "^4.1.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.4.0", - "is-npm": "^5.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.1.0", - "pupa": "^2.1.1", - "semver": "^7.3.4", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - }, - "dependencies": { - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "requires": { - "punycode": "^2.1.0" - } - }, - "url-parse": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.4.tgz", - "integrity": "sha512-ITeAByWWoqutFClc/lRZnFplgXgEZr3WJ6XngMM/N9DMIm4K8zXPCZ1Jdu0rERwO84w1WC5wkle2ubwTA4NTBg==", - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "dev": true, - "requires": { - "prepend-http": "^2.0.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "validator": { - "version": "13.7.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", - "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==" - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - } - } - }, - "web-streams-polyfill": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.0.tgz", - "integrity": "sha512-EqPmREeOzttaLRm5HS7io98goBgZ7IVz79aDvqjD0kYXLtFZTc0T/U6wHTPKyIjb+MdN7DFIIX6hgdBEpWmfPA==" - }, - "webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==" - }, - "websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "requires": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" - }, - "whatwg-fetch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", - "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" - }, - "whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", - "requires": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "requires": { - "isexe": "^2.0.0" - } - }, - "wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "requires": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dev": true, - "requires": { - "string-width": "^4.0.0" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "ws": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.3.0.tgz", - "integrity": "sha512-Gs5EZtpqZzLvmIM59w4igITU57lrtYVFneaa434VROv4thzJyV6UjIL3D42lslWlI+D4KzLYnxSwtfuiO79sNw==" - }, - "xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "dev": true - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - } - } + "name": "msclubwebserver", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@cspotcode/source-map-consumer": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", + "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", + "dev": true + }, + "@cspotcode/source-map-support": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz", + "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==", + "dev": true, + "requires": { + "@cspotcode/source-map-consumer": "0.8.0" + } + }, + "@eslint/eslintrc": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", + "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.2.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + } + } + }, + "@firebase/analytics": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.7.4.tgz", + "integrity": "sha512-AU3XMwHW7SFGCNeUKKNW2wXGTdmS164ackt/Epu2bDXCT1OcauPE1AVd+ofULSIDCaDUAQVmvw3JrobgogEU7Q==", + "requires": { + "@firebase/component": "0.5.9", + "@firebase/installations": "0.5.4", + "@firebase/logger": "0.3.2", + "@firebase/util": "1.4.2", + "tslib": "^2.1.0" + } + }, + "@firebase/analytics-compat": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.1.5.tgz", + "integrity": "sha512-5cfr0uWwlhoHQYAr6UtQCHwnGjs/3J/bWrfA3INNtzaN4/tTTLTD02iobbccRcM7dM5TR0sZFWS5orfAU3OBFg==", + "requires": { + "@firebase/analytics": "0.7.4", + "@firebase/analytics-types": "0.7.0", + "@firebase/component": "0.5.9", + "@firebase/util": "1.4.2", + "tslib": "^2.1.0" + } + }, + "@firebase/analytics-types": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.7.0.tgz", + "integrity": "sha512-DNE2Waiwy5+zZnCfintkDtBfaW6MjIG883474v6Z0K1XZIvl76cLND4iv0YUb48leyF+PJK1KO2XrgHb/KpmhQ==" + }, + "@firebase/app": { + "version": "0.7.9", + "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.7.9.tgz", + "integrity": "sha512-Ke+FRbmCvGaHuJjnNU1UM/W8K1P4mF31sf0lkWrPaJrdQNCaRDJAoI0S/lyLqbJWTjdJgsMN1yw2McR5pAs3Rg==", + "requires": { + "@firebase/component": "0.5.9", + "@firebase/logger": "0.3.2", + "@firebase/util": "1.4.2", + "tslib": "^2.1.0" + } + }, + "@firebase/app-check": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.5.2.tgz", + "integrity": "sha512-DJrvxcn5QPO5dU735GA9kYpf+GwmCmnd/oQdWVExrRG+yjaLnP0rSJ2HKQ4bZKGo8qig3P7fwQpdMOgP2BXFjQ==", + "requires": { + "@firebase/component": "0.5.9", + "@firebase/logger": "0.3.2", + "@firebase/util": "1.4.2", + "tslib": "^2.1.0" + } + }, + "@firebase/app-check-compat": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.2.2.tgz", + "integrity": "sha512-nX2Ou8Rwo+TMMNDecQOGH78kFw6sORLrsGyu0eC95M853JjisVxTngN1TU/RL5h83ElJ0HhNlz6C3FYAuGNqqA==", + "requires": { + "@firebase/app-check": "0.5.2", + "@firebase/component": "0.5.9", + "@firebase/logger": "0.3.2", + "@firebase/util": "1.4.2", + "tslib": "^2.1.0" + } + }, + "@firebase/app-check-interop-types": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.1.0.tgz", + "integrity": "sha512-uZfn9s4uuRsaX5Lwx+gFP3B6YsyOKUE+Rqa6z9ojT4VSRAsZFko9FRn6OxQUA1z5t5d08fY4pf+/+Dkd5wbdbA==" + }, + "@firebase/app-compat": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.1.10.tgz", + "integrity": "sha512-33LdDMO694BvVbSzldyIjqQcjXcnNI6bjNNMOgYFl4lD4fCludKhmOKg5NOuHkwl7iljOg/nKxPFkRvUwlKgPA==", + "requires": { + "@firebase/app": "0.7.9", + "@firebase/component": "0.5.9", + "@firebase/logger": "0.3.2", + "@firebase/util": "1.4.2", + "tslib": "^2.1.0" + } + }, + "@firebase/app-types": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.7.0.tgz", + "integrity": "sha512-6fbHQwDv2jp/v6bXhBw2eSRbNBpxHcd1NBF864UksSMVIqIyri9qpJB1Mn6sGZE+bnDsSQBC5j2TbMxYsJQkQg==" + }, + "@firebase/auth": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-0.19.3.tgz", + "integrity": "sha512-asOJkmzBh38DgZ5fBt7cv8dNyU3r7kRVoXi9f1eCpQp/n+NagaiUM+YKXq0snjbchFJu7qPBiwrIg/xZinY4kg==", + "requires": { + "@firebase/component": "0.5.9", + "@firebase/logger": "0.3.2", + "@firebase/util": "1.4.2", + "node-fetch": "2.6.5", + "selenium-webdriver": "4.0.0-rc-1", + "tslib": "^2.1.0" + }, + "dependencies": { + "node-fetch": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.5.tgz", + "integrity": "sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + } + } + }, + "@firebase/auth-compat": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.2.3.tgz", + "integrity": "sha512-qXdibKq44Lf22hy9YQaaMsAFMOiTA95Z9NjZJbrY8P0zXZUjFhwpx41Mett8+3X/uv/mXa6KuouRt2QdpsqU/g==", + "requires": { + "@firebase/auth": "0.19.3", + "@firebase/auth-types": "0.11.0", + "@firebase/component": "0.5.9", + "@firebase/util": "1.4.2", + "node-fetch": "2.6.5", + "selenium-webdriver": "^4.0.0-beta.2", + "tslib": "^2.1.0" + }, + "dependencies": { + "node-fetch": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.5.tgz", + "integrity": "sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + } + } + }, + "@firebase/auth-interop-types": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.1.6.tgz", + "integrity": "sha512-etIi92fW3CctsmR9e3sYM3Uqnoq861M0Id9mdOPF6PWIg38BXL5k4upCNBggGUpLIS0H1grMOvy/wn1xymwe2g==" + }, + "@firebase/auth-types": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.11.0.tgz", + "integrity": "sha512-q7Bt6cx+ySj9elQHTsKulwk3+qDezhzRBFC9zlQ1BjgMueUOnGMcvqmU0zuKlQ4RhLSH7MNAdBV2znVaoN3Vxw==" + }, + "@firebase/component": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.5.9.tgz", + "integrity": "sha512-oLCY3x9WbM5rn06qmUvbtJuPj4dIw/C9T4Th52IiHF5tiCRC5k6YthvhfUVcTwfoUhK0fOgtwuKJKA/LpCPjgA==", + "requires": { + "@firebase/util": "1.4.2", + "tslib": "^2.1.0" + } + }, + "@firebase/database": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.12.4.tgz", + "integrity": "sha512-XkrL1kXELRNkqKcltuT4hfG1gWmFiGvjFY+z7Lhb//12MqdkLjwa9YMK8c6Lo+Ro+IkWcJArQaOQYe3GkU5Wgg==", + "requires": { + "@firebase/auth-interop-types": "0.1.6", + "@firebase/component": "0.5.9", + "@firebase/logger": "0.3.2", + "@firebase/util": "1.4.2", + "faye-websocket": "0.11.4", + "tslib": "^2.1.0" + } + }, + "@firebase/database-compat": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-0.1.4.tgz", + "integrity": "sha512-dIJiZLDFF3U+MoEwoPBy7zxWmBUro1KefmwSHlpOoxmPv76tuoPm85NumpW/HmMrtTcTkC2qowtb6NjGE8X7mw==", + "requires": { + "@firebase/component": "0.5.9", + "@firebase/database": "0.12.4", + "@firebase/database-types": "0.9.3", + "@firebase/logger": "0.3.2", + "@firebase/util": "1.4.2", + "tslib": "^2.1.0" + }, + "dependencies": { + "@firebase/database-types": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.9.3.tgz", + "integrity": "sha512-R+YXLWy/Q7mNUxiUYiMboTwvVoprrgfyvf1Viyevskw6IoH1q8HV1UjlkLSgmRsOT9HPWt7XZUEStVZJFknHwg==", + "requires": { + "@firebase/app-types": "0.7.0", + "@firebase/util": "1.4.2" + } + } + } + }, + "@firebase/database-types": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.7.3.tgz", + "integrity": "sha512-dSOJmhKQ0nL8O4EQMRNGpSExWCXeHtH57gGg0BfNAdWcKhC8/4Y+qfKLfWXzyHvrSecpLmO0SmAi/iK2D5fp5A==", + "dev": true, + "requires": { + "@firebase/app-types": "0.6.3" + }, + "dependencies": { + "@firebase/app-types": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.6.3.tgz", + "integrity": "sha512-/M13DPPati7FQHEQ9Minjk1HGLm/4K4gs9bR4rzLCWJg64yGtVC0zNg9gDpkw9yc2cvol/mNFxqTtd4geGrwdw==", + "dev": true + } + } + }, + "@firebase/firestore": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-3.3.1.tgz", + "integrity": "sha512-aeEc/UzRJ2YqL/trEQo1fvKFScB/oXHzLg6q/X445tpMPf+zFHmpEuI9YdWGuqSCRfuP/qAy5u0tfkGIcrVmLg==", + "requires": { + "@firebase/component": "0.5.9", + "@firebase/logger": "0.3.2", + "@firebase/util": "1.4.2", + "@firebase/webchannel-wrapper": "0.6.1", + "@grpc/grpc-js": "^1.3.2", + "@grpc/proto-loader": "^0.6.0", + "node-fetch": "2.6.5", + "tslib": "^2.1.0" + }, + "dependencies": { + "node-fetch": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.5.tgz", + "integrity": "sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + } + } + }, + "@firebase/firestore-compat": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.1.8.tgz", + "integrity": "sha512-/v9Ag3opJ54i9417xqzRGJF3ptLVGwzBTjnnje/bTMWJam4DwVRoTiE5ZDm2HheMxRipFkZUsLgehRHUB9vMTw==", + "requires": { + "@firebase/component": "0.5.9", + "@firebase/firestore": "3.3.1", + "@firebase/firestore-types": "2.5.0", + "@firebase/util": "1.4.2", + "tslib": "^2.1.0" + } + }, + "@firebase/firestore-types": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-2.5.0.tgz", + "integrity": "sha512-I6c2m1zUhZ5SH0cWPmINabDyH5w0PPFHk2UHsjBpKdZllzJZ2TwTkXbDtpHUZNmnc/zAa0WNMNMvcvbb/xJLKA==" + }, + "@firebase/functions": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.7.6.tgz", + "integrity": "sha512-Kl6a2PbRkOlSlOWJSgYuNp3e53G3cb+axF+r7rbWhJIHiaelG16GerBMxZTSxyiCz77C24LwiA2TKNwe85ObZg==", + "requires": { + "@firebase/app-check-interop-types": "0.1.0", + "@firebase/auth-interop-types": "0.1.6", + "@firebase/component": "0.5.9", + "@firebase/messaging-interop-types": "0.1.0", + "@firebase/util": "1.4.2", + "node-fetch": "2.6.5", + "tslib": "^2.1.0" + }, + "dependencies": { + "node-fetch": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.5.tgz", + "integrity": "sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + } + } + }, + "@firebase/functions-compat": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.1.7.tgz", + "integrity": "sha512-Rv3mAUIhsLTxIgPWJSESUcmE1tzNHzUlqQStPnxHn6eFFgHVhkU2wg/NMrKZWTFlb51jpKTjh51AQDhRdT3n3A==", + "requires": { + "@firebase/component": "0.5.9", + "@firebase/functions": "0.7.6", + "@firebase/functions-types": "0.5.0", + "@firebase/util": "1.4.2", + "tslib": "^2.1.0" + } + }, + "@firebase/functions-types": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.5.0.tgz", + "integrity": "sha512-qza0M5EwX+Ocrl1cYI14zoipUX4gI/Shwqv0C1nB864INAD42Dgv4v94BCyxGHBg2kzlWy8PNafdP7zPO8aJQA==" + }, + "@firebase/installations": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.5.4.tgz", + "integrity": "sha512-rYb6Ju/tIBhojmM8FsgS96pErKl6gPgJFnffMO4bKH7HilXhOfgLfKU9k51ZDcps8N0npDx9+AJJ6pL1aYuYZQ==", + "requires": { + "@firebase/component": "0.5.9", + "@firebase/util": "1.4.2", + "idb": "3.0.2", + "tslib": "^2.1.0" + } + }, + "@firebase/logger": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.3.2.tgz", + "integrity": "sha512-lzLrcJp9QBWpo40OcOM9B8QEtBw2Fk1zOZQdvv+rWS6gKmhQBCEMc4SMABQfWdjsylBcDfniD1Q+fUX1dcBTXA==", + "requires": { + "tslib": "^2.1.0" + } + }, + "@firebase/messaging": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.9.4.tgz", + "integrity": "sha512-OvYV4MLPfDpdP/yltLqZXZRx6rXWz52bEilS2jL2B4sGiuTaXSkR6BIHB54EPTblu32nbyZYdlER4fssz4TfXw==", + "requires": { + "@firebase/component": "0.5.9", + "@firebase/installations": "0.5.4", + "@firebase/messaging-interop-types": "0.1.0", + "@firebase/util": "1.4.2", + "idb": "3.0.2", + "tslib": "^2.1.0" + } + }, + "@firebase/messaging-compat": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.1.4.tgz", + "integrity": "sha512-6477jBw7w7hk0uhnTUMsPoukalpcwbxTTo9kMguHVSXe0t3OdoxeXEaapaNJlOmU4Kgc8j3rsms8IDLdKVpvlA==", + "requires": { + "@firebase/component": "0.5.9", + "@firebase/messaging": "0.9.4", + "@firebase/util": "1.4.2", + "tslib": "^2.1.0" + } + }, + "@firebase/messaging-interop-types": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.1.0.tgz", + "integrity": "sha512-DbvUl/rXAZpQeKBnwz0NYY5OCqr2nFA0Bj28Fmr3NXGqR4PAkfTOHuQlVtLO1Nudo3q0HxAYLa68ZDAcuv2uKQ==" + }, + "@firebase/performance": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.5.4.tgz", + "integrity": "sha512-ES6aS4eoMhf9CczntBADDsXhaFea/3a0FADwy/VpWXXBxVb8tqc5tPcoTwd9L5M/aDeSiQMy344rhrSsTbIZEg==", + "requires": { + "@firebase/component": "0.5.9", + "@firebase/installations": "0.5.4", + "@firebase/logger": "0.3.2", + "@firebase/util": "1.4.2", + "tslib": "^2.1.0" + } + }, + "@firebase/performance-compat": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.1.4.tgz", + "integrity": "sha512-YuGfmpC0o+YvEBlEZCbPdNbT4Nn2qhi5uMXjqKnNIUepmXUsgOYDiAqM9nxHPoE/6IkvoFMdCj5nTUYVLCFXgg==", + "requires": { + "@firebase/component": "0.5.9", + "@firebase/logger": "0.3.2", + "@firebase/performance": "0.5.4", + "@firebase/performance-types": "0.1.0", + "@firebase/util": "1.4.2", + "tslib": "^2.1.0" + } + }, + "@firebase/performance-types": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.1.0.tgz", + "integrity": "sha512-6p1HxrH0mpx+622Ql6fcxFxfkYSBpE3LSuwM7iTtYU2nw91Hj6THC8Bc8z4nboIq7WvgsT/kOTYVVZzCSlXl8w==" + }, + "@firebase/polyfill": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@firebase/polyfill/-/polyfill-0.3.36.tgz", + "integrity": "sha512-zMM9oSJgY6cT2jx3Ce9LYqb0eIpDE52meIzd/oe/y70F+v9u1LDqk5kUF5mf16zovGBWMNFmgzlsh6Wj0OsFtg==", + "requires": { + "core-js": "3.6.5", + "promise-polyfill": "8.1.3", + "whatwg-fetch": "2.0.4" + } + }, + "@firebase/remote-config": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.3.3.tgz", + "integrity": "sha512-9hZWfB3k3IYsjHbWeUfhv/SDCcOgv/JMJpLXlUbTppXPm1IZ3X9ZW4I9bS86gGYr7m/kSv99U0oxQ7N9PoR8Iw==", + "requires": { + "@firebase/component": "0.5.9", + "@firebase/installations": "0.5.4", + "@firebase/logger": "0.3.2", + "@firebase/util": "1.4.2", + "tslib": "^2.1.0" + } + }, + "@firebase/remote-config-compat": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.1.4.tgz", + "integrity": "sha512-6WeKR7E9KJ1RIF9GZiyle1uD4IsIPUBKUnUnFkQhj3FV6cGvQwbeG0rbh7QQLvd0IWuh9lABYjHXWp+rGHQk8A==", + "requires": { + "@firebase/component": "0.5.9", + "@firebase/logger": "0.3.2", + "@firebase/remote-config": "0.3.3", + "@firebase/remote-config-types": "0.2.0", + "@firebase/util": "1.4.2", + "tslib": "^2.1.0" + } + }, + "@firebase/remote-config-types": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.2.0.tgz", + "integrity": "sha512-hqK5sCPeZvcHQ1D6VjJZdW6EexLTXNMJfPdTwbD8NrXUw6UjWC4KWhLK/TSlL0QPsQtcKRkaaoP+9QCgKfMFPw==" + }, + "@firebase/storage": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.9.0.tgz", + "integrity": "sha512-1gSYdrwP9kECmugH9L3tvNMvSjnNJGamj91rrESOFk2ZHDO93qKR90awc68NnhmzFAJOT/eJzVm35LKU6SqUNg==", + "requires": { + "@firebase/component": "0.5.9", + "@firebase/util": "1.4.2", + "node-fetch": "2.6.5", + "tslib": "^2.1.0" + }, + "dependencies": { + "node-fetch": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.5.tgz", + "integrity": "sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + } + } + }, + "@firebase/storage-compat": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.1.8.tgz", + "integrity": "sha512-L5R0DQoHCDKIgcBbqTx+6+RQ2533WFKeV3cfLAZCTGjyMUustj0eYDsr7fLhGexwsnpT3DaxhlbzT3icUWoDaA==", + "requires": { + "@firebase/component": "0.5.9", + "@firebase/storage": "0.9.0", + "@firebase/storage-types": "0.6.0", + "@firebase/util": "1.4.2", + "tslib": "^2.1.0" + } + }, + "@firebase/storage-types": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.6.0.tgz", + "integrity": "sha512-1LpWhcCb1ftpkP/akhzjzeFxgVefs6eMD2QeKiJJUGH1qOiows2w5o0sKCUSQrvrRQS1lz3SFGvNR1Ck/gqxeA==" + }, + "@firebase/util": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.4.2.tgz", + "integrity": "sha512-JMiUo+9QE9lMBvEtBjqsOFdmJgObFvi7OL1A0uFGwTmlCI1ZeNPOEBrwXkgTOelVCdiMO15mAebtEyxFuQ6FsA==", + "requires": { + "tslib": "^2.1.0" + } + }, + "@firebase/webchannel-wrapper": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.6.1.tgz", + "integrity": "sha512-9FqhNjKQWpQ3fGnSOCovHOm+yhhiorKEqYLAfd525jWavunDJcx8rOW6i6ozAh+FbwcYMkL7b+3j4UR/30MpoQ==" + }, + "@google-cloud/common": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-3.8.1.tgz", + "integrity": "sha512-FOs3NFU6bDt5mXE7IFpwIeqzLwRZNu9lJYl+bHVNkwmxX/w4VyDZAiGjQHhpV1Ek+muNKlX8HPchxaIxNTuOhw==", + "dev": true, + "requires": { + "@google-cloud/projectify": "^2.0.0", + "@google-cloud/promisify": "^2.0.0", + "arrify": "^2.0.1", + "duplexify": "^4.1.1", + "ent": "^2.2.0", + "extend": "^3.0.2", + "google-auth-library": "^7.9.2", + "retry-request": "^4.2.2", + "teeny-request": "^7.0.0" + } + }, + "@google-cloud/firestore": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-4.15.1.tgz", + "integrity": "sha512-2PWsCkEF1W02QbghSeRsNdYKN1qavrHBP3m72gPDMHQSYrGULOaTi7fSJquQmAtc4iPVB2/x6h80rdLHTATQtA==", + "dev": true, + "optional": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "functional-red-black-tree": "^1.0.1", + "google-gax": "^2.24.1", + "protobufjs": "^6.8.6" + } + }, + "@google-cloud/paginator": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-3.0.6.tgz", + "integrity": "sha512-XCTm/GfQIlc1ZxpNtTSs/mnZxC2cePNhxU3X8EzHXKIJ2JFncmJj2Fcd2IP+gbmZaSZnY0juFxbUCkIeuu/2eQ==", + "dev": true, + "requires": { + "arrify": "^2.0.0", + "extend": "^3.0.2" + } + }, + "@google-cloud/projectify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-2.1.1.tgz", + "integrity": "sha512-+rssMZHnlh0twl122gXY4/aCrk0G1acBqkHFfYddtsqpYXGxA29nj9V5V9SfC+GyOG00l650f6lG9KL+EpFEWQ==", + "dev": true + }, + "@google-cloud/promisify": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-2.0.4.tgz", + "integrity": "sha512-j8yRSSqswWi1QqUGKVEKOG03Q7qOoZP6/h2zN2YO+F5h2+DHU0bSrHCK9Y7lo2DI9fBd8qGAw795sf+3Jva4yA==", + "dev": true + }, + "@google-cloud/storage": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-5.16.0.tgz", + "integrity": "sha512-I/1lA78v9c5EbOM/KfcYsjzA7YlHQmhpzHYdKLKdYC8X5fFaQrw5nK+FU8GbEwdPxmREAF2qPbN7Ccq+A/ndWA==", + "dev": true, + "requires": { + "@google-cloud/common": "^3.8.1", + "@google-cloud/paginator": "^3.0.0", + "@google-cloud/promisify": "^2.0.0", + "arrify": "^2.0.0", + "async-retry": "^1.3.1", + "compressible": "^2.0.12", + "date-and-time": "^2.0.0", + "duplexify": "^4.0.0", + "extend": "^3.0.2", + "gcs-resumable-upload": "^3.5.1", + "get-stream": "^6.0.0", + "hash-stream-validation": "^0.2.2", + "mime": "^3.0.0", + "mime-types": "^2.0.8", + "p-limit": "^3.0.1", + "pumpify": "^2.0.0", + "snakeize": "^0.1.0", + "stream-events": "^1.0.1", + "xdg-basedir": "^4.0.0" + }, + "dependencies": { + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "dev": true + } + } + }, + "@grpc/grpc-js": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.4.4.tgz", + "integrity": "sha512-a6222b7Dl6fIlMgzVl7e+NiRoLiZFbpcwvBH2Oli56Bn7W4/3Ld+86hK4ffPn5rx2DlDidmIcvIJiOQXyhv9gA==", + "requires": { + "@grpc/proto-loader": "^0.6.4", + "@types/node": ">=12.12.47" + } + }, + "@grpc/proto-loader": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.7.tgz", + "integrity": "sha512-QzTPIyJxU0u+r2qGe8VMl3j/W2ryhEvBv7hc42OjYfthSj370fUrb7na65rG6w3YLZS/fb8p89iTBobfWGDgdw==", + "requires": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^6.10.0", + "yargs": "^16.1.1" + } + }, + "@humanwhocodes/config-array": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz", + "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@panva/asn1.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@panva/asn1.js/-/asn1.js-1.0.0.tgz", + "integrity": "sha512-UdkG3mLEqXgnlKsWanWcgb6dOjUzJ+XC5f+aWw30qrtjxeNUSfKX1cd5FBzOaXQumoe9nIqeZUvrRJS03HCCtw==", + "dev": true + }, + "@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" + }, + "@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" + }, + "@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", + "requires": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" + }, + "@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" + }, + "@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" + }, + "@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" + }, + "@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" + }, + "@sendgrid/client": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@sendgrid/client/-/client-7.6.0.tgz", + "integrity": "sha512-cpBVZKLlMTO+vpE18krTixubYmZa98oTbLkqBDuTiA3zRkW+urrxg7pDR24TkI35Mid0Zru8jDHwnOiqrXu0TA==", + "requires": { + "@sendgrid/helpers": "^7.6.0", + "axios": "^0.21.4" + } + }, + "@sendgrid/helpers": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@sendgrid/helpers/-/helpers-7.6.0.tgz", + "integrity": "sha512-0uWD+HSXLl4Z/X3cN+UMQC20RE7xwAACgppnfjDyvKG0KvJcUgDGz7HDdQkiMUdcVWfmyk6zKSg7XKfKzBjTwA==", + "requires": { + "deepmerge": "^4.2.2" + } + }, + "@sendgrid/mail": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@sendgrid/mail/-/mail-7.6.0.tgz", + "integrity": "sha512-0KdaSZzflJD/vUAZjB3ALBIuaVGoLq22hrb2fvQXZHRepU/yhRNlEOqrr05MfKBnKskzq1blnD1J0fHxiwaolw==", + "requires": { + "@sendgrid/client": "^7.6.0", + "@sendgrid/helpers": "^7.6.0" + } + }, + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true + }, + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dev": true, + "requires": { + "defer-to-connect": "^1.0.1" + } + }, + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true + }, + "@tsconfig/node10": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", + "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", + "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", + "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", + "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", + "dev": true + }, + "@types/amqplib": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@types/amqplib/-/amqplib-0.8.2.tgz", + "integrity": "sha512-p+TFLzo52f8UanB+Nq6gyUi65yecAcRY3nYowU6MPGFtaJvEDxcnFWrxssSTkF+ts1W3zyQDvgVICLQem5WxRA==", + "dev": true, + "requires": { + "@types/bluebird": "*", + "@types/node": "*" + } + }, + "@types/bcrypt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/bcrypt/-/bcrypt-5.0.0.tgz", + "integrity": "sha512-agtcFKaruL8TmcvqbndlqHPSJgsolhf/qPWchFlgnW1gECTN/nKbFcoFnvKAQRFfKbh+BO6A3SWdJu9t+xF3Lw==", + "requires": { + "@types/node": "*" + } + }, + "@types/bcryptjs": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.2.tgz", + "integrity": "sha512-LiMQ6EOPob/4yUL66SZzu6Yh77cbzJFYll+ZfaPiPPFswtIlA/Fs1MzdKYA7JApHU49zQTbJGX3PDmCpIdDBRQ==" + }, + "@types/bluebird": { + "version": "3.5.36", + "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.36.tgz", + "integrity": "sha512-HBNx4lhkxN7bx6P0++W8E289foSu8kO8GCk2unhuVggO+cE7rh9DhZUyPhUxNRG9m+5B5BTKxZQ5ZP92x/mx9Q==", + "dev": true + }, + "@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/caseless": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", + "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==" + }, + "@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "requires": { + "@types/node": "*" + } + }, + "@types/cors": { + "version": "2.8.12", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", + "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==" + }, + "@types/express": { + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", + "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-jwt": { + "version": "0.0.42", + "resolved": "https://registry.npmjs.org/@types/express-jwt/-/express-jwt-0.0.42.tgz", + "integrity": "sha512-WszgUddvM1t5dPpJ3LhWNH8kfNN8GPIBrAGxgIYXVCEGx6Bx4A036aAuf/r5WH9DIEdlmp7gHOYvSM6U87B0ag==", + "dev": true, + "requires": { + "@types/express": "*", + "@types/express-unless": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.25", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.25.tgz", + "integrity": "sha512-OUJIVfRMFijZukGGwTpKNFprqCCXk5WjNGvUgB/CxxBR40QWSjsNK86+yvGKlCOGc7sbwfHLaXhkG+NsytwBaQ==", + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "@types/express-unless": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@types/express-unless/-/express-unless-0.5.2.tgz", + "integrity": "sha512-Q74UyYRX/zIgl1HSp9tUX2PlG8glkVm+59r7aK4KGKzC5jqKIOX6rrVLRQrzpZUQ84VukHtRoeAuon2nIssHPQ==", + "dev": true, + "requires": { + "@types/express": "*" + } + }, + "@types/firebase": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/firebase/-/firebase-3.2.1.tgz", + "integrity": "sha512-G8XgHMu2jHlElfc2xVNaYP50F0qrqeTCjgeG1v5b4SRwWG4XKC4fCuEdVZuZaMRmVygcnbRZBAo9O7RsDvmkGQ==", + "requires": { + "firebase": "*" + } + }, + "@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/handlebars": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@types/handlebars/-/handlebars-4.1.0.tgz", + "integrity": "sha512-gq9YweFKNNB1uFK71eRqsd4niVkXrxHugqWFQkeLRJvGjnxsLr16bYtcsG4tOFwmYi0Bax+wCkbf1reUfdl4kA==", + "requires": { + "handlebars": "*" + } + }, + "@types/imagemin": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@types/imagemin/-/imagemin-7.0.1.tgz", + "integrity": "sha512-xEn5+M3lDBtI3JxLy6eU3ksoVurygnlG7OYhTqJfGGP4PcvYnfn+IABCmMve7ziM/SneHDm5xgJFKC8hCYPicw==", + "requires": { + "@types/node": "*" + } + }, + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, + "@types/jsonwebtoken": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.6.tgz", + "integrity": "sha512-+P3O/xC7nzVizIi5VbF34YtqSonFsdnbXBnWUCYRiKOi1f9gA4sEFvXkrGr/QVV23IbMYvcoerI7nnhDUiWXRQ==", + "requires": { + "@types/node": "*" + } + }, + "@types/long": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", + "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" + }, + "@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" + }, + "@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==" + }, + "@types/mongoose": { + "version": "5.11.97", + "resolved": "https://registry.npmjs.org/@types/mongoose/-/mongoose-5.11.97.tgz", + "integrity": "sha512-cqwOVYT3qXyLiGw7ueU2kX9noE8DPGRY6z8eUxudhXY8NZ7DMKYAxyZkLSevGfhCX3dO/AoX5/SO9lAzfjon0Q==", + "requires": { + "mongoose": "*" + } + }, + "@types/multer": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/@types/multer/-/multer-1.4.7.tgz", + "integrity": "sha512-/SNsDidUFCvqqcWDwxv2feww/yqhNeTRL5CVoL3jU4Goc4kKEL10T7Eye65ZqPNi4HRx8sAEX59pV1aEH7drNA==", + "requires": { + "@types/express": "*" + } + }, + "@types/node": { + "version": "16.11.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.9.tgz", + "integrity": "sha512-MKmdASMf3LtPzwLyRrFjtFFZ48cMf8jmX5VRYrDQiJa8Ybu5VAmkqBWqKU8fdCwD8ysw4mQ9nrEHvzg6gunR7A==" + }, + "@types/nodemailer": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.4.tgz", + "integrity": "sha512-Ksw4t7iliXeYGvIQcSIgWQ5BLuC/mljIEbjf615svhZL10PE9t+ei8O9gDaD3FPCasUJn9KTLwz2JFJyiiyuqw==", + "requires": { + "@types/node": "*" + } + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" + }, + "@types/request": { + "version": "2.48.8", + "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.8.tgz", + "integrity": "sha512-whjk1EDJPcAR2kYHRbFl/lKeeKYTi05A15K9bnLInCVroNDCtXce57xKdI0/rQaA3K+6q0eFyUBPmqfSndUZdQ==", + "requires": { + "@types/caseless": "*", + "@types/node": "*", + "@types/tough-cookie": "*", + "form-data": "^2.5.0" + } + }, + "@types/serve-static": { + "version": "1.13.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", + "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "@types/sharp": { + "version": "0.29.4", + "resolved": "https://registry.npmjs.org/@types/sharp/-/sharp-0.29.4.tgz", + "integrity": "sha512-asrPef2LYenr76zBzyy+Fw40yGzq/q/CY77mUP5n43DnuWjQoOB+8vxnzFcqccz+LF+A7mbnknGCfpVWSG82Bw==", + "requires": { + "@types/node": "*" + } + }, + "@types/tough-cookie": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.1.tgz", + "integrity": "sha512-Y0K95ThC3esLEYD6ZuqNek29lNX2EM1qxV8y2FTLUB0ff5wWrk7az+mLrnNFUnaXcgKye22+sFBRXOgpPILZNg==" + }, + "@types/uuid": { + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.3.tgz", + "integrity": "sha512-0LbEEx1zxrYB3pgpd1M5lEhLcXjKJnYghvhTRgaBeUivLHMDM1TzF3IJ6hXU2+8uA4Xz+5BA63mtZo5DjVT8iA==" + }, + "@types/validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-+jBxVvXVuggZOrm04NR8z+5+bgoW4VZyLzUO+hmPPW1mVFL/HaitLAkizfv4yg9TbG8lkfHWVMQ11yDqrVVCzA==" + }, + "@types/webidl-conversions": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-6.1.1.tgz", + "integrity": "sha512-XAahCdThVuCFDQLT7R7Pk/vqeObFNL3YqRyFZg+AqAP/W1/w3xHaIxuW7WszQqTbIBOPRcItYJIou3i/mppu3Q==" + }, + "@types/whatwg-url": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.1.tgz", + "integrity": "sha512-2YubE1sjj5ifxievI5Ge1sckb9k/Er66HyR2c+3+I6VDUUg1TLPdYYTEbQ+DjRkS4nTxMJhgWfSfMRD2sl2EYQ==", + "requires": { + "@types/node": "*", + "@types/webidl-conversions": "*" + } + }, + "@typescript-eslint/eslint-plugin": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.9.0.tgz", + "integrity": "sha512-qT4lr2jysDQBQOPsCCvpPUZHjbABoTJW8V9ZzIYKHMfppJtpdtzszDYsldwhFxlhvrp7aCHeXD1Lb9M1zhwWwQ==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "5.9.0", + "@typescript-eslint/scope-manager": "5.9.0", + "@typescript-eslint/type-utils": "5.9.0", + "debug": "^4.3.2", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.1.8", + "regexpp": "^3.2.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/experimental-utils": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.9.0.tgz", + "integrity": "sha512-ZnLVjBrf26dn7ElyaSKa6uDhqwvAi4jBBmHK1VxuFGPRAxhdi18ubQYSGA7SRiFiES3q9JiBOBHEBStOFkwD2g==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.9.0", + "@typescript-eslint/types": "5.9.0", + "@typescript-eslint/typescript-estree": "5.9.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "dependencies": { + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + } + } + }, + "@typescript-eslint/parser": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.9.0.tgz", + "integrity": "sha512-/6pOPz8yAxEt4PLzgbFRDpZmHnXCeZgPDrh/1DaVKOjvn/UPMlWhbx/gA96xRi2JxY1kBl2AmwVbyROUqys5xQ==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.9.0", + "@typescript-eslint/types": "5.9.0", + "@typescript-eslint/typescript-estree": "5.9.0", + "debug": "^4.3.2" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.9.0.tgz", + "integrity": "sha512-DKtdIL49Qxk2a8icF6whRk7uThuVz4A6TCXfjdJSwOsf+9ree7vgQWcx0KOyCdk0i9ETX666p4aMhrRhxhUkyg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.9.0", + "@typescript-eslint/visitor-keys": "5.9.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.9.0.tgz", + "integrity": "sha512-uVCb9dJXpBrK1071ri5aEW7ZHdDHAiqEjYznF3HSSvAJXyrkxGOw2Ejibz/q6BXdT8lea8CMI0CzKNFTNI6TEQ==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "5.9.0", + "debug": "^4.3.2", + "tsutils": "^3.21.0" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@typescript-eslint/types": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.9.0.tgz", + "integrity": "sha512-mWp6/b56Umo1rwyGCk8fPIzb9Migo8YOniBGPAQDNC6C52SeyNGN4gsVwQTAR+RS2L5xyajON4hOLwAGwPtUwg==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.9.0.tgz", + "integrity": "sha512-kxo3xL2mB7XmiVZcECbaDwYCt3qFXz99tBSuVJR4L/sR7CJ+UNAPrYILILktGj1ppfZ/jNt/cWYbziJUlHl1Pw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.9.0", + "@typescript-eslint/visitor-keys": "5.9.0", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.9.0.tgz", + "integrity": "sha512-6zq0mb7LV0ThExKlecvpfepiB+XEtFv/bzx7/jKSgyXTFD7qjmSu1FoiS0x3OZaiS+UIXpH2vd9O89f02RCtgw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.9.0", + "eslint-visitor-keys": "^3.0.0" + } + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, + "requires": { + "event-target-shim": "^5.0.0" + } + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz", + "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "amqplib": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.8.0.tgz", + "integrity": "sha512-icU+a4kkq4Y1PS4NNi+YPDMwdlbFcZ1EZTQT2nigW3fvOb6AOgUQ9+Mk4ue0Zu5cBg/XpDzB40oH10ysrk2dmA==", + "requires": { + "bitsyntax": "~0.1.0", + "bluebird": "^3.7.2", + "buffer-more-ints": "~1.0.0", + "readable-stream": "1.x >=1.1.9", + "safe-buffer": "~5.2.1", + "url-parse": "~1.5.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, + "ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dev": true, + "requires": { + "string-width": "^4.1.0" + } + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY=" + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "are-we-there-yet": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", + "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "args": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/args/-/args-5.0.1.tgz", + "integrity": "sha512-1kqmFCFsPffavQFGt8OxJdIcETti99kySRUPMpOhaGjL6mRJn8HFU1OxKY5bMqfZKUwTQc1mZkAjmGYaVOHFtQ==", + "requires": { + "camelcase": "5.0.0", + "chalk": "2.4.2", + "leven": "2.1.0", + "mri": "1.1.4" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "camelcase": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", + "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==" + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + } + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" + }, + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true + }, + "asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "async-retry": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", + "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", + "dev": true, + "requires": { + "retry": "0.13.1" + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" + }, + "axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "requires": { + "follow-redirects": "^1.14.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bcryptjs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=" + }, + "bignumber.js": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", + "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "bitsyntax": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/bitsyntax/-/bitsyntax-0.1.0.tgz", + "integrity": "sha512-ikAdCnrloKmFOugAfxWws89/fPc+nw0OOG1IzIE72uSOg/A3cYptKCjSUhDTuj7fhsJtzkzlv7l3b8PzRHLN0Q==", + "requires": { + "buffer-more-ints": "~1.0.0", + "debug": "~2.6.9", + "safe-buffer": "~5.1.2" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + } + }, + "boxen": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", + "dev": true, + "requires": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "bson": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.6.0.tgz", + "integrity": "sha512-8jw1NU1hglS+Da1jDOUYuNcBJ4cNHCFIqzlwoFNnsTOg2R/ox0aTYcTiBN4dzRa9q7Cvy6XErh3L8ReTEb9AQQ==", + "requires": { + "buffer": "^5.6.0" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "buffer-more-ints": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-1.0.0.tgz", + "integrity": "sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==" + }, + "busboy": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz", + "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=", + "requires": { + "dicer": "0.2.5", + "readable-stream": "1.1.x" + }, + "dependencies": { + "dicer": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", + "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=", + "requires": { + "readable-stream": "1.1.x", + "streamsearch": "0.1.2" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true + } + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.1.tgz", + "integrity": "sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "dev": true + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "color": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/color/-/color-4.0.2.tgz", + "integrity": "sha512-fSu0jW2aKQG2FHlDywqdFPdabJHsUdZ0xabSt3wFZdcgRKtLnUHs19nUtuFuLGVMFhINGgfZEIjbUOsGZXGu7Q==", + "requires": { + "color-convert": "^2.0.1", + "color-string": "^1.7.4" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "color-string": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.7.4.tgz", + "integrity": "sha512-nVdUvPVgZMpRQad5dcsCMOSB5BXLljklTiaxS6ehhKxDsAI5sD7k5VmFuBt1y3Rlym8uulc/ANUN/bMWtBu6Sg==", + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "colorette": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", + "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + } + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "core-js": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", + "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==" + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.1" + } + }, + "cross-fetch": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.4.tgz", + "integrity": "sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ==", + "requires": { + "node-fetch": "2.6.1" + }, + "dependencies": { + "node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" + } + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-uri-to-buffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz", + "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==" + }, + "date-and-time": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/date-and-time/-/date-and-time-2.0.1.tgz", + "integrity": "sha512-O7Xe5dLaqvY/aF/MFWArsAM1J4j7w1CSZlPCX9uHgmb+6SbkPd8Q4YOvfvH/cZGvFlJFfHOZKxQtmMUOoZhc/w==", + "dev": true + }, + "dateformat": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", + "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==" + }, + "dayjs": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.7.tgz", + "integrity": "sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig==" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" + }, + "defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "denque": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.0.1.tgz", + "integrity": "sha512-tfiWc6BQLXNLpNiR5iGd0Ocu3P3VpxfzFiqubLgMfhfOw9WyvgJBd46CClNn9k3qfbjvT//0cf7AlYRX/OslMQ==" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" + }, + "dicer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.0.tgz", + "integrity": "sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==", + "dev": true, + "requires": { + "streamsearch": "0.1.2" + } + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "requires": { + "path-type": "^4.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + }, + "dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==" + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "duplexify": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz", + "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==", + "requires": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "dev": true + }, + "env-cmd": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/env-cmd/-/env-cmd-10.1.0.tgz", + "integrity": "sha512-mMdWTT9XKN7yNth/6N6g2GuKuJTsKMDHlQFUDacb/heQRRWOTIZ42t1rMHnQu4jYxU1ajdTeJM+9eEETlqToMA==", + "requires": { + "commander": "^4.0.0", + "cross-spawn": "^7.0.0" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "eslint": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.6.0.tgz", + "integrity": "sha512-UvxdOJ7mXFlw7iuHZA4jmzPaUqIw54mZrv+XPYKNbKdLR0et4rf60lIZUU9kiNtnzzMzGWxMV+tQ7uG7JG8DPw==", + "dev": true, + "requires": { + "@eslint/eslintrc": "^1.0.5", + "@humanwhocodes/config-array": "^0.9.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.0", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.1.0", + "espree": "^9.3.0", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.2.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + } + } + }, + "eslint-config-prettier": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", + "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", + "dev": true + }, + "eslint-scope": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", + "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", + "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", + "dev": true + }, + "espree": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz", + "integrity": "sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==", + "dev": true, + "requires": { + "acorn": "^8.7.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^3.1.0" + }, + "dependencies": { + "acorn": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "dev": true + } + } + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true + }, + "expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "requires": { + "@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" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fast-redact": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.0.2.tgz", + "integrity": "sha512-YN+CYfCVRVMUZOUPeinHNKgytM1wPI/C/UCLEi56EsY2dwwvI00kIJHJoI7pMVqGoMew8SMZ2SSfHKHULHXDsg==" + }, + "fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, + "fast-text-encoding": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz", + "integrity": "sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig==", + "dev": true + }, + "fastify-warning": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/fastify-warning/-/fastify-warning-0.2.0.tgz", + "integrity": "sha512-s1EQguBw/9qtc1p/WTY4eq9WMRIACkj+HTcOIK1in4MV5aFaQC9ZCIt0dJ7pr5bIf4lPpHvAtP2ywpTNgs7hqw==" + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "requires": { + "reusify": "^1.0.4" + } + }, + "faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fetch-blob": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.1.3.tgz", + "integrity": "sha512-ax1Y5I9w+9+JiM+wdHkhBoxew+zG4AJ2SvAD1v1szpddUIiPERVGBxrMcB2ZqW0Y3PP8bOWYv2zqQq1Jp2kqUQ==", + "requires": { + "web-streams-polyfill": "^3.0.3" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "file-type": { + "version": "12.4.2", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-12.4.2.tgz", + "integrity": "sha512-UssQP5ZgIOKelfsaB5CuGAL+Y+q7EmONuiwF3N5HAH0t27rvrttgi6Ra9k/+DVaY9UF6+ybxu5pOXLUdA8N7Vg==" + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "firebase": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/firebase/-/firebase-9.5.0.tgz", + "integrity": "sha512-REScimA1DQz6mPU/u9wafzRwvEqzItX2ndDhtbj167zHbikyRi8Sgg0982N8SU6XlC+Pw6CAEAnNTSejfUYd6A==", + "requires": { + "@firebase/analytics": "0.7.4", + "@firebase/analytics-compat": "0.1.5", + "@firebase/app": "0.7.9", + "@firebase/app-check": "0.5.2", + "@firebase/app-check-compat": "0.2.2", + "@firebase/app-compat": "0.1.10", + "@firebase/app-types": "0.7.0", + "@firebase/auth": "0.19.3", + "@firebase/auth-compat": "0.2.3", + "@firebase/database": "0.12.4", + "@firebase/database-compat": "0.1.4", + "@firebase/firestore": "3.3.1", + "@firebase/firestore-compat": "0.1.8", + "@firebase/functions": "0.7.6", + "@firebase/functions-compat": "0.1.7", + "@firebase/installations": "0.5.4", + "@firebase/messaging": "0.9.4", + "@firebase/messaging-compat": "0.1.4", + "@firebase/performance": "0.5.4", + "@firebase/performance-compat": "0.1.4", + "@firebase/polyfill": "0.3.36", + "@firebase/remote-config": "0.3.3", + "@firebase/remote-config-compat": "0.1.4", + "@firebase/storage": "0.9.0", + "@firebase/storage-compat": "0.1.8", + "@firebase/util": "1.4.2" + } + }, + "firebase-admin": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-10.0.0.tgz", + "integrity": "sha512-EOAk5ZaqXhBBvx9ZyXd28kw8glMTt3xl0g3BepGRCy0RSSUPGOzfAqjGhc65guSKgFOpT5mAUycYcJbqullKUQ==", + "dev": true, + "requires": { + "@firebase/database-compat": "^0.1.1", + "@firebase/database-types": "^0.7.2", + "@google-cloud/firestore": "^4.5.0", + "@google-cloud/storage": "^5.3.0", + "@types/node": ">=12.12.47", + "dicer": "^0.3.0", + "jsonwebtoken": "^8.5.1", + "jwks-rsa": "^2.0.2", + "node-forge": "^0.10.0" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", + "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", + "dev": true + }, + "follow-redirects": { + "version": "1.14.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.6.tgz", + "integrity": "sha512-fhUl5EwSJbbl8AR+uYL2KQDxLkdSjZGR36xy46AO7cOMTrCMON6Sa28FmAnC2tRTDbd/Uuzz3aJBv7EBN7JH8A==" + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "requires": { + "fetch-blob": "^3.1.2" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "gaxios": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.3.2.tgz", + "integrity": "sha512-T+ap6GM6UZ0c4E6yb1y/hy2UB6hTrqhglp3XfmU9qbLCGRYhLVV5aRPpC4EmoG8N8zOnkYCgoBz+ScvGAARY6Q==", + "dev": true, + "requires": { + "abort-controller": "^3.0.0", + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.1" + }, + "dependencies": { + "node-fetch": { + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz", + "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==", + "dev": true, + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", + "dev": true + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", + "dev": true + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "dev": true, + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + } + } + }, + "gcp-metadata": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.3.1.tgz", + "integrity": "sha512-x850LS5N7V1F3UcV7PoupzGsyD6iVwTVvsh3tbXfkctZnBnjW5yu5z1/3k3SehF7TyoTIe78rJs02GMMy+LF+A==", + "dev": true, + "requires": { + "gaxios": "^4.0.0", + "json-bigint": "^1.0.0" + } + }, + "gcs-resumable-upload": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-3.6.0.tgz", + "integrity": "sha512-IyaNs4tx3Mp2UKn0CltRUiW/ZXYFlBNuK/V+ixs80chzVD+BJq3+8bfiganATFfCoMluAjokF9EswNJdVuOs8A==", + "dev": true, + "requires": { + "abort-controller": "^3.0.0", + "async-retry": "^1.3.3", + "configstore": "^5.0.0", + "extend": "^3.0.2", + "gaxios": "^4.0.0", + "google-auth-library": "^7.0.0", + "pumpify": "^2.0.0", + "stream-events": "^1.0.4" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "global-dirs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", + "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", + "dev": true, + "requires": { + "ini": "2.0.0" + } + }, + "globals": { + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", + "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "globby": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + } + }, + "google-auth-library": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-7.10.2.tgz", + "integrity": "sha512-M37o9Kxa/TLvOLgF71SXvLeVEP5sbSTmKl1zlIgl72SFy5PtsU3pOdu8G8MIHHpQ3/NZabDI8rQkA9DvQVKkPA==", + "dev": true, + "requires": { + "arrify": "^2.0.0", + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "fast-text-encoding": "^1.0.0", + "gaxios": "^4.0.0", + "gcp-metadata": "^4.2.0", + "gtoken": "^5.0.4", + "jws": "^4.0.0", + "lru-cache": "^6.0.0" + }, + "dependencies": { + "jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "dev": true, + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "dev": true, + "requires": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + } + } + }, + "google-gax": { + "version": "2.28.1", + "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-2.28.1.tgz", + "integrity": "sha512-2Xjd3FrjlVd6Cmw2B2Aicpc/q92SwTpIOvxPUlnRg9w+Do8nu7UR+eQrgoKlo2FIUcUuDTvppvcx8toND0pK9g==", + "dev": true, + "optional": true, + "requires": { + "@grpc/grpc-js": "~1.4.0", + "@grpc/proto-loader": "^0.6.1", + "@types/long": "^4.0.0", + "abort-controller": "^3.0.0", + "duplexify": "^4.0.0", + "fast-text-encoding": "^1.0.3", + "google-auth-library": "^7.6.1", + "is-stream-ended": "^0.1.4", + "node-fetch": "^2.6.1", + "object-hash": "^2.1.1", + "proto3-json-serializer": "^0.1.5", + "protobufjs": "6.11.2", + "retry-request": "^4.0.0" + }, + "dependencies": { + "node-fetch": { + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz", + "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==", + "dev": true, + "optional": true, + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", + "dev": true, + "optional": true + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", + "dev": true, + "optional": true + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "dev": true, + "optional": true, + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + } + } + }, + "google-p12-pem": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.1.2.tgz", + "integrity": "sha512-tjf3IQIt7tWCDsa0ofDQ1qqSCNzahXDxdAGJDbruWqu3eCg5CKLYKN+hi0s6lfvzYZ1GDVr+oDF9OOWlDSdf0A==", + "dev": true, + "requires": { + "node-forge": "^0.10.0" + } + }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dev": true, + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" + }, + "gtoken": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-5.3.1.tgz", + "integrity": "sha512-yqOREjzLHcbzz1UrQoxhBtpk8KjrVhuqPE7od1K2uhyxG2BHjKZetlbLw/SPZak/QqTIQW+addS+EcjqQsZbwQ==", + "dev": true, + "requires": { + "gaxios": "^4.0.0", + "google-p12-pem": "^3.0.3", + "jws": "^4.0.0" + }, + "dependencies": { + "jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "dev": true, + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "dev": true, + "requires": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + } + } + }, + "handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "dev": true + }, + "hash-stream-validation": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/hash-stream-validation/-/hash-stream-validation-0.2.4.tgz", + "integrity": "sha512-Gjzu0Xn7IagXVkSu9cSFuK1fqzwtLwFhNhVL8IFJijRNMgUttFbBSIAzKuSIrsFMO1+g1RlsoN49zPIbwPDMGQ==", + "dev": true + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "http-parser-js": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", + "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==" + }, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "husky": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/husky/-/husky-7.0.4.tgz", + "integrity": "sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "idb": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/idb/-/idb-3.0.2.tgz", + "integrity": "sha512-+FLa/0sTXqyux0o6C+i2lOR0VoS60LU/jzUo5xjfY6+7sEEgy4Gz1O7yFBXvjd7N0NyIGWIRg8DcQSLEG+VSPw==" + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "ignore": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz", + "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==" + }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", + "dev": true + }, + "imagemin": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/imagemin/-/imagemin-7.0.1.tgz", + "integrity": "sha512-33AmZ+xjZhg2JMCe+vDf6a9mzWukE7l+wAtesjE7KyteqqKjzxv7aVQeWnul1Ve26mWvEQqyPwl0OctNBfSR9w==", + "requires": { + "file-type": "^12.0.0", + "globby": "^10.0.0", + "graceful-fs": "^4.2.2", + "junk": "^3.1.0", + "make-dir": "^3.0.0", + "p-pipe": "^3.0.0", + "replace-ext": "^1.0.0" + } + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dev": true, + "requires": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + } + }, + "is-jpg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-jpg/-/is-jpg-3.0.0.tgz", + "integrity": "sha512-Vcd67KWHZblEKEBrtP25qLZ8wN9ICoAhl1pKUqD7SM7hf2qtuRl7loDgP5Zigh2oN/+7uj+KVyC0eRJvgOEFeQ==" + }, + "is-npm": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", + "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "is-stream-ended": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-stream-ended/-/is-stream-ended-0.1.4.tgz", + "integrity": "sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==", + "dev": true, + "optional": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "jose": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/jose/-/jose-2.0.5.tgz", + "integrity": "sha512-BAiDNeDKTMgk4tvD0BbxJ8xHEHBZgpeRZ1zGPPsitSyMgjoMWiLGYAE7H7NpP5h0lPppQajQs871E8NHUrzVPA==", + "dev": true, + "requires": { + "@panva/asn1.js": "^1.0.0" + } + }, + "joycon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.0.1.tgz", + "integrity": "sha512-SJcJNBg32dGgxhPtM0wQqxqV0ax9k/9TaUskGDSJkSFSQOEWWvQ3zzWdGQRIUry2j1zA5+ReH13t0Mf3StuVZA==" + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dev": true, + "requires": { + "bignumber.js": "^9.0.0" + } + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "dev": true + }, + "json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "jsonwebtoken": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", + "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "requires": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^5.6.0" + }, + "dependencies": { + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, + "jszip": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.7.1.tgz", + "integrity": "sha512-ghL0tz1XG9ZEmRMcEN2vt7xabrDdqHHeykgARpmZ0BiIctWxM47Vt63ZO2dnp4QYt/xJVLLy5Zv1l/xRdh2byg==", + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "junk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz", + "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==" + }, + "jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jwks-rsa": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-2.0.5.tgz", + "integrity": "sha512-fliHfsiBRzEU0nXzSvwnh0hynzGB0WihF+CinKbSRlaqRxbqqKf2xbBPgwc8mzf18/WgwlG8e5eTpfSTBcU4DQ==", + "dev": true, + "requires": { + "@types/express-jwt": "0.0.42", + "debug": "^4.3.2", + "jose": "^2.0.5", + "limiter": "^1.1.5", + "lru-memoizer": "^2.1.4" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "requires": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "kareem": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.2.tgz", + "integrity": "sha512-STHz9P7X2L4Kwn72fA4rGyqyXdmrMSdxqHx9IXon/FXluXieaFA6KJ2upcHAHxQPQ0LeM/OjLrhFxifHewOALQ==" + }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dev": true, + "requires": { + "json-buffer": "3.0.0" + } + }, + "latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dev": true, + "requires": { + "package-json": "^6.3.0" + } + }, + "leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=" + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "requires": { + "immediate": "~3.0.5" + } + }, + "limiter": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", + "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==", + "dev": true + }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" + }, + "lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" + }, + "lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" + }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "lru-memoizer": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-2.1.4.tgz", + "integrity": "sha512-IXAq50s4qwrOBrXJklY+KhgZF+5y98PDaNo0gi/v2KQBFLyWr+JyFvijZXkGKjQj/h9c0OwoE+JZbwUXce76hQ==", + "dev": true, + "requires": { + "lodash.clonedeep": "^4.5.0", + "lru-cache": "~4.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.2.tgz", + "integrity": "sha1-HRdnnAac2l0ECZGgnbwsDbN35V4=", + "dev": true, + "requires": { + "pseudomap": "^1.0.1", + "yallist": "^2.0.0" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==" + }, + "mime-types": { + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "requires": { + "mime-db": "1.51.0" + } + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, + "moment": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", + "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" + }, + "mongodb": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.2.2.tgz", + "integrity": "sha512-zt8rCTnTKyMQppyt63qMnrLM5dbADgUk18ORPF1XbtHLIYCyc9hattaYHi0pqMvNxDpgGgUofSVzS+UQErgTug==", + "requires": { + "bson": "^4.6.0", + "denque": "^2.0.1", + "mongodb-connection-string-url": "^2.3.2", + "saslprep": "^1.0.3" + } + }, + "mongodb-connection-string-url": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.3.2.tgz", + "integrity": "sha512-2LkmS0ny7LamAyhEs2Q+zuFFxeGNSc2DaGHBevjqkoPt7bgh+67mg1sFU6awnMsdLKpdEt7zUy466K9x7RsYcQ==", + "requires": { + "@types/whatwg-url": "^8.2.1", + "whatwg-url": "^11.0.0" + } + }, + "mongoose": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.1.2.tgz", + "integrity": "sha512-/CNxPVSPnaRNKndlhVOblFSB8kfpHWuAiJSEoVqs/pjS42actV7m/Wk0o0RbsndUvJ1WUenoXpbG8lrD9atGlQ==", + "requires": { + "bson": "^4.2.2", + "kareem": "2.3.2", + "mongodb": "4.2.2", + "mpath": "0.8.4", + "mquery": "4.0.0", + "ms": "2.1.2", + "regexp-clone": "1.0.0", + "sift": "13.5.2", + "sliced": "1.0.1" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "mpath": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.4.tgz", + "integrity": "sha512-DTxNZomBcTWlrMW76jy1wvV37X/cNNxPW1y2Jzd4DZkAaC5ZGsm8bfGfNOthcDuRJujXLqiuS6o3Tpy0JEoh7g==" + }, + "mquery": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-4.0.0.tgz", + "integrity": "sha512-nGjm89lHja+T/b8cybAby6H0YgA4qYC/lx6UlwvHGqvTq8bDaNeCwl1sY8uRELrNbVWJzIihxVd+vphGGn1vBw==", + "requires": { + "debug": "4.x", + "regexp-clone": "^1.0.0", + "sliced": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "mri": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.4.tgz", + "integrity": "sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w==" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "multer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.3.tgz", + "integrity": "sha512-np0YLKncuZoTzufbkM6wEKp68EhWJXcU6fq6QqrSwkckd2LlMgd1UqhUJLj6NS/5sZ8dE8LYDWslsltJznnXlg==", + "requires": { + "append-field": "^1.0.0", + "busboy": "^0.2.11", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.4", + "object-assign": "^4.1.1", + "on-finished": "^2.3.0", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + } + }, + "napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "node-abi": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.5.0.tgz", + "integrity": "sha512-LtHvNIBgOy5mO8mPEUtkCW/YCRWYEKshIvqhe1GHHyXEHEB5mgICyYnAcl4qan3uFeRROErKGzatFHPf6kDxWw==", + "requires": { + "semver": "^7.3.5" + }, + "dependencies": { + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "node-addon-api": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.2.0.tgz", + "integrity": "sha512-eazsqzwG2lskuzBqCGPi7Ac2UgOoMz8JVOXVhTvvPDYhthvNpefx8jWD8Np7Gv+2Sz0FlPWZk0nJV0z598Wn8Q==" + }, + "node-fetch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.1.0.tgz", + "integrity": "sha512-QU0WbIfMUjd5+MUzQOYhenAazakV7Irh1SGkWCsRzBwvm4fAhzEUaHMJ6QLP7gWT6WO9/oH2zhKMMGMuIrDyKw==", + "requires": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.2", + "formdata-polyfill": "^4.0.10" + } + }, + "node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "dev": true + }, + "nodemailer": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.7.2.tgz", + "integrity": "sha512-Dz7zVwlef4k5R71fdmxwR8Q39fiboGbu3xgswkzGwczUfjp873rVxt1O46+Fh0j1ORnAC6L9+heI8uUpO6DT7Q==" + }, + "nodemailer-sendgrid": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/nodemailer-sendgrid/-/nodemailer-sendgrid-1.0.3.tgz", + "integrity": "sha512-To/veO2M4evjtv1XrY7BUgE+LDypgs/FBx4wOHb2UNTpvZhiARtvMaBI0685Yxkho0lIPJc4jS0cUE7v+XGNgg==", + "requires": { + "@sendgrid/mail": "^6.2.1" + }, + "dependencies": { + "@sendgrid/client": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/@sendgrid/client/-/client-6.5.5.tgz", + "integrity": "sha512-Nbfgo94gbWSL8PIgJfuHoifyOJJepvV8NQkkglctAEfb1hyozKhrzE6v1kPG/z4j0RodaTtXD5LJj/t0q/VhLA==", + "requires": { + "@sendgrid/helpers": "^6.5.5", + "@types/request": "^2.48.4", + "request": "^2.88.0" + } + }, + "@sendgrid/helpers": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/@sendgrid/helpers/-/helpers-6.5.5.tgz", + "integrity": "sha512-uRFEanalfss5hDsuzVXZ1wm7i7eEXHh1py80piOXjobiQ+MxmtR19EU+gDSXZ+uMcEehBGhxnb7QDNN0q65qig==", + "requires": { + "chalk": "^2.0.1", + "deepmerge": "^4.2.2" + } + }, + "@sendgrid/mail": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/@sendgrid/mail/-/mail-6.5.5.tgz", + "integrity": "sha512-DSu8oTPI0BJFH60jMOG9gM+oeNMoRALFmdAYg2PIXpL+Zbxd7L2GzQZtmf1jLy/8UBImkbB3D74TjiOBiLRK1w==", + "requires": { + "@sendgrid/client": "^6.5.5", + "@sendgrid/helpers": "^6.5.5" + } + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + } + } + }, + "nodemon": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.15.tgz", + "integrity": "sha512-gdHMNx47Gw7b3kWxJV64NI+Q5nfl0y5DgDbiVtShiwa7Z0IZ07Ll4RLFo6AjrhzMtoEZn5PDE3/c2AbVsiCkpA==", + "dev": true, + "requires": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.0.4", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5", + "update-notifier": "^5.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + } + } + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "dev": true + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "dev": true, + "optional": true + }, + "on-exit-leak-free": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-0.2.0.tgz", + "integrity": "sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "dev": true + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-pipe": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-3.1.0.tgz", + "integrity": "sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==" + }, + "package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dev": true, + "requires": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" + }, + "pino": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-7.4.0.tgz", + "integrity": "sha512-qEHLtKcmYcid6s2qjlGTxaLe9Lq1IiGmd74IZb9Obi/FRTaA+ymb8FD/cmOIL4vt6ug/EtmhGwxZbiGhI+7cuQ==", + "requires": { + "fast-redact": "^3.0.0", + "fastify-warning": "^0.2.0", + "get-caller-file": "^2.0.5", + "on-exit-leak-free": "^0.2.0", + "pino-abstract-transport": "v0.5.0", + "pino-std-serializers": "^4.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.1.0", + "safe-stable-stringify": "^2.1.0", + "sonic-boom": "^2.2.1", + "thread-stream": "^0.13.0" + } + }, + "pino-abstract-transport": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-0.5.0.tgz", + "integrity": "sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==", + "requires": { + "duplexify": "^4.1.2", + "split2": "^4.0.0" + } + }, + "pino-pretty": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-7.2.0.tgz", + "integrity": "sha512-pkZhaF1JiyQt4BRqkLANYWuZTxavmuXh3OHsb8goeQasTFgNdzOECXkZWyPYrA0YMRa8zKoVsCzeYz9lI2NYwA==", + "requires": { + "args": "^5.0.1", + "colorette": "^2.0.7", + "dateformat": "^4.6.3", + "fast-safe-stringify": "^2.0.7", + "joycon": "^3.0.0", + "pino-abstract-transport": "^0.5.0", + "pump": "^3.0.0", + "readable-stream": "^3.6.0", + "rfdc": "^1.3.0", + "secure-json-parse": "^2.4.0", + "sonic-boom": "^2.2.0", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" + } + } + }, + "pino-std-serializers": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-4.0.0.tgz", + "integrity": "sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==" + }, + "prebuild-install": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.0.0.tgz", + "integrity": "sha512-IvSenf33K7JcgddNz2D5w521EgO+4aMMjFt73Uk9FRzQ7P+QZPKrp7qPsDydsSwjGt3T5xRNnM1bj1zMTD5fTA==", + "requires": { + "detect-libc": "^1.0.3", + "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", + "node-abi": "^3.3.0", + "npmlog": "^4.0.1", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + } + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true + }, + "prettier": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz", + "integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "promise-polyfill": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.1.3.tgz", + "integrity": "sha512-MG5r82wBzh7pSKDRa9y+vllNHz3e3d4CNj1PQE4BQYxLme0gKYYBm9YENq+UkEikyZ0XbiGWxYlVw3Rl9O/U8g==" + }, + "proto3-json-serializer": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-0.1.6.tgz", + "integrity": "sha512-tGbV6m6Kad8NqxMh5hw87euPS0YoZSAOIfvR01zYkQV8Gpx1V/8yU/0gCKCvfCkhAJsjvzzhnnsdQxA1w7PSog==", + "dev": true, + "optional": true, + "requires": { + "protobufjs": "^6.11.2" + } + }, + "protobufjs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz", + "integrity": "sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==", + "requires": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + } + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-2.0.1.tgz", + "integrity": "sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==", + "dev": true, + "requires": { + "duplexify": "^4.1.1", + "inherits": "^2.0.3", + "pump": "^3.0.0" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "dev": true, + "requires": { + "escape-goat": "^2.0.0" + } + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + }, + "quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + } + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "real-require": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.1.0.tgz", + "integrity": "sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==" + }, + "regexp-clone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz", + "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==" + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, + "registry-auth-token": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", + "dev": true, + "requires": { + "rc": "^1.2.8" + } + }, + "registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dev": true, + "requires": { + "rc": "^1.2.8" + } + }, + "replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==" + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + } + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dev": true, + "requires": { + "lowercase-keys": "^1.0.0" + } + }, + "retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true + }, + "retry-request": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-4.2.2.tgz", + "integrity": "sha512-xA93uxUD/rogV7BV59agW/JHPGXeREMWiZc9jhcwY4YdZ7QOtC7qbomYg0n4wyk2lJhggjvKvhNX8wln/Aldhg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "extend": "^3.0.2" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + }, + "rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-stable-stringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.2.0.tgz", + "integrity": "sha512-C6AuMdYPuPV/P1leplHNu0lgc2LAElq/g3TdoksDCIVtBhr78o/CH03bt/9SKqugFbKU9CUjsNlCu0fjtQzQUw==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "requires": { + "sparse-bitfield": "^3.0.3" + } + }, + "secure-json-parse": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.4.0.tgz", + "integrity": "sha512-Q5Z/97nbON5t/L/sH6mY2EacfjVGwrCcSi5D3btRO2GZ8pf1K1UN7Z9H5J57hjVU2Qzxr1xO+FmBhOvEkzCMmg==" + }, + "selenium-webdriver": { + "version": "4.0.0-rc-1", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.0.0-rc-1.tgz", + "integrity": "sha512-bcrwFPRax8fifRP60p7xkWDGSJJoMkPAzufMlk5K2NyLPht/YZzR2WcIk1+3gR8VOCLlst1P2PI+MXACaFzpIw==", + "requires": { + "jszip": "^3.6.0", + "rimraf": "^3.0.2", + "tmp": "^0.2.1", + "ws": ">=7.4.6" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dev": true, + "requires": { + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "sharp": { + "version": "0.29.3", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.29.3.tgz", + "integrity": "sha512-fKWUuOw77E4nhpyzCCJR1ayrttHoFHBT2U/kR/qEMRhvPEcluG4BKj324+SCO1e84+knXHwhJ1HHJGnUt4ElGA==", + "requires": { + "color": "^4.0.1", + "detect-libc": "^1.0.3", + "node-addon-api": "^4.2.0", + "prebuild-install": "^7.0.0", + "semver": "^7.3.5", + "simple-get": "^4.0.0", + "tar-fs": "^2.1.1", + "tunnel-agent": "^0.6.0" + }, + "dependencies": { + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "sift": { + "version": "13.5.2", + "resolved": "https://registry.npmjs.org/sift/-/sift-13.5.2.tgz", + "integrity": "sha512-+gxdEOMA2J+AI+fVsCqeNn7Tgx3M9ZN9jdi95939l1IJ8cZsqS8sqpJyOkic2SJk+1+98Uwryt/gL6XDaV+UZA==" + }, + "signal-exit": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", + "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==" + }, + "simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" + }, + "simple-get": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.0.tgz", + "integrity": "sha512-ZalZGexYr3TA0SwySsr5HlgOOinS4Jsa8YB2GJ6lUNAazyAu4KG/VmzMTwAt2YVXzzVj8QmefmAonZIK2BSGcQ==", + "requires": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + }, + "dependencies": { + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "requires": { + "mimic-response": "^3.1.0" + } + }, + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" + } + } + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "requires": { + "is-arrayish": "^0.3.1" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + }, + "sliced": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", + "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" + }, + "snakeize": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/snakeize/-/snakeize-0.1.0.tgz", + "integrity": "sha1-EMCI2LWOsHazIpu1oE4jLOEmQi0=", + "dev": true + }, + "sonic-boom": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-2.3.1.tgz", + "integrity": "sha512-o0vJPsRiCW5Q0EmRKjNiiYGy2DqSXcxk4mY9vIBSPwmkH/e/vJ2Tq8EECd5NTiO77x8vlVN+ykDjRQJTqf7eKg==", + "requires": { + "atomic-sleep": "^1.0.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", + "optional": true, + "requires": { + "memory-pager": "^1.0.2" + } + }, + "split2": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz", + "integrity": "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==" + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "stream-events": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", + "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", + "dev": true, + "requires": { + "stubs": "^3.0.0" + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, + "streamsearch": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", + "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + }, + "stubs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", + "integrity": "sha1-6NK6H6nJBXAwPAMLaQD31fiavls=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + }, + "dependencies": { + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + } + } + }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + } + } + }, + "teeny-request": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-7.1.3.tgz", + "integrity": "sha512-Ew3aoFzgQEatLA5OBIjdr1DWJUaC1xardG+qbPPo5k/y/3fMwXLxpjh5UB5dVfElktLaQbbMs80chkz53ByvSg==", + "dev": true, + "requires": { + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.1", + "stream-events": "^1.0.5", + "uuid": "^8.0.0" + }, + "dependencies": { + "node-fetch": { + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz", + "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==", + "dev": true, + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", + "dev": true + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", + "dev": true + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "dev": true, + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "thread-stream": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-0.13.0.tgz", + "integrity": "sha512-kTMZeX4Dzlb1zZ00/01aerGaTw2i8NE4sWF0TvF1uXewRhCiUjCvatQkvxIvFqauWG2ADFS2Wpd3qBeYL9i3dg==", + "requires": { + "real-require": "^0.1.0" + } + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "requires": { + "rimraf": "^3.0.0" + } + }, + "to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "requires": { + "nopt": "~1.0.10" + } + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "requires": { + "punycode": "^2.1.1" + } + }, + "ts-node": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.4.0.tgz", + "integrity": "sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A==", + "dev": true, + "requires": { + "@cspotcode/source-map-support": "0.7.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "yn": "3.1.1" + } + }, + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "typescript": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.2.tgz", + "integrity": "sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw==", + "dev": true + }, + "uglify-js": { + "version": "3.14.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.3.tgz", + "integrity": "sha512-mic3aOdiq01DuSVx0TseaEzMIVqebMZ0Z3vaeDhFEh9bsc24hV1TFvN74reA2vs08D0ZWfNjAcJ3UbVLaBss+g==", + "optional": true + }, + "undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, + "requires": { + "crypto-random-string": "^2.0.0" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "update-notifier": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", + "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", + "dev": true, + "requires": { + "boxen": "^5.0.0", + "chalk": "^4.1.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.4.0", + "is-npm": "^5.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.1.0", + "pupa": "^2.1.1", + "semver": "^7.3.4", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "dependencies": { + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, + "url-parse": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.4.tgz", + "integrity": "sha512-ITeAByWWoqutFClc/lRZnFplgXgEZr3WJ6XngMM/N9DMIm4K8zXPCZ1Jdu0rERwO84w1WC5wkle2ubwTA4NTBg==", + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "requires": { + "prepend-http": "^2.0.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + } + } + }, + "web-streams-polyfill": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.0.tgz", + "integrity": "sha512-EqPmREeOzttaLRm5HS7io98goBgZ7IVz79aDvqjD0kYXLtFZTc0T/U6wHTPKyIjb+MdN7DFIIX6hgdBEpWmfPA==" + }, + "webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==" + }, + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" + }, + "whatwg-fetch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", + "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" + }, + "whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "requires": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + }, + "wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "requires": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dev": true, + "requires": { + "string-width": "^4.0.0" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "ws": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.3.0.tgz", + "integrity": "sha512-Gs5EZtpqZzLvmIM59w4igITU57lrtYVFneaa434VROv4thzJyV6UjIL3D42lslWlI+D4KzLYnxSwtfuiO79sNw==" + }, + "xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + } + } } diff --git a/src/api/controllers/Application.controller.ts b/src/api/controllers/Application.controller.ts index 49ec3cd..289e989 100644 --- a/src/api/controllers/Application.controller.ts +++ b/src/api/controllers/Application.controller.ts @@ -125,7 +125,7 @@ export const changeApplicationStatusIntoInterview = async ( export const changeApplicationStatusIntoSelected = async (request: Request, response: Response, next: NextFunction) => { const { applicationId } = request.params; if (applicationId) { - await ApplicationService.changeApplicationStatusIntoSelected(applicationId, request.body) + await ApplicationService.changeApplicationStatusIntoSelected(applicationId) .then((data) => { request.handleResponse.successRespond(response)(data); next(); diff --git a/src/api/controllers/Contact.controller.ts b/src/api/controllers/Contact.controller.ts index d945dae..2cf618f 100644 --- a/src/api/controllers/Contact.controller.ts +++ b/src/api/controllers/Contact.controller.ts @@ -8,15 +8,15 @@ import ContactService from "../services"; * @returns {IContact} Contact document */ export const createContact = async (request: Request, response: Response, next: NextFunction) => { - await ContactService.insertContact(request.body) - .then((data) => { - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error: any) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); + await ContactService.insertContact(request.body) + .then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); }; /** @@ -26,14 +26,14 @@ export const createContact = async (request: Request, response: Response, next: * @returns {IContact[]} Contacts */ export const getAllContacts = async (request: Request, response: Response, next: NextFunction) => { - await ContactService.fetchContactInfo() - .then((contacts) => { - request.handleResponse.successRespond(response)(contacts); - }) - .catch((error) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); + await ContactService.fetchContactInfo() + .then((contacts) => { + request.handleResponse.successRespond(response)(contacts); + }) + .catch((error) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); }; /** @@ -43,12 +43,12 @@ export const getAllContacts = async (request: Request, response: Response, next: * @returns {IContact[]} Removed contact information */ export const removeContact = async (request: Request, response: Response, next: NextFunction) => { - await ContactService.archiveContact(request.params.contactId) - .then((deletedContactData) => { - request.handleResponse.successRespond(response)(deletedContactData); - }) - .catch((error) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); + await ContactService.archiveContact(request.params.contactId) + .then((deletedContactData) => { + request.handleResponse.successRespond(response)(deletedContactData); + }) + .catch((error) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); }; diff --git a/src/api/controllers/Event.controller.ts b/src/api/controllers/Event.controller.ts index ac1cca0..fe0dae5 100644 --- a/src/api/controllers/Event.controller.ts +++ b/src/api/controllers/Event.controller.ts @@ -1,7 +1,5 @@ -import { Express, Request, Response, NextFunction } from "express"; +import { Request, Response, NextFunction } from "express"; import EventService from "../services"; -import logger from "../../util/logger"; -import { IEvent } from "../../interfaces"; import ImageService from "../../util/image.handler"; /** @@ -11,20 +9,20 @@ import ImageService from "../../util/image.handler"; * @returns {IEvent} Event document */ export const insertEvent = async (request: Request, response: Response, next: NextFunction) => { - const bucketDirectoryName = "event-flyers"; + const bucketDirectoryName = "event-flyers"; - const eventFlyerPath = await ImageService.uploadImage(request.file, bucketDirectoryName); - request.body.createdBy = request.user && request.user._id ? request.user._id : null; - request.body.imageUrl = eventFlyerPath; - await EventService.insertEvent(request.body) - .then((data) => { - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error: any) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); + const eventFlyerPath = await ImageService.uploadImage(request.file, bucketDirectoryName); + request.body.createdBy = request.user && request.user._id ? request.user._id : null; + request.body.imageUrl = eventFlyerPath; + await EventService.insertEvent(request.body) + .then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); }; /** @@ -34,20 +32,20 @@ export const insertEvent = async (request: Request, response: Response, next: Ne * @returns {IEvent} Event document */ export const getEvent = async (request: Request, response: Response, next: NextFunction) => { - const eventId = request.params.eventId; - if (eventId) { - await EventService.getEvent(request.params.eventId) - .then((data) => { - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error: any) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); - } else { - request.handleResponse.errorRespond(response)("Event ID not found"); - } + const eventId = request.params.eventId; + if (eventId) { + await EventService.getEvent(request.params.eventId) + .then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); + } else { + request.handleResponse.errorRespond(response)("Event ID not found"); + } }; /** @@ -57,15 +55,15 @@ export const getEvent = async (request: Request, response: Response, next: NextF * @returns {IEvnet[]} All events in the system */ export const getEvents = async (request: Request, response: Response, next: NextFunction) => { - await EventService.getEvents() - .then((data) => { - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error: any) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); + await EventService.getEvents() + .then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); }; /** @@ -75,15 +73,15 @@ export const getEvents = async (request: Request, response: Response, next: Next * @returns {IEvnet[]} All past events in the system */ export const getPastEvents = async (request: Request, response: Response, next: NextFunction) => { - await EventService.getPastEvents() - .then((data) => { - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error: any) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); + await EventService.getPastEvents() + .then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); }; /** @@ -93,15 +91,15 @@ export const getPastEvents = async (request: Request, response: Response, next: * @returns {IEvnet} Upcoming event details */ export const getUpcomingEvent = async (request: Request, response: Response, next: NextFunction) => { - await EventService.getUpcomingEvent() - .then((data) => { - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error: any) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); + await EventService.getUpcomingEvent() + .then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); }; /** @@ -111,28 +109,28 @@ export const getUpcomingEvent = async (request: Request, response: Response, nex * @returns {IEvent} - Updated event details */ export const updateEvent = async (request: Request, response: Response, next: NextFunction) => { - if (request.file) { - const bucketDirectoryName = "event-flyers"; + if (request.file) { + const bucketDirectoryName = "event-flyers"; - const eventFlyerPath = await ImageService.uploadImage(request.file, bucketDirectoryName); - request.body.imageUrl = eventFlyerPath; - } - const eventId = request.params.eventId; - const updatedBy = request.user && request.user._id ? request.user._id : null; + const eventFlyerPath = await ImageService.uploadImage(request.file, bucketDirectoryName); + request.body.imageUrl = eventFlyerPath; + } + const eventId = request.params.eventId; + const updatedBy = request.user && request.user._id ? request.user._id : null; - if (eventId) { - await EventService.updateEvent(eventId, request.body, updatedBy) - .then((data) => { - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error: any) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); - } else { - request.handleResponse.errorRespond(response)("Event ID not found"); - } + if (eventId) { + await EventService.updateEvent(eventId, request.body, updatedBy) + .then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); + } else { + request.handleResponse.errorRespond(response)("Event ID not found"); + } }; /** @@ -142,67 +140,67 @@ export const updateEvent = async (request: Request, response: Response, next: Ne * @returns {IEvent} - Deleted event details */ export const deleteEvent = async (request: Request, response: Response, next: NextFunction) => { - const eventId = request.params.eventId; - const deletedBy = request.user && request.user._id ? request.user._id : null; - if (eventId) { - await EventService.deleteEvent(eventId, deletedBy) - .then((data) => { - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error: any) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); - } else { - request.handleResponse.errorRespond(response)("Event ID not found"); - } + const eventId = request.params.eventId; + const deletedBy = request.user && request.user._id ? request.user._id : null; + if (eventId) { + await EventService.deleteEvent(eventId, deletedBy) + .then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); + } else { + request.handleResponse.errorRespond(response)("Event ID not found"); + } }; export const eventsForAdmin = async (request: Request, response: Response, next: NextFunction) => { - await EventService.getAllEventsForAdmin() - .then((data: any) => { - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error: any) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); + await EventService.getAllEventsForAdmin() + .then((data: any) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); }; export const deletedEventsForAdmin = async (request: Request, response: Response, next: NextFunction) => { - await EventService.getDeletedEventsForAdmin() - .then((data: any) => { - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error: any) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); + await EventService.getDeletedEventsForAdmin() + .then((data: any) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); }; export const recoverRemovedEvent = async (request: Request, response: Response, next: NextFunction) => { - await EventService.recoverDeletedEvent(request.body.eventId) - .then((data) => { - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); + await EventService.recoverDeletedEvent(request.body.eventId) + .then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); }; export const deleteEventPermanently = async (request: Request, response: Response, next: NextFunction) => { - await EventService.deleteEventPermanently(request.body.eventId) - .then((data) => { - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); + await EventService.deleteEventPermanently(request.body.eventId) + .then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); }; diff --git a/src/api/controllers/ExecutiveBoard.controller.ts b/src/api/controllers/ExecutiveBoard.controller.ts index fbebcd6..378fb03 100644 --- a/src/api/controllers/ExecutiveBoard.controller.ts +++ b/src/api/controllers/ExecutiveBoard.controller.ts @@ -1,6 +1,5 @@ -import { Express, Request, Response, NextFunction } from "express"; +import { Request, Response, NextFunction } from "express"; import ExecutiveBoardService from "../services"; -import logger from "../../util/logger"; import ImageService from "../../util/image.handler"; /** @@ -9,22 +8,17 @@ import ImageService from "../../util/image.handler"; * @param next * @returns void */ -export const insertExecutiveBoard = async ( - request: Request, - response: Response, - next: NextFunction -) => { - request.body.createdBy = - request.user && request.user._id ? request.user._id : null; - await ExecutiveBoardService.insertExecutiveBoard(request.body) - .then((data) => { - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error: any) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); +export const insertExecutiveBoard = async (request: Request, response: Response, next: NextFunction) => { + request.body.createdBy = request.user && request.user._id ? request.user._id : null; + await ExecutiveBoardService.insertExecutiveBoard(request.body) + .then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); }; /** * @param request @@ -32,29 +26,21 @@ export const insertExecutiveBoard = async ( * @param next * @returns DocumentDefinition */ -export const getExecutiveBoardbyID = async ( - request: Request, - response: Response, - next: NextFunction -) => { - const executiveBoardId = request.params.executiveBoardId; - if (executiveBoardId) { - await ExecutiveBoardService.getExecutiveBoardbyID( - request.params.executiveBoardId - ) - .then((data) => { - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error: any) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); - } else { - request.handleResponse.errorRespond(response)( - "Executive board ID not found" - ); - } +export const getExecutiveBoardbyID = async (request: Request, response: Response, next: NextFunction) => { + const executiveBoardId = request.params.executiveBoardId; + if (executiveBoardId) { + await ExecutiveBoardService.getExecutiveBoardbyID(request.params.executiveBoardId) + .then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); + } else { + request.handleResponse.errorRespond(response)("Executive board ID not found"); + } }; /** * @param request @@ -62,20 +48,16 @@ export const getExecutiveBoardbyID = async ( * @param next * @returns [DocumentDefinition] */ -export const getExecutiveBoard = async ( - request: Request, - response: Response, - next: NextFunction -) => { - await ExecutiveBoardService.getExecutiveBoard() - .then((data) => { - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error: any) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); +export const getExecutiveBoard = async (request: Request, response: Response, next: NextFunction) => { + await ExecutiveBoardService.getExecutiveBoard() + .then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); }; /** * @param request @@ -83,42 +65,29 @@ export const getExecutiveBoard = async ( * @param next * @returns new Board member */ -export const addBoardMember = async ( - request: Request, - response: Response, - next: NextFunction -) => { - if (request.file) { - const bucketDirectoryName = "boardmember-flyers"; +export const addBoardMember = async (request: Request, response: Response, next: NextFunction) => { + if (request.file) { + const bucketDirectoryName = "boardmember-flyers"; - const boardMemberFlyerPath = await ImageService.uploadImage( - request.file, - bucketDirectoryName - ); - request.body.imageUrl = boardMemberFlyerPath; - } - request.body.createdBy = request.user && request.user._id ? request.user._id : null; - const executiveBoardId = request.params.executiveBoardId; - const updatedBy = request.user && request.user._id ? request.user._id : null; - if (executiveBoardId) { - await ExecutiveBoardService.addBoardMember( - request.params.executiveBoardId, - request.body, - updatedBy - ) - .then((data) => { - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error: any) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); - } else { - request.handleResponse.errorRespond(response)( - "Executive Board Id not found" - ); - } + const boardMemberFlyerPath = await ImageService.uploadImage(request.file, bucketDirectoryName); + request.body.imageUrl = boardMemberFlyerPath; + } + request.body.createdBy = request.user && request.user._id ? request.user._id : null; + const executiveBoardId = request.params.executiveBoardId; + const updatedBy = request.user && request.user._id ? request.user._id : null; + if (executiveBoardId) { + await ExecutiveBoardService.addBoardMember(request.params.executiveBoardId, request.body, updatedBy) + .then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); + } else { + request.handleResponse.errorRespond(response)("Executive Board Id not found"); + } }; /** * @param request @@ -126,33 +95,23 @@ export const addBoardMember = async ( * @param next * @returns updated ExecutiveBoard member */ -export const updateExecutiveBoardDetails = async ( - request: Request, - response: Response, - next: NextFunction -) => { - const executiveBoardId = request.params.executiveBoardId; - const updatedBy = request.user && request.user._id ? request.user._id : null; +export const updateExecutiveBoardDetails = async (request: Request, response: Response, next: NextFunction) => { + const executiveBoardId = request.params.executiveBoardId; + const updatedBy = request.user && request.user._id ? request.user._id : null; - if (executiveBoardId) { - await ExecutiveBoardService.updateExecutiveBoardDetails( - request.params.executiveBoardId, - request.body, - updatedBy - ) - .then((data) => { - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error: any) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); - } else { - request.handleResponse.errorRespond(response)( - "Executive board ID not found" - ); - } + if (executiveBoardId) { + await ExecutiveBoardService.updateExecutiveBoardDetails(request.params.executiveBoardId, request.body, updatedBy) + .then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); + } else { + request.handleResponse.errorRespond(response)("Executive board ID not found"); + } }; /** * @param request @@ -160,30 +119,21 @@ export const updateExecutiveBoardDetails = async ( * @param next * @returns deleted ExecutiveBoard member */ -export const deleteExecutiveBoardDetails = async ( - request: Request, - response: Response, - next: NextFunction -) => { - const executiveBoardId = request.params.executiveBoardId; - const deletedBy = request.user && request.user._id ? request.user._id : null; +export const deleteExecutiveBoardDetails = async (request: Request, response: Response, next: NextFunction) => { + const executiveBoardId = request.params.executiveBoardId; + const deletedBy = request.user && request.user._id ? request.user._id : null; - if (executiveBoardId) { - await ExecutiveBoardService.deleteExecutiveBoardDetails( - request.params.executiveBoardId, - deletedBy - ) - .then((data) => { - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error: any) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); - } else { - request.handleResponse.errorRespond(response)( - "Executive board ID not found" - ); - } + if (executiveBoardId) { + await ExecutiveBoardService.deleteExecutiveBoardDetails(request.params.executiveBoardId, deletedBy) + .then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); + } else { + request.handleResponse.errorRespond(response)("Executive board ID not found"); + } }; diff --git a/src/api/controllers/Organization.controller.ts b/src/api/controllers/Organization.controller.ts index cf3fc48..9ff6333 100644 --- a/src/api/controllers/Organization.controller.ts +++ b/src/api/controllers/Organization.controller.ts @@ -3,61 +3,61 @@ import ImageService from "../../util/image.handler"; import OrganizationService from "../services"; export const insertOrganization = async (request: Request, response: Response, next: NextFunction) => { - const bucketDirectoryName = "organization-images"; - const organizationImagePath = await ImageService.uploadImage(request.file, bucketDirectoryName); - request.body.imagePath = organizationImagePath; + const bucketDirectoryName = "organization-images"; + const organizationImagePath = await ImageService.uploadImage(request.file, bucketDirectoryName); + request.body.imagePath = organizationImagePath; - await OrganizationService.createOrganization(request.body, request.user._id) - .then((data) => { - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error: any) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); + await OrganizationService.createOrganization(request.body, request.user._id) + .then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); }; export const getOrganization = async (request: Request, response: Response, next: NextFunction) => { - await OrganizationService.getOrganizationInfo() - .then((data) => { - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error: any) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); + await OrganizationService.getOrganizationInfo() + .then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); }; export const getOrganizationForAdmin = async (request: Request, response: Response, next: NextFunction) => { - await OrganizationService.getOrganizationInfoForAdmin() - .then((data) => { - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error: any) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); + await OrganizationService.getOrganizationInfoForAdmin() + .then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); }; export const updateOrganization = async (request: Request, response: Response, next: NextFunction) => { - if (request.file) { - const bucketDirectoryName = "organization-images"; - const organizationImagePath = await ImageService.uploadImage(request.file, bucketDirectoryName); - request.body.imagePath = organizationImagePath; - } - const updatedBy = request.user && request.user._id ? request.user._id : null; - const organizationId = request.body.organizationId; + if (request.file) { + const bucketDirectoryName = "organization-images"; + const organizationImagePath = await ImageService.uploadImage(request.file, bucketDirectoryName); + request.body.imagePath = organizationImagePath; + } + const updatedBy = request.user && request.user._id ? request.user._id : null; + const organizationId = request.body.organizationId; - await OrganizationService.updateOrganizationInfo(organizationId, request.body, updatedBy) - .then((data) => { - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error: any) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); + await OrganizationService.updateOrganizationInfo(organizationId, request.body, updatedBy) + .then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); }; diff --git a/src/api/controllers/TopSpeaker.controller.ts b/src/api/controllers/TopSpeaker.controller.ts index 608ea1f..a19e7f3 100644 --- a/src/api/controllers/TopSpeaker.controller.ts +++ b/src/api/controllers/TopSpeaker.controller.ts @@ -1,7 +1,5 @@ -import { Express, Request, Response, NextFunction } from "express"; +import { Request, Response, NextFunction } from "express"; import TopSpeakerService from "../services"; -import logger from "../../util/logger"; -import { ITopSpeaker } from "../../interfaces"; import ImageService from "../../util/image.handler"; /** @@ -12,20 +10,20 @@ import ImageService from "../../util/image.handler"; */ export const insertTopSpeaker = async (request: Request, response: Response, next: NextFunction) => { - const bucketDirectoryName = "topspeaker-flyers"; - - const topSpeakerFlyerPath = await ImageService.uploadImage(request.file, bucketDirectoryName); - request.body.createdBy = request.user && request.user._id ? request.user._id : null; - request.body.imageUrl = topSpeakerFlyerPath; - await TopSpeakerService.insertTopSpeaker(request.body) - .then((data) => { - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error: any) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); + const bucketDirectoryName = "topspeaker-flyers"; + + const topSpeakerFlyerPath = await ImageService.uploadImage(request.file, bucketDirectoryName); + request.body.createdBy = request.user && request.user._id ? request.user._id : null; + request.body.imageUrl = topSpeakerFlyerPath; + await TopSpeakerService.insertTopSpeaker(request.body) + .then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); }; /** @@ -36,16 +34,16 @@ export const insertTopSpeaker = async (request: Request, response: Response, nex */ export const getTopSpeaker = async (request: Request, response: Response, next: NextFunction) => { - const topSpeakerId = request.params.topSpeakerId; - - if (topSpeakerId) { - await TopSpeakerService.getTopSpeaker(request.params.topSpeakerId).then((data) => { - request.handleResponse.successRespond(response)(data); - next(); - }); - } else { - request.handleResponse.errorRespond(response)("Top Speaker ID not found"); - } + const topSpeakerId = request.params.topSpeakerId; + + if (topSpeakerId) { + await TopSpeakerService.getTopSpeaker(request.params.topSpeakerId).then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }); + } else { + request.handleResponse.errorRespond(response)("Top Speaker ID not found"); + } }; /** @@ -56,15 +54,15 @@ export const getTopSpeaker = async (request: Request, response: Response, next: */ export const getTopSpeakers = async (request: Request, response: Response, next: NextFunction) => { - await TopSpeakerService.getTopSpeakers() - .then((data) => { - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error: any) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); + await TopSpeakerService.getTopSpeakers() + .then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); }; /** @@ -75,23 +73,23 @@ export const getTopSpeakers = async (request: Request, response: Response, next: */ export const updateTopSpeaker = async (request: Request, response: Response, next: NextFunction) => { - if (request.file) { - const bucketDirectoryName = "topspeaker-flyers"; - - const topSpeakerFlyerPath = await ImageService.uploadImage(request.file, bucketDirectoryName); - request.body.imageUrl = topSpeakerFlyerPath; - } - const topSpeakerId = request.params.topSpeakerId; - const updatedBy = request.user && request.user._id ? request.user._id : null; - - if (topSpeakerId) { - await TopSpeakerService.updateTopSpeaker(request.params.topSpeakerId, request.body, updatedBy).then((data) => { - request.handleResponse.successRespond(response)(data); - next(); - }); - } else { - request.handleResponse.errorRespond(response)("Top Speaker ID not found"); - } + if (request.file) { + const bucketDirectoryName = "topspeaker-flyers"; + + const topSpeakerFlyerPath = await ImageService.uploadImage(request.file, bucketDirectoryName); + request.body.imageUrl = topSpeakerFlyerPath; + } + const topSpeakerId = request.params.topSpeakerId; + const updatedBy = request.user && request.user._id ? request.user._id : null; + + if (topSpeakerId) { + await TopSpeakerService.updateTopSpeaker(request.params.topSpeakerId, request.body, updatedBy).then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }); + } else { + request.handleResponse.errorRespond(response)("Top Speaker ID not found"); + } }; /** @@ -102,39 +100,39 @@ export const updateTopSpeaker = async (request: Request, response: Response, nex */ export const deleteTopSpeaker = async (request: Request, response: Response, next: NextFunction) => { - const topSpeakerId = request.params.topSpeakerId; - const deletedBy = request.user && request.user._id ? request.user._id : null; - - if (topSpeakerId) { - await TopSpeakerService.deleteTopSpeaker(request.params.topSpeakerId, deletedBy).then((data) => { - request.handleResponse.successRespond(response)(data); - next(); - }); - } else { - request.handleResponse.errorRespond(response)("Top Speaker ID not found"); - } + const topSpeakerId = request.params.topSpeakerId; + const deletedBy = request.user && request.user._id ? request.user._id : null; + + if (topSpeakerId) { + await TopSpeakerService.deleteTopSpeaker(request.params.topSpeakerId, deletedBy).then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }); + } else { + request.handleResponse.errorRespond(response)("Top Speaker ID not found"); + } }; export const getAllTopSpeakersForAdmin = async (request: Request, response: Response, next: NextFunction) => { - await TopSpeakerService.getAllTopSpeakersForAdmin() - .then((data: any) => { - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error: any) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); + await TopSpeakerService.getAllTopSpeakersForAdmin() + .then((data: any) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); }; export const getDeletedTopSpeakersForAdmin = async (request: Request, response: Response, next: NextFunction) => { - await TopSpeakerService.getDeletedTopSpeakersForAdmin() - .then((data: any) => { - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error: any) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); + await TopSpeakerService.getDeletedTopSpeakersForAdmin() + .then((data: any) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); }; diff --git a/src/api/controllers/User.controller.ts b/src/api/controllers/User.controller.ts index 60fa399..d5187aa 100644 --- a/src/api/controllers/User.controller.ts +++ b/src/api/controllers/User.controller.ts @@ -1,4 +1,4 @@ -import { Express, Request, Response, NextFunction } from "express"; +import { Request, Response, NextFunction } from "express"; import UserService from "../services"; import logger from "../../util/logger"; import ImageService from "../../util/image.handler"; @@ -11,33 +11,33 @@ import { IUserRequest } from "../../interfaces"; * @returns {IUser} User document */ export const createUser = async (request: Request, response: Response, next: NextFunction) => { - const bucketDirectoryName = "profile-images"; - - const profileImagePath = await ImageService.uploadImage(request.file, bucketDirectoryName); - - const userInfo: IUserRequest = { - firstName: request.body.firstName as string, - lastName: request.body.lastName as string, - phoneNumber01: request.body.phoneNumber01 as string, - phoneNumber02: request.body.phoneNumber02 as string, - email: request.body.email as string, - userName: request.body.userName as string, - password: request.body.password as string, - profileImage: profileImagePath as string, - permissionLevel: request.body.permissionLevel as string, - }; - - await UserService.insertUser(userInfo) - .then((data) => { - logger.info(`New user with ID ${data._id} created`); - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error: any) => { - logger.error(error.message); - request.handleResponse.errorRespond(response)(error.message); - next(); - }); + const bucketDirectoryName = "profile-images"; + + const profileImagePath = await ImageService.uploadImage(request.file, bucketDirectoryName); + + const userInfo: IUserRequest = { + firstName: request.body.firstName as string, + lastName: request.body.lastName as string, + phoneNumber01: request.body.phoneNumber01 as string, + phoneNumber02: request.body.phoneNumber02 as string, + email: request.body.email as string, + userName: request.body.userName as string, + password: request.body.password as string, + profileImage: profileImagePath as string, + permissionLevel: request.body.permissionLevel as string, + }; + + await UserService.insertUser(userInfo) + .then((data) => { + logger.info(`New user with ID ${data._id} created`); + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + logger.error(error.message); + request.handleResponse.errorRespond(response)(error.message); + next(); + }); }; /** @@ -47,33 +47,33 @@ export const createUser = async (request: Request, response: Response, next: Nex * @returns {IUser} Authenticated user document */ export const login = async (request: Request, response: Response, next: NextFunction) => { - const { userName, password } = request.body; - - if (userName && password) { - await UserService.authenticateUser(userName, password) - .then(async (user) => { - const authToken = await user.generateAuthToken(); - const authResponseData = { - token: authToken, - }; - - request.handleResponse.successRespond(response)(authResponseData); - }) - .catch((error) => { - let errorResponseData = { - errorTime: new Date(), - message: error.message, - }; - - logger.error(JSON.stringify(errorResponseData)); - request.handleResponse.errorRespond(response)(errorResponseData); - next(); - }); - } else { - logger.error("Username or Password is missing"); - request.handleResponse.errorRespond(response)("Username or Password is missing"); - next(); - } + const { userName, password } = request.body; + + if (userName && password) { + await UserService.authenticateUser(userName, password) + .then(async (user) => { + const authToken = await user.generateAuthToken(); + const authResponseData = { + token: authToken, + }; + + request.handleResponse.successRespond(response)(authResponseData); + }) + .catch((error) => { + const errorResponseData = { + errorTime: new Date(), + message: error.message, + }; + + logger.error(JSON.stringify(errorResponseData)); + request.handleResponse.errorRespond(response)(errorResponseData); + next(); + }); + } else { + logger.error("Username or Password is missing"); + request.handleResponse.errorRespond(response)("Username or Password is missing"); + next(); + } }; /** @@ -83,14 +83,15 @@ export const login = async (request: Request, response: Response, next: NextFunc * @returns {IUser} Authenticated user document */ export const getAuthUser = async (request: Request, response: Response, next: NextFunction) => { - let userInfo = { - userName: request.user.userName, - permissionLevel: request.user.permissionLevel, - authToken: request.user.authToken, - imagePath: request.user.profileImage, - }; - - request.handleResponse.successRespond(response)(userInfo); + const userInfo = { + userName: request.user.userName, + permissionLevel: request.user.permissionLevel, + authToken: request.user.authToken, + imagePath: request.user.profileImage, + }; + + request.handleResponse.successRespond(response)(userInfo); + next(); }; /** @@ -103,15 +104,15 @@ export const getAuthUser = async (request: Request, response: Response, next: Ne * @returns {IUser[]} All user documents in the system */ export const getAllUsers = async (request: Request, response: Response, next: NextFunction) => { - await UserService.getUsers() - .then((users) => { - request.handleResponse.successRespond(response)(users); - next(); - }) - .catch((error) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); + await UserService.getUsers() + .then((users) => { + request.handleResponse.successRespond(response)(users); + next(); + }) + .catch((error) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); }; /** @@ -124,16 +125,15 @@ export const getAllUsers = async (request: Request, response: Response, next: Ne * @returns {IUser} Updated user document */ export const updateUser = async (request: Request, response: Response, next: NextFunction) => { - console.log(request.body); - await UserService.updateUser(request.user._id, request.body) - .then((user) => { - request.handleResponse.successRespond(response)(user); - next(); - }) - .catch((error) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); + await UserService.updateUser(request.user._id, request.body) + .then((user) => { + request.handleResponse.successRespond(response)(user); + next(); + }) + .catch((error) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); }; /** @@ -146,15 +146,15 @@ export const updateUser = async (request: Request, response: Response, next: Nex * @returns {IUser} Deleted user document */ export const removeUser = async (request: Request, response: Response, next: NextFunction) => { - await UserService.deleteUser(request.user._id, request.user._id) - .then((user) => { - request.handleResponse.successRespond(response)(user); - next(); - }) - .catch((error) => { - request.handleResponse.errorRespond(response)(JSON.parse(error.message)); - next(); - }); + await UserService.deleteUser(request.user._id, request.user._id) + .then((user) => { + request.handleResponse.successRespond(response)(user); + next(); + }) + .catch((error) => { + request.handleResponse.errorRespond(response)(JSON.parse(error.message)); + next(); + }); }; /** @@ -167,15 +167,15 @@ export const removeUser = async (request: Request, response: Response, next: Nex * @returns {IUser} Recover the deleted user */ export const recoverUser = async (request: Request, response: Response, next: NextFunction) => { - await UserService.recoverUser(request.body.userId) - .then((user) => { - request.handleResponse.successRespond(response)(user); - next(); - }) - .catch((error) => { - request.handleResponse.errorRespond(response)(JSON.parse(error.message)); - next(); - }); + await UserService.recoverUser(request.body.userId) + .then((user) => { + request.handleResponse.successRespond(response)(user); + next(); + }) + .catch((error) => { + request.handleResponse.errorRespond(response)(JSON.parse(error.message)); + next(); + }); }; /** @@ -188,15 +188,15 @@ export const recoverUser = async (request: Request, response: Response, next: Ne * @returns {IUser[]} Deleted user documents */ export const getRemovedUsers = async (request: Request, response: Response, next: NextFunction) => { - await UserService.fetchDeletedUsers() - .then((users) => { - request.handleResponse.successRespond(response)(users); - next(); - }) - .catch((error) => { - request.handleResponse.errorRespond(response)(JSON.parse(error.message)); - next(); - }); + await UserService.fetchDeletedUsers() + .then((users) => { + request.handleResponse.successRespond(response)(users); + next(); + }) + .catch((error) => { + request.handleResponse.errorRespond(response)(JSON.parse(error.message)); + next(); + }); }; /** @@ -209,18 +209,18 @@ export const getRemovedUsers = async (request: Request, response: Response, next * @returns {IUser} Deleted user permanently */ export const removeUserPermenently = async (request: Request, response: Response, next: NextFunction) => { - if (request.body.userId) { - await UserService.deleteUserPermenently(request.body.userId) - .then((user) => { - request.handleResponse.successRespond(response)(user); - next(); - }) - .catch((error) => { - request.handleResponse.errorRespond(response)(JSON.parse(error.message)); - next(); - }); - } else { - request.handleResponse.errorRespond(response)(JSON.parse("User id is not Passed")); - next(); - } + if (request.body.userId) { + await UserService.deleteUserPermenently(request.body.userId) + .then((user) => { + request.handleResponse.successRespond(response)(user); + next(); + }) + .catch((error) => { + request.handleResponse.errorRespond(response)(JSON.parse(error.message)); + next(); + }); + } else { + request.handleResponse.errorRespond(response)(JSON.parse("User id is not Passed")); + next(); + } }; diff --git a/src/api/controllers/Webinar.controller.ts b/src/api/controllers/Webinar.controller.ts index 8a5dfa9..4250373 100644 --- a/src/api/controllers/Webinar.controller.ts +++ b/src/api/controllers/Webinar.controller.ts @@ -1,6 +1,5 @@ -import { Express, Request, Response, NextFunction } from "express"; +import { Request, Response, NextFunction } from "express"; import WebinarService from "../services"; -import logger from "../../util/logger"; import ImageService from "../../util/image.handler"; /** @@ -9,28 +8,20 @@ import ImageService from "../../util/image.handler"; * @param {NextFunction} next - Next function * @returns {IWebinar} New webinar document */ -export const insertWebinar = async ( - request: Request, - response: Response, - next: NextFunction -) => { - const bucketDirectoryName = "webinar-flyers"; - const webinarFlyerPath = await ImageService.uploadImage( - request.file, - bucketDirectoryName - ); - request.body.createdBy = - request.user && request.user._id ? request.user._id : null; - request.body.imageUrl = webinarFlyerPath; - await WebinarService.insertWebinar(request.body) - .then((data) => { - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error: any) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); +export const insertWebinar = async (request: Request, response: Response, next: NextFunction) => { + const bucketDirectoryName = "webinar-flyers"; + const webinarFlyerPath = await ImageService.uploadImage(request.file, bucketDirectoryName); + request.body.createdBy = request.user && request.user._id ? request.user._id : null; + request.body.imageUrl = webinarFlyerPath; + await WebinarService.insertWebinar(request.body) + .then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); }; /** * @param {Request} request - Request from the frontend @@ -38,25 +29,21 @@ export const insertWebinar = async ( * @param {NextFunction} next - Next function * @returns {IWebinar} Webinar document for relevent ID */ -export const getWebinarById = async ( - request: Request, - response: Response, - next: NextFunction -) => { - const webinarId = request.params.webinarId; - if (webinarId) { - await WebinarService.fetchWebinarById(request.params.webinarId) - .then((data) => { - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error: any) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); - } else { - request.handleResponse.errorRespond(response)("WebinarId not found"); - } +export const getWebinarById = async (request: Request, response: Response, next: NextFunction) => { + const webinarId = request.params.webinarId; + if (webinarId) { + await WebinarService.fetchWebinarById(request.params.webinarId) + .then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); + } else { + request.handleResponse.errorRespond(response)("WebinarId not found"); + } }; /** * @param {Request} request - Request from the frontend @@ -64,20 +51,16 @@ export const getWebinarById = async ( * @param {NextFunction} next - Next function * @returns {IWebinar} Get all webinars in the system */ -export const getWebinars = async ( - request: Request, - response: Response, - next: NextFunction -) => { - await WebinarService.fetchWebinars() - .then((data) => { - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error: any) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); +export const getWebinars = async (request: Request, response: Response, next: NextFunction) => { + await WebinarService.fetchWebinars() + .then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); }; /** * @param {Request} request - Request from the frontend @@ -85,20 +68,16 @@ export const getWebinars = async ( * @param {NextFunction} next - Next function * @returns {IWebinar[]} Get past webinars */ -export const getPastWebinars = async ( - request: Request, - response: Response, - next: NextFunction -) => { - await WebinarService.fetchPastWebinars() - .then((data) => { - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error: any) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); +export const getPastWebinars = async (request: Request, response: Response, next: NextFunction) => { + await WebinarService.fetchPastWebinars() + .then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); }; /** * @param {Request} request - Request from the frontend @@ -106,20 +85,16 @@ export const getPastWebinars = async ( * @param {NextFunction} next - Next function * @returns {IWebinar} Get upcoming webinar document */ -export const getUpcomingWebinar = async ( - request: Request, - response: Response, - next: NextFunction -) => { - await WebinarService.fetchUpcomingWebinar() - .then((data) => { - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error: any) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); +export const getUpcomingWebinar = async (request: Request, response: Response, next: NextFunction) => { + await WebinarService.fetchUpcomingWebinar() + .then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); }; /** * @param {Request} request - Request from the frontend @@ -127,37 +102,30 @@ export const getUpcomingWebinar = async ( * @param {NextFunction} next - Next function * @returns {IWebinar} Updated webinar document */ -export const updateWebinar = async ( - request: Request, - response: Response, - next: NextFunction -) => { - if (request.file) { - const bucketDirectoryName = "webinar-flyers"; +export const updateWebinar = async (request: Request, response: Response, next: NextFunction) => { + if (request.file) { + const bucketDirectoryName = "webinar-flyers"; - const webinarFlyerPath = await ImageService.uploadImage( - request.file, - bucketDirectoryName - ); - request.body.imageUrl = webinarFlyerPath; - } + const webinarFlyerPath = await ImageService.uploadImage(request.file, bucketDirectoryName); + request.body.imageUrl = webinarFlyerPath; + } - const webinarId = request.params.webinarId; - const updatedBy = request.user && request.user._id ? request.user._id : null; + const webinarId = request.params.webinarId; + const updatedBy = request.user && request.user._id ? request.user._id : null; - if (webinarId) { - await WebinarService.updateWebinar(webinarId, request.body,updatedBy) - .then((data) => { - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error: any) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); - } else { - request.handleResponse.errorRespond(response)("WebinarId not found"); - } + if (webinarId) { + await WebinarService.updateWebinar(webinarId, request.body, updatedBy) + .then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); + } else { + request.handleResponse.errorRespond(response)("WebinarId not found"); + } }; /** * @param {Request} request - Request from the frontend @@ -165,58 +133,45 @@ export const updateWebinar = async ( * @param {NextFunction} next - Next function * @returns {IWebinar} Deleted webinar document */ -export const deleteWebinar = async ( - request: Request, - response: Response, - next: NextFunction -) => { +export const deleteWebinar = async (request: Request, response: Response, next: NextFunction) => { + const webinarId = request.params.webinarId; + const deletedBy = request.user && request.user._id ? request.user._id : null; - const webinarId = request.params.webinarId; - const deletedBy = request.user && request.user._id ? request.user._id : null; - - if (webinarId) { - await WebinarService.removeWebinar(request.params.webinarId,deletedBy) - .then((data) => { - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error: any) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); - } else { - request.handleResponse.errorRespond(response)("WebinarId not found"); - } + if (webinarId) { + await WebinarService.removeWebinar(request.params.webinarId, deletedBy) + .then((data) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); + } else { + request.handleResponse.errorRespond(response)("WebinarId not found"); + } }; -export const webinarsForAdmin = async ( - request: Request, - response: Response, - next: NextFunction -) => { - await WebinarService.getAllWebinarsForAdmin() - .then((data: any) => { - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error: any) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); +export const webinarsForAdmin = async (request: Request, response: Response, next: NextFunction) => { + await WebinarService.getAllWebinarsForAdmin() + .then((data: any) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); }; -export const deletedWebinarsForAdmin = async ( - request: Request, - response: Response, - next: NextFunction -) => { - await WebinarService.getDeletedWebinarsForAdmin() - .then((data: any) => { - request.handleResponse.successRespond(response)(data); - next(); - }) - .catch((error: any) => { - request.handleResponse.errorRespond(response)(error.message); - next(); - }); +export const deletedWebinarsForAdmin = async (request: Request, response: Response, next: NextFunction) => { + await WebinarService.getDeletedWebinarsForAdmin() + .then((data: any) => { + request.handleResponse.successRespond(response)(data); + next(); + }) + .catch((error: any) => { + request.handleResponse.errorRespond(response)(error.message); + next(); + }); }; diff --git a/src/api/controllers/index.ts b/src/api/controllers/index.ts index 8e667df..f25d951 100644 --- a/src/api/controllers/index.ts +++ b/src/api/controllers/index.ts @@ -1,163 +1,163 @@ import { - createUser, - login, - getAuthUser, - getAllUsers, - updateUser, - removeUser, - removeUserPermenently, - recoverUser, - getRemovedUsers, + createUser, + login, + getAuthUser, + getAllUsers, + updateUser, + removeUser, + removeUserPermenently, + recoverUser, + getRemovedUsers, } from "./User.controller"; import { createContact, getAllContacts, removeContact } from "./Contact.controller"; import { - insertEvent, - getEvent, - getEvents, - getPastEvents, - getUpcomingEvent, - updateEvent, - deleteEvent, - eventsForAdmin, - deletedEventsForAdmin, - deleteEventPermanently, - recoverRemovedEvent, + insertEvent, + getEvent, + getEvents, + getPastEvents, + getUpcomingEvent, + updateEvent, + deleteEvent, + eventsForAdmin, + deletedEventsForAdmin, + deleteEventPermanently, + recoverRemovedEvent, } from "./Event.controller"; import { - insertWebinar, - getWebinarById, - getWebinars, - getPastWebinars, - getUpcomingWebinar, - updateWebinar, - deleteWebinar, - webinarsForAdmin, - deletedWebinarsForAdmin, + insertWebinar, + getWebinarById, + getWebinars, + getPastWebinars, + getUpcomingWebinar, + updateWebinar, + deleteWebinar, + webinarsForAdmin, + deletedWebinarsForAdmin, } from "./Webinar.controller"; import { - insertTopSpeaker, - getTopSpeaker, - getTopSpeakers, - updateTopSpeaker, - deleteTopSpeaker, - getAllTopSpeakersForAdmin, - getDeletedTopSpeakersForAdmin, + insertTopSpeaker, + getTopSpeaker, + getTopSpeakers, + updateTopSpeaker, + deleteTopSpeaker, + getAllTopSpeakersForAdmin, + getDeletedTopSpeakersForAdmin, } from "./TopSpeaker.controller"; import { - addApplication, - getApplicationById, - getApplications, - setApplicationArchive, - changeApplicationStatusIntoInterview, - changeApplicationStatusIntoSelected, - changeApplicationStatusIntoRejected, - fetchPendingApplications, - fetchSelectedApplications, - fetchInterviewApplications, - fetchRejectedApplications, + addApplication, + getApplicationById, + getApplications, + setApplicationArchive, + changeApplicationStatusIntoInterview, + changeApplicationStatusIntoSelected, + changeApplicationStatusIntoRejected, + fetchPendingApplications, + fetchSelectedApplications, + fetchInterviewApplications, + fetchRejectedApplications, } from "./Application.controller"; import { - getBoardMemberbyID, - getAllBoardMembers, - updateBoardMemberDetails, - deleteBoardMemberDetails, + getBoardMemberbyID, + getAllBoardMembers, + updateBoardMemberDetails, + deleteBoardMemberDetails, } from "./BoardMember.controller"; import { - insertExecutiveBoard, - getExecutiveBoardbyID, - getExecutiveBoard, - addBoardMember, - updateExecutiveBoardDetails, - deleteExecutiveBoardDetails, + insertExecutiveBoard, + getExecutiveBoardbyID, + getExecutiveBoard, + addBoardMember, + updateExecutiveBoardDetails, + deleteExecutiveBoardDetails, } from "./ExecutiveBoard.controller"; import { - insertOrganization, - getOrganization, - getOrganizationForAdmin, - updateOrganization, + insertOrganization, + getOrganization, + getOrganizationForAdmin, + updateOrganization, } from "./Organization.controller"; export default { - //User Controllers - createUser, - login, - getAuthUser, - getAllUsers, - updateUser, - removeUser, - removeUserPermenently, - recoverUser, - getRemovedUsers, - //Contact Controllers - createContact, - getAllContacts, - removeContact, - //Event Controllers - insertEvent, - getEvent, - getEvents, - getPastEvents, - getUpcomingEvent, - updateEvent, - deleteEvent, - eventsForAdmin, - deletedEventsForAdmin, - deleteEventPermanently, - recoverRemovedEvent, - //Webinar Controllers - insertWebinar, - getWebinarById, - getWebinars, - getPastWebinars, - getUpcomingWebinar, - updateWebinar, - deleteWebinar, - webinarsForAdmin, - deletedWebinarsForAdmin, - //Executive board Controllers - insertExecutiveBoard, - getExecutiveBoardbyID, - getExecutiveBoard, - addBoardMember, - updateExecutiveBoardDetails, - deleteExecutiveBoardDetails, - //Top Speaker Controllers - insertTopSpeaker, - getTopSpeaker, - getTopSpeakers, - updateTopSpeaker, - deleteTopSpeaker, - getAllTopSpeakersForAdmin, - getDeletedTopSpeakersForAdmin, - //Board Member Controllers - getBoardMemberbyID, - getAllBoardMembers, - updateBoardMemberDetails, - deleteBoardMemberDetails, - //Application Controllers - addApplication, - getApplicationById, - getApplications, - setApplicationArchive, - changeApplicationStatusIntoInterview, - changeApplicationStatusIntoSelected, - changeApplicationStatusIntoRejected, - // Organization Controllers - insertOrganization, - getOrganization, - getOrganizationForAdmin, - updateOrganization, - // Application Controllers - fetchPendingApplications, - fetchSelectedApplications, - fetchInterviewApplications, - fetchRejectedApplications, + //User Controllers + createUser, + login, + getAuthUser, + getAllUsers, + updateUser, + removeUser, + removeUserPermenently, + recoverUser, + getRemovedUsers, + //Contact Controllers + createContact, + getAllContacts, + removeContact, + //Event Controllers + insertEvent, + getEvent, + getEvents, + getPastEvents, + getUpcomingEvent, + updateEvent, + deleteEvent, + eventsForAdmin, + deletedEventsForAdmin, + deleteEventPermanently, + recoverRemovedEvent, + //Webinar Controllers + insertWebinar, + getWebinarById, + getWebinars, + getPastWebinars, + getUpcomingWebinar, + updateWebinar, + deleteWebinar, + webinarsForAdmin, + deletedWebinarsForAdmin, + //Executive board Controllers + insertExecutiveBoard, + getExecutiveBoardbyID, + getExecutiveBoard, + addBoardMember, + updateExecutiveBoardDetails, + deleteExecutiveBoardDetails, + //Top Speaker Controllers + insertTopSpeaker, + getTopSpeaker, + getTopSpeakers, + updateTopSpeaker, + deleteTopSpeaker, + getAllTopSpeakersForAdmin, + getDeletedTopSpeakersForAdmin, + //Board Member Controllers + getBoardMemberbyID, + getAllBoardMembers, + updateBoardMemberDetails, + deleteBoardMemberDetails, + //Application Controllers + addApplication, + getApplicationById, + getApplications, + setApplicationArchive, + changeApplicationStatusIntoInterview, + changeApplicationStatusIntoSelected, + changeApplicationStatusIntoRejected, + // Organization Controllers + insertOrganization, + getOrganization, + getOrganizationForAdmin, + updateOrganization, + // Application Controllers + fetchPendingApplications, + fetchSelectedApplications, + fetchInterviewApplications, + fetchRejectedApplications, }; diff --git a/src/api/middleware/Auth.middleware.ts b/src/api/middleware/Auth.middleware.ts index 1dc0623..ee03406 100644 --- a/src/api/middleware/Auth.middleware.ts +++ b/src/api/middleware/Auth.middleware.ts @@ -15,35 +15,35 @@ import UserModel from "../models/User.model"; * method will execute. */ export const authenticate = async (request: Request, response: Response, next: NextFunction) => { - try { - const secret = process.env.JWT_SECRET as string; + try { + const secret = process.env.JWT_SECRET as string; - if (secret) { - const authToken = request.header("Authorization") as string; - const decode = jwt.verify(authToken, secret); - const user = await UserModel.findOne({ - _id: decode as string, - authToken: authToken, - }); + if (secret) { + const authToken = request.header("Authorization") as string; + const decode = jwt.verify(authToken, secret); + const user = await UserModel.findOne({ + _id: decode as string, + authToken: authToken, + }); - if (!user) { - let useNotFoundResponse = JSON.stringify({ - status: 401, - message: "User not found in the system", - }); - throw new Error(useNotFoundResponse); - } + if (!user) { + const useNotFoundResponse = JSON.stringify({ + status: 401, + message: "User not found in the system", + }); + throw new Error(useNotFoundResponse); + } - request.authToken = authToken; - request.user = user; + request.authToken = authToken; + request.user = user; - logger.info(`Authentication Token for ID ${user._id} is Accepted`); - next(); - } else { - throw new Error("Token Secret is not found"); - } - } catch (error: any) { - logger.warn(error.message); - return request.handleResponse.unauthorizedRespond(response)(error.message); - } + logger.info(`Authentication Token for ID ${user._id} is Accepted`); + next(); + } else { + throw new Error("Token Secret is not found"); + } + } catch (error: any) { + logger.warn(error.message); + return request.handleResponse.unauthorizedRespond(response)(error.message); + } }; diff --git a/src/api/middleware/index.ts b/src/api/middleware/index.ts index a00d841..7cad7a5 100644 --- a/src/api/middleware/index.ts +++ b/src/api/middleware/index.ts @@ -1,5 +1,5 @@ -import { authenticate } from './Auth.middleware'; +import { authenticate } from "./Auth.middleware"; export default { - authenticate, + authenticate, }; diff --git a/src/api/models/Application.model.ts b/src/api/models/Application.model.ts index 32ba4d6..b7570bb 100644 --- a/src/api/models/Application.model.ts +++ b/src/api/models/Application.model.ts @@ -2,31 +2,31 @@ import mongoose, { Schema } from "mongoose"; import { IApplication } from "../../interfaces"; const ApplicationSchema = new Schema( - { - studentId: { type: String, required: true }, - name: { type: String, required: true }, - email: { type: String, required: true }, - contactNumber: { type: String, required: true }, - currentAcademicYear: { type: String, required: true }, - selfIntroduction: { type: String, required: true }, - reasonForJoin: { type: String, required: true }, - linkedIn: { type: String, required: true }, - gitHub: { type: String, required: true }, - blog: { type: String, required: false }, - experiences: { type: String, required: false }, - challenges: { type: String, required: false }, - goal: { type: String, required: true }, - skillsAndTalents: [{ type: String, required: true }], - pastWork: { type: String, required: false }, - deletedAt: { type: Date, required: false, default: null }, - status: { - type: String, - enum: ["PENDING", "INTERVIEW", "SELECTED", "REJECTED"], - required: false, - default: "PENDING", - }, - }, - { timestamps: true } + { + studentId: { type: String, required: true }, + name: { type: String, required: true }, + email: { type: String, required: true }, + contactNumber: { type: String, required: true }, + currentAcademicYear: { type: String, required: true }, + selfIntroduction: { type: String, required: true }, + reasonForJoin: { type: String, required: true }, + linkedIn: { type: String, required: true }, + gitHub: { type: String, required: true }, + blog: { type: String, required: false }, + experiences: { type: String, required: false }, + challenges: { type: String, required: false }, + goal: { type: String, required: true }, + skillsAndTalents: [{ type: String, required: true }], + pastWork: { type: String, required: false }, + deletedAt: { type: Date, required: false, default: null }, + status: { + type: String, + enum: ["PENDING", "INTERVIEW", "SELECTED", "REJECTED"], + required: false, + default: "PENDING", + }, + }, + { timestamps: true } ); const ApplicationModel = mongoose.model("application", ApplicationSchema); diff --git a/src/api/models/BoardMember.model.ts b/src/api/models/BoardMember.model.ts index 48f44e9..c555d2a 100644 --- a/src/api/models/BoardMember.model.ts +++ b/src/api/models/BoardMember.model.ts @@ -2,29 +2,29 @@ import mongoose, { Schema } from "mongoose"; import { IBoardMember } from "../../interfaces/IBoardMember"; const BoardMemberSchema = new Schema({ - name: { type: String, required: true }, - position: { type: String, required: true }, - imageUrl: { type: String, required: false, default: null }, - socialMedia: { - facebook: { type: String, required: true }, - instagram: { type: String, required: true }, - twitter: { type: String, required: true }, - linkedIn: { type: String, required: true }, - }, - deletedAt: { type: Date, required: false, default: null }, - createdBy: { type: Schema.Types.ObjectId, required: true, ref: "users" }, - updatedBy: [ - { - user: { type: Schema.Types.ObjectId, required: false, ref: "users" }, - updatedAt: { type: Date, required: false }, - }, - ], - deletedBy: { - type: Schema.Types.ObjectId, - required: false, - default: null, - ref: "users", - }, + name: { type: String, required: true }, + position: { type: String, required: true }, + imageUrl: { type: String, required: false, default: null }, + socialMedia: { + facebook: { type: String, required: true }, + instagram: { type: String, required: true }, + twitter: { type: String, required: true }, + linkedIn: { type: String, required: true }, + }, + deletedAt: { type: Date, required: false, default: null }, + createdBy: { type: Schema.Types.ObjectId, required: true, ref: "users" }, + updatedBy: [ + { + user: { type: Schema.Types.ObjectId, required: false, ref: "users" }, + updatedAt: { type: Date, required: false }, + }, + ], + deletedBy: { + type: Schema.Types.ObjectId, + required: false, + default: null, + ref: "users", + }, }); const BoardMemberModel = mongoose.model("boardmember", BoardMemberSchema); diff --git a/src/api/models/Contact.model.ts b/src/api/models/Contact.model.ts index ebbcee3..c2d5b1f 100644 --- a/src/api/models/Contact.model.ts +++ b/src/api/models/Contact.model.ts @@ -3,32 +3,32 @@ import validator from "validator"; import { IContact } from "../../interfaces"; const ContactSchema = new Schema( - { - name: { - type: String, - required: [true, "Name is required"], - trim: true, - }, - email: { - type: String, - required: [true, "Email is required"], - trim: true, - validate(value: string) { - if (!validator.isEmail(value)) { - throw new Error("Email address is not valid"); - } - }, - }, - message: { - type: String, - required: [true, "Message is required"], - trim: true, - }, - deletedAt: { type: Date, required: false, default: null }, - }, - { - timestamps: true, - } + { + name: { + type: String, + required: [true, "Name is required"], + trim: true, + }, + email: { + type: String, + required: [true, "Email is required"], + trim: true, + validate(value: string) { + if (!validator.isEmail(value)) { + throw new Error("Email address is not valid"); + } + }, + }, + message: { + type: String, + required: [true, "Message is required"], + trim: true, + }, + deletedAt: { type: Date, required: false, default: null }, + }, + { + timestamps: true, + } ); const ContactModel = mongoose.model("contacts", ContactSchema); diff --git a/src/api/models/Event.model.ts b/src/api/models/Event.model.ts index 6f87955..f9a5343 100644 --- a/src/api/models/Event.model.ts +++ b/src/api/models/Event.model.ts @@ -2,31 +2,31 @@ import mongoose, { Schema } from "mongoose"; import { IEvent } from "../../interfaces"; const EventSchema = new Schema( - { - title: { type: String, required: true }, - description: { type: String, required: true }, - imageUrl: { type: String, required: true }, - dateTime: { type: Date, required: true }, - tags: [{ type: String, required: false }], - link: { type: String, required: false }, - registrationLink: { type: String, required: false }, - eventType: { type: String, enum: ["PAST", "UPCOMING"], required: true }, - deletedAt: { type: Date, required: false, default: null }, - createdBy: { type: Schema.Types.ObjectId, required: true, ref: "users" }, - updatedBy: [ - { - user: { type: Schema.Types.ObjectId, required: false, ref: "users" }, - updatedAt: { type: Date, required: false }, - }, - ], - deletedBy: { - type: Schema.Types.ObjectId, - required: false, - default: null, - ref: "users", - }, - }, - { timestamps: true } + { + title: { type: String, required: true }, + description: { type: String, required: true }, + imageUrl: { type: String, required: true }, + dateTime: { type: Date, required: true }, + tags: [{ type: String, required: false }], + link: { type: String, required: false }, + registrationLink: { type: String, required: false }, + eventType: { type: String, enum: ["PAST", "UPCOMING"], required: true }, + deletedAt: { type: Date, required: false, default: null }, + createdBy: { type: Schema.Types.ObjectId, required: true, ref: "users" }, + updatedBy: [ + { + user: { type: Schema.Types.ObjectId, required: false, ref: "users" }, + updatedAt: { type: Date, required: false }, + }, + ], + deletedBy: { + type: Schema.Types.ObjectId, + required: false, + default: null, + ref: "users", + }, + }, + { timestamps: true } ); const EventModel = mongoose.model("event", EventSchema); diff --git a/src/api/models/ExecutiveBoard.model.ts b/src/api/models/ExecutiveBoard.model.ts index c98e3ab..d84c145 100644 --- a/src/api/models/ExecutiveBoard.model.ts +++ b/src/api/models/ExecutiveBoard.model.ts @@ -2,22 +2,22 @@ import mongoose, { Schema } from "mongoose"; import { IExecutiveBoard } from "../../interfaces/IExecutiveBoard"; const ExecutiveBoardSchema = new Schema({ - year: { type: String, required: true }, - board: [{ type: mongoose.Schema.Types.ObjectId, ref: "boardmember" }], - deletedAt: { type: Date, required: false, default: null }, - createdBy: { type: Schema.Types.ObjectId, required: true, ref: "users" }, - updatedBy: [ - { - user: { type: Schema.Types.ObjectId, required: false, ref: "users" }, - updatedAt: { type: Date, required: false }, - }, - ], - deletedBy: { - type: Schema.Types.ObjectId, - required: false, - default: null, - ref: "users", - }, + year: { type: String, required: true }, + board: [{ type: mongoose.Schema.Types.ObjectId, ref: "boardmember" }], + deletedAt: { type: Date, required: false, default: null }, + createdBy: { type: Schema.Types.ObjectId, required: true, ref: "users" }, + updatedBy: [ + { + user: { type: Schema.Types.ObjectId, required: false, ref: "users" }, + updatedAt: { type: Date, required: false }, + }, + ], + deletedBy: { + type: Schema.Types.ObjectId, + required: false, + default: null, + ref: "users", + }, }); const ExecutiveBoardModel = mongoose.model("ececutiveboard", ExecutiveBoardSchema); diff --git a/src/api/models/Organization.model.ts b/src/api/models/Organization.model.ts index fcc28e1..dcc3c88 100644 --- a/src/api/models/Organization.model.ts +++ b/src/api/models/Organization.model.ts @@ -2,24 +2,24 @@ import mongoose, { Schema } from "mongoose"; import { IOrganization } from "../../interfaces"; const OrganizationSchema = new Schema( - { - name: { type: String, required: true, trim: true }, - email: { type: String, required: true, trim: true }, - university: { type: String, required: true, trim: true }, - phoneNumber: { type: String, required: true, trim: true }, - address: { type: String, required: true, trim: true }, - website: { type: String, required: true, trim: true }, - imagePath: { type: String, required: true, trim: true }, - updatedBy: [ - { - user: { type: Schema.Types.ObjectId, required: false, ref: "users" }, - updatedAt: { type: Date, required: false }, - }, - ], - }, - { - timestamps: true, - } + { + name: { type: String, required: true, trim: true }, + email: { type: String, required: true, trim: true }, + university: { type: String, required: true, trim: true }, + phoneNumber: { type: String, required: true, trim: true }, + address: { type: String, required: true, trim: true }, + website: { type: String, required: true, trim: true }, + imagePath: { type: String, required: true, trim: true }, + updatedBy: [ + { + user: { type: Schema.Types.ObjectId, required: false, ref: "users" }, + updatedAt: { type: Date, required: false }, + }, + ], + }, + { + timestamps: true, + } ); const OrganizationModel = mongoose.model("organization", OrganizationSchema); diff --git a/src/api/models/TopSpeaker.model.ts b/src/api/models/TopSpeaker.model.ts index 9b41e4f..44b2d03 100644 --- a/src/api/models/TopSpeaker.model.ts +++ b/src/api/models/TopSpeaker.model.ts @@ -2,33 +2,33 @@ import mongoose, { Schema } from "mongoose"; import { ITopSpeaker } from "../../interfaces"; const TopSpeakerSchema = new Schema( - { - imageUrl: { type: String, required: false, default: null }, - title: { type: String, required: true }, - description: { type: String, required: false }, - socialMediaURLs: { - facebook: { type: String, required: true }, - instagram: { type: String, required: true }, - twitter: { type: String, required: true }, - linkedIn: { type: String, required: true }, - web: { type: String, required: true }, - }, - deletedAt: { type: Date, required: false, default: null }, - createdBy: { type: Schema.Types.ObjectId, required: true, ref: "users" }, - updatedBy: [ - { - user: { type: Schema.Types.ObjectId, required: false, ref: "users" }, - updatedAt: { type: Date, required: false }, - }, - ], - deletedBy: { - type: Schema.Types.ObjectId, - required: false, - default: null, - ref: "users", - }, - }, - { timestamps: true } + { + imageUrl: { type: String, required: false, default: null }, + title: { type: String, required: true }, + description: { type: String, required: false }, + socialMediaURLs: { + facebook: { type: String, required: true }, + instagram: { type: String, required: true }, + twitter: { type: String, required: true }, + linkedIn: { type: String, required: true }, + web: { type: String, required: true }, + }, + deletedAt: { type: Date, required: false, default: null }, + createdBy: { type: Schema.Types.ObjectId, required: true, ref: "users" }, + updatedBy: [ + { + user: { type: Schema.Types.ObjectId, required: false, ref: "users" }, + updatedAt: { type: Date, required: false }, + }, + ], + deletedBy: { + type: Schema.Types.ObjectId, + required: false, + default: null, + ref: "users", + }, + }, + { timestamps: true } ); const TopSpeakerModel = mongoose.model("topSpeaker", TopSpeakerSchema); diff --git a/src/api/models/User.model.ts b/src/api/models/User.model.ts index 00a7eb1..6b20416 100644 --- a/src/api/models/User.model.ts +++ b/src/api/models/User.model.ts @@ -5,101 +5,101 @@ import { IUserModel, IUser } from "../../interfaces"; import validator from "validator"; const UserSchema = new Schema( - { - firstName: { type: String, required: true }, - lastName: { type: String, required: true }, - phoneNumber01: { - type: String, - required: [true, "Phone number 1 is required"], - trim: true, - max: [10, "Phone number should have 10 numbers"], - validate(value: string) { - if (!validator.isMobilePhone(value)) { - throw new Error("Phone number 1 is not valid"); - } - }, - }, - phoneNumber02: { - type: String, - required: false, - trim: true, - max: [10, "Phone number should have 10 numbers"], - validate(value: string) { - if (!validator.isMobilePhone(value) && value.length > 0) { - throw new Error("Phone number 2 is not valid"); - } - }, - }, - email: { - type: String, - required: [true, "Email is required"], - trim: true, - unique: true, - validate(value: string) { - if (!validator.isEmail(value)) { - throw new Error("Email address is not valid"); - } - }, - }, - userName: { type: String, required: false, unique: true }, - password: { type: String, required: false }, - profileImage: { type: String, required: false, default: null }, - authToken: { type: String, required: false }, - permissionLevel: { - type: String, - required: true, - enum: ["ROOT_ADMIN", "ADMIN", "EDITOR", "VIEWER"], - default: "EDITOR", - }, - deletedAt: { type: Date, required: false, default: null }, - deletedBy: { type: Schema.Types.ObjectId, required: false, default: null }, - }, - { - timestamps: true, - } + { + firstName: { type: String, required: true }, + lastName: { type: String, required: true }, + phoneNumber01: { + type: String, + required: [true, "Phone number 1 is required"], + trim: true, + max: [10, "Phone number should have 10 numbers"], + validate(value: string) { + if (!validator.isMobilePhone(value)) { + throw new Error("Phone number 1 is not valid"); + } + }, + }, + phoneNumber02: { + type: String, + required: false, + trim: true, + max: [10, "Phone number should have 10 numbers"], + validate(value: string) { + if (!validator.isMobilePhone(value) && value.length > 0) { + throw new Error("Phone number 2 is not valid"); + } + }, + }, + email: { + type: String, + required: [true, "Email is required"], + trim: true, + unique: true, + validate(value: string) { + if (!validator.isEmail(value)) { + throw new Error("Email address is not valid"); + } + }, + }, + userName: { type: String, required: false, unique: true }, + password: { type: String, required: false }, + profileImage: { type: String, required: false, default: null }, + authToken: { type: String, required: false }, + permissionLevel: { + type: String, + required: true, + enum: ["ROOT_ADMIN", "ADMIN", "EDITOR", "VIEWER"], + default: "EDITOR", + }, + deletedAt: { type: Date, required: false, default: null }, + deletedBy: { type: Schema.Types.ObjectId, required: false, default: null }, + }, + { + timestamps: true, + } ); // Hash the user password UserSchema.pre("save", async function (next) { - let user = this as IUser; - let password: any = user.password; + const user = this as IUser; + const password: any = user.password; - if (!user.isModified("password")) { - return next(); - } + if (!user.isModified("password")) { + return next(); + } - // Number of rounds hash function will execute - const salt = await bcrypt.genSalt(10); + // Number of rounds hash function will execute + const salt = await bcrypt.genSalt(10); - const hash = await bcrypt.hashSync(password, salt); - user.password = hash; - return next(); + const hash = await bcrypt.hashSync(password, salt); + user.password = hash; + return next(); }); UserSchema.methods.generateAuthToken = async function () { - let user = this as IUser; - const secret = process.env.JWT_SECRET as string; + const user = this as IUser; + const secret = process.env.JWT_SECRET as string; - const authToken = jwt.sign({ _id: user._id }, secret); - user.authToken = authToken; - await user.save(); - return authToken; + const authToken = jwt.sign({ _id: user._id }, secret); + user.authToken = authToken; + await user.save(); + return authToken; }; UserSchema.statics.findByUsernamePassword = async (userName: string, password: string): Promise => { - const user = await UserModel.findOne({ userName: userName }); + const user = await UserModel.findOne({ userName: userName }); - if (!user) { - throw new Error("User not found"); - } + if (!user) { + throw new Error("User not found"); + } - const isPasswordMatch = await bcrypt.compare(password, user.password as string); + const isPasswordMatch = await bcrypt.compare(password, user.password as string); - if (!isPasswordMatch) { - throw new Error("Password is incorrect"); - } + if (!isPasswordMatch) { + throw new Error("Password is incorrect"); + } - return user; + return user; }; const UserModel = mongoose.model("users", UserSchema); diff --git a/src/api/models/Webinar.model.ts b/src/api/models/Webinar.model.ts index 6dcaa72..c094a1d 100644 --- a/src/api/models/Webinar.model.ts +++ b/src/api/models/Webinar.model.ts @@ -2,31 +2,31 @@ import mongoose, { Schema } from "mongoose"; import { IWebinar } from "../../interfaces"; const WebinarSchema = new Schema( - { - title: { type: String, required: true }, - description: { type: String, required: true }, - imageUrl: { type: String, required: true }, - dateTime: { type: Date, required: true }, - tags: [{ type: String, required: false }], - link: { type: String, required: true }, - registrationLink: { type: String, required: false }, - webinarType: { type: String, enum: ["PAST", "UPCOMING"], required: true }, - deletedAt: { type: Date, required: false, default: null }, - createdBy: { type: Schema.Types.ObjectId, required: true, ref: "users" }, - updatedBy: [ - { - user: { type: Schema.Types.ObjectId, required: false, ref: "users" }, - updatedAt: { type: Date, required: false }, - }, - ], - deletedBy: { - type: Schema.Types.ObjectId, - required: false, - default: null, - ref: "users", - }, - }, - { timestamps: true } + { + title: { type: String, required: true }, + description: { type: String, required: true }, + imageUrl: { type: String, required: true }, + dateTime: { type: Date, required: true }, + tags: [{ type: String, required: false }], + link: { type: String, required: true }, + registrationLink: { type: String, required: false }, + webinarType: { type: String, enum: ["PAST", "UPCOMING"], required: true }, + deletedAt: { type: Date, required: false, default: null }, + createdBy: { type: Schema.Types.ObjectId, required: true, ref: "users" }, + updatedBy: [ + { + user: { type: Schema.Types.ObjectId, required: false, ref: "users" }, + updatedAt: { type: Date, required: false }, + }, + ], + deletedBy: { + type: Schema.Types.ObjectId, + required: false, + default: null, + ref: "users", + }, + }, + { timestamps: true } ); const WebinarModel = mongoose.model("webinar", WebinarSchema); diff --git a/src/api/routes/index.ts b/src/api/routes/index.ts index 6565863..68dd9bf 100644 --- a/src/api/routes/index.ts +++ b/src/api/routes/index.ts @@ -1,3 +1,5 @@ +/* eslint-disable max-len */ +/* eslint-disable indent */ import { Express } from "express"; import controller from "../controllers"; import middleware from "../middleware"; @@ -25,10 +27,10 @@ export default function (app: Express) { app.post("/contact/", controller.createContact); // Event endpoints - Private - app.post("/admin/event/",middleware.authenticate, upload.single('eventFlyer'), controller.insertEvent); + app.post("/admin/event/",middleware.authenticate, upload.single("eventFlyer"), controller.insertEvent); app.get("/admin/event/", middleware.authenticate,controller.eventsForAdmin); app.get("/admin/event/delete/", middleware.authenticate,controller.deletedEventsForAdmin); - app.put("/admin/event/:eventId", middleware.authenticate, upload.single('eventFlyer'), controller.updateEvent); + app.put("/admin/event/:eventId", middleware.authenticate, upload.single("eventFlyer"), controller.updateEvent); app.put("/admin/event/delete/:eventId", middleware.authenticate, controller.deleteEvent); app.put("/admin/event/recover/", middleware.authenticate, controller.recoverRemovedEvent); app.delete("/admin/event/delete", middleware.authenticate, controller.deleteEventPermanently); @@ -40,8 +42,8 @@ export default function (app: Express) { app.get("/upcomingevent/", controller.getUpcomingEvent); // Webinar endpoints - Private - app.post("/admin/webinar/", middleware.authenticate,upload.single('webinarFlyer'), controller.insertWebinar); - app.put("/admin/webinar/:webinarId", middleware.authenticate,upload.single('webinarFlyer'), controller.updateWebinar); + app.post("/admin/webinar/", middleware.authenticate,upload.single("webinarFlyer"), controller.insertWebinar); + app.put("/admin/webinar/:webinarId", middleware.authenticate,upload.single("webinarFlyer"), controller.updateWebinar); app.put("/admin/webinar/delete/:webinarId", middleware.authenticate, controller.deleteWebinar); app.get("/admin/webinar/", middleware.authenticate,controller.webinarsForAdmin); app.get("/admin/webinar/delete/", middleware.authenticate,controller.deletedWebinarsForAdmin); @@ -53,8 +55,8 @@ export default function (app: Express) { app.get("/upcomingwebinar/", controller.getUpcomingWebinar); // Top Speaker endpoints - Private - app.post("/admin/topspeaker/", middleware.authenticate,upload.single('topSpeakerFlyer'), controller.insertTopSpeaker); - app.put("/admin/topspeaker/:topSpeakerId", middleware.authenticate,upload.single('topSpeakerFlyer'), controller.updateTopSpeaker); + app.post("/admin/topspeaker/", middleware.authenticate,upload.single("topSpeakerFlyer"), controller.insertTopSpeaker); + app.put("/admin/topspeaker/:topSpeakerId", middleware.authenticate,upload.single("topSpeakerFlyer"), controller.updateTopSpeaker); app.put("/admin/topspeaker/delete/:topSpeakerId", middleware.authenticate, controller.deleteTopSpeaker); app.get("/admin/topspeaker/", middleware.authenticate,controller.getAllTopSpeakersForAdmin); app.get("/admin/topspeaker/delete/", middleware.authenticate,controller.getDeletedTopSpeakersForAdmin); @@ -64,7 +66,7 @@ export default function (app: Express) { app.get("/topspeaker/", controller.getTopSpeakers); // BoardMember endpoints - Private - app.put("/admin/boardmember/:boardMemberId", middleware.authenticate,upload.single('boardMemberFlyer'), controller.updateBoardMemberDetails); + app.put("/admin/boardmember/:boardMemberId", middleware.authenticate,upload.single("boardMemberFlyer"), controller.updateBoardMemberDetails); app.put("/admin/boardmember/delete/:boardMemberId", middleware.authenticate, controller.deleteBoardMemberDetails); // BoardMember endpoints - Public @@ -73,7 +75,7 @@ export default function (app: Express) { // ExecutiveBoard endpoints - Private app.post("/admin/executive/", middleware.authenticate, controller.insertExecutiveBoard); - app.put("/admin/executive/boardmember/:executiveBoardId", middleware.authenticate,upload.single('boardMemberFlyer'), controller.addBoardMember); + app.put("/admin/executive/boardmember/:executiveBoardId", middleware.authenticate,upload.single("boardMemberFlyer"), controller.addBoardMember); app.put("/admin/executive/:executiveBoardId", middleware.authenticate, controller.updateExecutiveBoardDetails); app.put("/admin/executive/delete/:executiveBoardId/", middleware.authenticate, controller.deleteExecutiveBoardDetails); @@ -99,8 +101,8 @@ export default function (app: Express) { app.post("/application/", controller.addApplication); // Organization endpoints - Private - app.post("/admin/organization/", middleware.authenticate, upload.single('organizationLogo'), controller.insertOrganization); + app.post("/admin/organization/", middleware.authenticate, upload.single("organizationLogo"), controller.insertOrganization); app.get("/admin/organization/info", middleware.authenticate, controller.getOrganization); app.get("/admin/organization/", middleware.authenticate, controller.getOrganizationForAdmin); - app.put("/admin/organization/", middleware.authenticate, upload.single('organizationLogo'), controller.updateOrganization); + app.put("/admin/organization/", middleware.authenticate, upload.single("organizationLogo"), controller.updateOrganization); } diff --git a/src/api/services/Application.service.ts b/src/api/services/Application.service.ts index 20fe031..66f32c7 100644 --- a/src/api/services/Application.service.ts +++ b/src/api/services/Application.service.ts @@ -1,4 +1,4 @@ -import { DocumentDefinition, FilterQuery } from "mongoose"; +import { DocumentDefinition } from "mongoose"; import { IApplication, IInterview } from "../../interfaces"; import ApplicationModel from "../models/Application.model"; import { configs } from "../../config"; @@ -10,39 +10,38 @@ import { request } from "express"; * @returns {Promise} */ export const addApplication = async (applicationData: DocumentDefinition) => { - return await ApplicationModel.create(applicationData) - .then(async (application) => { - // Send email - const emailTemplate = "Application-Email-Template.html"; - const to = application.email; - const subject = "MS Club SLIIT - Application Received"; - const emailBodyData = { - studentId: application.studentId, - name: application.name, - email: application.email, - contactNumber: application.contactNumber, - currentAcademicYear: application.currentAcademicYear, - linkedIn: application.linkedIn, - gitHub: application.gitHub, - skillsAndTalents: application.skillsAndTalents, - }; + return await ApplicationModel.create(applicationData) + .then(async (application) => { + // Send email + const emailTemplate = "Application-Email-Template.html"; + const to = application.email; + const subject = "MS Club SLIIT - Application Received"; + const emailBodyData = { + studentId: application.studentId, + name: application.name, + email: application.email, + contactNumber: application.contactNumber, + currentAcademicYear: application.currentAcademicYear, + linkedIn: application.linkedIn, + gitHub: application.gitHub, + skillsAndTalents: application.skillsAndTalents, + }; - const email = { - template: emailTemplate, - to: to, - subject: subject, - body: emailBodyData, - }; + const email = { + template: emailTemplate, + to: to, + subject: subject, + body: emailBodyData, + }; - // Send email data to message queue - const channel = request.channel; - console.log(channel); - request.queue.publishMessage(channel, configs.queue.emailService, JSON.stringify(email)); - return application; - }) - .catch((error) => { - throw new Error(error.message); - }); + // Send email data to message queue + const channel = request.channel; + request.queue.publishMessage(channel, configs.queue.emailService, JSON.stringify(email)); + return application; + }) + .catch((error) => { + throw new Error(error.message); + }); }; /** @@ -51,13 +50,13 @@ export const addApplication = async (applicationData: DocumentDefinition} */ export const fetchApplicationById = async (applicationId: string) => { - return await ApplicationModel.findById(applicationId) - .then((application) => { - return application; - }) - .catch((error) => { - throw new Error(error.message); - }); + return await ApplicationModel.findById(applicationId) + .then((application) => { + return application; + }) + .catch((error) => { + throw new Error(error.message); + }); }; /** @@ -66,13 +65,13 @@ export const fetchApplicationById = async (applicationId: string) => { * @returns {Promise} */ export const fetchApplications = async () => { - return await ApplicationModel.aggregate([{ $match: { deletedAt: { $eq: null } } }]) - .then((applications) => { - return applications; - }) - .catch((error) => { - throw new Error(error.message); - }); + return await ApplicationModel.aggregate([{ $match: { deletedAt: { $eq: null } } }]) + .then((applications) => { + return applications; + }) + .catch((error) => { + throw new Error(error.message); + }); }; /** @@ -80,18 +79,18 @@ export const fetchApplications = async () => { * @param applicationId @type string */ export const archiveApplication = async (applicationId: string) => { - return await ApplicationModel.findById(applicationId) - .then(async (application) => { - if (application?.deletedAt) { - application.deletedAt = new Date(); - return await application.save(); - } else { - return null; - } - }) - .catch((error) => { - throw new Error(error.message); - }); + return await ApplicationModel.findById(applicationId) + .then(async (application) => { + if (application?.deletedAt) { + application.deletedAt = new Date(); + return await application.save(); + } else { + return null; + } + }) + .catch((error) => { + throw new Error(error.message); + }); }; /** @@ -99,146 +98,144 @@ export const archiveApplication = async (applicationId: string) => { * @param applicationId @type string */ export const changeApplicationStatusIntoInterview = async ( - applicationId: string, - interviewData: DocumentDefinition + applicationId: string, + interviewData: DocumentDefinition ) => { - return await ApplicationModel.findById(applicationId) - .then(async (application) => { - if (application) { - // Send email - const emailTemplate = "Interview-Email-Template.html"; - const to = application.email; - const subject = "MS Club of SLIIT - Interview"; - const emailBodyData = { - name: application.name, - email: application.email, - date: interviewData.date, - time: interviewData.time, - duration: interviewData.duration, - format: interviewData.format, - }; + return await ApplicationModel.findById(applicationId) + .then(async (application) => { + if (application) { + // Send email + const emailTemplate = "Interview-Email-Template.html"; + const to = application.email; + const subject = "MS Club of SLIIT - Interview"; + const emailBodyData = { + name: application.name, + email: application.email, + date: interviewData.date, + time: interviewData.time, + duration: interviewData.duration, + format: interviewData.format, + }; - const email = { - template: emailTemplate, - to: to, - subject: subject, - body: emailBodyData, - }; + const email = { + template: emailTemplate, + to: to, + subject: subject, + body: emailBodyData, + }; - // Send email data to message queue - const channel = request.channel; - request.queue.publishMessage(channel, configs.queue.emailService, JSON.stringify(email)); - return application; - } else { - return null; - } - }) - .catch((error) => { - throw new Error(error.message); - }); + // Send email data to message queue + const channel = request.channel; + request.queue.publishMessage(channel, configs.queue.emailService, JSON.stringify(email)); + return application; + } else { + return null; + } + }) + .catch((error) => { + throw new Error(error.message); + }); }; /** * @function changeApplicationStatusIntoSelected to update the status into SELECTED of an application in the system * @param applicationId @type string */ -export const changeApplicationStatusIntoSelected = async ( - applicationId: string, - interviewData: DocumentDefinition -) => { - return await ApplicationModel.findById(applicationId) - .then(async (application) => { - if (application) { - // Send email - const emailTemplate = "Selected-Email-Template.html"; - const to = application.email; - const subject = "Congratulations from MS Club Team !"; - const emailBodyData = { - name: application.name, - }; +export const changeApplicationStatusIntoSelected = async (applicationId: string) => { + return await ApplicationModel.findById(applicationId) + .then(async (application) => { + if (application) { + // Send email + const emailTemplate = "Selected-Email-Template.html"; + const to = application.email; + const subject = "Congratulations from MS Club Team !"; + const emailBodyData = { + name: application.name, + }; - const email = { - template: emailTemplate, - to: to, - subject: subject, - body: emailBodyData, - }; + const email = { + template: emailTemplate, + to: to, + subject: subject, + body: emailBodyData, + }; - // Send email data to message queue - const channel = request.channel; - request.queue.publishMessage(channel, configs.queue.emailService, JSON.stringify(email)); - return application; - } else { - return null; - } - }) - .catch((error) => { - throw new Error(error.message); - }); + // Send email data to message queue + const channel = request.channel; + request.queue.publishMessage(channel, configs.queue.emailService, JSON.stringify(email)); + return application; + } else { + return null; + } + }) + .catch((error) => { + throw new Error(error.message); + }); }; /** - * @todo create @function changeApplicationStatusIntoRejected to update the status into REJECTED of an application in the system + * @todo create @function changeApplicationStatusIntoRejected to update the status into REJECTED of + * an application in the system * @param applicationId @type string */ export const changeApplicationStatusIntoRejected = async (applicationId: string) => { - return await ApplicationModel.findById(applicationId) - .then(async (application) => { - if (application) { - application.status = "REJECTED"; - return await application.save(); - } - }) - .catch((error) => { - throw new Error(error.message); - }); + return await ApplicationModel.findById(applicationId) + .then(async (application) => { + if (application) { + application.status = "REJECTED"; + return await application.save(); + } + }) + .catch((error) => { + throw new Error(error.message); + }); }; /** * @todo create @function fetchPendingApplications to filter PENDING applications in the system */ export const fetchPendingApplications = async () => { - return await ApplicationModel.aggregate([{ $match: { status: { $eq: "PENDING" }, deletedAt: { $eq: null } } }]) - .then((applications) => { - return applications; - }) - .catch((err) => { - throw new Error(err.message); - }); + return await ApplicationModel.aggregate([{ $match: { status: { $eq: "PENDING" }, deletedAt: { $eq: null } } }]) + .then((applications) => { + return applications; + }) + .catch((err) => { + throw new Error(err.message); + }); }; /** * @todo create @function fetchInterviewApplications to filter INTERVIEW applications in the system */ export const fetchInterviewApplications = async () => { - return await ApplicationModel.aggregate([{ $match: { status: { $eq: "INTERVIEW" }, deletedAt: { $eq: null } } }]) - .then((applications) => { - return applications; - }) - .catch((err) => { - throw new Error(err.message); - }); + return await ApplicationModel.aggregate([{ $match: { status: { $eq: "INTERVIEW" }, deletedAt: { $eq: null } } }]) + .then((applications) => { + return applications; + }) + .catch((err) => { + throw new Error(err.message); + }); }; /** * @todo create @function fetchSelectedApplications to filter SELECTED applications in the system */ export const fetchSelectedApplications = async () => { - return await ApplicationModel.aggregate([{ $match: { status: { $eq: "SELECTED" }, deletedAt: { $eq: null } } }]) - .then((applications) => { - return applications; - }) - .catch((err) => { - throw new Error(err.message); - }); + return await ApplicationModel.aggregate([{ $match: { status: { $eq: "SELECTED" }, deletedAt: { $eq: null } } }]) + .then((applications) => { + return applications; + }) + .catch((err) => { + throw new Error(err.message); + }); }; /** * @todo create @function fetchRejectedApplications to filter REJECTED applications in the system */ export const fetchRejectedApplications = async () => { - return await ApplicationModel.aggregate([{ $match: { status: { $eq: "REJECTED" }, deletedAt: { $eq: null } } }]) - .then((applications) => { - return applications; - }) - .catch((err) => { - throw new Error(err.message); - }); + return await ApplicationModel.aggregate([{ $match: { status: { $eq: "REJECTED" }, deletedAt: { $eq: null } } }]) + .then((applications) => { + return applications; + }) + .catch((err) => { + throw new Error(err.message); + }); }; diff --git a/src/api/services/BoardMember.service.ts b/src/api/services/BoardMember.service.ts index 861ed7b..7a93835 100644 --- a/src/api/services/BoardMember.service.ts +++ b/src/api/services/BoardMember.service.ts @@ -1,4 +1,4 @@ -import { DocumentDefinition, FilterQuery, Schema } from "mongoose"; +import { DocumentDefinition, Schema } from "mongoose"; import { IBoardMember, IUpdatedBy } from "../../interfaces"; import BoardMemberModel from "../models/BoardMember.model"; @@ -6,44 +6,44 @@ import BoardMemberModel from "../models/BoardMember.model"; add a new Board Member to the database */ export const insertBoardMember = async (BoardMemberData: DocumentDefinition) => { - return await BoardMemberModel.create(BoardMemberData) - .then(async (boardMember) => { - let initialUpdatedBy: IUpdatedBy = { - user: boardMember.createdBy, - updatedAt: new Date(), - }; - boardMember.updatedBy.push(initialUpdatedBy); - await boardMember.save(); - return boardMember; - }) - .catch((error) => { - throw new Error(error.message); - }); + return await BoardMemberModel.create(BoardMemberData) + .then(async (boardMember) => { + const initialUpdatedBy: IUpdatedBy = { + user: boardMember.createdBy, + updatedAt: new Date(), + }; + boardMember.updatedBy.push(initialUpdatedBy); + await boardMember.save(); + return boardMember; + }) + .catch((error) => { + throw new Error(error.message); + }); }; /** get the Board Memberby ID from the database * @param boardMemberId @type string */ export const getBoardMemberbyID = async (boardMemberId: string) => { - return await BoardMemberModel.findById(boardMemberId) - .then(async (boardMember) => { - return boardMember; - }) - .catch((error) => { - throw new Error(error.message); - }); + return await BoardMemberModel.findById(boardMemberId) + .then(async (boardMember) => { + return boardMember; + }) + .catch((error) => { + throw new Error(error.message); + }); }; /** get all Board Memberbys from the database */ export const getAllBoardMembers = async () => { - return await BoardMemberModel.find() - .then(async (boardMembers) => { - return boardMembers; - }) - .catch((error) => { - throw new Error(error.message); - }); + return await BoardMemberModel.find() + .then(async (boardMembers) => { + return boardMembers; + }) + .catch((error) => { + throw new Error(error.message); + }); }; /** update details of the member @@ -52,54 +52,54 @@ export const getAllBoardMembers = async () => { */ export const updateBoardMemberDetails = async ( - boardMemberId: string, - updateData: DocumentDefinition, - updatedBy: Schema.Types.ObjectId + boardMemberId: string, + updateData: DocumentDefinition, + updatedBy: Schema.Types.ObjectId ) => { - return await BoardMemberModel.findById(boardMemberId) - .then(async (boardMemberDetails) => { - if (boardMemberDetails) { - if (!boardMemberDetails.deletedAt) { - if (updateData.name) { - boardMemberDetails.name = updateData.name; - } - if (updateData.position) { - boardMemberDetails.position = updateData.position; - } - if (updateData.imageUrl) { - boardMemberDetails.imageUrl = updateData.imageUrl; - } - if (updateData.socialMedia) { - if (updateData.socialMedia.facebook) { - boardMemberDetails.socialMedia.facebook = updateData.socialMedia.facebook; - } - if (updateData.socialMedia.instagram) { - boardMemberDetails.socialMedia.instagram = updateData.socialMedia.instagram; - } - if (updateData.socialMedia.linkedIn) { - boardMemberDetails.socialMedia.linkedIn = updateData.socialMedia.linkedIn; - } - if (updateData.socialMedia.twitter) { - boardMemberDetails.socialMedia.twitter = updateData.socialMedia.twitter; - } - } - const updateUserInfo: IUpdatedBy = { - user: updatedBy, - updatedAt: new Date(), - }; + return await BoardMemberModel.findById(boardMemberId) + .then(async (boardMemberDetails) => { + if (boardMemberDetails) { + if (!boardMemberDetails.deletedAt) { + if (updateData.name) { + boardMemberDetails.name = updateData.name; + } + if (updateData.position) { + boardMemberDetails.position = updateData.position; + } + if (updateData.imageUrl) { + boardMemberDetails.imageUrl = updateData.imageUrl; + } + if (updateData.socialMedia) { + if (updateData.socialMedia.facebook) { + boardMemberDetails.socialMedia.facebook = updateData.socialMedia.facebook; + } + if (updateData.socialMedia.instagram) { + boardMemberDetails.socialMedia.instagram = updateData.socialMedia.instagram; + } + if (updateData.socialMedia.linkedIn) { + boardMemberDetails.socialMedia.linkedIn = updateData.socialMedia.linkedIn; + } + if (updateData.socialMedia.twitter) { + boardMemberDetails.socialMedia.twitter = updateData.socialMedia.twitter; + } + } + const updateUserInfo: IUpdatedBy = { + user: updatedBy, + updatedAt: new Date(), + }; - boardMemberDetails.updatedBy.push(updateUserInfo); - return await boardMemberDetails.save(); - } else { - throw new Error("Board Member is not found"); - } - } else { - return null; - } - }) - .catch((error) => { - throw new Error(error.message); - }); + boardMemberDetails.updatedBy.push(updateUserInfo); + return await boardMemberDetails.save(); + } else { + throw new Error("Board Member is not found"); + } + } else { + return null; + } + }) + .catch((error) => { + throw new Error(error.message); + }); }; /** @@ -107,17 +107,17 @@ export const updateBoardMemberDetails = async ( * @param boardMemberId @type string */ export const deleteBoardMemberDetails = async (boardMemberId: string, deletedBy: Schema.Types.ObjectId) => { - return await BoardMemberModel.findById(boardMemberId) - .then(async (boardMemberDetails) => { - if (boardMemberDetails && boardMemberDetails.deletedAt === null) { - boardMemberDetails.deletedAt = new Date(); - boardMemberDetails.deletedBy = deletedBy; - return await boardMemberDetails.save(); - } else { - return null; - } - }) - .catch((error) => { - throw new Error(error.message); - }); + return await BoardMemberModel.findById(boardMemberId) + .then(async (boardMemberDetails) => { + if (boardMemberDetails && boardMemberDetails.deletedAt === null) { + boardMemberDetails.deletedAt = new Date(); + boardMemberDetails.deletedBy = deletedBy; + return await boardMemberDetails.save(); + } else { + return null; + } + }) + .catch((error) => { + throw new Error(error.message); + }); }; diff --git a/src/api/services/Contact.service.ts b/src/api/services/Contact.service.ts index d073ab8..ad12c2a 100644 --- a/src/api/services/Contact.service.ts +++ b/src/api/services/Contact.service.ts @@ -10,34 +10,34 @@ import { request } from "express"; * @returns {IContact} Contact data */ export const insertContact = async (contactData: DocumentDefinition) => { - return await ContactModel.create(contactData) - .then(async (data) => { - // Send email - const emailTemplate = "Contact-Us-Email-Template.html"; - const to = data.email; - const subject = "MS Club SLIIT - Contact Us"; - const emailBodyData = { - name: data.name, - email: data.email, - message: data.message, - date_time: moment(data.createdAt).format("LLL"), - }; + return await ContactModel.create(contactData) + .then(async (data) => { + // Send email + const emailTemplate = "Contact-Us-Email-Template.html"; + const to = data.email; + const subject = "MS Club SLIIT - Contact Us"; + const emailBodyData = { + name: data.name, + email: data.email, + message: data.message, + date_time: moment(data.createdAt).format("LLL"), + }; - const email = { - template: emailTemplate, - to: to, - subject: subject, - body: emailBodyData, - }; + const email = { + template: emailTemplate, + to: to, + subject: subject, + body: emailBodyData, + }; - // Send email data to message queue - const channel = request.channel; - request.queue.publishMessage(channel, configs.queue.emailService, JSON.stringify(email)); - return data; - }) - .catch((error) => { - throw new Error(error.message); - }); + // Send email data to message queue + const channel = request.channel; + request.queue.publishMessage(channel, configs.queue.emailService, JSON.stringify(email)); + return data; + }) + .catch((error) => { + throw new Error(error.message); + }); }; /** @@ -45,29 +45,29 @@ export const insertContact = async (contactData: DocumentDefinition) = * @returns {IContact} Updated contact data */ export const archiveContact = async (contactId: string) => { - return await ContactModel.findById(contactId) - .then(async (contactData) => { - if (contactData && contactData.deletedAt === null) { - contactData.deletedAt = new Date(); - return await contactData.save(); - } else { - return "Contact not found"; - } - }) - .catch((error) => { - throw new Error(error.message); - }); + return await ContactModel.findById(contactId) + .then(async (contactData) => { + if (contactData && contactData.deletedAt === null) { + contactData.deletedAt = new Date(); + return await contactData.save(); + } else { + return "Contact not found"; + } + }) + .catch((error) => { + throw new Error(error.message); + }); }; /** * @returns {IContact[]} All available contacts */ export const fetchContactInfo = async () => { - return await ContactModel.aggregate([{ $match: { deletedAt: { $eq: null } } }]) - .then((contacts) => { - return contacts; - }) - .catch((error) => { - throw new Error(error.message); - }); + return await ContactModel.aggregate([{ $match: { deletedAt: { $eq: null } } }]) + .then((contacts) => { + return contacts; + }) + .catch((error) => { + throw new Error(error.message); + }); }; diff --git a/src/api/services/Event.service.ts b/src/api/services/Event.service.ts index ee70b70..69a615d 100644 --- a/src/api/services/Event.service.ts +++ b/src/api/services/Event.service.ts @@ -1,4 +1,4 @@ -import { DocumentDefinition, FilterQuery, Schema } from "mongoose"; +import { DocumentDefinition, Schema } from "mongoose"; import { IEvent, IUpdatedBy } from "../../interfaces"; import EventModel from "../models/Event.model"; import UserModel from "../models/User.model"; @@ -7,20 +7,20 @@ import UserModel from "../models/User.model"; save an event in the database */ export const insertEvent = async (eventData: DocumentDefinition) => { - return await EventModel.create(eventData) - .then(async (event) => { - let initialUpdatedBy: IUpdatedBy = { - user: event.createdBy, - updatedAt: new Date(), - }; + return await EventModel.create(eventData) + .then(async (event) => { + const initialUpdatedBy: IUpdatedBy = { + user: event.createdBy, + updatedAt: new Date(), + }; - event.updatedBy.push(initialUpdatedBy); - await event.save(); - return event; - }) - .catch((error) => { - throw new Error(error.message); - }); + event.updatedBy.push(initialUpdatedBy); + await event.save(); + return event; + }) + .catch((error) => { + throw new Error(error.message); + }); }; /** @@ -28,54 +28,54 @@ export const insertEvent = async (eventData: DocumentDefinition) => { * @param eventId @type string */ export const getEvent = async (eventId: string) => { - return await EventModel.findById(eventId) - .then((event) => { - return event; - }) - .catch((error) => { - throw new Error(error.message); - }); + return await EventModel.findById(eventId) + .then((event) => { + return event; + }) + .catch((error) => { + throw new Error(error.message); + }); }; /** fetch all the events in the system */ export const getEvents = async () => { - return await EventModel.aggregate([{ $match: { deletedAt: { $eq: null } } }]) - .then((events) => { - return events; - }) - .catch((error) => { - throw new Error(error.message); - }); + return await EventModel.aggregate([{ $match: { deletedAt: { $eq: null } } }]) + .then((events) => { + return events; + }) + .catch((error) => { + throw new Error(error.message); + }); }; /** fetch an past events in the system */ export const getPastEvents = async () => { - return await EventModel.find({ eventType: "PAST" }) - .then((events) => { - return events; - }) - .catch((error) => { - throw new Error(error.message); - }); + return await EventModel.find({ eventType: "PAST" }) + .then((events) => { + return events; + }) + .catch((error) => { + throw new Error(error.message); + }); }; /** fetch an upcoming event in the system */ export const getUpcomingEvent = async () => { - return await EventModel.findOne({ eventType: "UPCOMING" }) - .limit(1) - .sort({ $natural: -1 }) - .then((event) => { - return event; - }) - .catch((error) => { - throw new Error(error.message); - }); + return await EventModel.findOne({ eventType: "UPCOMING" }) + .limit(1) + .sort({ $natural: -1 }) + .then((event) => { + return event; + }) + .catch((error) => { + throw new Error(error.message); + }); }; /** @@ -84,56 +84,56 @@ export const getUpcomingEvent = async () => { * @param updateData @type DocumentDefinition */ export const updateEvent = async ( - eventId: string, - eventData: DocumentDefinition, - updatedBy: Schema.Types.ObjectId + eventId: string, + eventData: DocumentDefinition, + updatedBy: Schema.Types.ObjectId ) => { - return await EventModel.findById(eventId) - .then(async (eventDetails) => { - if (eventDetails) { - if (!eventDetails.deletedAt) { - if (eventData.title) { - eventDetails.title = eventData.title; - } - if (eventData.description) { - eventDetails.description = eventData.description; - } - if (eventData.imageUrl) { - eventDetails.imageUrl = eventData.imageUrl; - } - if (eventData.link) { - eventDetails.link = eventData.link; - } - if (eventData.registrationLink) { - eventDetails.registrationLink = eventData.registrationLink; - } - if (eventData.tags) { - eventDetails.tags = eventData.tags; - } - if (eventData.dateTime) { - eventDetails.dateTime = eventData.dateTime; - } - if (eventData.eventType) { - eventDetails.eventType = eventData.eventType; - } + return await EventModel.findById(eventId) + .then(async (eventDetails) => { + if (eventDetails) { + if (!eventDetails.deletedAt) { + if (eventData.title) { + eventDetails.title = eventData.title; + } + if (eventData.description) { + eventDetails.description = eventData.description; + } + if (eventData.imageUrl) { + eventDetails.imageUrl = eventData.imageUrl; + } + if (eventData.link) { + eventDetails.link = eventData.link; + } + if (eventData.registrationLink) { + eventDetails.registrationLink = eventData.registrationLink; + } + if (eventData.tags) { + eventDetails.tags = eventData.tags; + } + if (eventData.dateTime) { + eventDetails.dateTime = eventData.dateTime; + } + if (eventData.eventType) { + eventDetails.eventType = eventData.eventType; + } - const updateUserInfo: IUpdatedBy = { - user: updatedBy, - updatedAt: new Date(), - }; + const updateUserInfo: IUpdatedBy = { + user: updatedBy, + updatedAt: new Date(), + }; - eventDetails.updatedBy.push(updateUserInfo); - return await eventDetails.save(); - } else { - throw new Error("Event is not found"); - } - } else { - return null; - } - }) - .catch((error) => { - throw new Error(error.message); - }); + eventDetails.updatedBy.push(updateUserInfo); + return await eventDetails.save(); + } else { + throw new Error("Event is not found"); + } + } else { + return null; + } + }) + .catch((error) => { + throw new Error(error.message); + }); }; /** @@ -141,96 +141,96 @@ export const updateEvent = async ( * @param eventId @type string */ export const deleteEvent = async (eventId: string, deletedBy: Schema.Types.ObjectId) => { - return await EventModel.findById(eventId) - .then(async (eventDetails) => { - if (eventDetails && eventDetails.deletedAt === null) { - eventDetails.deletedAt = new Date(); - eventDetails.deletedBy = deletedBy; - return await eventDetails.save(); - } else { - return "Event not found"; - } - }) - .catch((error) => { - throw new Error(error.message); - }); + return await EventModel.findById(eventId) + .then(async (eventDetails) => { + if (eventDetails && eventDetails.deletedAt === null) { + eventDetails.deletedAt = new Date(); + eventDetails.deletedBy = deletedBy; + return await eventDetails.save(); + } else { + return "Event not found"; + } + }) + .catch((error) => { + throw new Error(error.message); + }); }; /** Get all events - admin */ export const getAllEventsForAdmin = async () => { - return await EventModel.find({ deletedAt: null }) - .populate({ - path: "createdBy", - select: "firstName lastName email permissionLevel profileImage", - }) - .populate({ - path: "updatedBy", - populate: { - path: "user", - select: "firstName lastName email permissionLevel profileImage", - }, - select: "updatedAt", - }) - .then((events) => { - return events; - }) - .catch((error) => { - throw new Error(error.message); - }); + return await EventModel.find({ deletedAt: null }) + .populate({ + path: "createdBy", + select: "firstName lastName email permissionLevel profileImage", + }) + .populate({ + path: "updatedBy", + populate: { + path: "user", + select: "firstName lastName email permissionLevel profileImage", + }, + select: "updatedAt", + }) + .then((events) => { + return events; + }) + .catch((error) => { + throw new Error(error.message); + }); }; /** Get deleted events - admin */ export const getDeletedEventsForAdmin = async () => { - return await EventModel.find({ deletedAt: { $ne: null } }) - .populate({ - path: "createdBy", - select: "firstName lastName email permissionLevel profileImage", - }) - .populate({ - path: "updatedBy", - populate: { - path: "user", - select: "firstName lastName email permissionLevel profileImage", - }, - select: "updatedAt", - }) - .then((events) => { - return events; - }) - .catch((error) => { - throw new Error(error.message); - }); + return await EventModel.find({ deletedAt: { $ne: null } }) + .populate({ + path: "createdBy", + select: "firstName lastName email permissionLevel profileImage", + }) + .populate({ + path: "updatedBy", + populate: { + path: "user", + select: "firstName lastName email permissionLevel profileImage", + }, + select: "updatedAt", + }) + .then((events) => { + return events; + }) + .catch((error) => { + throw new Error(error.message); + }); }; // Recover deleted events export const recoverDeletedEvent = async (eventId: string) => { - if (eventId) { - return UserModel.findById(eventId) - .then(async (event) => { - if (event) { - event.deletedAt = null; - event.deletedBy = null; + if (eventId) { + return UserModel.findById(eventId) + .then(async (event) => { + if (event) { + event.deletedAt = null; + event.deletedBy = null; - return event.save(); - } - }) - .catch((error) => { - throw new Error(error.message); - }); - } else { - throw new Error("Event ID not Passed"); - } + return event.save(); + } + }) + .catch((error) => { + throw new Error(error.message); + }); + } else { + throw new Error("Event ID not Passed"); + } }; // Delete event permanently export const deleteEventPermanently = async (eventId: string) => { - if (eventId) { - return UserModel.findByIdAndDelete(eventId); - } else { - throw new Error("Event ID not Passed"); - } + if (eventId) { + return UserModel.findByIdAndDelete(eventId); + } else { + throw new Error("Event ID not Passed"); + } }; diff --git a/src/api/services/ExecutiveBoard.service.ts b/src/api/services/ExecutiveBoard.service.ts index e9d50d4..d618eb8 100644 --- a/src/api/services/ExecutiveBoard.service.ts +++ b/src/api/services/ExecutiveBoard.service.ts @@ -1,56 +1,55 @@ -import { DocumentDefinition, FilterQuery, Schema } from "mongoose"; +import { DocumentDefinition, Schema } from "mongoose"; import { IExecutiveBoard, IBoardMember, IUpdatedBy } from "../../interfaces"; import ExecutiveBoardModel from "../models/ExecutiveBoard.model"; -import BoardMemberModel from "../models/BoardMember.model"; import { insertBoardMember } from "../services/BoardMember.service"; /** add a new executive board to the database */ export const insertExecutiveBoard = async (executiveBoardData: DocumentDefinition) => { - return await ExecutiveBoardModel.create(executiveBoardData) - .then(async (executiveBoard) => { - let initialUpdatedBy: IUpdatedBy = { - user: executiveBoard.createdBy, - updatedAt: new Date(), - }; - executiveBoard.updatedBy.push(initialUpdatedBy); - await executiveBoard.save(); - return executiveBoard; - }) - .catch((error) => { - throw new Error(error.message); - }); + return await ExecutiveBoardModel.create(executiveBoardData) + .then(async (executiveBoard) => { + const initialUpdatedBy: IUpdatedBy = { + user: executiveBoard.createdBy, + updatedAt: new Date(), + }; + executiveBoard.updatedBy.push(initialUpdatedBy); + await executiveBoard.save(); + return executiveBoard; + }) + .catch((error) => { + throw new Error(error.message); + }); }; /** get the executive board by ID from the database (the details of the existing board members should be populated) * @param executiveBoardId @type string */ export const getExecutiveBoardbyID = async (executiveBoardId: string) => { - return await ExecutiveBoardModel.findById(executiveBoardId) - .populate({ path: "board", match: { deletedAt: null } }) - .then(async (executiveBoard) => { - return executiveBoard; - }) - .catch((error) => { - throw new Error(error.message); - }); + return await ExecutiveBoardModel.findById(executiveBoardId) + .populate({ path: "board", match: { deletedAt: null } }) + .then(async (executiveBoard) => { + return executiveBoard; + }) + .catch((error) => { + throw new Error(error.message); + }); }; /** get all the executive boards from the database (the details of the existing board members should be populated) */ export const getExecutiveBoard = async () => { - return await ExecutiveBoardModel.find({ deletedAt: null }) - .populate({ - path: "board", - match: { deletedAt: null }, - }) - .then(async (executiveBoards) => { - return executiveBoards; - }) - .catch((error) => { - throw new Error(error.message); - }); + return await ExecutiveBoardModel.find({ deletedAt: null }) + .populate({ + path: "board", + match: { deletedAt: null }, + }) + .then(async (executiveBoards) => { + return executiveBoards; + }) + .catch((error) => { + throw new Error(error.message); + }); }; /** add members to executiveboard @@ -58,28 +57,28 @@ export const getExecutiveBoard = async () => { * @param insertData @type DocumentDefinition */ export const addBoardMember = async ( - executiveBoardId: string, - insertData: DocumentDefinition, - updatedBy: Schema.Types.ObjectId + executiveBoardId: string, + insertData: DocumentDefinition, + updatedBy: Schema.Types.ObjectId ) => { - return await insertBoardMember(insertData) - .then(async (createdBoardMember: IBoardMember) => { - const executiveBoard = await ExecutiveBoardModel.findById(executiveBoardId); - if (executiveBoard) { - executiveBoard.board.unshift(createdBoardMember); - const updateUserInfo: IUpdatedBy = { - user: updatedBy, - updatedAt: new Date(), - }; - executiveBoard.updatedBy.push(updateUserInfo); - return await executiveBoard.save(); - } else { - return null; - } - }) - .catch((error) => { - throw new Error(error.message); - }); + return await insertBoardMember(insertData) + .then(async (createdBoardMember: IBoardMember) => { + const executiveBoard = await ExecutiveBoardModel.findById(executiveBoardId); + if (executiveBoard) { + executiveBoard.board.unshift(createdBoardMember); + const updateUserInfo: IUpdatedBy = { + user: updatedBy, + updatedAt: new Date(), + }; + executiveBoard.updatedBy.push(updateUserInfo); + return await executiveBoard.save(); + } else { + return null; + } + }) + .catch((error) => { + throw new Error(error.message); + }); }; /** @@ -88,28 +87,28 @@ export const addBoardMember = async ( * @param updateData @type DocumentDefinition */ export const updateExecutiveBoardDetails = async ( - boardId: string, - updateData: DocumentDefinition, - updatedBy: Schema.Types.ObjectId + boardId: string, + updateData: DocumentDefinition, + updatedBy: Schema.Types.ObjectId ) => { - return await ExecutiveBoardModel.findById(boardId) - .then(async (executiveBoardDetails) => { - if (executiveBoardDetails) { - executiveBoardDetails.year = updateData.year; - const updateUserInfo: IUpdatedBy = { - user: updatedBy, - updatedAt: new Date(), - }; + return await ExecutiveBoardModel.findById(boardId) + .then(async (executiveBoardDetails) => { + if (executiveBoardDetails) { + executiveBoardDetails.year = updateData.year; + const updateUserInfo: IUpdatedBy = { + user: updatedBy, + updatedAt: new Date(), + }; - executiveBoardDetails.updatedBy.push(updateUserInfo); - return await executiveBoardDetails.save(); - } else { - return null; - } - }) - .catch((error) => { - throw new Error(error.message); - }); + executiveBoardDetails.updatedBy.push(updateUserInfo); + return await executiveBoardDetails.save(); + } else { + return null; + } + }) + .catch((error) => { + throw new Error(error.message); + }); }; /** delete members from executiveboard @@ -117,17 +116,17 @@ export const updateExecutiveBoardDetails = async ( * @param boardMemberId @type string */ export const deleteExecutiveBoardDetails = async (boardId: string, deletedBy: Schema.Types.ObjectId) => { - return await ExecutiveBoardModel.findById(boardId) - .then(async (executiveBoardDetails) => { - if (executiveBoardDetails && executiveBoardDetails.deletedAt === null) { - executiveBoardDetails.deletedAt = new Date(); - executiveBoardDetails.deletedBy = deletedBy; - return await executiveBoardDetails.save(); - } else { - return null; - } - }) - .catch((error) => { - throw new Error(error.message); - }); + return await ExecutiveBoardModel.findById(boardId) + .then(async (executiveBoardDetails) => { + if (executiveBoardDetails && executiveBoardDetails.deletedAt === null) { + executiveBoardDetails.deletedAt = new Date(); + executiveBoardDetails.deletedBy = deletedBy; + return await executiveBoardDetails.save(); + } else { + return null; + } + }) + .catch((error) => { + throw new Error(error.message); + }); }; diff --git a/src/api/services/Organization.service.ts b/src/api/services/Organization.service.ts index c87f76c..5de5978 100644 --- a/src/api/services/Organization.service.ts +++ b/src/api/services/Organization.service.ts @@ -1,87 +1,87 @@ import OrganizationModel from "../models/Organization.model"; -import { DocumentDefinition, FilterQuery, Schema } from "mongoose"; +import { DocumentDefinition, Schema } from "mongoose"; import { IOrganization, IUpdatedBy } from "../../interfaces"; // Insert the organization information export const createOrganization = async ( - organizationData: DocumentDefinition, - user: Schema.Types.ObjectId + organizationData: DocumentDefinition, + user: Schema.Types.ObjectId ) => { - return OrganizationModel.create(organizationData) - .then(async (organization) => { - let initialUpdatedBy: IUpdatedBy = { - user: user, - updatedAt: new Date(), - }; - organization.updatedBy.push(initialUpdatedBy); - return await organization.save(); - }) - .catch((error) => { - throw new Error(error.message); - }); + return OrganizationModel.create(organizationData) + .then(async (organization) => { + const initialUpdatedBy: IUpdatedBy = { + user: user, + updatedAt: new Date(), + }; + organization.updatedBy.push(initialUpdatedBy); + return await organization.save(); + }) + .catch((error) => { + throw new Error(error.message); + }); }; // Get organization information for dashboard export const getOrganizationInfo = async () => { - return OrganizationModel.findOne() - .select("name email phoneNumber address website university imagePath") - .then((organization) => { - return organization; - }) - .catch((error) => { - throw new Error(error.message); - }); + return OrganizationModel.findOne() + .select("name email phoneNumber address website university imagePath") + .then((organization) => { + return organization; + }) + .catch((error) => { + throw new Error(error.message); + }); }; // Get organization information for admin export const getOrganizationInfoForAdmin = async () => { - return OrganizationModel.findOne() - .populate({ - path: "updatedBy", - populate: { - path: "user", - select: "firstName lastName email permissionLevel profileImage", - }, - select: "updatedAt", - }) - .then((organization) => { - return organization; - }) - .catch((error) => { - throw new Error(error.message); - }); + return OrganizationModel.findOne() + .populate({ + path: "updatedBy", + populate: { + path: "user", + select: "firstName lastName email permissionLevel profileImage", + }, + select: "updatedAt", + }) + .then((organization) => { + return organization; + }) + .catch((error) => { + throw new Error(error.message); + }); }; // Update organization information export const updateOrganizationInfo = async ( - organizationId: string, - updateInfo: DocumentDefinition, - user: Schema.Types.ObjectId + organizationId: string, + updateInfo: DocumentDefinition, + user: Schema.Types.ObjectId ) => { - if (organizationId) { - return OrganizationModel.findById(organizationId) - .then(async (organization) => { - if (organization) { - if (updateInfo.name) organization.name = updateInfo.name; - if (updateInfo.email) organization.email = updateInfo.email; - if (updateInfo.phoneNumber) organization.phoneNumber = updateInfo.phoneNumber; - if (updateInfo.university) organization.university = updateInfo.university; - if (updateInfo.address) organization.address = updateInfo.address; - if (updateInfo.website) organization.website = updateInfo.website; - if (updateInfo.imagePath) organization.website = updateInfo.imagePath; + if (organizationId) { + return OrganizationModel.findById(organizationId) + .then(async (organization) => { + if (organization) { + if (updateInfo.name) organization.name = updateInfo.name; + if (updateInfo.email) organization.email = updateInfo.email; + if (updateInfo.phoneNumber) organization.phoneNumber = updateInfo.phoneNumber; + if (updateInfo.university) organization.university = updateInfo.university; + if (updateInfo.address) organization.address = updateInfo.address; + if (updateInfo.website) organization.website = updateInfo.website; + if (updateInfo.imagePath) organization.website = updateInfo.imagePath; - const updateUserInfo: IUpdatedBy = { - user: user, - updatedAt: new Date(), - }; - organization.updatedBy.push(updateUserInfo); - return await organization.save(); - } - }) - .catch((error) => { - throw new Error(error.message); - }); - } else { - throw new Error("Organization ID not Passed"); - } + const updateUserInfo: IUpdatedBy = { + user: user, + updatedAt: new Date(), + }; + organization.updatedBy.push(updateUserInfo); + return await organization.save(); + } + }) + .catch((error) => { + throw new Error(error.message); + }); + } else { + throw new Error("Organization ID not Passed"); + } }; diff --git a/src/api/services/TopSpeaker.service.ts b/src/api/services/TopSpeaker.service.ts index 44c91a4..c357462 100644 --- a/src/api/services/TopSpeaker.service.ts +++ b/src/api/services/TopSpeaker.service.ts @@ -1,23 +1,23 @@ -import { DocumentDefinition, FilterQuery, Schema } from "mongoose"; +import { DocumentDefinition, Schema } from "mongoose"; import { ITopSpeaker, IUpdatedBy } from "../../interfaces"; import TopSpeakerModel from "../models/TopSpeaker.model"; /** save a speaker in the database */ export const insertTopSpeaker = async (topSpeakerData: DocumentDefinition) => { - return await TopSpeakerModel.create(topSpeakerData) - .then(async (topSpeaker) => { - let initialUpdatedBy: IUpdatedBy = { - user: topSpeaker.createdBy, - updatedAt: new Date(), - }; - topSpeaker.updatedBy.push(initialUpdatedBy); - await topSpeaker.save(); - return topSpeaker; - }) - .catch((error) => { - throw new Error(error.message); - }); + return await TopSpeakerModel.create(topSpeakerData) + .then(async (topSpeaker) => { + const initialUpdatedBy: IUpdatedBy = { + user: topSpeaker.createdBy, + updatedAt: new Date(), + }; + topSpeaker.updatedBy.push(initialUpdatedBy); + await topSpeaker.save(); + return topSpeaker; + }) + .catch((error) => { + throw new Error(error.message); + }); }; /** @@ -25,30 +25,30 @@ export const insertTopSpeaker = async (topSpeakerData: DocumentDefinition { - return await TopSpeakerModel.findById(topSpeakerId) - .then((topSpeaker) => { - if (topSpeaker && topSpeaker.deletedAt == null) { - return topSpeaker; - } else { - throw new Error("Speaker is not found"); - } - }) - .catch((error) => { - throw new Error(error.message); - }); + return await TopSpeakerModel.findById(topSpeakerId) + .then((topSpeaker) => { + if (topSpeaker && topSpeaker.deletedAt == null) { + return topSpeaker; + } else { + throw new Error("Speaker is not found"); + } + }) + .catch((error) => { + throw new Error(error.message); + }); }; /** fetch all the TopSpeakers in the system */ export const getTopSpeakers = async () => { - return await TopSpeakerModel.aggregate([{ $match: { deletedAt: { $eq: null } } }]) - .then((topSpeakers) => { - return topSpeakers; - }) - .catch((error) => { - throw new Error(error.message); - }); + return await TopSpeakerModel.aggregate([{ $match: { deletedAt: { $eq: null } } }]) + .then((topSpeakers) => { + return topSpeakers; + }) + .catch((error) => { + throw new Error(error.message); + }); }; /** @@ -57,59 +57,59 @@ export const getTopSpeakers = async () => { * @param updateData @type DocumentDefinition */ export const updateTopSpeaker = async ( - topSpeakerId: string, - updateData: DocumentDefinition, - updatedBy: Schema.Types.ObjectId + topSpeakerId: string, + updateData: DocumentDefinition, + updatedBy: Schema.Types.ObjectId ) => { - return await TopSpeakerModel.findById(topSpeakerId) - .then(async (topSpeakerDetails) => { - if (topSpeakerDetails) { - if (updateData.title) { - topSpeakerDetails.title = updateData.title; - } + return await TopSpeakerModel.findById(topSpeakerId) + .then(async (topSpeakerDetails) => { + if (topSpeakerDetails) { + if (updateData.title) { + topSpeakerDetails.title = updateData.title; + } - if (updateData.description) { - topSpeakerDetails.description = updateData.description; - } + if (updateData.description) { + topSpeakerDetails.description = updateData.description; + } - if (updateData.imageUrl) { - topSpeakerDetails.imageUrl = updateData.imageUrl; - } + if (updateData.imageUrl) { + topSpeakerDetails.imageUrl = updateData.imageUrl; + } - if (updateData.socialMediaURLs && updateData.socialMediaURLs.facebook) { - topSpeakerDetails.socialMediaURLs.facebook = updateData.socialMediaURLs.facebook; - } + if (updateData.socialMediaURLs && updateData.socialMediaURLs.facebook) { + topSpeakerDetails.socialMediaURLs.facebook = updateData.socialMediaURLs.facebook; + } - if (updateData.socialMediaURLs && updateData.socialMediaURLs.instagram) { - topSpeakerDetails.socialMediaURLs.instagram = updateData.socialMediaURLs.instagram; - } + if (updateData.socialMediaURLs && updateData.socialMediaURLs.instagram) { + topSpeakerDetails.socialMediaURLs.instagram = updateData.socialMediaURLs.instagram; + } - if (updateData.socialMediaURLs && updateData.socialMediaURLs.linkedIn) { - topSpeakerDetails.socialMediaURLs.linkedIn = updateData.socialMediaURLs.linkedIn; - } + if (updateData.socialMediaURLs && updateData.socialMediaURLs.linkedIn) { + topSpeakerDetails.socialMediaURLs.linkedIn = updateData.socialMediaURLs.linkedIn; + } - if (updateData.socialMediaURLs && updateData.socialMediaURLs.twitter) { - topSpeakerDetails.socialMediaURLs.twitter = updateData.socialMediaURLs.twitter; - } + if (updateData.socialMediaURLs && updateData.socialMediaURLs.twitter) { + topSpeakerDetails.socialMediaURLs.twitter = updateData.socialMediaURLs.twitter; + } - if (updateData.socialMediaURLs && updateData.socialMediaURLs.web) { - topSpeakerDetails.socialMediaURLs.web = updateData.socialMediaURLs.web; - } + if (updateData.socialMediaURLs && updateData.socialMediaURLs.web) { + topSpeakerDetails.socialMediaURLs.web = updateData.socialMediaURLs.web; + } - const updateUserInfo: IUpdatedBy = { - user: updatedBy, - updatedAt: new Date(), - }; + const updateUserInfo: IUpdatedBy = { + user: updatedBy, + updatedAt: new Date(), + }; - topSpeakerDetails.updatedBy.push(updateUserInfo); - return await topSpeakerDetails.save(); - } else { - return null; - } - }) - .catch((error) => { - throw new Error(error.message); - }); + topSpeakerDetails.updatedBy.push(updateUserInfo); + return await topSpeakerDetails.save(); + } else { + return null; + } + }) + .catch((error) => { + throw new Error(error.message); + }); }; /** @@ -117,67 +117,67 @@ delete a past event * @param topSpeakerId @type string */ export const deleteTopSpeaker = async (topSpeakerId: string, deletedBy: Schema.Types.ObjectId) => { - return await TopSpeakerModel.findById(topSpeakerId) - .then(async (topSpeakerDetails) => { - if (topSpeakerDetails && topSpeakerDetails.deletedAt === null) { - topSpeakerDetails.deletedAt = new Date(); - topSpeakerDetails.deletedBy = deletedBy; - return await topSpeakerDetails.save(); - } else { - return null; - } - }) - .catch((error) => { - throw new Error(error.message); - }); + return await TopSpeakerModel.findById(topSpeakerId) + .then(async (topSpeakerDetails) => { + if (topSpeakerDetails && topSpeakerDetails.deletedAt === null) { + topSpeakerDetails.deletedAt = new Date(); + topSpeakerDetails.deletedBy = deletedBy; + return await topSpeakerDetails.save(); + } else { + return null; + } + }) + .catch((error) => { + throw new Error(error.message); + }); }; /** Get all top speakers - admin */ export const getAllTopSpeakersForAdmin = async () => { - return await TopSpeakerModel.find({ deletedAt: null }) - .populate({ - path: "createdBy", - select: "firstName lastName email permissionLevel profileImage", - }) - .populate({ - path: "updatedBy", - populate: { - path: "user", - select: "firstName lastName email permissionLevel profileImage", - }, - select: "updatedAt", - }) - .then((topSpeakers) => { - return topSpeakers; - }) - .catch((error) => { - throw new Error(error.message); - }); + return await TopSpeakerModel.find({ deletedAt: null }) + .populate({ + path: "createdBy", + select: "firstName lastName email permissionLevel profileImage", + }) + .populate({ + path: "updatedBy", + populate: { + path: "user", + select: "firstName lastName email permissionLevel profileImage", + }, + select: "updatedAt", + }) + .then((topSpeakers) => { + return topSpeakers; + }) + .catch((error) => { + throw new Error(error.message); + }); }; /** Get all deleted top speakers - admin */ export const getDeletedTopSpeakersForAdmin = async () => { - return await TopSpeakerModel.find({ deletedAt: { $ne: null } }) - .populate({ - path: "createdBy", - select: "firstName lastName email permissionLevel profileImage", - }) - .populate({ - path: "updatedBy", - populate: { - path: "user", - select: "firstName lastName email permissionLevel profileImage", - }, - select: "updatedAt", - }) - .then((topSpeakers) => { - return topSpeakers; - }) - .catch((error) => { - throw new Error(error.message); - }); + return await TopSpeakerModel.find({ deletedAt: { $ne: null } }) + .populate({ + path: "createdBy", + select: "firstName lastName email permissionLevel profileImage", + }) + .populate({ + path: "updatedBy", + populate: { + path: "user", + select: "firstName lastName email permissionLevel profileImage", + }, + select: "updatedAt", + }) + .then((topSpeakers) => { + return topSpeakers; + }) + .catch((error) => { + throw new Error(error.message); + }); }; diff --git a/src/api/services/User.service.ts b/src/api/services/User.service.ts index ab90f43..12fe889 100644 --- a/src/api/services/User.service.ts +++ b/src/api/services/User.service.ts @@ -1,42 +1,41 @@ import { DocumentDefinition, Schema } from "mongoose"; import { IUser, IUserRequest } from "../../interfaces"; import UserModel from "../models/User.model"; -import bcrypt from "bcrypt"; /** * @param {IUser} userData * @returns {Document} User document */ export const insertUser = async (userData: DocumentDefinition) => { - return await UserModel.create(userData) - .then(async (user) => { - await user.generateAuthToken(); - return user; - }) - .catch((error) => { - throw new Error(error.message); - }); + return await UserModel.create(userData) + .then(async (user) => { + await user.generateAuthToken(); + return user; + }) + .catch((error) => { + throw new Error(error.message); + }); }; export const authenticateUser = async (userName: string, password: string) => { - try { - return await UserModel.findByUsernamePassword(userName, password); - } catch (error: any) { - throw new Error(error.message); - } + try { + return await UserModel.findByUsernamePassword(userName, password); + } catch (error: any) { + throw new Error(error.message); + } }; /** *get all users */ export const getUsers = async () => { - return await UserModel.find({ deletedAt: null }) - .then((users) => { - return users; - }) - .catch((error) => { - throw new Error(error.message); - }); + return await UserModel.find({ deletedAt: null }) + .then((users) => { + return users; + }) + .catch((error) => { + throw new Error(error.message); + }); }; /** @@ -45,49 +44,49 @@ export const getUsers = async () => { * @param updateData @type DocumentDefinition */ export const updateUser = async (userId: string, updateData: DocumentDefinition) => { - return await UserModel.findById(userId) - .then(async (userDetails) => { - if (userDetails) { - if (userDetails.deletedAt === null) { - if (updateData.firstName) { - userDetails.firstName = updateData.firstName; - } - if (updateData.lastName) { - userDetails.lastName = updateData.lastName; - } - if (updateData.phoneNumber01) { - userDetails.phoneNumber01 = updateData.phoneNumber01; - } - if (updateData.phoneNumber02) { - userDetails.phoneNumber02 = updateData.phoneNumber02; - } - if (updateData.email) { - userDetails.email = updateData.email; - } - if (updateData.userName) { - userDetails.userName = updateData.userName; - } - if (updateData.password) { - userDetails.password = updateData.password; - } - if (updateData.profileImage) { - userDetails.profileImage = updateData.profileImage; - } - if (updateData.permissionLevel) { - userDetails.permissionLevel = updateData.permissionLevel; - } + return await UserModel.findById(userId) + .then(async (userDetails) => { + if (userDetails) { + if (userDetails.deletedAt === null) { + if (updateData.firstName) { + userDetails.firstName = updateData.firstName; + } + if (updateData.lastName) { + userDetails.lastName = updateData.lastName; + } + if (updateData.phoneNumber01) { + userDetails.phoneNumber01 = updateData.phoneNumber01; + } + if (updateData.phoneNumber02) { + userDetails.phoneNumber02 = updateData.phoneNumber02; + } + if (updateData.email) { + userDetails.email = updateData.email; + } + if (updateData.userName) { + userDetails.userName = updateData.userName; + } + if (updateData.password) { + userDetails.password = updateData.password; + } + if (updateData.profileImage) { + userDetails.profileImage = updateData.profileImage; + } + if (updateData.permissionLevel) { + userDetails.permissionLevel = updateData.permissionLevel; + } - return await userDetails.save(); - } else { - throw new Error("User is not found"); - } - } else { - throw new Error("User already removed"); - } - }) - .catch((error) => { - throw new Error(error.message); - }); + return await userDetails.save(); + } else { + throw new Error("User is not found"); + } + } else { + throw new Error("User already removed"); + } + }) + .catch((error) => { + throw new Error(error.message); + }); }; /** @@ -95,60 +94,60 @@ export const updateUser = async (userId: string, updateData: DocumentDefinition< * @param userId @type string */ export const deleteUser = async (userId: string, deletedBy: Schema.Types.ObjectId) => { - return await UserModel.findById(userId) - .then(async (userDetails) => { - if (userDetails && userDetails.deletedAt === null) { - userDetails.deletedAt = new Date(); - userDetails.deletedBy = deletedBy; - return await userDetails.save(); - } else { - const errorInfo = { - time: new Date(), - message: "User already removed", - }; - throw new Error(JSON.stringify(errorInfo)); - } - }) - .catch((error) => { - throw new Error(error.message); - }); + return await UserModel.findById(userId) + .then(async (userDetails) => { + if (userDetails && userDetails.deletedAt === null) { + userDetails.deletedAt = new Date(); + userDetails.deletedBy = deletedBy; + return await userDetails.save(); + } else { + const errorInfo = { + time: new Date(), + message: "User already removed", + }; + throw new Error(JSON.stringify(errorInfo)); + } + }) + .catch((error) => { + throw new Error(error.message); + }); }; export const recoverUser = async (userId: string) => { - return await UserModel.findById(userId) - .then(async (user) => { - if (user) { - user.deletedAt = null; - user.deletedBy = null; + return await UserModel.findById(userId) + .then(async (user) => { + if (user) { + user.deletedAt = null; + user.deletedBy = null; - return await user.save(); - } - }) - .catch((error) => { - const errorInfo = { - time: new Date(), - message: error.message, - }; - throw new Error(JSON.stringify(errorInfo)); - }); + return await user.save(); + } + }) + .catch((error) => { + const errorInfo = { + time: new Date(), + message: error.message, + }; + throw new Error(JSON.stringify(errorInfo)); + }); }; export const fetchDeletedUsers = async () => { - return await UserModel.find({ deletedAt: { $ne: null } }) - .then((users) => { - return users; - }) - .catch((error) => { - throw new Error(error.message); - }); + return await UserModel.find({ deletedAt: { $ne: null } }) + .then((users) => { + return users; + }) + .catch((error) => { + throw new Error(error.message); + }); }; export const deleteUserPermenently = async (userId: string) => { - return await UserModel.findByIdAndDelete(userId) - .then((user) => { - return user; - }) - .catch((error) => { - throw new Error(error.message); - }); + return await UserModel.findByIdAndDelete(userId) + .then((user) => { + return user; + }) + .catch((error) => { + throw new Error(error.message); + }); }; diff --git a/src/api/services/Webinar.service.ts b/src/api/services/Webinar.service.ts index c069291..b976493 100644 --- a/src/api/services/Webinar.service.ts +++ b/src/api/services/Webinar.service.ts @@ -1,4 +1,4 @@ -import { DocumentDefinition, FilterQuery, Schema } from "mongoose"; +import { DocumentDefinition, Schema } from "mongoose"; import { IWebinar, IUpdatedBy } from "../../interfaces"; import WebinarModel from "../models/Webinar.model"; /** @@ -7,19 +7,19 @@ import WebinarModel from "../models/Webinar.model"; * @returns {IWebinar} New webinar document */ export const insertWebinar = async (webinarData: DocumentDefinition) => { - return await WebinarModel.create(webinarData) - .then(async (webinar) => { - let initialUpdatedBy: IUpdatedBy = { - user: webinar.createdBy, - updatedAt: new Date(), - }; - webinar.updatedBy.push(initialUpdatedBy); - await webinar.save(); - return webinar; - }) - .catch((error) => { - throw new Error(error.message); - }); + return await WebinarModel.create(webinarData) + .then(async (webinar) => { + const initialUpdatedBy: IUpdatedBy = { + user: webinar.createdBy, + updatedAt: new Date(), + }; + webinar.updatedBy.push(initialUpdatedBy); + await webinar.save(); + return webinar; + }) + .catch((error) => { + throw new Error(error.message); + }); }; /** @@ -28,13 +28,13 @@ export const insertWebinar = async (webinarData: DocumentDefinition) = * @returns {IWebinar} Webinar document for relevant ID */ export const fetchWebinarById = async (webinarId: string) => { - return await WebinarModel.findById(webinarId) - .then((webinar) => { - return webinar; - }) - .catch((error) => { - throw new Error(error.message); - }); + return await WebinarModel.findById(webinarId) + .then((webinar) => { + return webinar; + }) + .catch((error) => { + throw new Error(error.message); + }); }; /** @@ -42,13 +42,13 @@ export const fetchWebinarById = async (webinarId: string) => { * @returns {IWebinar} All webinar documents in the database */ export const fetchWebinars = async () => { - return await WebinarModel.aggregate([{ $match: { deletedAt: { $eq: null } } }]) - .then((webinars) => { - return webinars; - }) - .catch((error) => { - throw new Error(error.message); - }); + return await WebinarModel.aggregate([{ $match: { deletedAt: { $eq: null } } }]) + .then((webinars) => { + return webinars; + }) + .catch((error) => { + throw new Error(error.message); + }); }; /** @@ -56,13 +56,13 @@ export const fetchWebinars = async () => { * @returns {IWebinar} All the past webinar documents in the database */ export const fetchPastWebinars = async () => { - return await WebinarModel.find({ webinarType: "PAST" }) - .then((webinars) => { - return webinars; - }) - .catch((error) => { - throw new Error(error.message); - }); + return await WebinarModel.find({ webinarType: "PAST" }) + .then((webinars) => { + return webinars; + }) + .catch((error) => { + throw new Error(error.message); + }); }; /** @@ -70,15 +70,15 @@ export const fetchPastWebinars = async () => { * @returns {IWebinar} All the upcoming webinar documents in the database */ export const fetchUpcomingWebinar = async () => { - return await WebinarModel.findOne({ webinarType: "UPCOMING" }) - .limit(1) - .sort({ $natural: -1 }) - .then((webinar) => { - return webinar; - }) - .catch((error) => { - throw new Error(error.message); - }); + return await WebinarModel.findOne({ webinarType: "UPCOMING" }) + .limit(1) + .sort({ $natural: -1 }) + .then((webinar) => { + return webinar; + }) + .catch((error) => { + throw new Error(error.message); + }); }; /** @@ -87,58 +87,58 @@ export const fetchUpcomingWebinar = async () => { * @param updateData @type DocumentDefinition */ export const updateWebinar = async ( - webinarId: string, - webinarData: DocumentDefinition, - updatedBy: Schema.Types.ObjectId + webinarId: string, + webinarData: DocumentDefinition, + updatedBy: Schema.Types.ObjectId ) => { - return await WebinarModel.findById(webinarId) - .then(async (webinarDetails) => { - if (webinarDetails) { - if (!webinarDetails.deletedAt) { - if (webinarData.title) { - webinarDetails.title = webinarData.title; - } + return await WebinarModel.findById(webinarId) + .then(async (webinarDetails) => { + if (webinarDetails) { + if (!webinarDetails.deletedAt) { + if (webinarData.title) { + webinarDetails.title = webinarData.title; + } - if (webinarData.description) { - webinarDetails.description = webinarData.description; - } + if (webinarData.description) { + webinarDetails.description = webinarData.description; + } - if (webinarData.imageUrl) { - webinarDetails.imageUrl = webinarData.imageUrl; - } + if (webinarData.imageUrl) { + webinarDetails.imageUrl = webinarData.imageUrl; + } - if (webinarData.dateTime) { - webinarDetails.dateTime = webinarData.dateTime; - } + if (webinarData.dateTime) { + webinarDetails.dateTime = webinarData.dateTime; + } - if (webinarData.tags) { - webinarDetails.tags = webinarData.tags; - } + if (webinarData.tags) { + webinarDetails.tags = webinarData.tags; + } - if (webinarData.link) { - webinarDetails.link = webinarData.link; - } + if (webinarData.link) { + webinarDetails.link = webinarData.link; + } - if (webinarData.registrationLink) { - webinarDetails.registrationLink = webinarData.registrationLink; - } + if (webinarData.registrationLink) { + webinarDetails.registrationLink = webinarData.registrationLink; + } - const updateUserInfo: IUpdatedBy = { - user: updatedBy, - updatedAt: new Date(), - }; - webinarDetails.updatedBy.push(updateUserInfo); - return await webinarDetails.save(); - } else { - throw new Error("Webinar is not found"); - } - } else { - return null; - } - }) - .catch((error) => { - throw new Error(error.message); - }); + const updateUserInfo: IUpdatedBy = { + user: updatedBy, + updatedAt: new Date(), + }; + webinarDetails.updatedBy.push(updateUserInfo); + return await webinarDetails.save(); + } else { + throw new Error("Webinar is not found"); + } + } else { + return null; + } + }) + .catch((error) => { + throw new Error(error.message); + }); }; /** @@ -146,61 +146,61 @@ export const updateWebinar = async ( * @param webinarId @type string */ export const removeWebinar = async (webinarId: string, deletedBy: Schema.Types.ObjectId) => { - return await WebinarModel.findById(webinarId) - .then(async (webinarDetails) => { - if (webinarDetails && webinarDetails.deletedAt === null) { - webinarDetails.deletedAt = new Date(); - webinarDetails.deletedBy = deletedBy; - return await webinarDetails.save(); - } else { - return "Webinar not found"; - } - }) - .catch((error) => { - throw new Error(error.message); - }); + return await WebinarModel.findById(webinarId) + .then(async (webinarDetails) => { + if (webinarDetails && webinarDetails.deletedAt === null) { + webinarDetails.deletedAt = new Date(); + webinarDetails.deletedBy = deletedBy; + return await webinarDetails.save(); + } else { + return "Webinar not found"; + } + }) + .catch((error) => { + throw new Error(error.message); + }); }; export const getAllWebinarsForAdmin = async () => { - return await WebinarModel.find({ deletedAt: null }) - .populate({ - path: "createdBy", - select: "firstName lastName email permissionLevel profileImage", - }) - .populate({ - path: "updatedBy", - populate: { - path: "user", - select: "firstName lastName email permissionLevel profileImage", - }, - select: "updatedAt", - }) - .then((webinars) => { - return webinars; - }) - .catch((error) => { - throw new Error(error.message); - }); + return await WebinarModel.find({ deletedAt: null }) + .populate({ + path: "createdBy", + select: "firstName lastName email permissionLevel profileImage", + }) + .populate({ + path: "updatedBy", + populate: { + path: "user", + select: "firstName lastName email permissionLevel profileImage", + }, + select: "updatedAt", + }) + .then((webinars) => { + return webinars; + }) + .catch((error) => { + throw new Error(error.message); + }); }; export const getDeletedWebinarsForAdmin = async () => { - return await WebinarModel.find({ deletedAt: { $ne: null } }) - .populate({ - path: "createdBy", - select: "firstName lastName email permissionLevel profileImage", - }) - .populate({ - path: "updatedBy", - populate: { - path: "user", - select: "firstName lastName email permissionLevel profileImage", - }, - select: "updatedAt", - }) - .then((webinars) => { - return webinars; - }) - .catch((error) => { - throw new Error(error.message); - }); + return await WebinarModel.find({ deletedAt: { $ne: null } }) + .populate({ + path: "createdBy", + select: "firstName lastName email permissionLevel profileImage", + }) + .populate({ + path: "updatedBy", + populate: { + path: "user", + select: "firstName lastName email permissionLevel profileImage", + }, + select: "updatedAt", + }) + .then((webinars) => { + return webinars; + }) + .catch((error) => { + throw new Error(error.message); + }); }; diff --git a/src/api/services/index.ts b/src/api/services/index.ts index e3e35c3..b9796b9 100644 --- a/src/api/services/index.ts +++ b/src/api/services/index.ts @@ -1,163 +1,162 @@ import { - insertUser, - authenticateUser, - getUsers, - updateUser, - deleteUser, - deleteUserPermenently, - recoverUser, - fetchDeletedUsers, + insertUser, + authenticateUser, + getUsers, + updateUser, + deleteUser, + deleteUserPermenently, + recoverUser, + fetchDeletedUsers, } from "./User.service"; import { insertContact, archiveContact, fetchContactInfo } from "./Contact.service"; import { - insertEvent, - getEvent, - getEvents, - getPastEvents, - getUpcomingEvent, - updateEvent, - deleteEvent, - getAllEventsForAdmin, - getDeletedEventsForAdmin, - recoverDeletedEvent, - deleteEventPermanently, + insertEvent, + getEvent, + getEvents, + getPastEvents, + getUpcomingEvent, + updateEvent, + deleteEvent, + getAllEventsForAdmin, + getDeletedEventsForAdmin, + recoverDeletedEvent, + deleteEventPermanently, } from "./Event.service"; import { - insertWebinar, - fetchWebinarById, - fetchWebinars, - fetchPastWebinars, - fetchUpcomingWebinar, - updateWebinar, - removeWebinar, - getAllWebinarsForAdmin, - getDeletedWebinarsForAdmin, + insertWebinar, + fetchWebinarById, + fetchWebinars, + fetchPastWebinars, + fetchUpcomingWebinar, + updateWebinar, + removeWebinar, + getAllWebinarsForAdmin, + getDeletedWebinarsForAdmin, } from "./Webinar.service"; import { - insertTopSpeaker, - getTopSpeaker, - getTopSpeakers, - updateTopSpeaker, - deleteTopSpeaker, - getAllTopSpeakersForAdmin, - getDeletedTopSpeakersForAdmin, + insertTopSpeaker, + getTopSpeaker, + getTopSpeakers, + updateTopSpeaker, + deleteTopSpeaker, + getAllTopSpeakersForAdmin, + getDeletedTopSpeakersForAdmin, } from "./TopSpeaker.service"; import { - addApplication, - fetchApplicationById, - fetchApplications, - archiveApplication, - changeApplicationStatusIntoInterview, - changeApplicationStatusIntoSelected, - changeApplicationStatusIntoRejected, - fetchPendingApplications, - fetchInterviewApplications, - fetchSelectedApplications, - fetchRejectedApplications, - + addApplication, + fetchApplicationById, + fetchApplications, + archiveApplication, + changeApplicationStatusIntoInterview, + changeApplicationStatusIntoSelected, + changeApplicationStatusIntoRejected, + fetchPendingApplications, + fetchInterviewApplications, + fetchSelectedApplications, + fetchRejectedApplications, } from "./Application.service"; import { - insertBoardMember, - getBoardMemberbyID, - getAllBoardMembers, - updateBoardMemberDetails, - deleteBoardMemberDetails, + insertBoardMember, + getBoardMemberbyID, + getAllBoardMembers, + updateBoardMemberDetails, + deleteBoardMemberDetails, } from "./BoardMember.service"; import { - insertExecutiveBoard, - getExecutiveBoardbyID, - getExecutiveBoard, - addBoardMember, - updateExecutiveBoardDetails, - deleteExecutiveBoardDetails, + insertExecutiveBoard, + getExecutiveBoardbyID, + getExecutiveBoard, + addBoardMember, + updateExecutiveBoardDetails, + deleteExecutiveBoardDetails, } from "./ExecutiveBoard.service"; import { - createOrganization, - getOrganizationInfo, - getOrganizationInfoForAdmin, - updateOrganizationInfo, + createOrganization, + getOrganizationInfo, + getOrganizationInfoForAdmin, + updateOrganizationInfo, } from "./Organization.service"; export default { - // User services - insertUser, - authenticateUser, - getUsers, - updateUser, - deleteUser, - deleteUserPermenently, - recoverUser, - fetchDeletedUsers, - // Contact services - insertContact, - fetchContactInfo, - archiveContact, - // Event services - insertEvent, - getEvent, - getEvents, - getPastEvents, - getUpcomingEvent, - updateEvent, - deleteEvent, - getAllEventsForAdmin, - getDeletedEventsForAdmin, - recoverDeletedEvent, - deleteEventPermanently, - // Webinar services - insertWebinar, - fetchWebinarById, - fetchWebinars, - fetchPastWebinars, - fetchUpcomingWebinar, - updateWebinar, - removeWebinar, - getAllWebinarsForAdmin, - getDeletedWebinarsForAdmin, - // TopSpeaker Service - insertTopSpeaker, - getTopSpeaker, - getTopSpeakers, - updateTopSpeaker, - deleteTopSpeaker, - getAllTopSpeakersForAdmin, - getDeletedTopSpeakersForAdmin, - // Application Service - addApplication, - fetchApplicationById, - fetchApplications, - archiveApplication, - changeApplicationStatusIntoInterview, - changeApplicationStatusIntoSelected, - changeApplicationStatusIntoRejected, - fetchPendingApplications, - fetchInterviewApplications, - fetchSelectedApplications, - fetchRejectedApplications, - // BoardMember Service - insertBoardMember, - getBoardMemberbyID, - getAllBoardMembers, - updateBoardMemberDetails, - deleteBoardMemberDetails, - // ExecutiveBoardMember Service - insertExecutiveBoard, - getExecutiveBoardbyID, - getExecutiveBoard, - addBoardMember, - updateExecutiveBoardDetails, - deleteExecutiveBoardDetails, - // Organization Service - createOrganization, - getOrganizationInfo, - getOrganizationInfoForAdmin, - updateOrganizationInfo, + // User services + insertUser, + authenticateUser, + getUsers, + updateUser, + deleteUser, + deleteUserPermenently, + recoverUser, + fetchDeletedUsers, + // Contact services + insertContact, + fetchContactInfo, + archiveContact, + // Event services + insertEvent, + getEvent, + getEvents, + getPastEvents, + getUpcomingEvent, + updateEvent, + deleteEvent, + getAllEventsForAdmin, + getDeletedEventsForAdmin, + recoverDeletedEvent, + deleteEventPermanently, + // Webinar services + insertWebinar, + fetchWebinarById, + fetchWebinars, + fetchPastWebinars, + fetchUpcomingWebinar, + updateWebinar, + removeWebinar, + getAllWebinarsForAdmin, + getDeletedWebinarsForAdmin, + // TopSpeaker Service + insertTopSpeaker, + getTopSpeaker, + getTopSpeakers, + updateTopSpeaker, + deleteTopSpeaker, + getAllTopSpeakersForAdmin, + getDeletedTopSpeakersForAdmin, + // Application Service + addApplication, + fetchApplicationById, + fetchApplications, + archiveApplication, + changeApplicationStatusIntoInterview, + changeApplicationStatusIntoSelected, + changeApplicationStatusIntoRejected, + fetchPendingApplications, + fetchInterviewApplications, + fetchSelectedApplications, + fetchRejectedApplications, + // BoardMember Service + insertBoardMember, + getBoardMemberbyID, + getAllBoardMembers, + updateBoardMemberDetails, + deleteBoardMemberDetails, + // ExecutiveBoardMember Service + insertExecutiveBoard, + getExecutiveBoardbyID, + getExecutiveBoard, + addBoardMember, + updateExecutiveBoardDetails, + deleteExecutiveBoardDetails, + // Organization Service + createOrganization, + getOrganizationInfo, + getOrganizationInfoForAdmin, + updateOrganizationInfo, }; diff --git a/src/app.ts b/src/app.ts index 955192b..4ab96bd 100644 --- a/src/app.ts +++ b/src/app.ts @@ -1,4 +1,4 @@ -require("dotenv").config(); +import dotenv from "dotenv"; import express, { Express, Request, Response, NextFunction } from "express"; import cors from "cors"; import logger from "./util/logger"; @@ -7,12 +7,9 @@ import routes from "./api/routes"; import { configs } from "./config"; import connect from "./util/database.connection"; import amqp from "amqplib"; -import { createChannel } from "./util/queue.config"; +dotenv.config(); export const app: Express = express(); -const channel = createChannel().then((channelData) => { - return channelData; -}); const PORT: string = configs.port; const ENVIRONMENT = configs.environment; const MONGO_URI = configs.mongodb.uri; @@ -24,52 +21,51 @@ app.use(express.urlencoded({ extended: true })); // Inject Response Handler app.use((req: Request, res: Response, next: NextFunction) => { - req.handleResponse = responseHandler; - next(); + req.handleResponse = responseHandler; + next(); }); // Create and Inject the message queue app.use((req: Request, res: Response, next: NextFunction) => { - try { - // Create the channel - amqp - .connect(configs.queue.messageBrokerURL) - .then((connection) => { - connection - .createChannel() - .then((channel) => { - channel.assertExchange(configs.queue.exchangeName, "direct", { durable: false }); + try { + // Create the channel + amqp + .connect(configs.queue.messageBrokerURL) + .then((connection) => { + connection + .createChannel() + .then((channel) => { + channel.assertExchange(configs.queue.exchangeName, "direct", { durable: false }); - // Add channel as request property - console.log("Test", req.channel); - req.channel = channel; - next(); - }) - .catch((channelError) => { - logger.error(`Channel Error: ${channelError.message}`); - }); - }) - .catch((connectionError: any) => { - logger.error(`Connection Error: ${connectionError.message}`); - }); - } catch (error: any) { - console.log("Error"); - logger.error(error.message); - } + // Add channel as request property + req.channel = channel; + next(); + }) + .catch((channelError) => { + logger.error(`Channel Error: ${channelError.message}`); + }); + }) + .catch((connectionError: any) => { + logger.error(`Connection Error: ${connectionError.message}`); + }); + } catch (error: any) { + logger.error(error.message); + } }); // Root API Call app.get("/", (req: Request, res: Response, next: NextFunction) => { - res.send("

MS CLUB SLIIT Web API

"); + res.send("

MS CLUB SLIIT Web API

"); + next(); }); // Start the Server app.listen(PORT, () => { - logger.info(`Starting on ${ENVIRONMENT} Environment`); - logger.info(MONGO_URI); - // Connect to Database - connect(); - // Inject Routes - routes(app); - logger.info(`API Server up and running on PORT ${PORT}`); + logger.info(`Starting on ${ENVIRONMENT} Environment`); + logger.info(MONGO_URI); + // Connect to Database + connect(); + // Inject Routes + routes(app); + logger.info(`API Server up and running on PORT ${PORT}`); }); diff --git a/src/config/index.ts b/src/config/index.ts index e2fc310..ee5703e 100644 --- a/src/config/index.ts +++ b/src/config/index.ts @@ -3,97 +3,97 @@ let configs: IConfig; const environment = process.env.NODE_ENV?.trim() as string; if (environment == "Development") { - configs = { - ip: process.env.IP || "localhost", - port: (process.env.PORT as string) || "8087", - environment: process.env.DEV_ENVIRONMENT as string, - mongodb: { - uri: process.env.DEV_MONGO_URI as string, - }, - auth: { - secret: process.env.DEV_JWT_SECRET as string, - }, - email: { - host: process.env.EMAIL_HOST as string, - port: process.env.EMAIL_PORT as string, - secure: true, - pool: true, - secureConnection: true, - auth: { - user: process.env.EMAIL_AUTH_USER as string, - pass: process.env.EMAIL_AUTH_PASSWORD as string, - }, - tls: { - rejectUnauthorized: false, - }, - sendGrid: { - user: process.env.EMAIL_SENDGRID_USER as string, - apiKey: process.env.SENDGRID_API_KEY as string, - }, - }, - firebase: { - projectId: process.env.STORAGE_PROJECT_ID as string, - clientEmail: process.env.STORAGE_CLIENT_EMAIL as string, - privateKey: process.env.STORAGE_PRIVATE_KEY as string, - storageBucket: process.env.STORAGE_BUCKET_URL as string, - bucketName: process.env.BUCKET_NAME as string, - applicationImageBucket: process.env.APPLICATION_IMAGES_BUCKET as string, - emailTemplateBucket: process.env.EMAIL_TEMPLATE_BUCKET as string, - }, - queue: { - messageBrokerURL: process.env.DEV_MESSAGE_BROKER_URL as string, - exchangeName: process.env.EXCHANGE_NAME as string, - emailService: process.env.EMAIL_SERVICE_NAME as string, - emailQueue: process.env.EMAIL_QUEUE_NAME as string, - }, - }; + configs = { + ip: process.env.IP || "localhost", + port: (process.env.PORT as string) || "8087", + environment: process.env.DEV_ENVIRONMENT as string, + mongodb: { + uri: process.env.DEV_MONGO_URI as string, + }, + auth: { + secret: process.env.DEV_JWT_SECRET as string, + }, + email: { + host: process.env.EMAIL_HOST as string, + port: process.env.EMAIL_PORT as string, + secure: true, + pool: true, + secureConnection: true, + auth: { + user: process.env.EMAIL_AUTH_USER as string, + pass: process.env.EMAIL_AUTH_PASSWORD as string, + }, + tls: { + rejectUnauthorized: false, + }, + sendGrid: { + user: process.env.EMAIL_SENDGRID_USER as string, + apiKey: process.env.SENDGRID_API_KEY as string, + }, + }, + firebase: { + projectId: process.env.STORAGE_PROJECT_ID as string, + clientEmail: process.env.STORAGE_CLIENT_EMAIL as string, + privateKey: process.env.STORAGE_PRIVATE_KEY as string, + storageBucket: process.env.STORAGE_BUCKET_URL as string, + bucketName: process.env.BUCKET_NAME as string, + applicationImageBucket: process.env.APPLICATION_IMAGES_BUCKET as string, + emailTemplateBucket: process.env.EMAIL_TEMPLATE_BUCKET as string, + }, + queue: { + messageBrokerURL: process.env.DEV_MESSAGE_BROKER_URL as string, + exchangeName: process.env.EXCHANGE_NAME as string, + emailService: process.env.EMAIL_SERVICE_NAME as string, + emailQueue: process.env.EMAIL_QUEUE_NAME as string, + }, + }; } if (environment == "Production") { - configs = { - ip: process.env.IP || "localhost", - port: (process.env.PORT as string) || "8087", - environment: process.env.PROD_ENVIRONMENT as string, - mongodb: { - uri: process.env.PROD_MONGO_URI as string, - }, - auth: { - secret: process.env.PROD_JWT_SECRET as string, - }, - email: { - host: process.env.EMAIL_HOST as string, - port: process.env.EMAIL_PORT as string, - secure: true, - pool: true, - secureConnection: true, - auth: { - user: process.env.EMAIL_AUTH_USER as string, - pass: process.env.EMAIL_AUTH_PASSWORD as string, - }, - tls: { - rejectUnauthorized: false, - }, - sendGrid: { - user: process.env.EMAIL_SENDGRID_USER as string, - apiKey: process.env.SENDGRID_API_KEY as string, - }, - }, - firebase: { - projectId: process.env.PROJECT_ID as string, - clientEmail: process.env.STORAGE_CLIENT_EMAIL as string, - privateKey: process.env.STORAGE_PRIVATE_KEY as string, - storageBucket: process.env.STORAGE_BUCKET_URL as string, - bucketName: process.env.BUCKET_NAME as string, - applicationImageBucket: process.env.APPLICATION_IMAGES_BUCKET as string, - emailTemplateBucket: process.env.EMAIL_TEMPLATE_BUCKET as string, - }, - queue: { - messageBrokerURL: process.env.PROD_MESSAGE_BROKER_URL as string, - exchangeName: process.env.EXCHANGE_NAME as string, - emailService: process.env.EMAIL_SERVICE_NAME as string, - emailQueue: process.env.EMAIL_QUEUE_NAME as string, - }, - }; + configs = { + ip: process.env.IP || "localhost", + port: (process.env.PORT as string) || "8087", + environment: process.env.PROD_ENVIRONMENT as string, + mongodb: { + uri: process.env.PROD_MONGO_URI as string, + }, + auth: { + secret: process.env.PROD_JWT_SECRET as string, + }, + email: { + host: process.env.EMAIL_HOST as string, + port: process.env.EMAIL_PORT as string, + secure: true, + pool: true, + secureConnection: true, + auth: { + user: process.env.EMAIL_AUTH_USER as string, + pass: process.env.EMAIL_AUTH_PASSWORD as string, + }, + tls: { + rejectUnauthorized: false, + }, + sendGrid: { + user: process.env.EMAIL_SENDGRID_USER as string, + apiKey: process.env.SENDGRID_API_KEY as string, + }, + }, + firebase: { + projectId: process.env.PROJECT_ID as string, + clientEmail: process.env.STORAGE_CLIENT_EMAIL as string, + privateKey: process.env.STORAGE_PRIVATE_KEY as string, + storageBucket: process.env.STORAGE_BUCKET_URL as string, + bucketName: process.env.BUCKET_NAME as string, + applicationImageBucket: process.env.APPLICATION_IMAGES_BUCKET as string, + emailTemplateBucket: process.env.EMAIL_TEMPLATE_BUCKET as string, + }, + queue: { + messageBrokerURL: process.env.PROD_MESSAGE_BROKER_URL as string, + exchangeName: process.env.EXCHANGE_NAME as string, + emailService: process.env.EMAIL_SERVICE_NAME as string, + emailQueue: process.env.EMAIL_QUEUE_NAME as string, + }, + }; } export { configs }; diff --git a/src/config/storage.config.ts b/src/config/storage.config.ts index 44f6635..7d0ef4d 100644 --- a/src/config/storage.config.ts +++ b/src/config/storage.config.ts @@ -2,11 +2,11 @@ import { Storage } from "@google-cloud/storage"; import { configs } from "."; const storage = new Storage({ - projectId: "ms-storage-server-fb22b", - credentials: { - client_email: configs.firebase.clientEmail, - private_key: configs.firebase.privateKey.replace(/\\n/gm, "\n"), - }, + projectId: "ms-storage-server-fb22b", + credentials: { + client_email: configs.firebase.clientEmail, + private_key: configs.firebase.privateKey.replace(/\\n/gm, "\n"), + }, }); const bucketName = configs.firebase.bucketName; diff --git a/src/interfaces/IApplication.ts b/src/interfaces/IApplication.ts index dfdb694..d27bbc4 100644 --- a/src/interfaces/IApplication.ts +++ b/src/interfaces/IApplication.ts @@ -1,23 +1,23 @@ -import { Document } from 'mongoose'; +import { Document } from "mongoose"; interface IApplication extends Document { - studentId : string; - name : string; - email : string - contactNumber : string; - currentAcademicYear : string; - selfIntroduction : string; - reasonForJoin : string; - linkedIn : string; - gitHub : string; - blog ?: string; - experiences ?: string; - challenges ?: string; - goal : string; - skillsAndTalents : string[]; - pastWork ?: string; - deletedAt ?: Date; - status : string; -}; + studentId: string; + name: string; + email: string; + contactNumber: string; + currentAcademicYear: string; + selfIntroduction: string; + reasonForJoin: string; + linkedIn: string; + gitHub: string; + blog?: string; + experiences?: string; + challenges?: string; + goal: string; + skillsAndTalents: string[]; + pastWork?: string; + deletedAt?: Date; + status: string; +} -export type { IApplication }; \ No newline at end of file +export type { IApplication }; diff --git a/src/interfaces/IBoardMember.ts b/src/interfaces/IBoardMember.ts index 7c7a842..95615d7 100644 --- a/src/interfaces/IBoardMember.ts +++ b/src/interfaces/IBoardMember.ts @@ -1,26 +1,26 @@ import { Document, Schema } from "mongoose"; interface IUpdatedBy { - user: Schema.Types.ObjectId; - updatedAt: Date; + user: Schema.Types.ObjectId; + updatedAt: Date; } interface IBoardMember extends Document { - name: string; - position: string; - imageUrl?: string; - socialMedia: ISocialMedia; - deletedAt?: Date; - createdBy: Schema.Types.ObjectId; - updatedBy: IUpdatedBy[]; - deletedBy?: Schema.Types.ObjectId; + name: string; + position: string; + imageUrl?: string; + socialMedia: ISocialMedia; + deletedAt?: Date; + createdBy: Schema.Types.ObjectId; + updatedBy: IUpdatedBy[]; + deletedBy?: Schema.Types.ObjectId; } interface ISocialMedia { - facebook: string; - instagram: string; - twitter: string; - linkedIn: string; + facebook: string; + instagram: string; + twitter: string; + linkedIn: string; } export type { IBoardMember }; diff --git a/src/interfaces/IConfig.ts b/src/interfaces/IConfig.ts index 9b5b15c..7c040b9 100644 --- a/src/interfaces/IConfig.ts +++ b/src/interfaces/IConfig.ts @@ -1,46 +1,46 @@ interface IConfig { - ip: string; - port: string; - environment: string; - mongodb: { - uri: string; - }; - auth: { - secret: string; - }; - email: { - host: string; - port: string; - secure: boolean; - pool: boolean; - secureConnection: boolean; - auth: { - user: string; - pass: string; - }; - tls: { - rejectUnauthorized: boolean; - }; - sendGrid: { - user: string; - apiKey: string; - }; - }; - firebase: { - projectId: string; - clientEmail: string; - privateKey: string; - storageBucket: string; - emailTemplateBucket: string; - applicationImageBucket: string; - bucketName: string; - }; - queue: { - messageBrokerURL: string; - exchangeName: string; - emailQueue: string; - emailService: string; - }; + ip: string; + port: string; + environment: string; + mongodb: { + uri: string; + }; + auth: { + secret: string; + }; + email: { + host: string; + port: string; + secure: boolean; + pool: boolean; + secureConnection: boolean; + auth: { + user: string; + pass: string; + }; + tls: { + rejectUnauthorized: boolean; + }; + sendGrid: { + user: string; + apiKey: string; + }; + }; + firebase: { + projectId: string; + clientEmail: string; + privateKey: string; + storageBucket: string; + emailTemplateBucket: string; + applicationImageBucket: string; + bucketName: string; + }; + queue: { + messageBrokerURL: string; + exchangeName: string; + emailQueue: string; + emailService: string; + }; } export type { IConfig }; diff --git a/src/interfaces/IContact.ts b/src/interfaces/IContact.ts index bc3fd4e..62f2e4d 100644 --- a/src/interfaces/IContact.ts +++ b/src/interfaces/IContact.ts @@ -1,12 +1,12 @@ -import { Document } from 'mongoose'; +import { Document } from "mongoose"; interface IContact extends Document { - name: string; - email: string; - message: string; - createdAt: Date; - updatedAt: Date; - deletedAt?: Date; + name: string; + email: string; + message: string; + createdAt: Date; + updatedAt: Date; + deletedAt?: Date; } -export type { IContact }; \ No newline at end of file +export type { IContact }; diff --git a/src/interfaces/IEvent.ts b/src/interfaces/IEvent.ts index 3e3306a..e584650 100644 --- a/src/interfaces/IEvent.ts +++ b/src/interfaces/IEvent.ts @@ -1,25 +1,25 @@ import { Document, Schema } from "mongoose"; interface IUpdatedBy { - user: Schema.Types.ObjectId; - updatedAt: Date; + user: Schema.Types.ObjectId; + updatedAt: Date; } interface IEvent extends Document { - title: string; - description: string; - imageUrl: string; - dateTime: Date; - tags?: string[]; - link?: string; - registrationLink?: string; - eventType: string; - createdAt: Date; - updatedAt: Date; - deletedAt?: null | Date | string; - createdBy: Schema.Types.ObjectId; - updatedBy: IUpdatedBy[]; - deletedBy?: Schema.Types.ObjectId; + title: string; + description: string; + imageUrl: string; + dateTime: Date; + tags?: string[]; + link?: string; + registrationLink?: string; + eventType: string; + createdAt: Date; + updatedAt: Date; + deletedAt?: null | Date | string; + createdBy: Schema.Types.ObjectId; + updatedBy: IUpdatedBy[]; + deletedBy?: Schema.Types.ObjectId; } export type { IEvent, IUpdatedBy }; diff --git a/src/interfaces/IExecutiveBoard.ts b/src/interfaces/IExecutiveBoard.ts index eef30e9..fd67919 100644 --- a/src/interfaces/IExecutiveBoard.ts +++ b/src/interfaces/IExecutiveBoard.ts @@ -1,17 +1,17 @@ -import { Document,Schema } from "mongoose"; +import { Document, Schema } from "mongoose"; import { IBoardMember } from "./IBoardMember"; interface IUpdatedBy { - user: Schema.Types.ObjectId; - updatedAt: Date; + user: Schema.Types.ObjectId; + updatedAt: Date; } interface IExecutiveBoard extends Document { - year: string; - board: IBoardMember[]; - deletedAt?: Date; - createdBy: Schema.Types.ObjectId; - updatedBy: IUpdatedBy[]; - deletedBy?: Schema.Types.ObjectId; + year: string; + board: IBoardMember[]; + deletedAt?: Date; + createdBy: Schema.Types.ObjectId; + updatedBy: IUpdatedBy[]; + deletedBy?: Schema.Types.ObjectId; } export type { IExecutiveBoard }; diff --git a/src/interfaces/IInterview.ts b/src/interfaces/IInterview.ts index 980c010..a633b30 100644 --- a/src/interfaces/IInterview.ts +++ b/src/interfaces/IInterview.ts @@ -1,10 +1,10 @@ -import { Document } from 'mongoose'; +import { Document } from "mongoose"; interface IInterview extends Document { - date : string; - time : string; - duration : string - format : string -}; + date: string; + time: string; + duration: string; + format: string; +} -export type { IInterview }; \ No newline at end of file +export type { IInterview }; diff --git a/src/interfaces/IOrganization.ts b/src/interfaces/IOrganization.ts index cadb50a..03b58a3 100644 --- a/src/interfaces/IOrganization.ts +++ b/src/interfaces/IOrganization.ts @@ -1,14 +1,14 @@ import { IUpdatedBy } from "."; interface IOrganization { - name: string; - email: string; - phoneNumber?: string | null; - university: string | null; - address: string | null; - website: string | null; - updatedBy: IUpdatedBy[]; - imagePath: string; + name: string; + email: string; + phoneNumber?: string | null; + university: string | null; + address: string | null; + website: string | null; + updatedBy: IUpdatedBy[]; + imagePath: string; } export type { IOrganization }; diff --git a/src/interfaces/ITopSpeaker.ts b/src/interfaces/ITopSpeaker.ts index f5b215c..0b73416 100644 --- a/src/interfaces/ITopSpeaker.ts +++ b/src/interfaces/ITopSpeaker.ts @@ -1,27 +1,27 @@ -import { Document,Schema } from 'mongoose'; +import { Document, Schema } from "mongoose"; interface IUpdatedBy { - user: Schema.Types.ObjectId; - updatedAt: Date; + user: Schema.Types.ObjectId; + updatedAt: Date; } interface ITopSpeaker extends Document { - imageUrl?: string; - title: string; - description: string; - socialMediaURLs: ITopSpeakerMedia; - deletedAt?: Date; - createdBy: Schema.Types.ObjectId; - updatedBy: IUpdatedBy[]; - deletedBy?: Schema.Types.ObjectId; + imageUrl?: string; + title: string; + description: string; + socialMediaURLs: ITopSpeakerMedia; + deletedAt?: Date; + createdBy: Schema.Types.ObjectId; + updatedBy: IUpdatedBy[]; + deletedBy?: Schema.Types.ObjectId; } interface ITopSpeakerMedia { - facebook: string; - instagram: string; - twitter: string; - linkedIn: string; - web: string; + facebook: string; + instagram: string; + twitter: string; + linkedIn: string; + web: string; } export type { ITopSpeaker }; diff --git a/src/interfaces/IUser.ts b/src/interfaces/IUser.ts index 45f811f..afb3f40 100644 --- a/src/interfaces/IUser.ts +++ b/src/interfaces/IUser.ts @@ -1,41 +1,42 @@ import { Document, Model, Schema } from "mongoose"; interface IUserRequest { - firstName: string; - lastName: string; - email: string; - phoneNumber01: string; - phoneNumber02: string; - userName: string; - password: string; - profileImage?: any; - authToken?: string; - permissionLevel: string; + firstName: string; + lastName: string; + email: string; + phoneNumber01: string; + phoneNumber02: string; + userName: string; + password: string; + profileImage?: any; + authToken?: string; + permissionLevel: string; } interface IUserDocument extends Document { - firstName: string; - lastName: string; - email: string; - phoneNumber01: string; - phoneNumber02: string; - userName: string; - password: string; - profileImage?: any; - authToken?: string; - permissionLevel: string; - deletedAt?: Date | null; - deletedBy?: Schema.Types.ObjectId | null; + firstName: string; + lastName: string; + email: string; + phoneNumber01: string; + phoneNumber02: string; + userName: string; + password: string; + profileImage?: any; + authToken?: string; + permissionLevel: string; + deletedAt?: Date | null; + deletedBy?: Schema.Types.ObjectId | null; } // Object level functions for the schema interface IUser extends IUserDocument { - generateAuthToken(): string; + generateAuthToken(): string; } // Static functions for the schema interface IUserModel extends Model { - findByUsernamePassword(userName: string, password: string): IUser; + // eslint-disable-next-line no-unused-vars + findByUsernamePassword(userName: string, password: string): IUser; } export type { IUser, IUserModel, IUserRequest }; diff --git a/src/interfaces/IWebinar.ts b/src/interfaces/IWebinar.ts index e09e6b9..af48aef 100644 --- a/src/interfaces/IWebinar.ts +++ b/src/interfaces/IWebinar.ts @@ -1,23 +1,23 @@ import { Document, Schema } from "mongoose"; interface IUpdatedBy { - user: Schema.Types.ObjectId; - updatedAt: Date; + user: Schema.Types.ObjectId; + updatedAt: Date; } interface IWebinar extends Document { - title: string; - description: string; - imageUrl: string; - dateTime: Date; - tags?: string[]; - link?: string; - registrationLink?: string; - webinarType: string; - deletedAt?: Date; - createdBy: Schema.Types.ObjectId; - updatedBy: IUpdatedBy[]; - deletedBy?: Schema.Types.ObjectId; + title: string; + description: string; + imageUrl: string; + dateTime: Date; + tags?: string[]; + link?: string; + registrationLink?: string; + webinarType: string; + deletedAt?: Date; + createdBy: Schema.Types.ObjectId; + updatedBy: IUpdatedBy[]; + deletedBy?: Schema.Types.ObjectId; } export type { IWebinar }; diff --git a/src/interfaces/index.ts b/src/interfaces/index.ts index 6d00184..f26f20a 100644 --- a/src/interfaces/index.ts +++ b/src/interfaces/index.ts @@ -11,18 +11,18 @@ import { IInterview } from "./IInterview"; import { IOrganization } from "./IOrganization"; export { - IUser, - IUserModel, - IUserRequest, - IContact, - IConfig, - IEvent, - IUpdatedBy, - IWebinar, - IExecutiveBoard, - IBoardMember, - IApplication, - ITopSpeaker, - IInterview, - IOrganization, + IUser, + IUserModel, + IUserRequest, + IContact, + IConfig, + IEvent, + IUpdatedBy, + IWebinar, + IExecutiveBoard, + IBoardMember, + IApplication, + ITopSpeaker, + IInterview, + IOrganization, }; diff --git a/src/templates/Email-Template.html b/src/templates/Email-Template.html index db7c92e..e20d49d 100644 --- a/src/templates/Email-Template.html +++ b/src/templates/Email-Template.html @@ -1,191 +1,206 @@ + + + + - - - - + +
+
+ + + + + + + + + +
+ + + + + + + + + + +
+ +
+
+
+ + + + + + + + + + + - -
-
-
+ Hi {{name}} + + + +
+ Email body message +
+ Thank you. +
- - - - - -
- - - - - - - - - - - - -
- -
-
-
- - - - - - - - - - - - - - -
- Hi {{name}} - - - -
- Email body message -
- Thank you. -
- - - - - - - - -
- - - - - - - - - - - - - - -
- Sri Lanka Institute Of Information Technology,
- Malabe,
- Sri Lanka. -
- - www.msclubsliit.org -
- - - - - - - - - -
-
-
- -
-
-
- © 2021 MS Club of SLIIT All Rights Reserved. -
-
-
-
-
- - - - - - \ No newline at end of file +
+ + + + + + + +
+ + + + + + + + + + + + + + +
+ Sri Lanka Institute Of Information Technology,
+ Malabe,
+ Sri Lanka. +
+ + www.msclubsliit.org + +
+ + + + + + + + + +
+
+
+
+ +
+ © 2021 MS Club of SLIIT All Rights Reserved. +
+ + + + +
+
+
+
+ + diff --git a/src/util/database.connection.ts b/src/util/database.connection.ts index 26700b9..0361301 100644 --- a/src/util/database.connection.ts +++ b/src/util/database.connection.ts @@ -1,30 +1,30 @@ -import Mongoose, { ConnectOptions } from "mongoose"; +import Mongoose from "mongoose"; import logger from "./logger"; import { configs } from "../config"; let database: Mongoose.Connection; const connect = async () => { - const databaseConnectionString = configs.mongodb.uri; + const databaseConnectionString = configs.mongodb.uri; - if (database) { - return; - } + if (database) { + return; + } - try { - Mongoose.connect(databaseConnectionString); - database = Mongoose.connection; + try { + Mongoose.connect(databaseConnectionString); + database = Mongoose.connection; - database.once("open", async () => { - logger.info("Database Synced"); - }); + database.once("open", async () => { + logger.info("Database Synced"); + }); - database.on("error", () => { - logger.error("Error connecting to database"); - }); - } catch (error: any) { - logger.error(error.message); - } + database.on("error", () => { + logger.error("Error connecting to database"); + }); + } catch (error: any) { + logger.error(error.message); + } }; export default connect; diff --git a/src/util/email.handler.ts b/src/util/email.handler.ts index 8ebfdad..08254b9 100644 --- a/src/util/email.handler.ts +++ b/src/util/email.handler.ts @@ -6,112 +6,106 @@ import moment from "moment"; import fetch from "cross-fetch"; import { Channel } from "amqplib"; import { subscribeMessages } from "./queue.config"; - -const cc = - "senurajayadeva@gmail.com,Lasalshettiarachchi458@gmail.com,rusiruavbpersonal98@gmail.com,yasirurandika99@gmail.com"; +import sgMail from "@sendgrid/mail"; // HTML Configuration require.extensions[".html"] = (module: any, fileName: string) => { - module.exports = fs.readFileSync(fileName, "utf8"); + module.exports = fs.readFileSync(fileName, "utf8"); }; -// SendGrid Configuration -const sgMail = require("@sendgrid/mail"); - let template: HandlebarsTemplateDelegate; let htmlToSend: string; class EmailService { - channel: Channel; - - constructor(channel: Channel) { - this.channel = channel; - subscribeMessages(this.channel, this); - } - - sendEmailWithTemplate(data: any) { - console.log(data); - let fileName = data.email.template; - let to = data.email.to; - let subject = data.email.subject; - let emailBodyData = data.email.body; - - return new Promise(async (resolve, reject) => { - EmailService.getEmailTemplatePath(fileName) - .then((emailTemplate) => { - if (emailTemplate) { - template = handlebars.compile(emailTemplate); - htmlToSend = template(emailBodyData); - - EmailService.retry( - 5, // Retry count - function () { - return EmailService.sendEmail(to, subject, htmlToSend) - .then((responseData) => { - return resolve(responseData); - }) - .catch((error) => { - return reject(error.message); - }); - }, - "sendEmailWithTemplate->sendEmail" - ); - } else { - return reject("Email template not found"); - } - }) - .catch((error) => { - logger.error(error.message); - }); - }); - } - - static getEmailTemplatePath = async (fileName: string) => { - const emailBucketLink = `${configs.firebase.storageBucket}/${configs.firebase.bucketName}/${configs.firebase.emailTemplateBucket}`; - const templatePath = (await fetch(`${emailBucketLink}/${fileName}`)).text(); - - return templatePath; - }; - - static sendEmail = (to: string, subject: string, htmlTemplate: any) => { - return new Promise((resolve, reject) => { - sgMail.setApiKey(configs.email.sendGrid.apiKey); - const msg = { - to: to, // Change to your recipient - from: { name: "MS Club of SLIIT", email: configs.email.sendGrid.user }, // Change to your verified sender - cc: "msclubofsliit@gmail.com", - subject: subject, - text: htmlTemplate, - html: htmlTemplate, - }; - sgMail - .send(msg) - .then((responseData: any) => { - logger.info(`Email sent ${responseData}`); - return resolve(responseData); - }) - .catch((error: any) => { - logger.error("Send Email Error: " + error); - return reject(error); - }); - }); - }; - - static retry = (maxRetries: number, retryFunction: any, retryFunctionName: string) => { - logger.info("## RETRY COUNT: " + maxRetries); - - return retryFunction().catch((error: any) => { - if (maxRetries <= 0) { - const RetryFailedDateAndTime = moment().utcOffset("+05.30").format("MMMM Do YYYY, h:mm:ss a"); - logger.error(RetryFailedDateAndTime); - /** - * @todo - to send Email to the system admin about the failure - */ - } - - return this.retry(maxRetries - 1, retryFunction, retryFunctionName); - }); - }; + channel: Channel; + + constructor(channel: Channel) { + this.channel = channel; + subscribeMessages(this.channel, this); + } + + sendEmailWithTemplate(data: any) { + const fileName = data.email.template; + const to = data.email.to; + const subject = data.email.subject; + const emailBodyData = data.email.body; + + return new Promise((resolve, reject) => { + EmailService.getEmailTemplatePath(fileName) + .then((emailTemplate) => { + if (emailTemplate) { + template = handlebars.compile(emailTemplate); + htmlToSend = template(emailBodyData); + + EmailService.retry( + 5, // Retry count + function () { + return EmailService.sendEmail(to, subject, htmlToSend) + .then((responseData) => { + return resolve(responseData); + }) + .catch((error) => { + return reject(error.message); + }); + }, + "sendEmailWithTemplate->sendEmail" + ); + } else { + return reject("Email template not found"); + } + }) + .catch((error) => { + logger.error(error.message); + }); + }); + } + + static getEmailTemplatePath = async (fileName: string) => { + const emailBucketLink = `${configs.firebase.storageBucket}/${configs.firebase.bucketName}/${configs.firebase.emailTemplateBucket}`; + const templatePath = (await fetch(`${emailBucketLink}/${fileName}`)).text(); + + return templatePath; + }; + + static sendEmail = (to: string, subject: string, htmlTemplate: any) => { + return new Promise((resolve, reject) => { + sgMail.setApiKey(configs.email.sendGrid.apiKey); + const msg = { + to: to, // Change to your recipient + from: { name: "MS Club of SLIIT", email: configs.email.sendGrid.user }, // Change to your verified sender + cc: "msclubofsliit@gmail.com", + subject: subject, + text: htmlTemplate, + html: htmlTemplate, + }; + sgMail + .send(msg) + .then((responseData: any) => { + logger.info(`Email sent ${responseData}`); + return resolve(responseData); + }) + .catch((error: any) => { + logger.error("Send Email Error: " + error); + return reject(error); + }); + }); + }; + + static retry = (maxRetries: number, retryFunction: any, retryFunctionName: string) => { + logger.info("## RETRY COUNT: " + maxRetries); + + return retryFunction().catch(() => { + if (maxRetries <= 0) { + const RetryFailedDateAndTime = moment().utcOffset("+05.30").format("MMMM Do YYYY, h:mm:ss a"); + logger.error(RetryFailedDateAndTime); + /** + * @todo - to send Email to the system admin about the failure + */ + } + + return this.retry(maxRetries - 1, retryFunction, retryFunctionName); + }); + }; } export default EmailService; diff --git a/src/util/image.handler.ts b/src/util/image.handler.ts index d7a2eb0..ce02780 100644 --- a/src/util/image.handler.ts +++ b/src/util/image.handler.ts @@ -1,41 +1,32 @@ import StorageBucket from "../config/storage.config"; import logger from "./logger"; class ImageService { - static uploadImage = async ( - file: any, - folderName: string - ): Promise => { - return new Promise((resolve, reject) => { - const { originalname, buffer } = file; + static uploadImage = async (file: any, folderName: string): Promise => { + return new Promise((resolve, reject) => { + const { buffer } = file; - const blob = StorageBucket.file( - `${folderName}/${this.generateImageName()}` - ); - const blobStream = blob.createWriteStream({ - resumable: false, - gzip: true, - }); + const blob = StorageBucket.file(`${folderName}/${this.generateImageName()}`); + const blobStream = blob.createWriteStream({ + resumable: false, + gzip: true, + }); - blobStream - .on("finish", () => { - resolve(blob.name); - }) - .on("error", (error) => { - logger.error(error.message); - reject(`Upload Error: ${error.message}`); - }) - .end(buffer); - }); - }; + blobStream + .on("finish", () => { + resolve(blob.name); + }) + .on("error", (error) => { + logger.error(error.message); + reject(`Upload Error: ${error.message}`); + }) + .end(buffer); + }); + }; - static generateImageName = () => { - let fileName = - new Date().getTime() + - "-" + - Math.floor(Math.random() * 1000000 + 1) + - ".jpg"; - return fileName; - }; + static generateImageName = () => { + const fileName = new Date().getTime() + "-" + Math.floor(Math.random() * 1000000 + 1) + ".jpg"; + return fileName; + }; } export default ImageService; diff --git a/src/util/logger.ts b/src/util/logger.ts index b5dbb71..c600fe4 100644 --- a/src/util/logger.ts +++ b/src/util/logger.ts @@ -1,12 +1,12 @@ -import pino from 'pino'; -import dayjs from 'dayjs'; +import pino from "pino"; +import dayjs from "dayjs"; const LOGGER = pino({ - prettyPrint: true, - base: { - pid: false, - }, - timestamp: () => `, "TIME"::"${dayjs().format()}"` + prettyPrint: true, + base: { + pid: false, + }, + timestamp: () => `, "TIME"::"${dayjs().format()}"`, }); -export default LOGGER; \ No newline at end of file +export default LOGGER; diff --git a/src/util/queue.config.ts b/src/util/queue.config.ts index cb06ab2..a0b4001 100644 --- a/src/util/queue.config.ts +++ b/src/util/queue.config.ts @@ -1,39 +1,30 @@ import amqp, { Channel } from "amqplib"; import { configs } from "../config"; -import EmailService from "./email.handler"; // Create a channel const createChannel = async () => { - try { - const connection = await amqp.connect(configs.queue.messageBrokerURL); - const channel = await connection.createChannel(); - await channel.assertExchange(configs.queue.exchangeName, "direct", { durable: false }); - return channel; - } catch (error) { - throw error; - } + const connection = await amqp.connect(configs.queue.messageBrokerURL); + const channel = await connection.createChannel(); + await channel.assertExchange(configs.queue.exchangeName, "direct", { durable: false }); + return channel; }; // Publish the messages const publishMessage = async (channel: Channel, bindingKey: string, message: any) => { - try { - await channel.publish(configs.queue.exchangeName, bindingKey, Buffer.from(JSON.stringify(message))); - } catch (error) { - throw error; - } + await channel.publish(configs.queue.exchangeName, bindingKey, Buffer.from(JSON.stringify(message))); }; // Subscribe to messages const subscribeMessages = async (channel: Channel, service: any) => { - const serviceQueue = await channel.assertQueue(configs.queue.emailQueue); - channel.bindQueue(serviceQueue.queue, configs.queue.exchangeName, configs.queue.emailService); - channel.consume(serviceQueue.queue, (data) => { - if (data) { - const queueItem = JSON.parse(JSON.parse(data.content.toString())); - service.sendEmailWithTemplate(queueItem); - channel.ack(data); // Send acknowledgement to queue after consume the message - } - }); + const serviceQueue = await channel.assertQueue(configs.queue.emailQueue); + channel.bindQueue(serviceQueue.queue, configs.queue.exchangeName, configs.queue.emailService); + channel.consume(serviceQueue.queue, (data) => { + if (data) { + const queueItem = JSON.parse(JSON.parse(data.content.toString())); + service.sendEmailWithTemplate(queueItem); + channel.ack(data); // Send acknowledgement to queue after consume the message + } + }); }; export { createChannel, publishMessage, subscribeMessages }; diff --git a/src/util/response.handler.ts b/src/util/response.handler.ts index fef63fb..c5727d7 100644 --- a/src/util/response.handler.ts +++ b/src/util/response.handler.ts @@ -1,36 +1,36 @@ -import { Response } from 'express'; +import { Response } from "express"; const successRespond = (response: Response, status = 201) => { - return function (data: any) { - if (!data) { - return response.status(204).json({ status:204, message: 'Not Found' }); - } - return response.status(status).json(data); - }; -} + return function (data: any) { + if (!data) { + return response.status(204).json({ status: 204, message: "Not Found" }); + } + return response.status(status).json(data); + }; +}; const notFoundRespond = (response: Response) => { - return function (data: any) { - if (!data) { - return response.status(204).json({ status:204, message: 'Not Found' }); - } - return response.status(404).json({ status: 404, details: 'Not Found' }); - }; -} + return function (data: any) { + if (!data) { + return response.status(204).json({ status: 204, message: "Not Found" }); + } + return response.status(404).json({ status: 404, details: "Not Found" }); + }; +}; const errorRespond = (response: Response) => { - return function (error: any) { - return response.status(400).json({ status: 400, details: error }); - }; -} + return function (error: any) { + return response.status(400).json({ status: 400, details: error }); + }; +}; const unauthorizedRespond = (response: Response) => { - return function (data: any) { - if (!data) { - return response.status(204).json({ status:204, message: 'Not Found' }); - } - return response.status(401).json({ details: data }); - } -} + return function (data: any) { + if (!data) { + return response.status(204).json({ status: 204, message: "Not Found" }); + } + return response.status(401).json({ details: data }); + }; +}; -export default { successRespond, notFoundRespond, errorRespond, unauthorizedRespond }; \ No newline at end of file +export default { successRespond, notFoundRespond, errorRespond, unauthorizedRespond }; diff --git a/tsconfig.json b/tsconfig.json index 981b7e6..ef3e342 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,15 +1,15 @@ { - "compilerOptions": { - "target": "es2016", - "module": "commonjs", - "rootDir": "./src", - "moduleResolution": "node", - "outDir": "./build", - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "strict": true, - "skipLibCheck": true, - "typeRoots": ["./typings", "./node_modules/@types"] - }, - "exclude": ["node_modules", "**/*.spec.ts"] + "compilerOptions": { + "target": "es2016", + "module": "commonjs", + "rootDir": "./src", + "moduleResolution": "node", + "outDir": "./build", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true, + "typeRoots": ["./typings", "./node_modules/@types"] + }, + "exclude": ["node_modules", "**/*.spec.ts"] } diff --git a/typings/express/index.d.ts b/typings/express/index.d.ts index c9cf359..b3e6595 100644 --- a/typings/express/index.d.ts +++ b/typings/express/index.d.ts @@ -1,46 +1,47 @@ +/* eslint-disable no-unused-vars */ import { Channel } from "amqplib"; declare global { - namespace Express { - interface Request { - handleResponse: { - successRespond(response: Response): (data: any) => Response; - notFoundRespond(response: Response): (data: any) => Response; - errorRespond(response: Response): (error: any) => Response; - unauthorizedRespond(response: Response): (data: any) => Response; - }; - queue: { - /** - * Publish messages to the queue. This function wil take 3 parameters. - * @param channel - RabbitMQ Channel - * @param bindingKey - Binding key to bind the messages to the queue - * @param message - Actual message data that add to the queue - * @example - * let channel = request.queue.channel; - * let bindingKey = configs.queue.emailService; - * let message = { - * template: "Email-Template.html", - * body: "Email template to queue" - * }; - * - * request.queue.publishMessage(channel, bindingKey, message); - */ - publishMessage(channel: Channel, bindingKey: string, message: any): Promise; + namespace Express { + interface Request { + handleResponse: { + successRespond(response: Response): (data: any) => Response; + notFoundRespond(response: Response): (data: any) => Response; + errorRespond(response: Response): (error: any) => Response; + unauthorizedRespond(response: Response): (data: any) => Response; + }; + queue: { + /** + * Publish messages to the queue. This function wil take 3 parameters. + * @param channel - RabbitMQ Channel + * @param bindingKey - Binding key to bind the messages to the queue + * @param message - Actual message data that add to the queue + * @example + * let channel = request.queue.channel; + * let bindingKey = configs.queue.emailService; + * let message = { + * template: "Email-Template.html", + * body: "Email template to queue" + * }; + * + * request.queue.publishMessage(channel, bindingKey, message); + */ + publishMessage(channel: Channel, bindingKey: string, message: any): Promise; - /** - * Consume the messages that are published to the message queue. The function will take 3 parameters. - * @param channel - RabbitMQ Channel - * @param service - Class name of the service - * @example - * let channel = request.queue.channel; - * let emailService = new EmailService(); - * - * request.queue.subscribeMessages(channel, emailService); - */ - subscribeMessages(channel: Channel, service: EmailService): Promise; - }; - authToken: any; - user: any; - channel: Channel; - } - } + /** + * Consume the messages that are published to the message queue. The function will take 3 parameters. + * @param channel - RabbitMQ Channel + * @param service - Class name of the service + * @example + * let channel = request.queue.channel; + * let emailService = new EmailService(); + * + * request.queue.subscribeMessages(channel, emailService); + */ + subscribeMessages(channel: Channel, service: EmailService): Promise; + }; + authToken: any; + user: any; + channel: Channel; + } + } } From 3125e3b940f7c191568f9f34cc2d9c039e85b9b3 Mon Sep 17 00:00:00 2001 From: rusiruavb Date: Wed, 5 Jan 2022 23:10:25 +0530 Subject: [PATCH 8/9] Fix the message publishing issue --- .eslintrc.json => .eslintrc | 0 src/api/controllers/Application.controller.ts | 6 +-- src/api/services/Application.service.ts | 14 +++---- src/api/services/Contact.service.ts | 3 +- src/app.ts | 42 ++++++------------- src/util/email.handler.ts | 14 +++---- src/util/queue.config.ts | 11 +++-- tsconfig.json | 2 +- typings/express/index.d.ts | 2 +- 9 files changed, 37 insertions(+), 57 deletions(-) rename .eslintrc.json => .eslintrc (100%) diff --git a/.eslintrc.json b/.eslintrc similarity index 100% rename from .eslintrc.json rename to .eslintrc diff --git a/src/api/controllers/Application.controller.ts b/src/api/controllers/Application.controller.ts index 289e989..e6d43d4 100644 --- a/src/api/controllers/Application.controller.ts +++ b/src/api/controllers/Application.controller.ts @@ -8,7 +8,7 @@ import ApplicationService from "../services"; * @returns {IApplication} - New application document */ export const addApplication = async (request: Request, response: Response, next: NextFunction) => { - await ApplicationService.addApplication(request.body) + await ApplicationService.addApplication(request, request.body) .then(async (data) => { request.handleResponse.successRespond(response)(data); next(); @@ -99,7 +99,7 @@ export const changeApplicationStatusIntoInterview = async ( ) => { const { applicationId } = request.params; if (applicationId) { - await ApplicationService.changeApplicationStatusIntoInterview(applicationId, request.body) + await ApplicationService.changeApplicationStatusIntoInterview(request, applicationId, request.body) .then((data) => { request.handleResponse.successRespond(response)(data); next(); @@ -125,7 +125,7 @@ export const changeApplicationStatusIntoInterview = async ( export const changeApplicationStatusIntoSelected = async (request: Request, response: Response, next: NextFunction) => { const { applicationId } = request.params; if (applicationId) { - await ApplicationService.changeApplicationStatusIntoSelected(applicationId) + await ApplicationService.changeApplicationStatusIntoSelected(request, applicationId) .then((data) => { request.handleResponse.successRespond(response)(data); next(); diff --git a/src/api/services/Application.service.ts b/src/api/services/Application.service.ts index 66f32c7..f67508a 100644 --- a/src/api/services/Application.service.ts +++ b/src/api/services/Application.service.ts @@ -1,15 +1,14 @@ import { DocumentDefinition } from "mongoose"; import { IApplication, IInterview } from "../../interfaces"; import ApplicationModel from "../models/Application.model"; -import { configs } from "../../config"; -import { request } from "express"; +import { Request } from "express"; /** * Application Service * @param {IApplication} application * @returns {Promise} */ -export const addApplication = async (applicationData: DocumentDefinition) => { +export const addApplication = async (request: Request, applicationData: DocumentDefinition) => { return await ApplicationModel.create(applicationData) .then(async (application) => { // Send email @@ -36,7 +35,7 @@ export const addApplication = async (applicationData: DocumentDefinition { @@ -98,6 +97,7 @@ export const archiveApplication = async (applicationId: string) => { * @param applicationId @type string */ export const changeApplicationStatusIntoInterview = async ( + request: Request, applicationId: string, interviewData: DocumentDefinition ) => { @@ -126,7 +126,7 @@ export const changeApplicationStatusIntoInterview = async ( // Send email data to message queue const channel = request.channel; - request.queue.publishMessage(channel, configs.queue.emailService, JSON.stringify(email)); + request.queue.publishMessage(channel, JSON.stringify(email)); return application; } else { return null; @@ -141,7 +141,7 @@ export const changeApplicationStatusIntoInterview = async ( * @function changeApplicationStatusIntoSelected to update the status into SELECTED of an application in the system * @param applicationId @type string */ -export const changeApplicationStatusIntoSelected = async (applicationId: string) => { +export const changeApplicationStatusIntoSelected = async (request: Request, applicationId: string) => { return await ApplicationModel.findById(applicationId) .then(async (application) => { if (application) { @@ -162,7 +162,7 @@ export const changeApplicationStatusIntoSelected = async (applicationId: string) // Send email data to message queue const channel = request.channel; - request.queue.publishMessage(channel, configs.queue.emailService, JSON.stringify(email)); + request.queue.publishMessage(channel, JSON.stringify(email)); return application; } else { return null; diff --git a/src/api/services/Contact.service.ts b/src/api/services/Contact.service.ts index ad12c2a..8c50992 100644 --- a/src/api/services/Contact.service.ts +++ b/src/api/services/Contact.service.ts @@ -2,7 +2,6 @@ import { DocumentDefinition } from "mongoose"; import { IContact } from "../../interfaces"; import ContactModel from "../models/Contact.model"; import moment from "moment"; -import { configs } from "../../config"; import { request } from "express"; /** @@ -32,7 +31,7 @@ export const insertContact = async (contactData: DocumentDefinition) = // Send email data to message queue const channel = request.channel; - request.queue.publishMessage(channel, configs.queue.emailService, JSON.stringify(email)); + request.queue.publishMessage(channel, JSON.stringify(email)); return data; }) .catch((error) => { diff --git a/src/app.ts b/src/app.ts index 4ab96bd..070a0fb 100644 --- a/src/app.ts +++ b/src/app.ts @@ -1,4 +1,5 @@ import dotenv from "dotenv"; +dotenv.config(); import express, { Express, Request, Response, NextFunction } from "express"; import cors from "cors"; import logger from "./util/logger"; @@ -6,13 +7,19 @@ import responseHandler from "./util/response.handler"; import routes from "./api/routes"; import { configs } from "./config"; import connect from "./util/database.connection"; -import amqp from "amqplib"; +import messageQueue from "./util/queue.config"; +import { Channel } from "amqplib"; +import EmailService from "./util/email.handler"; -dotenv.config(); export const app: Express = express(); const PORT: string = configs.port; const ENVIRONMENT = configs.environment; const MONGO_URI = configs.mongodb.uri; +let channel: Channel; + +messageQueue.createChannel().then((channelData) => { + channel = channelData; +}); // Register Middleware Chain app.use(cors()); @@ -22,37 +29,12 @@ app.use(express.urlencoded({ extended: true })); // Inject Response Handler app.use((req: Request, res: Response, next: NextFunction) => { req.handleResponse = responseHandler; + req.channel = channel; + req.queue = messageQueue; + new EmailService(channel); next(); }); -// Create and Inject the message queue -app.use((req: Request, res: Response, next: NextFunction) => { - try { - // Create the channel - amqp - .connect(configs.queue.messageBrokerURL) - .then((connection) => { - connection - .createChannel() - .then((channel) => { - channel.assertExchange(configs.queue.exchangeName, "direct", { durable: false }); - - // Add channel as request property - req.channel = channel; - next(); - }) - .catch((channelError) => { - logger.error(`Channel Error: ${channelError.message}`); - }); - }) - .catch((connectionError: any) => { - logger.error(`Connection Error: ${connectionError.message}`); - }); - } catch (error: any) { - logger.error(error.message); - } -}); - // Root API Call app.get("/", (req: Request, res: Response, next: NextFunction) => { res.send("

MS CLUB SLIIT Web API

"); diff --git a/src/util/email.handler.ts b/src/util/email.handler.ts index 08254b9..03c99fa 100644 --- a/src/util/email.handler.ts +++ b/src/util/email.handler.ts @@ -5,7 +5,7 @@ import { configs } from "../config"; import moment from "moment"; import fetch from "cross-fetch"; import { Channel } from "amqplib"; -import { subscribeMessages } from "./queue.config"; +import messageQueue from "./queue.config"; import sgMail from "@sendgrid/mail"; // HTML Configuration @@ -21,14 +21,14 @@ class EmailService { constructor(channel: Channel) { this.channel = channel; - subscribeMessages(this.channel, this); + messageQueue.subscribeMessages(this.channel, this); } sendEmailWithTemplate(data: any) { - const fileName = data.email.template; - const to = data.email.to; - const subject = data.email.subject; - const emailBodyData = data.email.body; + const fileName = data.template; + const to = data.to; + const subject = data.subject; + const emailBodyData = data.body; return new Promise((resolve, reject) => { EmailService.getEmailTemplatePath(fileName) @@ -81,7 +81,7 @@ class EmailService { sgMail .send(msg) .then((responseData: any) => { - logger.info(`Email sent ${responseData}`); + logger.info(`Email sent to ${to}`); return resolve(responseData); }) .catch((error: any) => { diff --git a/src/util/queue.config.ts b/src/util/queue.config.ts index a0b4001..6c25e58 100644 --- a/src/util/queue.config.ts +++ b/src/util/queue.config.ts @@ -5,19 +5,18 @@ import { configs } from "../config"; const createChannel = async () => { const connection = await amqp.connect(configs.queue.messageBrokerURL); const channel = await connection.createChannel(); - await channel.assertExchange(configs.queue.exchangeName, "direct", { durable: false }); + await channel.assertQueue(configs.queue.emailQueue, { durable: false }); return channel; }; // Publish the messages -const publishMessage = async (channel: Channel, bindingKey: string, message: any) => { - await channel.publish(configs.queue.exchangeName, bindingKey, Buffer.from(JSON.stringify(message))); +const publishMessage = (channel: Channel, message: any) => { + channel.sendToQueue(configs.queue.emailQueue, Buffer.from(JSON.stringify(message))); }; // Subscribe to messages const subscribeMessages = async (channel: Channel, service: any) => { - const serviceQueue = await channel.assertQueue(configs.queue.emailQueue); - channel.bindQueue(serviceQueue.queue, configs.queue.exchangeName, configs.queue.emailService); + const serviceQueue = await channel.assertQueue(configs.queue.emailQueue, { durable: false }); channel.consume(serviceQueue.queue, (data) => { if (data) { const queueItem = JSON.parse(JSON.parse(data.content.toString())); @@ -27,4 +26,4 @@ const subscribeMessages = async (channel: Channel, service: any) => { }); }; -export { createChannel, publishMessage, subscribeMessages }; +export default { createChannel, publishMessage, subscribeMessages }; diff --git a/tsconfig.json b/tsconfig.json index ef3e342..cfe84ff 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "target": "es2016", + "target": "es2017", "module": "commonjs", "rootDir": "./src", "moduleResolution": "node", diff --git a/typings/express/index.d.ts b/typings/express/index.d.ts index b3e6595..ae0d2cb 100644 --- a/typings/express/index.d.ts +++ b/typings/express/index.d.ts @@ -25,7 +25,7 @@ declare global { * * request.queue.publishMessage(channel, bindingKey, message); */ - publishMessage(channel: Channel, bindingKey: string, message: any): Promise; + publishMessage(channel: Channel, message: any): void; /** * Consume the messages that are published to the message queue. The function will take 3 parameters. From f4144055dd160c9271d7452d6e93ce0a61b8ab20 Mon Sep 17 00:00:00 2001 From: rusiruavb Date: Thu, 6 Jan 2022 11:04:43 +0530 Subject: [PATCH 9/9] Fix the typo issue in PR template --- .github/templates/PR_TEMPLATE.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/templates/PR_TEMPLATE.md b/.github/templates/PR_TEMPLATE.md index c53ba4f..fda58a4 100644 --- a/.github/templates/PR_TEMPLATE.md +++ b/.github/templates/PR_TEMPLATE.md @@ -3,7 +3,7 @@ **Check following steps are fulfilled before creating the PR**
📝 Explain what are the changes that you have done to the codebase in the PR description
✔️ Assign more than 2 reviewers to the PR.
-✔️ Add relevent labes to the PR
+✔️ Add relevant labels to the PR
(⚠️ Must to have one of the these labels. **high-priority**, **medium-priority**, **low-priority**)
✔️ Select the project. **(MS Club Web Server)**
-✔️ If there is any issue created that related to the PR, please link link it to the PR. +✔️ If there is any issue created that related to the PR, please link it to the PR.