├── .gitignore ├── uploads ├── blog │ ├── GD9Y0NBrJ_rFbKJ50JutiVS0.jpg │ ├── YtI1fVDDUlFtH0jxbCukol_e.jpg │ ├── bZgxst81ul_dJvEakJ6hSzoj.jpg │ └── uoG4yy407WTGYSocybnnqGwo.jpg ├── avatar │ ├── -EW3mCvcMhLRAUmHq9tZuJXY.jpg │ ├── 0dND5LB5mi5yCdCVs5Wl3c8j.jpg │ ├── 1d7VcKiiys_lNMtouPCr4JRf.jpg │ ├── 3X63fX8ds5CHfY86m1_sHL3e.jpg │ ├── 5JKJWFnNnMn1lTcNLeTXvXEL.jpg │ ├── 5Pk7SRP-HHuclNo6ez5ae8rJ.jpg │ ├── AObEX8U_Pb1PMtjQVPHMbh49.jpg │ ├── DJ3hA_9jN7WVW2aNKM8nbtfe.jpg │ ├── H_CaI5dKnPbxQ3pCzSpMrIs6.jpg │ ├── ISYXrpAgMCbnac_TwmOtFveY.jpg │ ├── R5hPej87hQuT5HMooQw3tINn.jpg │ ├── g2QfqgpXWYM1BTdyVFAWroYY.jpg │ ├── gLVDfYuu5r38BR5h6UJDtnWq.jpg │ ├── hvML8T7rXsMF1fB_cB-FXtx8.jpg │ ├── j-2S7nGdYxaKuP3HYV8GuQUB.jpg │ ├── jbHRnLuCdyohYF95T4HPyLlr.jpg │ ├── nQrKPPE6CUrBAl3mdnV_IwcS.jpg │ ├── r2saoP2r4brH04gB6Tel1Qy4.jpg │ └── vIKCsm0HmX2gb1VxJwTDlln7.jpg └── course │ ├── FUqXzu1DHckxXhoHqP7W-m9b.jpg │ ├── KAHWhOeZY2KEB2DD5YRQ0Mbb.jpg │ ├── VVQSFsBUulI1IoSJG_DCQWjg.jpg │ └── ocQmIsHeVVXlQgbbkDQTrPVF.jpg ├── utils ├── image.js └── jwt.js ├── models ├── menu.js ├── newsletter.js ├── user.js ├── course.js └── post.js ├── router ├── auth.js ├── menu.js ├── newsletter.js ├── post.js ├── course.js └── user.js ├── constants.js ├── package.json ├── index.js ├── middlewares └── authenticated.js ├── app.js ├── controllers ├── newsletter.js ├── menu.js ├── course.js ├── post.js ├── user.js └── auth.js └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /uploads/blog/GD9Y0NBrJ_rFbKJ50JutiVS0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xAgustin93/web-personal-server/HEAD/uploads/blog/GD9Y0NBrJ_rFbKJ50JutiVS0.jpg -------------------------------------------------------------------------------- /uploads/blog/YtI1fVDDUlFtH0jxbCukol_e.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xAgustin93/web-personal-server/HEAD/uploads/blog/YtI1fVDDUlFtH0jxbCukol_e.jpg -------------------------------------------------------------------------------- /uploads/blog/bZgxst81ul_dJvEakJ6hSzoj.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xAgustin93/web-personal-server/HEAD/uploads/blog/bZgxst81ul_dJvEakJ6hSzoj.jpg -------------------------------------------------------------------------------- /uploads/blog/uoG4yy407WTGYSocybnnqGwo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xAgustin93/web-personal-server/HEAD/uploads/blog/uoG4yy407WTGYSocybnnqGwo.jpg -------------------------------------------------------------------------------- /uploads/avatar/-EW3mCvcMhLRAUmHq9tZuJXY.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xAgustin93/web-personal-server/HEAD/uploads/avatar/-EW3mCvcMhLRAUmHq9tZuJXY.jpg -------------------------------------------------------------------------------- /uploads/avatar/0dND5LB5mi5yCdCVs5Wl3c8j.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xAgustin93/web-personal-server/HEAD/uploads/avatar/0dND5LB5mi5yCdCVs5Wl3c8j.jpg -------------------------------------------------------------------------------- /uploads/avatar/1d7VcKiiys_lNMtouPCr4JRf.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xAgustin93/web-personal-server/HEAD/uploads/avatar/1d7VcKiiys_lNMtouPCr4JRf.jpg -------------------------------------------------------------------------------- /uploads/avatar/3X63fX8ds5CHfY86m1_sHL3e.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xAgustin93/web-personal-server/HEAD/uploads/avatar/3X63fX8ds5CHfY86m1_sHL3e.jpg -------------------------------------------------------------------------------- /uploads/avatar/5JKJWFnNnMn1lTcNLeTXvXEL.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xAgustin93/web-personal-server/HEAD/uploads/avatar/5JKJWFnNnMn1lTcNLeTXvXEL.jpg -------------------------------------------------------------------------------- /uploads/avatar/5Pk7SRP-HHuclNo6ez5ae8rJ.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xAgustin93/web-personal-server/HEAD/uploads/avatar/5Pk7SRP-HHuclNo6ez5ae8rJ.jpg -------------------------------------------------------------------------------- /uploads/avatar/AObEX8U_Pb1PMtjQVPHMbh49.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xAgustin93/web-personal-server/HEAD/uploads/avatar/AObEX8U_Pb1PMtjQVPHMbh49.jpg -------------------------------------------------------------------------------- /uploads/avatar/DJ3hA_9jN7WVW2aNKM8nbtfe.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xAgustin93/web-personal-server/HEAD/uploads/avatar/DJ3hA_9jN7WVW2aNKM8nbtfe.jpg -------------------------------------------------------------------------------- /uploads/avatar/H_CaI5dKnPbxQ3pCzSpMrIs6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xAgustin93/web-personal-server/HEAD/uploads/avatar/H_CaI5dKnPbxQ3pCzSpMrIs6.jpg -------------------------------------------------------------------------------- /uploads/avatar/ISYXrpAgMCbnac_TwmOtFveY.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xAgustin93/web-personal-server/HEAD/uploads/avatar/ISYXrpAgMCbnac_TwmOtFveY.jpg -------------------------------------------------------------------------------- /uploads/avatar/R5hPej87hQuT5HMooQw3tINn.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xAgustin93/web-personal-server/HEAD/uploads/avatar/R5hPej87hQuT5HMooQw3tINn.jpg -------------------------------------------------------------------------------- /uploads/avatar/g2QfqgpXWYM1BTdyVFAWroYY.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xAgustin93/web-personal-server/HEAD/uploads/avatar/g2QfqgpXWYM1BTdyVFAWroYY.jpg -------------------------------------------------------------------------------- /uploads/avatar/gLVDfYuu5r38BR5h6UJDtnWq.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xAgustin93/web-personal-server/HEAD/uploads/avatar/gLVDfYuu5r38BR5h6UJDtnWq.jpg -------------------------------------------------------------------------------- /uploads/avatar/hvML8T7rXsMF1fB_cB-FXtx8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xAgustin93/web-personal-server/HEAD/uploads/avatar/hvML8T7rXsMF1fB_cB-FXtx8.jpg -------------------------------------------------------------------------------- /uploads/avatar/j-2S7nGdYxaKuP3HYV8GuQUB.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xAgustin93/web-personal-server/HEAD/uploads/avatar/j-2S7nGdYxaKuP3HYV8GuQUB.jpg -------------------------------------------------------------------------------- /uploads/avatar/jbHRnLuCdyohYF95T4HPyLlr.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xAgustin93/web-personal-server/HEAD/uploads/avatar/jbHRnLuCdyohYF95T4HPyLlr.jpg -------------------------------------------------------------------------------- /uploads/avatar/nQrKPPE6CUrBAl3mdnV_IwcS.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xAgustin93/web-personal-server/HEAD/uploads/avatar/nQrKPPE6CUrBAl3mdnV_IwcS.jpg -------------------------------------------------------------------------------- /uploads/avatar/r2saoP2r4brH04gB6Tel1Qy4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xAgustin93/web-personal-server/HEAD/uploads/avatar/r2saoP2r4brH04gB6Tel1Qy4.jpg -------------------------------------------------------------------------------- /uploads/avatar/vIKCsm0HmX2gb1VxJwTDlln7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xAgustin93/web-personal-server/HEAD/uploads/avatar/vIKCsm0HmX2gb1VxJwTDlln7.jpg -------------------------------------------------------------------------------- /uploads/course/FUqXzu1DHckxXhoHqP7W-m9b.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xAgustin93/web-personal-server/HEAD/uploads/course/FUqXzu1DHckxXhoHqP7W-m9b.jpg -------------------------------------------------------------------------------- /uploads/course/KAHWhOeZY2KEB2DD5YRQ0Mbb.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xAgustin93/web-personal-server/HEAD/uploads/course/KAHWhOeZY2KEB2DD5YRQ0Mbb.jpg -------------------------------------------------------------------------------- /uploads/course/VVQSFsBUulI1IoSJG_DCQWjg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xAgustin93/web-personal-server/HEAD/uploads/course/VVQSFsBUulI1IoSJG_DCQWjg.jpg -------------------------------------------------------------------------------- /uploads/course/ocQmIsHeVVXlQgbbkDQTrPVF.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xAgustin93/web-personal-server/HEAD/uploads/course/ocQmIsHeVVXlQgbbkDQTrPVF.jpg -------------------------------------------------------------------------------- /utils/image.js: -------------------------------------------------------------------------------- 1 | function getFilePath(file) { 2 | const filePath = file.path; 3 | const fileSplit = filePath.split("/"); 4 | 5 | return `${fileSplit[1]}/${fileSplit[2]}`; 6 | } 7 | 8 | module.exports = { 9 | getFilePath, 10 | }; 11 | -------------------------------------------------------------------------------- /models/menu.js: -------------------------------------------------------------------------------- 1 | const mongoose = require("mongoose"); 2 | 3 | const MenuSchema = mongoose.Schema({ 4 | title: String, 5 | path: String, 6 | order: Number, 7 | active: Boolean, 8 | }); 9 | 10 | module.exports = mongoose.model("Menu", MenuSchema); 11 | -------------------------------------------------------------------------------- /router/auth.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const AuthController = require("../controllers/auth"); 3 | 4 | const api = express.Router(); 5 | 6 | api.post("/auth/register", AuthController.register); 7 | api.post("/auth/login", AuthController.login); 8 | api.post("/auth/refresh_access_token", AuthController.refreshAccessToken); 9 | 10 | module.exports = api; 11 | -------------------------------------------------------------------------------- /models/newsletter.js: -------------------------------------------------------------------------------- 1 | const mongoose = require("mongoose"); 2 | const mongoosePaginate = require("mongoose-paginate"); 3 | 4 | const NewsletterSchema = mongoose.Schema({ 5 | email: { 6 | type: String, 7 | unique: true, 8 | }, 9 | }); 10 | 11 | NewsletterSchema.plugin(mongoosePaginate); 12 | 13 | module.exports = mongoose.model("Newsletter", NewsletterSchema); 14 | -------------------------------------------------------------------------------- /models/user.js: -------------------------------------------------------------------------------- 1 | const mongoose = require("mongoose"); 2 | 3 | const UserSchema = mongoose.Schema({ 4 | firstname: String, 5 | lastname: String, 6 | email: { 7 | type: String, 8 | unique: true, 9 | }, 10 | password: String, 11 | role: String, 12 | active: Boolean, 13 | avatar: String, 14 | }); 15 | 16 | module.exports = mongoose.model("User", UserSchema); 17 | -------------------------------------------------------------------------------- /models/course.js: -------------------------------------------------------------------------------- 1 | const mongoose = require("mongoose"); 2 | const mongoosePaginate = require("mongoose-paginate"); 3 | 4 | const CourseSchema = mongoose.Schema({ 5 | title: String, 6 | miniature: String, 7 | description: String, 8 | url: String, 9 | price: Number, 10 | score: Number, 11 | }); 12 | 13 | CourseSchema.plugin(mongoosePaginate); 14 | 15 | module.exports = mongoose.model("Course", CourseSchema); 16 | -------------------------------------------------------------------------------- /constants.js: -------------------------------------------------------------------------------- 1 | const DB_USER = "admin"; 2 | const DB_PASSWORD = "admin123456"; 3 | const DB_HOST = "web-personal.1hnuc3c.mongodb.net"; 4 | 5 | const API_VERSION = "v1"; 6 | const IP_SERVER = "localhost"; 7 | 8 | const JWT_SECRET_KEY = "gR7cH9Svfj8JLe4c186Ghs48hheb3902nh5DsA"; 9 | 10 | module.exports = { 11 | DB_USER, 12 | DB_PASSWORD, 13 | DB_HOST, 14 | API_VERSION, 15 | IP_SERVER, 16 | JWT_SECRET_KEY, 17 | }; 18 | -------------------------------------------------------------------------------- /models/post.js: -------------------------------------------------------------------------------- 1 | const mongoose = require("mongoose"); 2 | const mongoosePaginate = require("mongoose-paginate"); 3 | 4 | const PostSchema = mongoose.Schema({ 5 | title: String, 6 | miniature: String, 7 | content: String, 8 | path: { 9 | type: String, 10 | unique: true, 11 | }, 12 | created_at: Date, 13 | }); 14 | 15 | PostSchema.plugin(mongoosePaginate); 16 | 17 | module.exports = mongoose.model("Post", PostSchema); 18 | -------------------------------------------------------------------------------- /router/menu.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const MenuController = require("../controllers/menu"); 3 | const md_auth = require("../middlewares/authenticated"); 4 | 5 | const api = express.Router(); 6 | 7 | api.post("/menu", [md_auth.asureAuth], MenuController.createMenu); 8 | api.get("/menu", MenuController.getMenus); 9 | api.patch("/menu/:id", [md_auth.asureAuth], MenuController.updateMenu); 10 | api.delete("/menu/:id", [md_auth.asureAuth], MenuController.deleteMenu); 11 | 12 | module.exports = api; 13 | -------------------------------------------------------------------------------- /router/newsletter.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const NewsletterController = require("../controllers/newsletter"); 3 | const md_auth = require("../middlewares/authenticated"); 4 | 5 | const api = express.Router(); 6 | 7 | api.post("/newsletter", NewsletterController.suscribeEmail); 8 | api.get("/newsletter", [md_auth.asureAuth], NewsletterController.getEmails); 9 | api.delete( 10 | "/newsletter/:id", 11 | [md_auth.asureAuth], 12 | NewsletterController.deleteEmail 13 | ); 14 | 15 | module.exports = api; 16 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "web-personal-api", 3 | "version": "0.0.1", 4 | "description": "El api de la web personal", 5 | "main": "index.js", 6 | "author": "Agustin Navarro Galdon", 7 | "license": "MIT", 8 | "scripts": { 9 | "start": "node index.js", 10 | "dev": "nodemon index.js" 11 | }, 12 | "dependencies": { 13 | "bcryptjs": "^2.4.3", 14 | "body-parser": "^1.20.0", 15 | "connect-multiparty": "^2.2.0", 16 | "cors": "^2.8.5", 17 | "express": "^4.18.1", 18 | "jsonwebtoken": "^8.5.1", 19 | "mongoose": "^6.6.1", 20 | "mongoose-paginate": "^5.0.3", 21 | "nodemon": "^2.0.20" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const mongoose = require("mongoose"); 2 | const app = require("./app"); 3 | const { 4 | DB_USER, 5 | DB_PASSWORD, 6 | DB_HOST, 7 | IP_SERVER, 8 | API_VERSION, 9 | } = require("./constants"); 10 | 11 | const PORT = process.env.POST || 3977; 12 | 13 | mongoose.connect( 14 | `mongodb+srv://${DB_USER}:${DB_PASSWORD}@${DB_HOST}/`, 15 | (error) => { 16 | if (error) throw error; 17 | 18 | app.listen(PORT, () => { 19 | console.log("######################"); 20 | console.log("###### API REST ######"); 21 | console.log("######################"); 22 | console.log(`http://${IP_SERVER}:${PORT}/api/${API_VERSION}`); 23 | }); 24 | } 25 | ); 26 | -------------------------------------------------------------------------------- /router/post.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const multiparty = require("connect-multiparty"); 3 | const PostController = require("../controllers/post"); 4 | const md_auth = require("../middlewares/authenticated"); 5 | 6 | const md_upload = multiparty({ uploadDir: "./uploads/blog" }); 7 | const api = express.Router(); 8 | 9 | api.post("/post", [md_auth.asureAuth, md_upload], PostController.createPost); 10 | api.get("/post", PostController.getPosts); 11 | api.patch( 12 | "/post/:id", 13 | [md_auth.asureAuth, md_upload], 14 | PostController.updatePost 15 | ); 16 | api.delete("/post/:id", [md_auth.asureAuth], PostController.deletePost); 17 | api.get("/post/:path", PostController.getPost); 18 | 19 | module.exports = api; 20 | -------------------------------------------------------------------------------- /router/course.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const multiparty = require("connect-multiparty"); 3 | const CourseController = require("../controllers/course"); 4 | const md_auth = require("../middlewares/authenticated"); 5 | 6 | const md_updload = multiparty({ uploadDir: "./uploads/course" }); 7 | const api = express.Router(); 8 | 9 | api.post( 10 | "/course", 11 | [md_auth.asureAuth, md_updload], 12 | CourseController.createCourse 13 | ); 14 | api.get("/course", CourseController.getCourse); 15 | api.patch( 16 | "/course/:id", 17 | [md_auth.asureAuth, md_updload], 18 | CourseController.updateCourse 19 | ); 20 | api.delete("/course/:id", [md_auth.asureAuth], CourseController.deleteCourse); 21 | 22 | module.exports = api; 23 | -------------------------------------------------------------------------------- /router/user.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const multiparty = require("connect-multiparty"); 3 | const UserController = require("../controllers/user"); 4 | const md_auth = require("../middlewares/authenticated"); 5 | 6 | const md_upload = multiparty({ uploadDir: "./uploads/avatar" }); 7 | const api = express.Router(); 8 | 9 | api.get("/user/me", [md_auth.asureAuth], UserController.getMe); 10 | api.get("/users", [md_auth.asureAuth], UserController.getUsers); 11 | api.post("/user", [md_auth.asureAuth, md_upload], UserController.createUser); 12 | api.patch( 13 | "/user/:id", 14 | [md_auth.asureAuth, md_upload], 15 | UserController.updateUser 16 | ); 17 | api.delete("/user/:id", [md_auth.asureAuth], UserController.deleteUser); 18 | 19 | module.exports = api; 20 | -------------------------------------------------------------------------------- /middlewares/authenticated.js: -------------------------------------------------------------------------------- 1 | const jwt = require("../utils/jwt"); 2 | 3 | function asureAuth(req, res, next) { 4 | if (!req.headers.authorization) { 5 | return res 6 | .status(403) 7 | .send({ msg: "La peticion no tiene la cabecera de autenticación" }); 8 | } 9 | 10 | const token = req.headers.authorization.replace("Bearer ", ""); 11 | 12 | try { 13 | const payload = jwt.decoded(token); 14 | 15 | const { exp } = payload; 16 | const currentData = new Date().getTime(); 17 | 18 | if (exp <= currentData) { 19 | return res.status(400).send({ msg: "El token ha expirado" }); 20 | } 21 | 22 | req.user = payload; 23 | next(); 24 | } catch (error) { 25 | return res.status(400).send({ msg: "Token invalido" }); 26 | } 27 | } 28 | 29 | module.exports = { 30 | asureAuth, 31 | }; 32 | -------------------------------------------------------------------------------- /utils/jwt.js: -------------------------------------------------------------------------------- 1 | const jwt = require("jsonwebtoken"); 2 | const { JWT_SECRET_KEY } = require("../constants"); 3 | 4 | function createAccessToken(user) { 5 | const expToken = new Date(); 6 | expToken.setHours(expToken.getHours() + 3); 7 | 8 | const payload = { 9 | token_type: "access", 10 | user_id: user._id, 11 | iat: Date.now(), 12 | exp: expToken.getTime(), 13 | }; 14 | 15 | return jwt.sign(payload, JWT_SECRET_KEY); 16 | } 17 | 18 | function createRefreshToken(user) { 19 | const expToken = new Date(); 20 | expToken.getMonth(expToken.getMonth() + 1); 21 | 22 | const payload = { 23 | token_type: "refresh", 24 | user_id: user._id, 25 | iat: Date.now(), 26 | exp: expToken.getTime(), 27 | }; 28 | 29 | return jwt.sign(payload, JWT_SECRET_KEY); 30 | } 31 | 32 | function decoded(token) { 33 | return jwt.decode(token, JWT_SECRET_KEY, true); 34 | } 35 | 36 | module.exports = { 37 | createAccessToken, 38 | createRefreshToken, 39 | decoded, 40 | }; 41 | -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const bodyParser = require("body-parser"); 3 | const cors = require("cors"); 4 | const { API_VERSION } = require("./constants"); 5 | 6 | const app = express(); 7 | 8 | // Import routings 9 | const authRoutes = require("./router/auth"); 10 | const userRoutes = require("./router/user"); 11 | const menuRoutes = require("./router/menu"); 12 | const courseRoutes = require("./router/course"); 13 | const postRoutes = require("./router/post"); 14 | const newsletterRoutes = require("./router/newsletter"); 15 | 16 | // Configure Body Parser 17 | app.use(bodyParser.urlencoded({ extended: true })); 18 | app.use(bodyParser.json()); 19 | 20 | // Configure static folder 21 | app.use(express.static("uploads")); 22 | 23 | // Configure Header HTTP - CORS 24 | app.use(cors()); 25 | 26 | // Configure routings 27 | app.use(`/api/${API_VERSION}`, authRoutes); 28 | app.use(`/api/${API_VERSION}`, userRoutes); 29 | app.use(`/api/${API_VERSION}`, menuRoutes); 30 | app.use(`/api/${API_VERSION}`, courseRoutes); 31 | app.use(`/api/${API_VERSION}`, postRoutes); 32 | app.use(`/api/${API_VERSION}`, newsletterRoutes); 33 | 34 | module.exports = app; 35 | -------------------------------------------------------------------------------- /controllers/newsletter.js: -------------------------------------------------------------------------------- 1 | const Newsletter = require("../models/newsletter"); 2 | 3 | function suscribeEmail(req, res) { 4 | const { email } = req.body; 5 | 6 | if (!email) res.status(400).send({ msg: "Email obligatorio" }); 7 | 8 | const newsletter = new Newsletter({ 9 | email: email.toLowerCase(), 10 | }); 11 | 12 | newsletter.save((error) => { 13 | if (error) { 14 | res.status(400).send({ msg: "El emial ya esta registrado" }); 15 | } else { 16 | res.status(200).send({ msg: "Email registrado" }); 17 | } 18 | }); 19 | } 20 | 21 | function getEmails(req, res) { 22 | const { page = 1, limit = 10 } = req.query; 23 | 24 | const options = { 25 | page: parseInt(page), 26 | limit: parseInt(limit), 27 | }; 28 | 29 | Newsletter.paginate({}, options, (error, emailsStored) => { 30 | if (error) { 31 | res.status(400).send({ msg: "Error al obtener los emails" }); 32 | } else { 33 | res.status(200).send(emailsStored); 34 | } 35 | }); 36 | } 37 | 38 | function deleteEmail(req, res) { 39 | const { id } = req.params; 40 | 41 | Newsletter.findByIdAndDelete(id, (error) => { 42 | if (error) { 43 | res.status(400).send({ msg: "Error al eliminar el registro" }); 44 | } else { 45 | res.status(200).send({ msg: "Eliminacion correcta" }); 46 | } 47 | }); 48 | } 49 | 50 | module.exports = { 51 | suscribeEmail, 52 | getEmails, 53 | deleteEmail, 54 | }; 55 | -------------------------------------------------------------------------------- /controllers/menu.js: -------------------------------------------------------------------------------- 1 | const Menu = require("../models/menu"); 2 | 3 | async function createMenu(req, res) { 4 | const menu = new Menu(req.body); 5 | 6 | menu.save((error, menuStored) => { 7 | if (error) { 8 | res.status(400).send({ msg: "Error al crear el menu" }); 9 | } else { 10 | res.status(200).send(menuStored); 11 | } 12 | }); 13 | } 14 | 15 | async function getMenus(req, res) { 16 | const { active } = req.query; 17 | 18 | let response = null; 19 | if (active === undefined) { 20 | response = await Menu.find().sort({ order: "asc" }); 21 | } else { 22 | response = await Menu.find({ active }).sort({ order: "asc" }); 23 | } 24 | 25 | if (!response) { 26 | res.status(400).send({ msg: "No se ha encontrado ningun menu" }); 27 | } else { 28 | res.status(200).send(response); 29 | } 30 | } 31 | 32 | async function updateMenu(req, res) { 33 | const { id } = req.params; 34 | const menuData = req.body; 35 | 36 | Menu.findByIdAndUpdate({ _id: id }, menuData, (error) => { 37 | if (error) { 38 | res.status(400).send({ msh: "Error al actualizar el menu" }); 39 | } else { 40 | res.status(200).send({ msg: "Actualizacion correcta" }); 41 | } 42 | }); 43 | } 44 | 45 | async function deleteMenu(req, res) { 46 | const { id } = req.params; 47 | 48 | Menu.findByIdAndDelete(id, (error) => { 49 | if (error) { 50 | res.status(400).send({ msg: "Error al eliminar el menu" }); 51 | } else { 52 | res.status(200).send({ msg: "Menu eliminado" }); 53 | } 54 | }); 55 | } 56 | 57 | module.exports = { 58 | createMenu, 59 | getMenus, 60 | updateMenu, 61 | deleteMenu, 62 | }; 63 | -------------------------------------------------------------------------------- /controllers/course.js: -------------------------------------------------------------------------------- 1 | const Course = require("../models/course"); 2 | const image = require("../utils/image"); 3 | 4 | function createCourse(req, res) { 5 | const course = new Course(req.body); 6 | 7 | const imagePath = image.getFilePath(req.files.miniature); 8 | course.miniature = imagePath; 9 | 10 | course.save((error, courseStored) => { 11 | if (error) { 12 | res.status(400).send({ msg: "Error al crear el curso" }); 13 | } else { 14 | res.status(201).send(courseStored); 15 | } 16 | }); 17 | } 18 | 19 | function getCourse(req, res) { 20 | const { page = 1, limit = 10 } = req.query; 21 | 22 | const options = { 23 | page: parseInt(page), 24 | limit: parseInt(limit), 25 | }; 26 | 27 | Course.paginate({}, options, (error, courses) => { 28 | if (error) { 29 | res.status(400).send({ msg: "Error al obtener los cursos" }); 30 | } else { 31 | res.status(200).send(courses); 32 | } 33 | }); 34 | } 35 | 36 | function updateCourse(req, res) { 37 | const { id } = req.params; 38 | const courseData = req.body; 39 | 40 | if (req.files.miniature) { 41 | const imagePath = image.getFilePath(req.files.miniature); 42 | courseData.miniature = imagePath; 43 | } 44 | 45 | Course.findByIdAndUpdate({ _id: id }, courseData, (error) => { 46 | if (error) { 47 | res.status(400).send({ msg: "Error al actualizar el curso" }); 48 | } else { 49 | res.status(200).send({ msg: "Actualizacion correcta" }); 50 | } 51 | }); 52 | } 53 | 54 | function deleteCourse(req, res) { 55 | const { id } = req.params; 56 | 57 | Course.findByIdAndDelete(id, (error) => { 58 | if (error) { 59 | res.status(400).send({ msg: "Error al eliminar el curso" }); 60 | } else { 61 | res.status(200).send({ msg: "Curso eliminado" }); 62 | } 63 | }); 64 | } 65 | 66 | module.exports = { 67 | createCourse, 68 | getCourse, 69 | updateCourse, 70 | deleteCourse, 71 | }; 72 | -------------------------------------------------------------------------------- /controllers/post.js: -------------------------------------------------------------------------------- 1 | const Post = require("../models/post"); 2 | const image = require("../utils/image"); 3 | 4 | function createPost(req, res) { 5 | const post = new Post(req.body); 6 | post.created_at = new Date(); 7 | 8 | const imagePath = image.getFilePath(req.files.miniature); 9 | post.miniature = imagePath; 10 | 11 | post.save((error, postStored) => { 12 | if (error) { 13 | res.status(400).send({ msg: "Error al creat el post" }); 14 | } else { 15 | res.status(201).send(postStored); 16 | } 17 | }); 18 | } 19 | 20 | function getPosts(req, res) { 21 | const { page = 1, limit = 10 } = req.query; 22 | 23 | const options = { 24 | page: parseInt(page), 25 | limit: parseInt(limit), 26 | sort: { created_at: "desc" }, 27 | }; 28 | 29 | Post.paginate({}, options, (error, postsStored) => { 30 | if (error) { 31 | res.status(400).send({ msg: "Error al obtener los posts" }); 32 | } else { 33 | res.status(200).send(postsStored); 34 | } 35 | }); 36 | } 37 | 38 | function updatePost(req, res) { 39 | const { id } = req.params; 40 | const postData = req.body; 41 | 42 | if (req.files.miniature) { 43 | const imagePath = image.getFilePath(req.files.miniature); 44 | postData.miniature = imagePath; 45 | } 46 | 47 | Post.findByIdAndUpdate({ _id: id }, postData, (error) => { 48 | if (error) { 49 | res.status(400).send({ msg: "Error al actualizar el post" }); 50 | } else { 51 | res.status(200).send({ msg: "Actualización correcta" }); 52 | } 53 | }); 54 | } 55 | 56 | function deletePost(req, res) { 57 | const { id } = req.params; 58 | 59 | Post.findByIdAndDelete(id, (error) => { 60 | if (error) { 61 | res.status(400).send({ msg: "Error al eliminar el post" }); 62 | } else { 63 | res.status(200).send({ msg: "Post eliminado" }); 64 | } 65 | }); 66 | } 67 | 68 | function getPost(req, res) { 69 | const { path } = req.params; 70 | 71 | Post.findOne({ path }, (error, postStored) => { 72 | if (error) { 73 | res.status(500).send({ msg: "Error del servidor" }); 74 | } else if (!postStored) { 75 | res.status(400).send({ msg: "No se ha encontrado ningun post" }); 76 | } else { 77 | res.status(200).send(postStored); 78 | } 79 | }); 80 | } 81 | 82 | module.exports = { 83 | createPost, 84 | getPosts, 85 | updatePost, 86 | deletePost, 87 | getPost, 88 | }; 89 | -------------------------------------------------------------------------------- /controllers/user.js: -------------------------------------------------------------------------------- 1 | const bcrypt = require("bcryptjs"); 2 | const User = require("../models/user"); 3 | const image = require("../utils/image"); 4 | 5 | async function getMe(req, res) { 6 | const { user_id } = req.user; 7 | 8 | const response = await User.findById(user_id); 9 | 10 | if (!response) { 11 | res.status(400).send({ msg: "No se ha encontrado usuario" }); 12 | } else { 13 | res.status(200).send(response); 14 | } 15 | } 16 | 17 | async function getUsers(req, res) { 18 | const { active } = req.query; 19 | let response = null; 20 | 21 | if (active === undefined) { 22 | response = await User.find(); 23 | } else { 24 | response = await User.find({ active }); 25 | } 26 | 27 | res.status(200).send(response); 28 | } 29 | 30 | async function createUser(req, res) { 31 | const { password } = req.body; 32 | const user = new User({ ...req.body, active: false }); 33 | 34 | const salt = bcrypt.genSaltSync(10); 35 | const hasPassword = bcrypt.hashSync(password, salt); 36 | user.password = hasPassword; 37 | 38 | if (req.files.avatar) { 39 | const imagePath = image.getFilePath(req.files.avatar); 40 | user.avatar = imagePath; 41 | } 42 | 43 | user.save((error, userStored) => { 44 | if (error) { 45 | res.status(400).send({ msg: "Error al crear el usuario" }); 46 | } else { 47 | res.status(201).send(userStored); 48 | } 49 | }); 50 | } 51 | 52 | async function updateUser(req, res) { 53 | const { id } = req.params; 54 | const userData = req.body; 55 | 56 | if (userData.password) { 57 | const salt = bcrypt.genSaltSync(10); 58 | const hashPassword = bcrypt.hashSync(userData.password, salt); 59 | userData.password = hashPassword; 60 | } else { 61 | delete userData.password; 62 | } 63 | 64 | if (req.files.avatar) { 65 | const imagePath = image.getFilePath(req.files.avatar); 66 | userData.avatar = imagePath; 67 | } 68 | 69 | User.findByIdAndUpdate({ _id: id }, userData, (error) => { 70 | if (error) { 71 | res.status(400).send({ msg: "Error al actualizar el usuario" }); 72 | } else { 73 | res.status(200).send({ msg: "Actualizacion correcta" }); 74 | } 75 | }); 76 | } 77 | 78 | async function deleteUser(req, res) { 79 | const { id } = req.params; 80 | 81 | User.findByIdAndDelete(id, (error) => { 82 | if (error) { 83 | res.status(400).send({ msg: "Error al eliminar el usuario" }); 84 | } else { 85 | res.status(200).send({ msg: "Usuario eliminado" }); 86 | } 87 | }); 88 | } 89 | 90 | module.exports = { 91 | getMe, 92 | getUsers, 93 | createUser, 94 | updateUser, 95 | deleteUser, 96 | }; 97 | -------------------------------------------------------------------------------- /controllers/auth.js: -------------------------------------------------------------------------------- 1 | const bcrypt = require("bcryptjs"); 2 | const User = require("../models/user"); 3 | const jwt = require("../utils/jwt"); 4 | 5 | function register(req, res) { 6 | const { firstname, lastname, email, password } = req.body; 7 | 8 | if (!email) res.status(400).send({ msg: "El email es obligatorio" }); 9 | if (!password) res.status(400).send({ msg: "La contraseña es obligatoria" }); 10 | 11 | const user = new User({ 12 | firstname, 13 | lastname, 14 | email: email.toLowerCase(), 15 | role: "user", 16 | active: false, 17 | }); 18 | 19 | const salt = bcrypt.genSaltSync(10); 20 | const hashPassword = bcrypt.hashSync(password, salt); 21 | user.password = hashPassword; 22 | 23 | user.save((error, userStorage) => { 24 | if (error) { 25 | res.status(400).send({ msg: "Error al crear el usuario" }); 26 | } else { 27 | res.status(200).send(userStorage); 28 | } 29 | }); 30 | } 31 | 32 | function login(req, res) { 33 | const { email, password } = req.body; 34 | 35 | if (!email) res.status(400).send({ msg: "El email es obligatorio" }); 36 | if (!password) res.status(400).send({ msg: "La contraseña es obligatoria" }); 37 | 38 | const emailLowerCase = email.toLowerCase(); 39 | 40 | User.findOne({ email: emailLowerCase }, (error, userStore) => { 41 | if (error) { 42 | res.status(500).send({ msg: "Error del servidor" }); 43 | } else { 44 | bcrypt.compare(password, userStore.password, (bcryptError, check) => { 45 | if (bcryptError) { 46 | res.status(500).send({ msg: "Error del servidor" }); 47 | } else if (!check) { 48 | res.status(400).send({ msg: "Contraseña incorrecta" }); 49 | } else if (!userStore.active) { 50 | res.status(401).send({ msg: "Usuario no autorizado o no activo" }); 51 | } else { 52 | res.status(200).send({ 53 | access: jwt.createAccessToken(userStore), 54 | refresh: jwt.createRefreshToken(userStore), 55 | }); 56 | } 57 | }); 58 | } 59 | }); 60 | } 61 | 62 | function refreshAccessToken(req, res) { 63 | const { token } = req.body; 64 | 65 | if (!token) res.status(400).send({ msg: "Token requerido" }); 66 | 67 | const { user_id } = jwt.decoded(token); 68 | 69 | User.findOne({ _id: user_id }, (error, userStorage) => { 70 | if (error) { 71 | res.status(500).send({ msg: "Error del servidor" }); 72 | } else { 73 | res.status(200).send({ 74 | accessToken: jwt.createAccessToken(userStorage), 75 | }); 76 | } 77 | }); 78 | } 79 | 80 | module.exports = { 81 | register, 82 | login, 83 | refreshAccessToken, 84 | }; 85 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@types/node@*": 6 | version "18.7.21" 7 | resolved "https://registry.yarnpkg.com/@types/node/-/node-18.7.21.tgz#63ee6688070e456325b6748dc492a7b948593871" 8 | integrity sha512-rLFzK5bhM0YPyCoTC8bolBjMk7bwnZ8qeZUBslBfjZQou2ssJdWslx9CZ8DGM+Dx7QXQiiTVZ/6QO6kwtHkZCA== 9 | 10 | "@types/webidl-conversions@*": 11 | version "7.0.0" 12 | resolved "https://registry.yarnpkg.com/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz#2b8e60e33906459219aa587e9d1a612ae994cfe7" 13 | integrity sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog== 14 | 15 | "@types/whatwg-url@^8.2.1": 16 | version "8.2.2" 17 | resolved "https://registry.yarnpkg.com/@types/whatwg-url/-/whatwg-url-8.2.2.tgz#749d5b3873e845897ada99be4448041d4cc39e63" 18 | integrity sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA== 19 | dependencies: 20 | "@types/node" "*" 21 | "@types/webidl-conversions" "*" 22 | 23 | abbrev@1: 24 | version "1.1.1" 25 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" 26 | integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== 27 | 28 | accepts@~1.3.8: 29 | version "1.3.8" 30 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" 31 | integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== 32 | dependencies: 33 | mime-types "~2.1.34" 34 | negotiator "0.6.3" 35 | 36 | anymatch@~3.1.2: 37 | version "3.1.2" 38 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" 39 | integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== 40 | dependencies: 41 | normalize-path "^3.0.0" 42 | picomatch "^2.0.4" 43 | 44 | array-flatten@1.1.1: 45 | version "1.1.1" 46 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 47 | integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== 48 | 49 | balanced-match@^1.0.0: 50 | version "1.0.2" 51 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 52 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 53 | 54 | base64-js@^1.3.1: 55 | version "1.5.1" 56 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" 57 | integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== 58 | 59 | bcryptjs@^2.4.3: 60 | version "2.4.3" 61 | resolved "https://registry.yarnpkg.com/bcryptjs/-/bcryptjs-2.4.3.tgz#9ab5627b93e60621ff7cdac5da9733027df1d0cb" 62 | integrity sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ== 63 | 64 | binary-extensions@^2.0.0: 65 | version "2.2.0" 66 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" 67 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== 68 | 69 | bluebird@3.0.5: 70 | version "3.0.5" 71 | resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.0.5.tgz#2ff9d07c9b3edb29d6d280fe07528365e7ecd392" 72 | integrity sha512-5o9RE3ued60EEv6gcT5L2APn/4zSpAwzeH65fuF+d/K3/LGZ9JpGIlDU2HeI4NujAY5Wh7mUBM5UF3Zuh8bBhQ== 73 | 74 | body-parser@1.20.0, body-parser@^1.20.0: 75 | version "1.20.0" 76 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5" 77 | integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg== 78 | dependencies: 79 | bytes "3.1.2" 80 | content-type "~1.0.4" 81 | debug "2.6.9" 82 | depd "2.0.0" 83 | destroy "1.2.0" 84 | http-errors "2.0.0" 85 | iconv-lite "0.4.24" 86 | on-finished "2.4.1" 87 | qs "6.10.3" 88 | raw-body "2.5.1" 89 | type-is "~1.6.18" 90 | unpipe "1.0.0" 91 | 92 | brace-expansion@^1.1.7: 93 | version "1.1.11" 94 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 95 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 96 | dependencies: 97 | balanced-match "^1.0.0" 98 | concat-map "0.0.1" 99 | 100 | braces@~3.0.2: 101 | version "3.0.2" 102 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 103 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 104 | dependencies: 105 | fill-range "^7.0.1" 106 | 107 | bson@^4.6.5, bson@^4.7.0: 108 | version "4.7.0" 109 | resolved "https://registry.yarnpkg.com/bson/-/bson-4.7.0.tgz#7874a60091ffc7a45c5dd2973b5cad7cded9718a" 110 | integrity sha512-VrlEE4vuiO1WTpfof4VmaVolCVYkYTgB9iWgYNOrVlnifpME/06fhFRmONgBhClD5pFC1t9ZWqFUQEQAzY43bA== 111 | dependencies: 112 | buffer "^5.6.0" 113 | 114 | buffer-equal-constant-time@1.0.1: 115 | version "1.0.1" 116 | resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" 117 | integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== 118 | 119 | buffer@^5.6.0: 120 | version "5.7.1" 121 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" 122 | integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== 123 | dependencies: 124 | base64-js "^1.3.1" 125 | ieee754 "^1.1.13" 126 | 127 | bytes@3.1.2: 128 | version "3.1.2" 129 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" 130 | integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== 131 | 132 | call-bind@^1.0.0: 133 | version "1.0.2" 134 | resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" 135 | integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== 136 | dependencies: 137 | function-bind "^1.1.1" 138 | get-intrinsic "^1.0.2" 139 | 140 | chokidar@^3.5.2: 141 | version "3.5.3" 142 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" 143 | integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== 144 | dependencies: 145 | anymatch "~3.1.2" 146 | braces "~3.0.2" 147 | glob-parent "~5.1.2" 148 | is-binary-path "~2.1.0" 149 | is-glob "~4.0.1" 150 | normalize-path "~3.0.0" 151 | readdirp "~3.6.0" 152 | optionalDependencies: 153 | fsevents "~2.3.2" 154 | 155 | concat-map@0.0.1: 156 | version "0.0.1" 157 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 158 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 159 | 160 | connect-multiparty@^2.2.0: 161 | version "2.2.0" 162 | resolved "https://registry.yarnpkg.com/connect-multiparty/-/connect-multiparty-2.2.0.tgz#b4932482dba298f82b8a54b70fb60ec5d72393c3" 163 | integrity sha512-zKcpA7cuXGEhuw9Pz7JmVCFmp85jzGLGm/iiagXTwyEAJp4ypLPtRS/V4IGuGb9KjjrgHBs6P/gDCpZHnFzksA== 164 | dependencies: 165 | http-errors "~1.7.0" 166 | multiparty "~4.2.1" 167 | on-finished "~2.3.0" 168 | qs "~6.5.2" 169 | type-is "~1.6.16" 170 | 171 | content-disposition@0.5.4: 172 | version "0.5.4" 173 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" 174 | integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== 175 | dependencies: 176 | safe-buffer "5.2.1" 177 | 178 | content-type@~1.0.4: 179 | version "1.0.4" 180 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 181 | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== 182 | 183 | cookie-signature@1.0.6: 184 | version "1.0.6" 185 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 186 | integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== 187 | 188 | cookie@0.5.0: 189 | version "0.5.0" 190 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" 191 | integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== 192 | 193 | cors@^2.8.5: 194 | version "2.8.5" 195 | resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" 196 | integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== 197 | dependencies: 198 | object-assign "^4" 199 | vary "^1" 200 | 201 | debug@2.6.9: 202 | version "2.6.9" 203 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 204 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 205 | dependencies: 206 | ms "2.0.0" 207 | 208 | debug@4.x: 209 | version "4.3.4" 210 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" 211 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== 212 | dependencies: 213 | ms "2.1.2" 214 | 215 | debug@^3.2.7: 216 | version "3.2.7" 217 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" 218 | integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== 219 | dependencies: 220 | ms "^2.1.1" 221 | 222 | denque@^2.1.0: 223 | version "2.1.0" 224 | resolved "https://registry.yarnpkg.com/denque/-/denque-2.1.0.tgz#e93e1a6569fb5e66f16a3c2a2964617d349d6ab1" 225 | integrity sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw== 226 | 227 | depd@2.0.0: 228 | version "2.0.0" 229 | resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" 230 | integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== 231 | 232 | depd@~1.1.2: 233 | version "1.1.2" 234 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" 235 | integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== 236 | 237 | destroy@1.2.0: 238 | version "1.2.0" 239 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" 240 | integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== 241 | 242 | ecdsa-sig-formatter@1.0.11: 243 | version "1.0.11" 244 | resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" 245 | integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== 246 | dependencies: 247 | safe-buffer "^5.0.1" 248 | 249 | ee-first@1.1.1: 250 | version "1.1.1" 251 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 252 | integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== 253 | 254 | encodeurl@~1.0.2: 255 | version "1.0.2" 256 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 257 | integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== 258 | 259 | escape-html@~1.0.3: 260 | version "1.0.3" 261 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 262 | integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== 263 | 264 | etag@~1.8.1: 265 | version "1.8.1" 266 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 267 | integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== 268 | 269 | express@^4.18.1: 270 | version "4.18.1" 271 | resolved "https://registry.yarnpkg.com/express/-/express-4.18.1.tgz#7797de8b9c72c857b9cd0e14a5eea80666267caf" 272 | integrity sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q== 273 | dependencies: 274 | accepts "~1.3.8" 275 | array-flatten "1.1.1" 276 | body-parser "1.20.0" 277 | content-disposition "0.5.4" 278 | content-type "~1.0.4" 279 | cookie "0.5.0" 280 | cookie-signature "1.0.6" 281 | debug "2.6.9" 282 | depd "2.0.0" 283 | encodeurl "~1.0.2" 284 | escape-html "~1.0.3" 285 | etag "~1.8.1" 286 | finalhandler "1.2.0" 287 | fresh "0.5.2" 288 | http-errors "2.0.0" 289 | merge-descriptors "1.0.1" 290 | methods "~1.1.2" 291 | on-finished "2.4.1" 292 | parseurl "~1.3.3" 293 | path-to-regexp "0.1.7" 294 | proxy-addr "~2.0.7" 295 | qs "6.10.3" 296 | range-parser "~1.2.1" 297 | safe-buffer "5.2.1" 298 | send "0.18.0" 299 | serve-static "1.15.0" 300 | setprototypeof "1.2.0" 301 | statuses "2.0.1" 302 | type-is "~1.6.18" 303 | utils-merge "1.0.1" 304 | vary "~1.1.2" 305 | 306 | fill-range@^7.0.1: 307 | version "7.0.1" 308 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 309 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 310 | dependencies: 311 | to-regex-range "^5.0.1" 312 | 313 | finalhandler@1.2.0: 314 | version "1.2.0" 315 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" 316 | integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== 317 | dependencies: 318 | debug "2.6.9" 319 | encodeurl "~1.0.2" 320 | escape-html "~1.0.3" 321 | on-finished "2.4.1" 322 | parseurl "~1.3.3" 323 | statuses "2.0.1" 324 | unpipe "~1.0.0" 325 | 326 | forwarded@0.2.0: 327 | version "0.2.0" 328 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" 329 | integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== 330 | 331 | fresh@0.5.2: 332 | version "0.5.2" 333 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 334 | integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== 335 | 336 | fsevents@~2.3.2: 337 | version "2.3.2" 338 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 339 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 340 | 341 | function-bind@^1.1.1: 342 | version "1.1.1" 343 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 344 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 345 | 346 | get-intrinsic@^1.0.2: 347 | version "1.1.3" 348 | resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" 349 | integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== 350 | dependencies: 351 | function-bind "^1.1.1" 352 | has "^1.0.3" 353 | has-symbols "^1.0.3" 354 | 355 | glob-parent@~5.1.2: 356 | version "5.1.2" 357 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 358 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 359 | dependencies: 360 | is-glob "^4.0.1" 361 | 362 | has-flag@^3.0.0: 363 | version "3.0.0" 364 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 365 | integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== 366 | 367 | has-symbols@^1.0.3: 368 | version "1.0.3" 369 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" 370 | integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== 371 | 372 | has@^1.0.3: 373 | version "1.0.3" 374 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 375 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 376 | dependencies: 377 | function-bind "^1.1.1" 378 | 379 | http-errors@2.0.0: 380 | version "2.0.0" 381 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" 382 | integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== 383 | dependencies: 384 | depd "2.0.0" 385 | inherits "2.0.4" 386 | setprototypeof "1.2.0" 387 | statuses "2.0.1" 388 | toidentifier "1.0.1" 389 | 390 | http-errors@~1.7.0: 391 | version "1.7.3" 392 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" 393 | integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== 394 | dependencies: 395 | depd "~1.1.2" 396 | inherits "2.0.4" 397 | setprototypeof "1.1.1" 398 | statuses ">= 1.5.0 < 2" 399 | toidentifier "1.0.0" 400 | 401 | http-errors@~1.8.1: 402 | version "1.8.1" 403 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" 404 | integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== 405 | dependencies: 406 | depd "~1.1.2" 407 | inherits "2.0.4" 408 | setprototypeof "1.2.0" 409 | statuses ">= 1.5.0 < 2" 410 | toidentifier "1.0.1" 411 | 412 | iconv-lite@0.4.24: 413 | version "0.4.24" 414 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 415 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 416 | dependencies: 417 | safer-buffer ">= 2.1.2 < 3" 418 | 419 | ieee754@^1.1.13: 420 | version "1.2.1" 421 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" 422 | integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== 423 | 424 | ignore-by-default@^1.0.1: 425 | version "1.0.1" 426 | resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" 427 | integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== 428 | 429 | inherits@2.0.4: 430 | version "2.0.4" 431 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 432 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 433 | 434 | ip@^2.0.0: 435 | version "2.0.0" 436 | resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" 437 | integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== 438 | 439 | ipaddr.js@1.9.1: 440 | version "1.9.1" 441 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" 442 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== 443 | 444 | is-binary-path@~2.1.0: 445 | version "2.1.0" 446 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 447 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 448 | dependencies: 449 | binary-extensions "^2.0.0" 450 | 451 | is-extglob@^2.1.1: 452 | version "2.1.1" 453 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 454 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 455 | 456 | is-glob@^4.0.1, is-glob@~4.0.1: 457 | version "4.0.3" 458 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 459 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 460 | dependencies: 461 | is-extglob "^2.1.1" 462 | 463 | is-number@^7.0.0: 464 | version "7.0.0" 465 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 466 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 467 | 468 | jsonwebtoken@^8.5.1: 469 | version "8.5.1" 470 | resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d" 471 | integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== 472 | dependencies: 473 | jws "^3.2.2" 474 | lodash.includes "^4.3.0" 475 | lodash.isboolean "^3.0.3" 476 | lodash.isinteger "^4.0.4" 477 | lodash.isnumber "^3.0.3" 478 | lodash.isplainobject "^4.0.6" 479 | lodash.isstring "^4.0.1" 480 | lodash.once "^4.0.0" 481 | ms "^2.1.1" 482 | semver "^5.6.0" 483 | 484 | jwa@^1.4.1: 485 | version "1.4.1" 486 | resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" 487 | integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== 488 | dependencies: 489 | buffer-equal-constant-time "1.0.1" 490 | ecdsa-sig-formatter "1.0.11" 491 | safe-buffer "^5.0.1" 492 | 493 | jws@^3.2.2: 494 | version "3.2.2" 495 | resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" 496 | integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== 497 | dependencies: 498 | jwa "^1.4.1" 499 | safe-buffer "^5.0.1" 500 | 501 | kareem@2.4.1: 502 | version "2.4.1" 503 | resolved "https://registry.yarnpkg.com/kareem/-/kareem-2.4.1.tgz#7d81ec518204a48c1cb16554af126806c3cd82b0" 504 | integrity sha512-aJ9opVoXroQUPfovYP5kaj2lM7Jn02Gw13bL0lg9v0V7SaUc0qavPs0Eue7d2DcC3NjqI6QAUElXNsuZSeM+EA== 505 | 506 | lodash.includes@^4.3.0: 507 | version "4.3.0" 508 | resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" 509 | integrity sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w== 510 | 511 | lodash.isboolean@^3.0.3: 512 | version "3.0.3" 513 | resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" 514 | integrity sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg== 515 | 516 | lodash.isinteger@^4.0.4: 517 | version "4.0.4" 518 | resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" 519 | integrity sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA== 520 | 521 | lodash.isnumber@^3.0.3: 522 | version "3.0.3" 523 | resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" 524 | integrity sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw== 525 | 526 | lodash.isplainobject@^4.0.6: 527 | version "4.0.6" 528 | resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" 529 | integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== 530 | 531 | lodash.isstring@^4.0.1: 532 | version "4.0.1" 533 | resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" 534 | integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw== 535 | 536 | lodash.once@^4.0.0: 537 | version "4.1.1" 538 | resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" 539 | integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== 540 | 541 | media-typer@0.3.0: 542 | version "0.3.0" 543 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 544 | integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== 545 | 546 | memory-pager@^1.0.2: 547 | version "1.5.0" 548 | resolved "https://registry.yarnpkg.com/memory-pager/-/memory-pager-1.5.0.tgz#d8751655d22d384682741c972f2c3d6dfa3e66b5" 549 | integrity sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg== 550 | 551 | merge-descriptors@1.0.1: 552 | version "1.0.1" 553 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 554 | integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== 555 | 556 | methods@~1.1.2: 557 | version "1.1.2" 558 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 559 | integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== 560 | 561 | mime-db@1.52.0: 562 | version "1.52.0" 563 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" 564 | integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== 565 | 566 | mime-types@~2.1.24, mime-types@~2.1.34: 567 | version "2.1.35" 568 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" 569 | integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== 570 | dependencies: 571 | mime-db "1.52.0" 572 | 573 | mime@1.6.0: 574 | version "1.6.0" 575 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 576 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 577 | 578 | minimatch@^3.1.2: 579 | version "3.1.2" 580 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 581 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 582 | dependencies: 583 | brace-expansion "^1.1.7" 584 | 585 | mongodb-connection-string-url@^2.5.3: 586 | version "2.5.3" 587 | resolved "https://registry.yarnpkg.com/mongodb-connection-string-url/-/mongodb-connection-string-url-2.5.3.tgz#c0c572b71570e58be2bd52b33dffd1330cfb6990" 588 | integrity sha512-f+/WsED+xF4B74l3k9V/XkTVj5/fxFH2o5ToKXd8Iyi5UhM+sO9u0Ape17Mvl/GkZaFtM0HQnzAG5OTmhKw+tQ== 589 | dependencies: 590 | "@types/whatwg-url" "^8.2.1" 591 | whatwg-url "^11.0.0" 592 | 593 | mongodb@4.9.1: 594 | version "4.9.1" 595 | resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-4.9.1.tgz#0c769448228bcf9a6aa7d16daa3625b48312479e" 596 | integrity sha512-ZhgI/qBf84fD7sI4waZBoLBNJYPQN5IOC++SBCiPiyhzpNKOxN/fi0tBHvH2dEC42HXtNEbFB0zmNz4+oVtorQ== 597 | dependencies: 598 | bson "^4.7.0" 599 | denque "^2.1.0" 600 | mongodb-connection-string-url "^2.5.3" 601 | socks "^2.7.0" 602 | optionalDependencies: 603 | saslprep "^1.0.3" 604 | 605 | mongoose-paginate@^5.0.3: 606 | version "5.0.3" 607 | resolved "https://registry.yarnpkg.com/mongoose-paginate/-/mongoose-paginate-5.0.3.tgz#d7ae49ed5bf64f1f7af7620ea865b67058c55371" 608 | integrity sha512-sqrQJJ2nY7z2S5XzrMxbnlnAXpOnqyyM8t/FQ4Rv0uimYyacitmVSZOjlotbiQLI8I4v4hy3dCtJn31+OPl5Wg== 609 | dependencies: 610 | bluebird "3.0.5" 611 | 612 | mongoose@^6.6.1: 613 | version "6.6.1" 614 | resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-6.6.1.tgz#8aec30924b1a524924d9de4eb4746951f6aadd26" 615 | integrity sha512-hPDamnn6quL9TjIrOudqUS5sMilENmP/gfxoCIb+rDmlzawtM7+MVCAWrM9930fzD20N7qAema/zE9QIDuifhQ== 616 | dependencies: 617 | bson "^4.6.5" 618 | kareem "2.4.1" 619 | mongodb "4.9.1" 620 | mpath "0.9.0" 621 | mquery "4.0.3" 622 | ms "2.1.3" 623 | sift "16.0.0" 624 | 625 | mpath@0.9.0: 626 | version "0.9.0" 627 | resolved "https://registry.yarnpkg.com/mpath/-/mpath-0.9.0.tgz#0c122fe107846e31fc58c75b09c35514b3871904" 628 | integrity sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew== 629 | 630 | mquery@4.0.3: 631 | version "4.0.3" 632 | resolved "https://registry.yarnpkg.com/mquery/-/mquery-4.0.3.tgz#4d15f938e6247d773a942c912d9748bd1965f89d" 633 | integrity sha512-J5heI+P08I6VJ2Ky3+33IpCdAvlYGTSUjwTPxkAr8i8EoduPMBX2OY/wa3IKZIQl7MU4SbFk8ndgSKyB/cl1zA== 634 | dependencies: 635 | debug "4.x" 636 | 637 | ms@2.0.0: 638 | version "2.0.0" 639 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 640 | integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== 641 | 642 | ms@2.1.2: 643 | version "2.1.2" 644 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 645 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 646 | 647 | ms@2.1.3, ms@^2.1.1: 648 | version "2.1.3" 649 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 650 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 651 | 652 | multiparty@~4.2.1: 653 | version "4.2.3" 654 | resolved "https://registry.yarnpkg.com/multiparty/-/multiparty-4.2.3.tgz#6b14981badb5ad3f0929622868751810368d4633" 655 | integrity sha512-Ak6EUJZuhGS8hJ3c2fY6UW5MbkGUPMBEGd13djUzoY/BHqV/gTuFWtC6IuVA7A2+v3yjBS6c4or50xhzTQZImQ== 656 | dependencies: 657 | http-errors "~1.8.1" 658 | safe-buffer "5.2.1" 659 | uid-safe "2.1.5" 660 | 661 | negotiator@0.6.3: 662 | version "0.6.3" 663 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" 664 | integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== 665 | 666 | nodemon@^2.0.20: 667 | version "2.0.20" 668 | resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.20.tgz#e3537de768a492e8d74da5c5813cb0c7486fc701" 669 | integrity sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw== 670 | dependencies: 671 | chokidar "^3.5.2" 672 | debug "^3.2.7" 673 | ignore-by-default "^1.0.1" 674 | minimatch "^3.1.2" 675 | pstree.remy "^1.1.8" 676 | semver "^5.7.1" 677 | simple-update-notifier "^1.0.7" 678 | supports-color "^5.5.0" 679 | touch "^3.1.0" 680 | undefsafe "^2.0.5" 681 | 682 | nopt@~1.0.10: 683 | version "1.0.10" 684 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" 685 | integrity sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg== 686 | dependencies: 687 | abbrev "1" 688 | 689 | normalize-path@^3.0.0, normalize-path@~3.0.0: 690 | version "3.0.0" 691 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 692 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 693 | 694 | object-assign@^4: 695 | version "4.1.1" 696 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 697 | integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== 698 | 699 | object-inspect@^1.9.0: 700 | version "1.12.2" 701 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" 702 | integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== 703 | 704 | on-finished@2.4.1: 705 | version "2.4.1" 706 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" 707 | integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== 708 | dependencies: 709 | ee-first "1.1.1" 710 | 711 | on-finished@~2.3.0: 712 | version "2.3.0" 713 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 714 | integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== 715 | dependencies: 716 | ee-first "1.1.1" 717 | 718 | parseurl@~1.3.3: 719 | version "1.3.3" 720 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 721 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 722 | 723 | path-to-regexp@0.1.7: 724 | version "0.1.7" 725 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 726 | integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== 727 | 728 | picomatch@^2.0.4, picomatch@^2.2.1: 729 | version "2.3.1" 730 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 731 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 732 | 733 | proxy-addr@~2.0.7: 734 | version "2.0.7" 735 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" 736 | integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== 737 | dependencies: 738 | forwarded "0.2.0" 739 | ipaddr.js "1.9.1" 740 | 741 | pstree.remy@^1.1.8: 742 | version "1.1.8" 743 | resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" 744 | integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== 745 | 746 | punycode@^2.1.1: 747 | version "2.1.1" 748 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 749 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 750 | 751 | qs@6.10.3: 752 | version "6.10.3" 753 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" 754 | integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== 755 | dependencies: 756 | side-channel "^1.0.4" 757 | 758 | qs@~6.5.2: 759 | version "6.5.3" 760 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" 761 | integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== 762 | 763 | random-bytes@~1.0.0: 764 | version "1.0.0" 765 | resolved "https://registry.yarnpkg.com/random-bytes/-/random-bytes-1.0.0.tgz#4f68a1dc0ae58bd3fb95848c30324db75d64360b" 766 | integrity sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ== 767 | 768 | range-parser@~1.2.1: 769 | version "1.2.1" 770 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" 771 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 772 | 773 | raw-body@2.5.1: 774 | version "2.5.1" 775 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" 776 | integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== 777 | dependencies: 778 | bytes "3.1.2" 779 | http-errors "2.0.0" 780 | iconv-lite "0.4.24" 781 | unpipe "1.0.0" 782 | 783 | readdirp@~3.6.0: 784 | version "3.6.0" 785 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 786 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 787 | dependencies: 788 | picomatch "^2.2.1" 789 | 790 | safe-buffer@5.2.1, safe-buffer@^5.0.1: 791 | version "5.2.1" 792 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 793 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 794 | 795 | "safer-buffer@>= 2.1.2 < 3": 796 | version "2.1.2" 797 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 798 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 799 | 800 | saslprep@^1.0.3: 801 | version "1.0.3" 802 | resolved "https://registry.yarnpkg.com/saslprep/-/saslprep-1.0.3.tgz#4c02f946b56cf54297e347ba1093e7acac4cf226" 803 | integrity sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag== 804 | dependencies: 805 | sparse-bitfield "^3.0.3" 806 | 807 | semver@^5.6.0, semver@^5.7.1: 808 | version "5.7.1" 809 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 810 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 811 | 812 | semver@~7.0.0: 813 | version "7.0.0" 814 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" 815 | integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== 816 | 817 | send@0.18.0: 818 | version "0.18.0" 819 | resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" 820 | integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== 821 | dependencies: 822 | debug "2.6.9" 823 | depd "2.0.0" 824 | destroy "1.2.0" 825 | encodeurl "~1.0.2" 826 | escape-html "~1.0.3" 827 | etag "~1.8.1" 828 | fresh "0.5.2" 829 | http-errors "2.0.0" 830 | mime "1.6.0" 831 | ms "2.1.3" 832 | on-finished "2.4.1" 833 | range-parser "~1.2.1" 834 | statuses "2.0.1" 835 | 836 | serve-static@1.15.0: 837 | version "1.15.0" 838 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" 839 | integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== 840 | dependencies: 841 | encodeurl "~1.0.2" 842 | escape-html "~1.0.3" 843 | parseurl "~1.3.3" 844 | send "0.18.0" 845 | 846 | setprototypeof@1.1.1: 847 | version "1.1.1" 848 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" 849 | integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== 850 | 851 | setprototypeof@1.2.0: 852 | version "1.2.0" 853 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" 854 | integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== 855 | 856 | side-channel@^1.0.4: 857 | version "1.0.4" 858 | resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" 859 | integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== 860 | dependencies: 861 | call-bind "^1.0.0" 862 | get-intrinsic "^1.0.2" 863 | object-inspect "^1.9.0" 864 | 865 | sift@16.0.0: 866 | version "16.0.0" 867 | resolved "https://registry.yarnpkg.com/sift/-/sift-16.0.0.tgz#447991577db61f1a8fab727a8a98a6db57a23eb8" 868 | integrity sha512-ILTjdP2Mv9V1kIxWMXeMTIRbOBrqKc4JAXmFMnFq3fKeyQ2Qwa3Dw1ubcye3vR+Y6ofA0b9gNDr/y2t6eUeIzQ== 869 | 870 | simple-update-notifier@^1.0.7: 871 | version "1.0.7" 872 | resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-1.0.7.tgz#7edf75c5bdd04f88828d632f762b2bc32996a9cc" 873 | integrity sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew== 874 | dependencies: 875 | semver "~7.0.0" 876 | 877 | smart-buffer@^4.2.0: 878 | version "4.2.0" 879 | resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" 880 | integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== 881 | 882 | socks@^2.7.0: 883 | version "2.7.0" 884 | resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.0.tgz#f9225acdb841e874dca25f870e9130990f3913d0" 885 | integrity sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA== 886 | dependencies: 887 | ip "^2.0.0" 888 | smart-buffer "^4.2.0" 889 | 890 | sparse-bitfield@^3.0.3: 891 | version "3.0.3" 892 | resolved "https://registry.yarnpkg.com/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz#ff4ae6e68656056ba4b3e792ab3334d38273ca11" 893 | integrity sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ== 894 | dependencies: 895 | memory-pager "^1.0.2" 896 | 897 | statuses@2.0.1: 898 | version "2.0.1" 899 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" 900 | integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== 901 | 902 | "statuses@>= 1.5.0 < 2": 903 | version "1.5.0" 904 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" 905 | integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== 906 | 907 | supports-color@^5.5.0: 908 | version "5.5.0" 909 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 910 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 911 | dependencies: 912 | has-flag "^3.0.0" 913 | 914 | to-regex-range@^5.0.1: 915 | version "5.0.1" 916 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 917 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 918 | dependencies: 919 | is-number "^7.0.0" 920 | 921 | toidentifier@1.0.0: 922 | version "1.0.0" 923 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" 924 | integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== 925 | 926 | toidentifier@1.0.1: 927 | version "1.0.1" 928 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" 929 | integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== 930 | 931 | touch@^3.1.0: 932 | version "3.1.0" 933 | resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" 934 | integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== 935 | dependencies: 936 | nopt "~1.0.10" 937 | 938 | tr46@^3.0.0: 939 | version "3.0.0" 940 | resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" 941 | integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== 942 | dependencies: 943 | punycode "^2.1.1" 944 | 945 | type-is@~1.6.16, type-is@~1.6.18: 946 | version "1.6.18" 947 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" 948 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 949 | dependencies: 950 | media-typer "0.3.0" 951 | mime-types "~2.1.24" 952 | 953 | uid-safe@2.1.5: 954 | version "2.1.5" 955 | resolved "https://registry.yarnpkg.com/uid-safe/-/uid-safe-2.1.5.tgz#2b3d5c7240e8fc2e58f8aa269e5ee49c0857bd3a" 956 | integrity sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA== 957 | dependencies: 958 | random-bytes "~1.0.0" 959 | 960 | undefsafe@^2.0.5: 961 | version "2.0.5" 962 | resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" 963 | integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== 964 | 965 | unpipe@1.0.0, unpipe@~1.0.0: 966 | version "1.0.0" 967 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 968 | integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== 969 | 970 | utils-merge@1.0.1: 971 | version "1.0.1" 972 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 973 | integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== 974 | 975 | vary@^1, vary@~1.1.2: 976 | version "1.1.2" 977 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 978 | integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== 979 | 980 | webidl-conversions@^7.0.0: 981 | version "7.0.0" 982 | resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" 983 | integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== 984 | 985 | whatwg-url@^11.0.0: 986 | version "11.0.0" 987 | resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018" 988 | integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ== 989 | dependencies: 990 | tr46 "^3.0.0" 991 | webidl-conversions "^7.0.0" 992 | --------------------------------------------------------------------------------